/*************************************************************************************************************************************/ /* */ /* I N I T I A L I S A T I O N S : */ /* */ /* */ /* Author of '$xrv/champs_5.17$I' : */ /* */ /* Jean-Francois Colonna (LACTAMME, 1992??????????). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I N I T I A L I S A T I O N S G E N E R A L E S : */ /* */ /*************************************************************************************************************************************/ #define INITIALISATIONS_GENERALES \ Bblock \ DEFV(Logical,INIT(EnTete_de_sauvegardM ## PRINT_ATTENTION_____editer_les_messages \ ,PRINT_ATTENTION_____editer_les_messages \ ) \ ); \ EGAL(PRINT_ATTENTION_____editer_les_messages,NE_PAS_EDITER_LES_MESSAGES_DE_PRINT_ATTENTION); \ /* Afin de ne pas editer les messages d'ATTENTION emis par 'SET_DIMENSIONS_2D(...)' via */ \ /* 'AVERTISSEMENT_SUR_LE_NON_REDIMENSIONNEMENT_DE_CERTAINES_IMAGES' ('v $xiii/Images$DEF'). */ \ \ SET_ECHANTILLONNAGE(PAS_HORIZONTAL,PAS_VERTICAL); \ /* Definition du sous-echantillonnage des champs. */ \ SET_DIMENSIONS_2D(Xmin_IMAGE,Xmax_IMAGE,Ymin_IMAGE,Ymax_IMAGE); \ /* Dimensionnement des images a generer... */ \ INITIALISATION_POINT_3D(Lsource \ ,X_DE_LA_SOURCE_LUMINEUSE \ ,Y_DE_LA_SOURCE_LUMINEUSE \ ,Z_DE_LA_SOURCE_LUMINEUSE \ ); \ /* Initialisation de la position de la source lumineuse... */ \ \ DEBUT_DE_L_INITIALISATION_DES_INTERPOLATIONS; \ /* Debut d'initialisation des differentes interpolations. */ \ \ EGAL(nombre_de_periodes_de_la_simulation,UN); \ /* Afin de corriger les initialisation anterieures correspondant a '$xrq/nucleon.L0$K' ; on */ \ /* notera qu'il est impossible de changer la valeur de 'NOMBRE_DE_PERIODES_DE_LA_SIMULATION' */ \ /* non plus que l'initialisation de 'nombre_de_periodes_de_la_simulation' puisque tout cela */ \ /* est fait dans '$xrq/nucleon.L3$I'... */ \ \ EGAL(PRINT_ATTENTION_____editer_les_messages,EnTete_de_sauvegardM ## PRINT_ATTENTION_____editer_les_messages); \ /* Restauration de 'PRINT_ATTENTION_____editer_les_messages'... */ \ Eblock \ /* Initialisations generales faites au tout debut... */ #define INITIALISATION_DE_LA_SYNTHESE_D_IMAGE \ Bblock \ INITIALISATION_DE_BASE_DES_TROIS_COMPOSANTES_D_UNE_IMAGE; \ \ Test(IL_FAUT(generer_les_trainees)) \ Bblock \ DEFV(genere_p,INIT(blanc_1,NIVEAU_UNDEF)); \ DEFV(genere_p,INIT(blanc_0,NIVEAU_UNDEF)); \ /* De facon a voir l'attenuation du 'BLANC'... */ \ DEFV(Logical,INIT(on_a_trouve_la_periode_d_attenuation_des_trainees \ ,COND(IFLT(facteur_d_attenuation_des_trainees,PONDERATION_MAXIMALE_DES_TRAINEES),FAUX,VRAI) \ ) \ ); \ /* A priori, on n'a pas encore trouve la periode d'attenuation des trainees, sauf si le */ \ /* facteur d'attenuation est plus grand ou egal a 1... */ \ \ EGAL(periode_d_attenuation_des_trainees,UN); \ /* A priori, la periode est de 1... */ \ \ Tant(EST_FAUX(on_a_trouve_la_periode_d_attenuation_des_trainees)) \ Bblock \ EGAL(blanc_1 \ ,ATTENUATION_DE_TRAINEES(PUIX(facteur_d_attenuation_des_trainees \ ,ADD2(periode_d_attenuation_des_trainees,UN) \ ) \ ,BLANC \ ) \ ); \ EGAL(blanc_0 \ ,ATTENUATION_DE_TRAINEES(PUIX(facteur_d_attenuation_des_trainees \ ,ADD2(periode_d_attenuation_des_trainees,ZERO) \ ) \ ,BLANC \ ) \ ); \ /* Etude de l'attenuation du 'BLANC'. */ \ \ Test(IFGE(blanc_1,blanc_0)) \ Bblock \ INCR(periode_d_attenuation_des_trainees,I); \ /* Tant que l'on ne peut distinguer 'blanc_1' de 'blanc_0', on augmente la periode... */ \ Eblock \ ATes \ Bblock \ EGAL(on_a_trouve_la_periode_d_attenuation_des_trainees,VRAI); \ /* Des que l'on ne peut distinguer 'blanc_1' de 'blanc_0', on connait la periode... */ \ Eblock \ ETes \ Eblock \ ETan \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ MISE_A_JOUR_D_UN_CUMUL_POUR_LE_CALCUL_DES_TRAINEES(TRAINEES_ROUGE,Image_ROUGE); \ MISE_A_JOUR_D_UN_CUMUL_POUR_LE_CALCUL_DES_TRAINEES(TRAINEES_VERTE,Image_VERTE); \ MISE_A_JOUR_D_UN_CUMUL_POUR_LE_CALCUL_DES_TRAINEES(TRAINEES_BLEUE,Image_BLEUE); \ /* Initialisation eventuelle du calcul des trainees... */ \ \ INITIALISATION_DU_ZOOM_AUTOMATIQUE; \ /* Mis sous cette forme le 20131114165226... */ \ Eblock \ /* Initialisation de la synthese d'image... */ #define INITIALISATION_DU_ZOOM_AUTOMATIQUE \ Bblock \ Test(IL_FAUT(zoom_automatique)) \ Bblock \ DEFV(Logical,INIT(on_a_trouve_le_rapport_de_zoom_automatique,FAUX)); \ /* A priori, on n'a pas encore trouve le rapport de zoom automatique. */ \ \ EGAL(rapport_automatique_du_zoom,zoom_automatique_maximal); \ /* Initialisation du processus. */ \ INITIALISATION_SYSTEMATIQUE_TRANSFORMATION; \ T_ZOOM(rapport_automatique_du_zoom); \ /* A cause de 'TRANSFORMATION_GEOMETRIQUE_3D_F?(...)' qui suivent... */ \ \ Tant(EST_FAUX(on_a_trouve_le_rapport_de_zoom_automatique)) \ Bblock \ DEFV(Float,INIT(Xf_BG,TRANSFORMATION_GEOMETRIQUE_3D_Fx(ASD2(espace_physique,origine,x) \ ,ASD2(espace_physique,origine,y) \ ,Z_de_calcul_du_zoom_automatique \ ,FZERO \ ) \ ) \ ); \ DEFV(Float,INIT(Yf_BG,TRANSFORMATION_GEOMETRIQUE_3D_Fy(ASD2(espace_physique,origine,x) \ ,ASD2(espace_physique,origine,y) \ ,Z_de_calcul_du_zoom_automatique \ ,FZERO \ ) \ ) \ ); \ DEFV(Float,INIT(Zf_BG,TRANSFORMATION_GEOMETRIQUE_3D_Fz(ASD2(espace_physique,origine,x) \ ,ASD2(espace_physique,origine,y) \ ,Z_de_calcul_du_zoom_automatique \ ,FZERO \ ) \ ) \ ); \ /* Definition du coin Bas-Gauche du plan de l'espace passant par le centre et exprime */ \ /* dans les coordonnees de l'univers. */ \ DEFV(Float,INIT(Xf_HD,TRANSFORMATION_GEOMETRIQUE_3D_Fx(ASD2(espace_physique,extremite,x) \ ,ASD2(espace_physique,extremite,y) \ ,Z_de_calcul_du_zoom_automatique \ ,FZERO \ ) \ ) \ ); \ DEFV(Float,INIT(Yf_HD,TRANSFORMATION_GEOMETRIQUE_3D_Fy(ASD2(espace_physique,extremite,x) \ ,ASD2(espace_physique,extremite,y) \ ,Z_de_calcul_du_zoom_automatique \ ,FZERO \ ) \ ) \ ); \ DEFV(Float,INIT(Zf_HD,TRANSFORMATION_GEOMETRIQUE_3D_Fz(ASD2(espace_physique,extremite,x) \ ,ASD2(espace_physique,extremite,y) \ ,Z_de_calcul_du_zoom_automatique \ ,FZERO \ ) \ ) \ ); \ /* Definition du coin Haut-Droite du plan de l'espace passant par le centre et exprime */ \ /* dans les coordonnees de l'univers. */ \ DEFV(Int,INIT(X_BG \ ,INTE(X_DE_VISUALISATION(Projection_OX(X_PHYSIQUE_DANS_01(Xf_BG) \ ,Y_PHYSIQUE_DANS_01(Yf_BG) \ ,Z_PHYSIQUE_DANS_01(Zf_BG) \ ) \ ) \ ) \ ) \ ); \ DEFV(Int,INIT(Y_BG \ ,INTE(Y_DE_VISUALISATION(Projection_OY(X_PHYSIQUE_DANS_01(Xf_BG) \ ,Y_PHYSIQUE_DANS_01(Yf_BG) \ ,Z_PHYSIQUE_DANS_01(Zf_BG) \ ) \ ) \ ) \ ) \ ); \ /* Definition du coin Bas-Gauche du plan de l'espace passant par le centre et exprime */ \ /* dans les coordonnees de l'image. */ \ DEFV(Int,INIT(X_HD \ ,INTE(X_DE_VISUALISATION(Projection_OX(X_PHYSIQUE_DANS_01(Xf_HD) \ ,Y_PHYSIQUE_DANS_01(Yf_HD) \ ,Z_PHYSIQUE_DANS_01(Zf_HD) \ ) \ ) \ ) \ ) \ ); \ DEFV(Int,INIT(Y_HD \ ,INTE(Y_DE_VISUALISATION(Projection_OY(X_PHYSIQUE_DANS_01(Xf_HD) \ ,Y_PHYSIQUE_DANS_01(Yf_HD) \ ,Z_PHYSIQUE_DANS_01(Zf_HD) \ ) \ ) \ ) \ ) \ ); \ /* Definition du coin Haut-Droite du plan de l'espace passant par le centre et exprime */ \ /* dans les coordonnees de l'image. */ \ \ Test(IFOU(TEST_HORS_IMAGE(X_BG,Y_BG),TEST_HORS_IMAGE(X_HD,Y_HD))) \ Bblock \ EGAL(rapport_automatique_du_zoom \ ,EXPB(SOUS(LOGX(rapport_automatique_du_zoom),finesse_de_calcul_du_zoom_automatique)) \ ); \ /* Tant que la diagonale de l'espace dans le plan central n'est pas entierement dans */ \ /* l'image, on reduit le rapport de zoom "automatique"... */ \ INITIALISATION_SYSTEMATIQUE_TRANSFORMATION; \ T_ZOOM(rapport_automatique_du_zoom); \ /* Tout ceci afin de ne pas cumuler tout les rapports de zoom successifs... */ \ Eblock \ ATes \ Bblock \ EGAL(on_a_trouve_le_rapport_de_zoom_automatique,VRAI); \ /* Des que la diagonale de l'espace dans le plan central est entierement contenue dans */ \ /* l'image, on s'arrete sur ce rapport de zoom. */ \ Eblock \ ETes \ Eblock \ ETan \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Initialisation du zoom automatique (introduite sous cette forme "separee" le */ \ /* 20131114165226 pour 'v $xrv/particule.10$K INITIALISATION_DU_ZOOM_AUTOMATIQUE'). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I N I T I A L I S A T I O N S R E L A T I V E S A C H A Q U E N O U V E L L E I M A G E : */ /* */ /*************************************************************************************************************************************/ #define INITIALISATION_DE_BASE_DES_TROIS_COMPOSANTES_D_UNE_IMAGE \ Bblock \ Test(IL_FAUT(generer_un_effet_de_brume)) \ Bblock \ CALi(Iblanc(Image_ROUGE)); \ CALi(Iblanc(Image_VERTE)); \ CALi(Iblanc(Image_BLEUE)); \ /* Nettoyage : fond BLANC lorsqu'un effet de brume est demande (cette initialisation est due */ \ /* au fait qu'apres l'application de la brume, le fond de l'image sera blanc ; afin que le */ \ /* traitement de l'aliasing soit correct, il faut que le fond initial de l'image utilise */ \ /* pour tracer les spheres soit aussi celui de la version finale des images...). */ \ Eblock \ ATes \ Bblock \ CALi(Inoir(Image_ROUGE)); \ CALi(Inoir(Image_VERTE)); \ CALi(Inoir(Image_BLEUE)); \ /* Nettoyage : fond NOIR lorsqu'un effet de brume n'est pas demande. */ \ Eblock \ ETes \ Eblock \ /* Initialisation de base des trois composantes de l'image a generer... */ #ifdef __VERSION__PERMETTRE_L_UTILISATION_D_UN_FOND /* Le nom 'PERMETTRE_L_UTILISATION_D_UN_FOND' a ete change le 20030313152029 en */ /* '__VERSION__PERMETTRE_L_UTILISATION_D_UN_FOND' afin de permettre sa recuperation */ /* dans 'v $xcc/cpp$Z _VERSION_'. */ # define METTRE_UN_FOND \ FAUX # define INVERSER_LE_FOND \ FAUX # define LE_FOND_EST_DYNAMIQUE \ FAUX # define FACTEUR_DU_FOND \ FU # define TRANSLATION_DU_FOND \ FZERO # define LE_FOND_A_UN_Z_BUFFER \ FAUX # define DONNEES_NECESSAIRES_A_L_UTILISATION_D_UN_FOND \ DEFV(Logical,INIT(mettre_un_fond,METTRE_UN_FOND)); \ /* Indique s'il faut mettre ('VRAI') ou pas ('FAUX') un fond derriere chaque image generee. */ \ DEFV(Logical,INIT(inverser_le_fond,INVERSER_LE_FOND)); \ /* Indique, lorsque 'IL_FAUT(mettre_un_fond)', si le fond doit etre inverse ('VRAI') ou */ \ /* pas ('FAUX'). */ \ DEFV(Logical,INIT(le_fond_est_dynamique,LE_FOND_EST_DYNAMIQUE)); \ /* Indique, lorsqu'un fond est demande, si celui-ci est statique ('FAUX'), c'est-a-dire */ \ /* n'evolue pas d'image en image, ou bien est dynamique ('VRAI'), et donc est lui-meme */ \ /* constitue d'une suite d'images. Cet indicateur controle aussi le 'Z-Buffer' eventuel. */ \ DEFV(Float,INIT(facteur_du_fond,FACTEUR_DU_FOND)); \ DEFV(Float,INIT(translation_du_fond,TRANSLATION_DU_FOND)); \ /* Indique respectivement le facteur et la translation du fond... */ \ DEFV(CHAR,INIC(POINTERc(nom_imageF),NOM_PIPE)); \ /* Nom du fond a utiliser eventuellement derriere chaque image generee. */ \ DEFV(Logical,INIT(le_fond_a_un_Z_Buffer,LE_FOND_A_UN_Z_BUFFER)); \ /* Indique si le fond possede un 'Z-Buffer' ('VRAI') ou pas ('FAUX'). */ \ DEFV(CHAR,INIC(POINTERc(nom_imageZF),NOM_PIPE)); \ /* Nom du 'Z-Buffer' du fond a utiliser eventuellement. L'indicateur 'le_fond_est_dynamique' */ \ /* s'applique a lui aussi... */ # define NOM_D_UNE_COMPOSANTE_DU_FOND(numero_image,composante) \ COND(EST_VRAI(le_fond_est_dynamique) \ ,chain_Aconcaten3_sauf_nom_pipe(nom_imageF \ ,NUMERO_IMAGE(numero_image) \ ,composante \ ) \ ,chain_Aconcaten2_sauf_nom_pipe(nom_imageF \ ,composante \ ) \ ) \ /* Generation du nom d'une composante du fond... */ # define CHARGEMENT_D_UNE_COMPOSANTE_DU_FOND(generer_la_composante,fond_Image,numero_image,composante) \ Bblock \ Test(IFET(IL_FAUT(generer_la_composante) \ ,PAS_D_ERREUR(CODE_ERROR(Iload_image(fond_Image \ ,NOM_D_UNE_COMPOSANTE_DU_FOND(numero_image,composante) \ ) \ ) \ ) \ ) \ ) \ Bblock \ Test(IL_FAUT(inverser_le_fond)) \ Bblock \ CALi(Icomplementation(fond_Image,fond_Image)); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ CALi(Inoir(fond_Image)); \ Eblock \ ETes \ Eblock \ /* Chargement d'une composante du fond avec initialisation en cas d'erreur... */ # define INITIALISATION_DES_TROIS_COMPOSANTES_D_UNE_IMAGE(numero_image) \ Bblock \ INITIALISATION_DE_BASE_DES_TROIS_COMPOSANTES_D_UNE_IMAGE; \ /* Initialisation a priori (meme si un fond est necessaire, et ce au cas ou il n'existerait */ \ /* pas...). */ \ Test(IL_FAUT(mettre_un_fond)) \ Bblock \ BDEFV(image,fond_Image_ROUGE); \ BDEFV(image,fond_Image_VERTE); \ BDEFV(image,fond_Image_BLEUE); \ /* Definition des trois fonds a charger... */ \ \ CHARGEMENT_D_UNE_COMPOSANTE_DU_FOND(generer_la_composante_ROUGE,fond_Image_ROUGE,numero_image,c_ROUGE); \ CHARGEMENT_D_UNE_COMPOSANTE_DU_FOND(generer_la_composante_VERTE,fond_Image_VERTE,numero_image,c_VERTE); \ CHARGEMENT_D_UNE_COMPOSANTE_DU_FOND(generer_la_composante_BLEUE,fond_Image_BLEUE,numero_image,c_BLEUE); \ /* Chargement du fond dynamique ou statique demande. */ \ \ CALS(Iscale(Image_ROUGE,facteur_du_fond,fond_Image_ROUGE,translation_du_fond)); \ CALS(Iscale(Image_VERTE,facteur_du_fond,fond_Image_VERTE,translation_du_fond)); \ CALS(Iscale(Image_BLEUE,facteur_du_fond,fond_Image_BLEUE,translation_du_fond)); \ /* Enfin, modification eventuelle du fond... */ \ \ EDEFV(image,fond_Image_BLEUE); \ EDEFV(image,fond_Image_VERTE); \ EDEFV(image,fond_Image_ROUGE); \ /* Definition des trois fonds a charger... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Initialisation des trois composantes de l'image a generer... */ #Aifdef __VERSION__PERMETTRE_L_UTILISATION_D_UN_FOND # define INITIALISATION_DES_TROIS_COMPOSANTES_D_UNE_IMAGE(numero_image) \ Bblock \ INITIALISATION_DE_BASE_DES_TROIS_COMPOSANTES_D_UNE_IMAGE; \ Eblock \ /* Initialisation des trois composantes de l'image a generer... */ #Eifdef __VERSION__PERMETTRE_L_UTILISATION_D_UN_FOND #define INITIALISATIONS_RELATIVES_A_CHAQUE_NOUVELLE_IMAGE(numero_image) \ Bblock \ Test(IL_FAUT(zoom_automatique)) \ Bblock \ Test(IFEQ(rapport_automatique_du_zoom,FLOT__UNDEF)) \ Bblock \ PRINT_ATTENTION("le zoom automatique n'est pas disponible ici, il est donc desactive"); \ EGAL(zoom_automatique,FAUX); \ /* Dispositif introduit le 20110322120951 a cause de 'v $xrv/particule.10$K' qui n'utilise */ \ /* pas 'v $xrv/champs_5.17$I INITIALISATION_DE_LA_SYNTHESE_D_IMAGE' (comme beaucoup d'autres */ \ /* '$K' d'ailleurs...) et qui donc ne peut pas calculer automatiquement le rapport de zoom. */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ INITIALISATION_DES_TROIS_COMPOSANTES_D_UNE_IMAGE(numero_image); \ /* Initialisation des trois composantes de l'image a generer... */ \ \ SET_NOIR_PLANCHER(NOIR_PLANCHER); \ INITIALISATION_TRANSFORMATION; \ /* Initialisation de la transformation tri-dimensionnelle courante. */ \ SET_FACTEUR_D_ELOIGNEMENT_EN_Z_DE_L_OBSERVATEUR(facteur_en_Z_de_l_observateur); \ /* Facteur d'eloignement en 'Z' de l'observateur destine a une projection "standard"... */ \ \ CHANGEMENT_DU_POINT_DE_VUE; \ /* Positionnement de l'observateur. */ \ \ SET_DECALAGE_ANGULAIRE_DE_L_OBSERVATEUR(decalage_angulaire_pour_la_stereoscopie); \ /* Initialisation du facteur de rotation de l'observateur permettant ainsi de creer */ \ /* des paires stereoscopiques. ATTENTION, l'ordre suivant est imperatif : */ \ /* */ \ /* CHANGEMENT_DU_POINT_DE_VUE; */ \ /* SET_DECALAGE_ANGULAIRE_DE_L_OBSERVATEUR(...); */ \ /* */ \ /* car la premiere procedure peut changer 'decalage_angulaire_pour_la_stereoscopie' via la */ \ /* fonction 'vTRANSFORMAT_31(...,sSTEREOSCOPIE(...))'. */ \ \ PREPARATION_DE_L_INITIALISATION_DU_Z_BUFFER; \ /* Initialisation de la future valeur d'initialisation du 'Z-Buffer'... */ \ INITIALISATION_DE_LA_LISTE_DES_POINTS; \ /* (re-)initialisation de l'index de rangement dans la liste de tri des spheres... */ \ Eblock \ /* Initialisations necessaires avant le calcul et la generation de chaque nouvelle image. */