/*************************************************************************************************************************************/ /* */ /* 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... */