/*************************************************************************************************************************************/
/* */
/* D E F I N I T I O N S D E L ' A N T I - A L I A S I N G : */
/* */
/* */
/* Author of '$xrq/nucleon.LP$I' : */
/* */
/* Jean-Francois COLONNA (LACTAMME, 1991??????????). */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* T R A I T E M E N T D E L ' A N T I - A L I A S I N G P R E S D U */
/* C O N T O U R A P P A R E N T D ' U N E S P H E R E : */
/* */
/*************************************************************************************************************************************/
#define EPAISSEUR_DE_LA_COURONNE_D_ANTI_ALIASING \
FLOT(QUATRE)
DEFV(Local,DEFV(Float,INIT(epaisseur_de_la_couronne_d_anti_aliasing,EPAISSEUR_DE_LA_COURONNE_D_ANTI_ALIASING)));
DEFV(Local,DEFV(Float,INIT(epaisseur_de_la_couronne_d_anti_aliasing_effective,FLOT__UNDEF)));
/* Epaisseur (exprimee en nombre de points) de la couronne (externe) des spheres sur */
/* laquelle le traitement anti-aliasing sera effectue. On notera que prendre ici une */
/* valeur egale a 'FZERO' revient a supprimer la correction. On notera que suivant le */
/* type d'interpolation, cette valeur peut etre modifiee : */
/* */
/* 2.0 : INTERPOLATION_LINEAIRE(...), */
/* 3.0 : INTERPOLATION_CUBIQUE(...). */
/* */
/* ATTENTION, ce parametre 'epaisseur_de_la_couronne_d_anti_aliasing' ("couronne=") */
/* associe au parametre 'attenuation_au_bord_d_un_disque' ("attenuation_au_bord=") peut, */
/* comme cela s'est vu en generant la sequence : */
/* */
/* xivPdf 9 2 / 026783_027294 */
/* */
/* avoir des effets visuels genants en ce qui concerne le rayon apparent des spheres */
/* (c'est-a-dire tel qu'elles sont vues). Il peut etre alors necessaire de "tricher" en */
/* augmentant le rayon (d'ou le parametre '$_____FacteurPsI' inferieur a 1 dans la dite */
/* sequence...). */
/* */
/* Le 20060224113546 fut introduit 'epaisseur_de_la_couronne_d_anti_aliasing_effective'... */
/* */
/* Le 20240424094430 le test suivant des deux parametres precedents fut introduit : */
/* */
/* */
/* :Debut_listG_TestAntiAlias: */
/* */
/* $Z FilSTmpB FAnTi_AlIaSiNg */
/* */
/* $Z set CoUrOnNe=4 */
/* $Z set AtTeNuAtIoN=0.125 */
/* */
/* $Z set CoOrD_XY=0.5 */
/* $Z set CoOrD_Z1=0.5 */
/* $Z set CoOrD_Z2=0.5 */
/* */
/* $Z set RaYoN=0.08 */
/* */
/* $Z echo "$CoOrD_XY""\n""$CoOrD_XY" > $FAnTi_AlIaSiNg$COORD_X */
/* $Z echo "$CoOrD_XY""\n""$CoOrD_XY" > $FAnTi_AlIaSiNg$COORD_Y */
/* $Z echo "$CoOrD_Z1""\n""$CoOrD_Z2" > $FAnTi_AlIaSiNg$COORD_Z */
/* */
/* $Z echo "$BLANC""\n""$NOIR" > $FAnTi_AlIaSiNg$ROUGE */
/* $Z echo "$NOIR""\n""$BLANC" > $FAnTi_AlIaSiNg$VERTE */
/* $Z echo "$NOIR""\n""$NOIR" > $FAnTi_AlIaSiNg$BLEUE */
/* */
/* $Z echo "$RaYoN""\n""$RaYoN" > $FAnTi_AlIaSiNg$RAYON */
/* */
/* $Z $xrv/particule.10$X \ */
/* $Z npoints=2 \ */
/* $Z LISTE_X=$FAnTi_AlIaSiNg$COORD_X \ */
/* $Z LISTE_Y=$FAnTi_AlIaSiNg$COORD_Y \ */
/* $Z LISTE_Z=$FAnTi_AlIaSiNg$COORD_Z \ */
/* $Z LISTE_ROUGE=$FAnTi_AlIaSiNg$ROUGE \ */
/* $Z LISTE_VERTE=$FAnTi_AlIaSiNg$VERTE \ */
/* $Z LISTE_BLEUE=$FAnTi_AlIaSiNg$BLEUE \ */
/* $Z LISTE_RAYON=$FAnTi_AlIaSiNg$RAYON \ */
/* $Z ZBuffer_test_strict=FAUX \ */
/* $Z couronne=$CoUrOnNe \ */
/* $Z attenuation_au_bord=$AtTeNuAtIoN \ */
/* $Z chiffres=0 R=$FAnTi_AlIaSiNg.test \ */
/* $Z $formatI */
/* */
/* $Z v $FAnTi_AlIaSiNg.test */
/* */
/* $Z FilSTmpE FAnTi_AlIaSiNg */
/* */
/* :Fin_listG_TestAntiAlias: */
/* */
/* */
/* Puis on fera : */
/* */
/* listG $xrq/nucleon.LP$I :Debut_listG_""TestAntiAlias: :Fin_listG_""TestAntiAlias: */
/* */
/* pour generer le '$Z' a executer a des fins de test... */
#define MODULER_L_EPAISSEUR_DE_LA_COURONNE_D_ANTI_ALIASING \
FAUX
DEFV(Local,DEFV(Logical,INIT(moduler_l_epaisseur_de_la_couronne_d_anti_aliasing
,MODULER_L_EPAISSEUR_DE_LA_COURONNE_D_ANTI_ALIASING
)
)
);
DEFV(Local,DEFV(Float,INIT(minimum_de_l_epaisseur_de_la_couronne_d_anti_aliasing,EPAISSEUR_DE_LA_COURONNE_D_ANTI_ALIASING)));
DEFV(Local,DEFV(Float,INIT(maximum_de_l_epaisseur_de_la_couronne_d_anti_aliasing,EPAISSEUR_DE_LA_COURONNE_D_ANTI_ALIASING)));
DEFV(Local,DEFV(Float,INIT(rayon_associe_au_minimum_de_l_epaisseur_de_la_couronne_d_anti_aliasing,FLOT__UNDEF)));
DEFV(Local,DEFV(Float,INIT(rayon_associe_au_maximum_de_l_epaisseur_de_la_couronne_d_anti_aliasing,FLOT__UNDEF)));
/* Le 20060224115535 a ete introduite la possibilite de moduler l'epaisseur de la couronne */
/* des spheres 'epaisseur_de_la_couronne_d_anti_aliasing' en fonction du rayon courant... */
/* La valeur par defaut ('FAUX') garantit la compatibilite anterieure. On notera le */
/* 20060224123438 qu'il est impossible d'utiliser 'RAYON_DE_VISUALISATION' pour initialiser */
/* les deux rayons ci-dessus car, en effet, le symbole 'RAYON_DE_VISUALISATION' n'est en */
/* general pas encore defini. La valeur par defaut ne sera mise en place qu'avant la */
/* premiere recherche des parametres ('v $xrv/champs_5.1A$I PROKESS_ARGUMENT_F'). */
DEFV(Local,DEFV(Float,INIT(distance_critique_normalisee_au_bord,FLOT__UNDEF)));
/* Distance normalisee dans [0,1] a laquelle peuvent se situer les niveaux maximaux ; */
/* au-dela ils doivent imperativement decroitre. On notera qu'une valeur superieure ou */
/* egale a 'COORDONNEE_BARYCENTRIQUE_MAXIMALE' revient a supprimer la correction... */
#define CALCUL_DE_LA_DISTANCE_CRITIQUE_NORMALISEE_AU_BORD(rayon,Arayon) \
/* L'argument 'Arayon' a ete introduit le 20060224145005 car c'est le parametre le plus */ \
/* "parlant" et sur lequel il est le plus facile d'agir de facon pertinente... */ \
Bblock \
Test(IL_NE_FAUT_PAS(moduler_l_epaisseur_de_la_couronne_d_anti_aliasing)) \
Bblock \
EGAL(epaisseur_de_la_couronne_d_anti_aliasing_effective,epaisseur_de_la_couronne_d_anti_aliasing); \
/* Cas ou l'epaisseur de la couronne est constante... */ \
Eblock \
ATes \
Bblock \
EGAL(epaisseur_de_la_couronne_d_anti_aliasing_effective \
,INTERPOLATION_LINEAIRE(minimum_de_l_epaisseur_de_la_couronne_d_anti_aliasing \
,maximum_de_l_epaisseur_de_la_couronne_d_anti_aliasing \
,NORM(TRON(Arayon \
,rayon_associe_au_minimum_de_l_epaisseur_de_la_couronne_d_anti_aliasing \
,rayon_associe_au_maximum_de_l_epaisseur_de_la_couronne_d_anti_aliasing \
) \
,rayon_associe_au_minimum_de_l_epaisseur_de_la_couronne_d_anti_aliasing \
,rayon_associe_au_maximum_de_l_epaisseur_de_la_couronne_d_anti_aliasing \
) \
) \
); \
/* Cas ou l'epaisseur de la couronne est modulee par le rayon (introduit le 20060224115535). */ \
/* */ \
/* ATTENTION : on rappelle que 'rayon' est exprime en nombre de points... */ \
Eblock \
ETes \
\
EGAL(distance_critique_normalisee_au_bord \
,TRON(SOUS(COORDONNEE_BARYCENTRIQUE_MAXIMALE \
,DIVZ(epaisseur_de_la_couronne_d_anti_aliasing_effective \
,MAX2(FLOT(rayon),epaisseur_de_la_couronne_d_anti_aliasing_effective) \
) \
) \
,COORDONNEE_BARYCENTRIQUE_MINIMALE \
,COORDONNEE_BARYCENTRIQUE_MAXIMALE \
) \
); \
Eblock \
/* Calcul de 'distance_critique_normalisee_au_bord' en fonction du rayon courant de la */ \
/* sphere courante... */
#define COORDONNEE_BARYCENTRIQUE_A_L_INTERIEUR_DE_LA_COURONNE(distance_normalisee) \
NORM(distance_normalisee,distance_critique_normalisee_au_bord,COORDONNEE_BARYCENTRIQUE_MAXIMALE) \
/* Lorsque l'on est a l'interieur de la couronne, la distance normalisee est ramenee dans */ \
/* [0,1] afin de fournir une coordonnee barycentrique de parcours de cette couronne. */
#define ATTENUATION_D_ANTI_ALIASING_AU_BORD \
COORDONNEE_BARYCENTRIQUE_MINIMALE
DEFV(Local,DEFV(Float,INIT(attenuation_d_anti_aliasing_au_bord,ATTENUATION_D_ANTI_ALIASING_AU_BORD)));
/* Facteur multiplicatif a appliquer a 'modulation_d_eclairement' sur le contour apparent */
/* des spheres... */
#nodefine CORRECTION_D_ANTI_ALIASING_VERSION_01(distance_normalisee) \
/* ATTENTION : la distance normalisee argument est dans [0,1], et est en fait le rapport */ \
/* de la distance au rayon... */ \
fCOND(IFLE(distance_normalisee,distance_critique_normalisee_au_bord) \
,COORDONNEE_BARYCENTRIQUE_MAXIMALE \
,INTERPOLATION_LINEAIRE(COORDONNEE_BARYCENTRIQUE_MAXIMALE \
,attenuation_d_anti_aliasing_au_bord \
,COORDONNEE_BARYCENTRIQUE_A_L_INTERIEUR_DE_LA_COURONNE(distance_normalisee) \
) \
) \
/* Lorsque les zones tres eclairees d'une sphere se situent tres pres du contour apparent, */ \
/* une correction d'aliasing s'impose. Une telle fonction est definie ici ; elle est */ \
/* fonction de la distance normalisee au centre du disque bidimensionnel. Cette correction */ \
/* est une valeur dans [0,1] elle-aussi definie par la courbe suivante : */ \
/* */ \
/* */ \
/* ^ */ \
/* COORDONNEE_BARYCENTRIQUE_MAXIMALE. . | * * * * * * * * . . . . */ \
/* | .* . */ \
/* | . * . */ \
/* | . * . */ \
/* | . * . */ \
/* | . * . */ \
/* | . * . */ \
/* | . *. */ \
/* attenuation_d_anti_aliasing_au_bord. | . . . . . . . . . . . * */ \
/* | . . */ \
/* | . . */ \
/* | . . */ \
/* | . . */ \
/* COORDONNEE_BARYCENTRIQUE_MINIMALE. . ---------------------------------------> */ \
/* . . . distance */ \
/* . . . normalisee */ \
/* COORDONNEE_BARYCENTRIQUE_MINIMALE. . . . . dans [0,1] */ \
/* distance_critique_normalisee_au_bord . . . . . . . . . . */ \
/* COORDONNEE_BARYCENTRIQUE_MAXIMALE. . . . . . . . . . . . . . . */ \
/* */ \
/* */ \
/* Nota important : il convient de remarquer que la distance utilisee ici est une distance */ \
/* bidimensionnelle dans le plan, et non pas une distance dans l'espace tridimensionnel. */ \
/* Elle definie bien (ou du moins son complement a 'COORDONNEE_BARYCENTRIQUE_MAXIMALE') une */ \
/* distance du point courant bidimensionnel au contour apparent... */ \
/* */ \
/* Le 20030222110348, 'CORRECTION_D_ANTI_ALIASING_VERSION_01(...)' est passe de 'define' a */ \
/* 'nodefine' afin de ne pas etre recupere par le processus 'v $xcc/cpp$Z _VERSION_'. */
#define DERIVEE_A_L_INTERIEUR_DE_LA_COURONNE \
FZERO
DEFV(Local,DEFV(Float,INIT(derivee_a_l_interieur_de_la_couronne,DERIVEE_A_L_INTERIEUR_DE_LA_COURONNE)));
/* Definit la derivee de la fonction a interpoler cubiquement a l'interieur de la couronne. */
#define DERIVEE_A_L_EXTERIEUR_DE_LA_COURONNE \
FZERO
DEFV(Local,DEFV(Float,INIT(derivee_a_l_exterieur_de_la_couronne,DERIVEE_A_L_EXTERIEUR_DE_LA_COURONNE)));
/* Definit la derivee de la fonction a interpoler cubiquement a l'exterieur de la couronne. */
#define CORRECTION_D_ANTI_ALIASING_VERSION_02(distance_normalisee) \
/* ATTENTION : la distance normalisee argument est dans [0,1], et est en fait le rapport */ \
/* de la distance au rayon... */ \
fCOND(IFLE(distance_normalisee,distance_critique_normalisee_au_bord) \
,COORDONNEE_BARYCENTRIQUE_MAXIMALE \
,INTERPOLATION_CUBIQUE(COORDONNEE_BARYCENTRIQUE_MAXIMALE \
,derivee_a_l_interieur_de_la_couronne \
,attenuation_d_anti_aliasing_au_bord \
,derivee_a_l_exterieur_de_la_couronne \
,COORDONNEE_BARYCENTRIQUE_A_L_INTERIEUR_DE_LA_COURONNE(distance_normalisee) \
) \
) \
/* Lorsque les zones tres eclairees d'une sphere se situent tres pres du contour apparent, */ \
/* une correction d'aliasing s'impose. Une telle fonction est definie ici ; elle est */ \
/* fonction de la distance normalisee au centre du disque bidimensionnel. Cette correction */ \
/* est une valeur dans [0,1] elle-aussi definie par la courbe suivante : */ \
/* */ \
/* */ \
/* ^ */ \
/* COORDONNEE_BARYCENTRIQUE_MAXIMALE. . | * * * * * * * * . . . . */ \
/* | . * . */ \
/* | . * . */ \
/* | . * . */ \
/* | . * . */ \
/* | . * . */ \
/* | . * . */ \
/* | . * . */ \
/* attenuation_d_anti_aliasing_au_bord. | . . . . . . . . . . . * */ \
/* | . . */ \
/* | . . */ \
/* | . . */ \
/* | . . */ \
/* COORDONNEE_BARYCENTRIQUE_MINIMALE. . ---------------------------------------> */ \
/* . . . distance */ \
/* . . . normalisee */ \
/* COORDONNEE_BARYCENTRIQUE_MINIMALE. . . . . dans [0,1] */ \
/* distance_critique_normalisee_au_bord . . . . . . . . . . */ \
/* COORDONNEE_BARYCENTRIQUE_MAXIMALE. . . . . . . . . . . . . . . */ \
/* */ \
/* */ \
/* Nota important : il convient de remarquer que la distance utilisee ici est une distance */ \
/* bidimensionnelle dans le plan, et non pas une distance dans l'espace tridimensionnel. */ \
/* Elle definie bien (ou du moins son complement a 'COORDONNEE_BARYCENTRIQUE_MAXIMALE') une */ \
/* distance du point courant bidimensionnel au contour apparent... */
#define CORRECTION_D_ANTI_ALIASING(distance_normalisee) \
/* ATTENTION : la distance normalisee argument est dans [0,1], et est en fait le rapport */ \
/* de la distance au rayon... */ \
CORRECTION_D_ANTI_ALIASING_VERSION_02(distance_normalisee) \
/* Choix de la methode de correction d'aliasing... */