/*************************************************************************************************************************************/ /* */ /* M I S E E N M O N T A G N E D E L ' I M A G E A R G U M E N T : */ /* */ /* */ /* Definition : */ /* */ /* Cette commande genere une image */ /* dont le nom est le premier argument */ /* d'appel ; elle est le resultat de */ /* la mise en montagne de la deuxieme image. */ /* */ /* */ /* Author of '$xci/montagne.01$K' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 1987??????????). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I N T E R F A C E ' listG ' : */ /* */ /* */ /* :Debut_listG: */ /* :Fin_listG: */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D I R E C T I V E S S P E C I F I Q U E S D E C O M P I L A T I O N : */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* F I C H I E R S D ' I N C L U D E S : */ /* */ /*************************************************************************************************************************************/ #include INCLUDES_BASE #ifdef TYPE_DE_imageA_surface_VERSION_02 # include image_image_IMAGESF_EXT #Aifdef TYPE_DE_imageA_surface_VERSION_02 #Eifdef TYPE_DE_imageA_surface_VERSION_02 #include image_image_MONTAGNES_EXT /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* P A R A M E T R E S : */ /* */ /*************************************************************************************************************************************/ #define COMPATIBILITE_20131031 \ FAUX \ /* Permet d'assurer la compatibilite anterieure au 20131031074405 si besoin est... */ #ifdef TYPE_DE_imageA_surface_VERSION_02 # define LA_SURFACE_EST_UNE_IMAGE_STANDARD \ VRAI \ /* L'image "surface" est-elle une image 'image' ou une image 'imageF' ??? */ # define RENORMALISER_LA_SURFACE \ VRAI \ /* Lorsque l'image "surface" est une image 'imageF' faut-il la renormaliser ('VRAI') ou */ \ /* pas ('FAUX') ? */ # define CONSERVER_LE_ZERO \ VRAI \ /* En cas d'image 'imageF' doit-on conserver le zero ('VRAI') ou pas ('FAUX'). */ # define IL_FAUT_CALCULER_LES_EXTREMA_DES_IMAGES_NON_STANDARDS \ VRAI \ /* Dans le cas d'une image flottante faut-il calculer les extrema pour la conversion */ \ /* ('VRAI') ou les forcer ('FAUX') ? */ # define MINIMUM_FORCE \ FLOT__NOIR # define MAXIMUM_FORCE \ FLOT__BLANC /* Valeur forcee des extrema d'une image flottante lorsque les extrema ne sont pas a */ /* calculer ou lorsque des images 'Standard's sont a convertir en flottant... */ #define EPSILON_DE_SEUILLAGE_INFERIEUR \ RACX(EPSILON_DE_SEUILLAGE_INFERIEUR_PAR_RAPPORT_AU_NIVEAU_ORIGINE_POUR_IFnormalisation) \ /* Pour 'IFnormalisation_____epsilon_de_seuillage_inferieur_par_rapport_au_niveau_origine'. */ \ /* On utilise implicitement 'RACX(...)' afin de prevenir des "underflow" ulterieurs car, en */ \ /* effet, le resultat de l'eventuelle 'IFnormalisation(...)' va etre utilise dans des */ \ /* 'prdF3D(...)' ('v $xiii/montagnes$FON prdF3D.normale,rayon_lumineux.'). */ #Aifdef TYPE_DE_imageA_surface_VERSION_02 #Eifdef TYPE_DE_imageA_surface_VERSION_02 #define CHARGER_UN_FOND \ FAUX \ /* Pour charger un fond a placer en arriere-plan de la montagne. */ #define EFFACEMENT_PRELIMINAIRE \ FAUX \ /* Pour ne pas effacer initialement l'image a generer puisqu'on fait un 'Inoir()'. */ #define GENERER_LES_OMBRES_PORTEES \ VRAI \ /* Pour generer les ombres portees. */ #define LARGEUR_DE_LA_ZONE_DE_PENOMBRE \ FLOT(DOUZE) \ /* Largeur de la zone de penombre. */ #define FAIRE_DU_DEPTH_CUEING \ FAUX \ /* Pour ne pas faire du "depth-cueing". */ #define MINIMUM_DU_DEPTH_CUEING \ FZERO \ /* Pour que le "depth-cueing" soit maximal lorsqu'il est demande. */ #define VUE_D_AVION \ FAUX \ /* Pour voir la montagne en perspective. */ #define FAIRE_LE_TRAITEMENT_ANTI_ALIASING \ VRAI \ /* Pour faire le traitement anti-aliasing. */ #define ECHELLE_DU_CHAMP \ FU \ /* On laisse le champ invariant... */ #define X_TRANSLATION_DE_LA_MONTAGNE \ FZERO \ /* Translation horizontale, */ #define Y_TRANSLATION_DE_LA_MONTAGNE \ FDU \ /* Translation verticale, */ #define X_SOURCE_LUMINEUSE \ FLOT(HUIT) \ /* Abscisse de la source lumineuse (autrefois 6.4453), */ #define Y_SOURCE_LUMINEUSE \ FLOT(HUIT) \ /* Ordonnee de la source lumineuse (autrefois 2.7343). */ #define MEMORISER_LE_Z_BUFFER \ FAUX \ /* Indique si le 'Z-Buffer' doit etre fourni comme resultat ('VRAI'), ou bien oublie */ \ /* apres le calcul ('FAUX'). */ #define MEMORISER_LE_Z_BUFFER_COMME_UNE_IMAGE_STANDARD \ VRAI \ /* Indique si le 'Z-Buffer' est fourni comme resultat, si ce dernier doit etre fourni en */ \ /* tant qu'image standard ('VRAI') ou pas ('FAUX'). */ #define AIDER_AU_CADRAGE \ FAUX \ /* Indique si l'on doit editer les plus grandes ordonnees dans [0,1] rencontrees */ \ /* globalement et sur la 'last' ligne lors de la generation de la montagne. */ #define EDITER_LES_EXTREMA_DU_Z_Buffer \ FAUX \ /* Indique si l'on doit editer les extrema {Z_Buffer_____minimum,Z_Buffer_____maximum} du */ \ /* 'Z-Buffer' lorsque 'IL_FAUT(aider_au_cadrage)'. */ #define TRAITEMENT_ANTI_ALIASING_LES_LIGNES_DE_CRETE \ FAUX #define TRAITEMENT_ANTI_ALIASING_DES_LIGNES_DE_CRETE__ARGUMENTS_DE_DILATATION \ C_VIDE #define TRAITEMENT_ANTI_ALIASING_DES_LIGNES_DE_CRETE__ARGUMENTS_DE_CONVOLUTION \ C_VIDE /* Introduit le 20151208113024 afin de traiter ("anti-aliasing") les lignes de crete... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* M A C R O S U T I L E S : */ /* */ /*************************************************************************************************************************************/ #define imageSURFACE \ ImageA1 #define FimageSURFACE \ IFmageA /* Definition de la surface (introduit le 20151208113024). */ #define imageTEXTURE \ ImageA2 \ /* Definition de la texture (introduit le 20151208113024). */ #define imageZ_BUFFER \ ImageA3 \ /* Definition du 'Z-Buffer' (introduit le 20151208113024). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* E X E C U T I O N D E L A M I S E E N M O N T A G N E : */ /* */ /*************************************************************************************************************************************/ BCommande(nombre_d_arguments,arguments) /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(CHAR,INIC(POINTERc(nom_imageR),NOM_PIPE)); DEFV(CHAR,INIC(POINTERc(nom_imageF),NOM_PIPE)); DEFV(CHAR,INIC(POINTERc(nom_imageA),NOM_PIPE)); DEFV(CHAR,INIC(POINTERc(nom_imageT),NOM_PIPE)); DEFV(CHAR,INIC(POINTERc(nom_imageZ),NOM_PIPE)); DEFV(Logical,INIT(compatibilite_20131031,COMPATIBILITE_20131031)); /* Permet d'assurer la compatibilite anterieure au 20131031074405 si besoin est... */ #ifdef TYPE_DE_imageA_surface_VERSION_02 DEFV(Logical,INIT(la_surface_est_une_image_standard,LA_SURFACE_EST_UNE_IMAGE_STANDARD)); /* L'image "surface" est-elle une image 'image' ou une image 'imageF' ??? */ DEFV(Logical,INIT(renormaliser_la_surface,RENORMALISER_LA_SURFACE)); /* Lorsque l'image "surface" est une image 'imageF' faut-il la renormaliser ('VRAI') ou */ /* pas ('FAUX') ? */ DEFV(Logical,INIT(conserver_le_zero,CONSERVER_LE_ZERO)); /* En cas d'image 'imageF' doit-on conserver le zero ('VRAI') ou pas ('FAUX'). */ DEFV(Logical,INIT(il_faut_calculer_les_extrema_des_images_non_standards,IL_FAUT_CALCULER_LES_EXTREMA_DES_IMAGES_NON_STANDARDS)); /* Dans le cas d'une image flottante faut-il calculer les extrema pour la conversion */ /* ('VRAI') ou les forcer ('FAUX') ? */ DEFV(genere_Float,INIT(minimum_force,MINIMUM_FORCE)); DEFV(genere_Float,INIT(maximum_force,MAXIMUM_FORCE)); /* Valeur forcee des extrema d'une image flottante lorsque les extrema ne sont pas a */ /* calculer ou lorsque des images 'Standard's sont a convertir en flottant... */ #Aifdef TYPE_DE_imageA_surface_VERSION_02 #Eifdef TYPE_DE_imageA_surface_VERSION_02 DEFV(Float,INIT(echelle_du_champ,ECHELLE_DU_CHAMP)); /* Facteur d'echelle a appliquer a l'image Argument. */ DEFV(deltaF_2D,translation_de_la_montagne); /* Translation de la montagne dans l'image. */ DEFV(pointF_2D,source_lumineuse); /* Position de la source lumineuse. */ DEFV(Logical,INIT(charger_un_fond,CHARGER_UN_FOND)); /* Pour charger un fond a placer en arriere-plan de la montagne. */ DEFV(Logical,INIT(effacement_preliminaire,EFFACEMENT_PRELIMINAIRE)); /* Pour l'effacement initial de l'image Resultat. */ DEFV(Logical,INIT(generer_les_ombres_portees,GENERER_LES_OMBRES_PORTEES)); /* Pour mettre ou pas les ombres portees, */ DEFV(Float,INIT(largeur_de_la_zone_de_penombre,LARGEUR_DE_LA_ZONE_DE_PENOMBRE)); /* Largeur de la zone de penombre. */ DEFV(Logical,INIT(faire_du_depth_cueing,FAIRE_DU_DEPTH_CUEING)); /* Pour faire ou pas du "depth-cueing", */ DEFV(Float,INIT(minimum_du_depth_cueing,MINIMUM_DU_DEPTH_CUEING)); /* Pour ponderer dans [0,1] le "depth-cueing" : plus on est proche de */ /* zero, plus il est fort... */ DEFV(Logical,INIT(vue_d_avion,VUE_D_AVION)); /* Pour voir d'avion ou pas la montagne. */ DEFV(Logical,INIT(faire_le_traitement_anti_aliasing,FAIRE_LE_TRAITEMENT_ANTI_ALIASING)); /* Pour faire ou pas le traitement anti-aliasing. */ DEFV(Logical,INIT(memoriser_le_Z_Buffer,MEMORISER_LE_Z_BUFFER)); /* Indique si le 'Z-Buffer' doit etre fourni comme resultat ('VRAI'), ou bien oublie */ /* apres le calcul ('FAUX'). */ DEFV(Logical,INIT(memoriser_le_Z_Buffer_comme_une_image_standard,MEMORISER_LE_Z_BUFFER_COMME_UNE_IMAGE_STANDARD)); /* Indique si le 'Z-Buffer' est fourni comme resultat, si ce dernier doit etre fourni en */ /* tant qu'image standard ('VRAI') ou pas ('FAUX'). */ DEFV(Logical,INIT(aider_au_cadrage,AIDER_AU_CADRAGE)); /* Indique si l'on doit editer les plus grandes ordonnees dans [0,1] rencontrees */ /* globalement et sur la 'last' ligne lors de la generation de la montagne. */ DEFV(Logical,INIT(editer_les_extrema_du_Z_Buffer,EDITER_LES_EXTREMA_DU_Z_Buffer)); /* Indique si l'on doit editer les extrema {Z_Buffer_____minimum,Z_Buffer_____maximum} du */ /* 'Z-Buffer' lorsque 'IL_FAUT(aider_au_cadrage)'. */ DEFV(Logical,INIT(traitement_anti_aliasing_les_lignes_de_crete,TRAITEMENT_ANTI_ALIASING_LES_LIGNES_DE_CRETE)); DEFV(CHAR,INIC(POINTERc(traitement_anti_aliasing_des_lignes_de_crete__arguments_de_dilatation) ,TRAITEMENT_ANTI_ALIASING_DES_LIGNES_DE_CRETE__ARGUMENTS_DE_DILATATION ) ); DEFV(CHAR,INIC(POINTERc(traitement_anti_aliasing_des_lignes_de_crete__arguments_de_convolution) ,TRAITEMENT_ANTI_ALIASING_DES_LIGNES_DE_CRETE__ARGUMENTS_DE_CONVOLUTION ) ); /* Introduit le 20151208113024 afin de traiter ("anti-aliasing") les lignes de crete... */ /*..............................................................................................................................*/ EGAL(Z_Buffer_____valeur_initiale,VALEUR_INITIALE_DU_Z_BUFFER_POUR_LES_MONTAGNES); /* A priori, au cas ou le 'Z' serait interpole dans le 'Z-Buffer'... */ INITIALISATION_ACCROISSEMENT_2D(translation_de_la_montagne,X_TRANSLATION_DE_LA_MONTAGNE,Y_TRANSLATION_DE_LA_MONTAGNE); /* Initialisation par defaut de la translation de la montagne. */ INITIALISATION_POINT_2D(source_lumineuse,X_SOURCE_LUMINEUSE,Y_SOURCE_LUMINEUSE); /* Initialisation par defaut de la source lumineuse. */ #define GET_ARGUMENT_L_____Imontagnes_precises_____interpoler_le_Z_Buffer_lors_de_l_anti_aliasing \ "zbuffer_interpole=""zBuffer_interpole=""Zi=""Zbuffer_interpole=""ZBuffer_interpole=""Z-Buffer_interpole=" #define GET_ARGUMENT_L_____memoriser_le_Z_Buffer_comme_une_image_standard \ "zbuffer_standard=""zBuffer_standard=""Zbuffer_standard=""ZBuffer_standard=""Z-Buffer_standard=" /* Afin de raccourcir une ligne suivante (introduit le 20070223135715)... */ #ifdef TYPE_DE_imageA_surface_VERSION_01 GET_ARGUMENTSv(nombre_d_arguments ,BLOC(GET_ARGUMENT_L("compatibilite_20131031=",compatibilite_20131031); GET_ARGUMENT_L("Imontagnes_precises_____compatibilite_20061220=""compatibilite_20061220=" ,Imontagnes_precises_____compatibilite_20061220 ); /* Introduit le 20061220104910... */ GET_ARGUMENT_L("Imontagnes_precises_____compatibilite_20090130=""compatibilite_20090130=" ,Imontagnes_precises_____compatibilite_20090130 ); /* Introduit le 20090130182048... */ GET_ARGUMENT_L("Imontagnes_precises_____compatibilite_20090202=""compatibilite_20090202=" ,Imontagnes_precises_____compatibilite_20090202 ); /* Introduit le 20090202104006... */ GET_ARGUMENT_L("Imontagnes_precises_____compatibilite_20090203=""compatibilite_20090203=" ,Imontagnes_precises_____compatibilite_20090203 ); /* Introduit le 20090203155036... */ GET_ARGUMENT_L("Imontagnes_precises_____compatibilite_20100223=""compatibilite_20100223=" ,Imontagnes_precises_____compatibilite_20100223 ); /* Introduit le 20100223173603... */ GET_ARGUMENT_L("Imontagnes_precises_____compatibilite_20210928=""compatibilite_20210928=" ,Imontagnes_precises_____compatibilite_20210928 ); /* Introduit le 20210928141600... */ GET_ARGUMENT_L("Imontagnes_precises_____compatibilite_20211001=""compatibilite_20211001=" ,Imontagnes_precises_____compatibilite_20211001 ); /* Introduit le 20211001181008... */ GET_ARGUMENT_C("imageF=""F=",nom_imageF); GET_ARGUMENT_C("imageA=""A=",nom_imageA); GET_ARGUMENT_C("texture=""T=",nom_imageT); GET_ARGUMENT_C("imageR=""R=",nom_imageR); GET_ARGUMENT_C("imageZ=""Z=",nom_imageZ); GET_ARGUMENT_L("fond=",charger_un_fond); GET_ARGUMENT_L(GET_ARGUMENT_L_____Imontagnes_precises_____interpoler_le_Z_Buffer_lors_de_l_anti_aliasing ,Imontagnes_precises_____interpoler_le_Z_Buffer_lors_de_l_anti_aliasing ); GET_ARGUMENT_F("Z0=",Z_Buffer_____valeur_initiale); GET_ARGUMENT_L("zbuffer=""zBuffer=""Zbuffer=""ZBuffer=""Z-Buffer=",memoriser_le_Z_Buffer); GET_ARGUMENT_L(GET_ARGUMENT_L_____memoriser_le_Z_Buffer_comme_une_image_standard ,memoriser_le_Z_Buffer_comme_une_image_standard ); /* On notera le 20151208094749 que le 'Z-Buffer' en mode "standard", complemente et */ /* legerement dilate peut servir de noyau de convolution (via 'v $xci/convol.02$K') */ /* pour "anti-aliaser" les lignes de crete ('v $xiirc/VONK.72$M' a ce propos...). */ GET_ARGUMENT_F("Tx=",ASD1(translation_de_la_montagne,dx)); GET_ARGUMENT_F("Ty=",ASD1(translation_de_la_montagne,dy)); GET_ARGUMENT_F("sx=""Sx=",ASD1(source_lumineuse,x)); GET_ARGUMENT_F("sy=""Sy=",ASD1(source_lumineuse,y)); GET_ARGUMENT_L("effacement=""init=",effacement_preliminaire); GET_ARGUMENT_F("echelle=""e=",echelle_du_champ); GET_ARGUMENT_F("Tz=",Imontagnes_precises_____translation_de_la_coordonnee_Z_lors_d_une_vue_d_avion); /* Introduit le 20080214131153 lors de la regeneration de 'v $xiirf/PAYS.R5$M' pour laquelle */ /* 'facteur_d_echelle' est negatif ce qui provoquait alors des 'Zf' tous negatifs */ /* dans 'v $xiii/montagnes$FON TRACE_POINT_3D_VUE_D_AVION' et donc des points invisibles... */ GET_ARGUMENT_F("source_lumineuse_intensite_speculaire=""slis=""is=""speculaire=" ,Imontagnes_precises_____source_lumineuse_specularite ); /* Introduit le 20130101110056... */ GET_ARGUMENT_L("ombres=",generer_les_ombres_portees); GET_ARGUMENT_F("largeur_penombre=""penombre=",largeur_de_la_zone_de_penombre); GET_ARGUMENT_L("depth_cueing=""depth=",faire_du_depth_cueing); GET_ARGUMENT_F("minimum=""min_depth_cueing=""min=",minimum_du_depth_cueing); /* Le 20110223144930 furent introduits "depth_cueing=" et "min_depth_cueing="... */ GET_ARGUMENT_F("depthN=",Imontagnes_precises_____depth_cueing_ponderation_niveau); GET_ARGUMENT_F("depthX=",Imontagnes_precises_____depth_cueing_ponderation_coordonnee_X); GET_ARGUMENT_F("depthY=",Imontagnes_precises_____depth_cueing_ponderation_coordonnee_Y); GET_ARGUMENT_F("depthT=",Imontagnes_precises_____depth_cueing_translation); GET_ARGUMENT_L("avion=",vue_d_avion); GET_ARGUMENT_F("perspective=",Imontagnes_precises_____facteur_de_correction_perspective); GET_ARGUMENT_L("verification_perspective=""vp=" ,Imontagnes_precises_____verification_de_la_correction_perspective ); /* Introduit le 20170413103808... */ GET_ARGUMENT_L("alias=",faire_le_traitement_anti_aliasing); GET_ARGUMENT_F("fc=""facteur_cretes=",Imontagnes_precises_____facteur_profondeur_toutes_lignes_de_crete); /* Introduit le 20061220160522... */ GET_ARGUMENT_F("fc1=""facteur_cretes_1=" ,Imontagnes_precises_____facteur_1_interpolation_toutes_lignes_de_crete ); GET_ARGUMENT_F("fc2=""facteur_cretes_2=" ,Imontagnes_precises_____facteur_2_interpolation_toutes_lignes_de_crete ); /* Introduit le 20061220120334 et etendu le 20061220134944 a deux facteurs... */ GET_ARGUMENT_L("interpoler=",Imontagnes_precises_____interpoler_les_lignes_de_crete_sur_la_montagne); GET_ARGUMENT_L("falaise=",Imontagnes_precises_____visualiser_la_falaise_avant_de_la_montagne); GET_ARGUMENT_F("idv=",Imontagnes_precises_____importance_du_decalage_vertical); GET_ARGUMENT_L("aide_cadrage=""cadrage=""aide=",aider_au_cadrage); GET_ARGUMENT_L("Zextrema=",editer_les_extrema_du_Z_Buffer); GET_ARGUMENT_L("anti_aliasing_lignes_crete=""aalc=",traitement_anti_aliasing_les_lignes_de_crete); GET_ARGUMENT_C("arguments_dilatation=""ad=" ,traitement_anti_aliasing_des_lignes_de_crete__arguments_de_dilatation ); GET_ARGUMENT_C("arguments_convolution=""ac=" ,traitement_anti_aliasing_des_lignes_de_crete__arguments_de_convolution ); /* Introduits le 20151208113024... */ ) ); #Aifdef TYPE_DE_imageA_surface_VERSION_01 #Eifdef TYPE_DE_imageA_surface_VERSION_01 #ifdef TYPE_DE_imageA_surface_VERSION_02 EGAL(IFnormalisation_____epsilon_de_seuillage_inferieur_par_rapport_au_niveau_origine,EPSILON_DE_SEUILLAGE_INFERIEUR); GET_ARGUMENTSv(nombre_d_arguments ,BLOC(GET_ARGUMENT_L("compatibilite_20131031=",compatibilite_20131031); GET_ARGUMENT_L("Imontagnes_precises_____compatibilite_20061220=""compatibilite_20061220=" ,Imontagnes_precises_____compatibilite_20061220 ); /* Introduit le 20061220104910... */ GET_ARGUMENT_L("Imontagnes_precises_____compatibilite_20090130=""compatibilite_20090130=" ,Imontagnes_precises_____compatibilite_20090130 ); /* Introduit le 20090130182048... */ GET_ARGUMENT_L("Imontagnes_precises_____compatibilite_20090202=""compatibilite_20090202=" ,Imontagnes_precises_____compatibilite_20090202 ); /* Introduit le 20090202104006... */ GET_ARGUMENT_L("Imontagnes_precises_____compatibilite_20090203=""compatibilite_20090203=" ,Imontagnes_precises_____compatibilite_20090203 ); /* Introduit le 20090203155036... */ GET_ARGUMENT_L("Imontagnes_precises_____compatibilite_20100223=""compatibilite_20100223=" ,Imontagnes_precises_____compatibilite_20100223 ); /* Introduit le 20100223173603... */ GET_ARGUMENT_L("Imontagnes_precises_____compatibilite_20210928=""compatibilite_20210928=" ,Imontagnes_precises_____compatibilite_20210928 ); /* Introduit le 20210928141600... */ GET_ARGUMENT_L("Imontagnes_precises_____compatibilite_20211001=""compatibilite_20211001=" ,Imontagnes_precises_____compatibilite_20211001 ); /* Introduit le 20211001181008... */ GET_ARGUMENT_C("imageF=""F=",nom_imageF); GET_ARGUMENT_C("imageA=""A=",nom_imageA); GET_ARGUMENT_C("texture=""T=",nom_imageT); GET_ARGUMENT_C("imageR=""R=",nom_imageR); GET_ARGUMENT_C("imageZ=""Z=",nom_imageZ); GET_ARGUMENT_L("standard=",la_surface_est_une_image_standard); GET_ARGUMENT_L("rn=""renormaliser=",renormaliser_la_surface); GET_ARGUMENT_L("zero=",conserver_le_zero); GET_ARGUMENT_L("extrema=",il_faut_calculer_les_extrema_des_images_non_standards); GET_ARGUMENT_F("minimum_force=",minimum_force); GET_ARGUMENT_F("maximum_force=",maximum_force); GET_ARGUMENT_L("fond=",charger_un_fond); GET_ARGUMENT_L(GET_ARGUMENT_L_____Imontagnes_precises_____interpoler_le_Z_Buffer_lors_de_l_anti_aliasing ,Imontagnes_precises_____interpoler_le_Z_Buffer_lors_de_l_anti_aliasing ); GET_ARGUMENT_F("Z0=",Z_Buffer_____valeur_initiale); GET_ARGUMENT_L("zbuffer=""zBuffer=""Zbuffer=""ZBuffer=""Z-Buffer=",memoriser_le_Z_Buffer); GET_ARGUMENT_L(GET_ARGUMENT_L_____memoriser_le_Z_Buffer_comme_une_image_standard ,memoriser_le_Z_Buffer_comme_une_image_standard ); GET_ARGUMENT_F("Tx=",ASD1(translation_de_la_montagne,dx)); GET_ARGUMENT_F("Ty=",ASD1(translation_de_la_montagne,dy)); /* On notera le 20150112124927 que "Ty=", "perspective=" et "echelle=" ne sont bien */ /* "homothetiques" (lors d'un changement de format) que si les valeurs contenues dans */ /* le fichier 'nom_imageA' sont bien dans [0,1]. Des difficultes liees a des bornes */ /* differentes ont ete rencontrees lors de la generation de l'image 'v $xiirv/CHAR.12$M', */ /* le probleme venant surtout de 'v $xiii/montagnes$FON 013313_013824'... */ GET_ARGUMENT_F("sx=""sX=""Sx=""SX=",ASD1(source_lumineuse,x)); GET_ARGUMENT_F("sy=""sY=""Sy=""SY=",ASD1(source_lumineuse,y)); GET_ARGUMENT_L("effacement=""init=",effacement_preliminaire); GET_ARGUMENT_F("echelle=""e=",echelle_du_champ); /* On notera le 20150112124927 que "Ty=", "perspective=" et "echelle=" ne sont bien */ /* "homothetiques" (lors d'un changement de format) que si les valeurs contenues dans */ /* le fichier 'nom_imageA' sont bien dans [0,1]. Des difficultes liees a des bornes */ /* differentes ont ete rencontrees lors de la generation de l'image 'v $xiirv/CHAR.12$M', */ /* le probleme venant surtout de 'v $xiii/montagnes$FON 013313_013824'... */ GET_ARGUMENT_F("Tz=",Imontagnes_precises_____translation_de_la_coordonnee_Z_lors_d_une_vue_d_avion); /* Introduit le 20080214131153 lors de la regeneration de 'v $xiirf/PAYS.R5$M' pour laquelle */ /* 'facteur_d_echelle' est negatif ce qui provoquait alors des 'Zf' tous negatifs */ /* dans 'v $xiii/montagnes$FON TRACE_POINT_3D_VUE_D_AVION' et donc des points invisibles... */ GET_ARGUMENT_F("source_lumineuse_intensite_speculaire=""slis=""is=""speculaire=" ,Imontagnes_precises_____source_lumineuse_specularite ); /* Introduit le 20130101110056... */ GET_ARGUMENT_L("ombres=",generer_les_ombres_portees); GET_ARGUMENT_F("largeur_penombre=""penombre=",largeur_de_la_zone_de_penombre); GET_ARGUMENT_F("attenuation=",Imontagnes_precises_____facteur_d_attenuation_a_l_ombre); GET_ARGUMENT_F("Nminimum=",minimum_normalise_du_cosinus_d_une_normale); GET_ARGUMENT_F("Nmaximum=",maximum_normalise_du_cosinus_d_une_normale); GET_ARGUMENT_L("depth_cueing=""depth=",faire_du_depth_cueing); GET_ARGUMENT_F("minimum=""min_depth_cueing=""min=",minimum_du_depth_cueing); /* Le 20110223144930 furent introduits "depth_cueing=" et "min_depth_cueing="... */ GET_ARGUMENT_F("Adepth_cueing=""Adepth=""Ad=",Imontagnes_precises_____Ay_reduit); GET_ARGUMENT_F("Bdepth_cueing=""Bdepth=""Bd=",Imontagnes_precises_____By_reduit); /* Introduits le 20140627115805 afin de pouvoir, par exemple, inverser le "depth-cueing"... */ GET_ARGUMENT_F("depthN=",Imontagnes_precises_____depth_cueing_ponderation_niveau); GET_ARGUMENT_F("depthX=",Imontagnes_precises_____depth_cueing_ponderation_coordonnee_X); GET_ARGUMENT_F("depthY=",Imontagnes_precises_____depth_cueing_ponderation_coordonnee_Y); GET_ARGUMENT_F("depthT=",Imontagnes_precises_____depth_cueing_translation); GET_ARGUMENT_L("avion=",vue_d_avion); GET_ARGUMENT_F("perspective=",Imontagnes_precises_____facteur_de_correction_perspective); /* On notera le 20150112124927 que "Ty=", "perspective=" et "echelle=" ne sont bien */ /* "homothetiques" (lors d'un changement de format) que si les valeurs contenues dans */ /* le fichier 'nom_imageA' sont bien dans [0,1]. Des difficultes liees a des bornes */ /* differentes ont ete rencontrees lors de la generation de l'image 'v $xiirv/CHAR.12$M', */ /* le probleme venant surtout de 'v $xiii/montagnes$FON 013313_013824'... */ GET_ARGUMENT_L("verification_perspective=""vp=" ,Imontagnes_precises_____verification_de_la_correction_perspective ); /* Introduit le 20170413103808... */ GET_ARGUMENT_L("alias=",faire_le_traitement_anti_aliasing); GET_ARGUMENT_F("fc=""facteur_cretes=",Imontagnes_precises_____facteur_profondeur_toutes_lignes_de_crete); /* Introduit le 20061220160522... */ GET_ARGUMENT_F("fc1=""facteur_cretes_1=" ,Imontagnes_precises_____facteur_1_interpolation_toutes_lignes_de_crete ); GET_ARGUMENT_F("fc2=""facteur_cretes_2=" ,Imontagnes_precises_____facteur_2_interpolation_toutes_lignes_de_crete ); /* Introduit le 20061220120334 et etendu le 20061220134944 a deux facteurs... */ GET_ARGUMENT_L("interpoler=",Imontagnes_precises_____interpoler_les_lignes_de_crete_sur_la_montagne); GET_ARGUMENT_L("falaise=",Imontagnes_precises_____visualiser_la_falaise_avant_de_la_montagne); GET_ARGUMENT_F("idv=",Imontagnes_precises_____importance_du_decalage_vertical); GET_ARGUMENT_L("aide_cadrage=""cadrage=""aide=",aider_au_cadrage); GET_ARGUMENT_L("Zextrema=",editer_les_extrema_du_Z_Buffer); GET_ARGUMENT_P("noir=""NOIR=",noir_plancher_substitution); GET_ARGUMENT_I("pas_falaise=",pas_entre_CLIPPING_INTENSITE_et_MIN_INTENSITE); GET_ARGUMENT_F("epsilon=",IFnormalisation_____epsilon_de_seuillage_inferieur_par_rapport_au_niveau_origine); GET_ARGUMENT_L("anti_aliasing_lignes_crete=""aalc=",traitement_anti_aliasing_les_lignes_de_crete); GET_ARGUMENT_C("arguments_dilatation=""ad=" ,traitement_anti_aliasing_des_lignes_de_crete__arguments_de_dilatation ); GET_ARGUMENT_C("arguments_convolution=""ac=" ,traitement_anti_aliasing_des_lignes_de_crete__arguments_de_convolution ); /* Introduits le 20151208113024... */ GET_ARGUMENT_L("editer_Z=""eZ=",Itrace_segment_vertical_____editer_la_coordonnee_Z_d_un_point); GET_ARGUMENT_I("point_X=""pX=" ,Itrace_segment_vertical_____coordonnee_X_du_point_dont_on_veut_la_coordonnee_Z ); GET_ARGUMENT_I("point_Y=""pY=" ,Itrace_segment_vertical_____coordonnee_Y_du_point_dont_on_veut_la_coordonnee_Z ); /* Introduits le 20240330120932 pour faire des tests. Voici un exemple d'utilisation : */ /* */ /* Squ */ /* v $xiirv/PIPO.U1$m */ /* */ /* Le curseur pointant sur un pic "9" (entre "27" et "50") donne : */ /* */ /* curseur=(+1372.000000,+1010.000000) */ /* */ /* On communique ensuite aux differents '$xci/montagne.01$X' les arguments suivants : */ /* */ /* editer_Z=VRAI pX=1372 pY=1010 */ /* */ /* qui donne : */ /* */ /* Y(OrigineVecteur)=1074 Y(ExtremiteVecteur)=1075 */ /* X=1372 Y=1010 Z=1075 */ /* ---- ---- */ /* /\ /\ */ /* || || */ /* Puis : || -------------------------------- */ /* || | */ /* ------------------------------------ | */ /* | | */ /* | | */ /* | | */ /* v $xiirv/PIPO.U1$M | | */ /* | | */ /* le curseur pointant sur le sommet du meme pic "9" donne : | | */ /* | | */ /* curseur=(+1372.000000,+1075.000000) | | */ /* | | */ /* soit : | | */ /* | | */ /* X=1372 <----------------------------- | */ /* Y=1075 <--------------------------------------- */ /* */ /* et ainsi, le sommet du pic est a l'ordonnee Y=1075 du plan de l'image, ce qui correspond */ /* bien a la hauteur Z=1075 du pic utilise pour le test... */ ) ); #Aifdef TYPE_DE_imageA_surface_VERSION_02 #Eifdef TYPE_DE_imageA_surface_VERSION_02 #undef GET_ARGUMENT_L_____Imontagnes_precises_____interpoler_le_Z_Buffer_lors_de_l_anti_aliasing #undef GET_ARGUMENT_L_____memoriser_le_Z_Buffer_comme_une_image_standard CALi(Inoir(ImageR)); /* Initialisation de l'image Resultat. */ Test(IFEQ_chaine(nom_imageR,NOM_PIPE)) Bblock Test(IL_FAUT(traitement_anti_aliasing_les_lignes_de_crete)) /* Test introduit le 20151208113024... */ Bblock PRINT_ATTENTION("pour l'anti-aliasing de crete, l'image Resultat ne peut pas etre le 'pipe', on y renonce donc."); /* En effet, lors du traiement "anti-alising" des lignes de crete, le nom 'nom_imageR' */ /* sert dans 'convol.02' alors que le "pipe" est deja utilise pour le dialogue entre */ /* 'eor' et ce meme 'convol.02', d'ou un conflit... */ EGAL(traitement_anti_aliasing_les_lignes_de_crete,FAUX); Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes #ifdef TYPE_DE_imageA_surface_VERSION_01 Test(PAS_D_ERREUR(CODE_ERROR(Iload_image(imageSURFACE,nom_imageA)))) #Aifdef TYPE_DE_imageA_surface_VERSION_01 #Eifdef TYPE_DE_imageA_surface_VERSION_01 #ifdef TYPE_DE_imageA_surface_VERSION_02 Test(PAS_D_ERREUR(CODE_ERROR(COND(EST_VRAI(la_surface_est_une_image_standard) ,Iload_image(imageSURFACE,nom_imageA) ,IloadF_image(FimageSURFACE,nom_imageA) ) ) ) ) #Aifdef TYPE_DE_imageA_surface_VERSION_02 #Eifdef TYPE_DE_imageA_surface_VERSION_02 /* Chargement de l'image a transformer. */ Bblock Test(PAS_D_ERREUR(CODE_ERROR(Iload_image(imageTEXTURE,nom_imageT)))) /* Chargement de la texture. */ Bblock Test(IL_FAUT(Imontagnes_precises_____interpoler_le_Z_Buffer_lors_de_l_anti_aliasing)) Bblock Test(IFNE(Z_Buffer_____valeur_initiale,VALEUR_INITIALE_DU_Z_BUFFER_POUR_LES_MONTAGNES)) Bblock PRINT_ATTENTION("la valeur d'initialisation du 'Z-Buffer' n'est pas compatible avec un effet de brume"); Test(IL_FAUT(compatibilite_20131031)) Bblock EGAL(Z_Buffer_____valeur_initiale,VALEUR_INITIALE_DU_Z_BUFFER_POUR_LES_MONTAGNES); /* Dans le cas ou le 'Z' va etre interpole dans le 'Z-Buffer', il est important que la */ /* valeur d'initialisation de ce dernier soit la bonne... */ /* */ /* Je note le 20131030082449 que si l'image 'nom_imageA' contient des valeurs negatives */ /* (et donc inferieures a 'VALEUR_INITIALE_DU_Z_BUFFER_POUR_LES_MONTAGNES'), alors il y */ /* aura des "trous" dans la surface. Cela s'est vu a cette date lors de la generation des */ /* images du type 'v $xiirf/PAYU.F4$m p=$xiP/gris.01' et a impose l'utilisation de : */ /* */ /* renormaliser=VRAI */ /* */ /* D'ou la modification du 20131031074405... */ Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes CALS(Iinit_Z_Buffer()); /* Initialisation standard du 'Z-Buffer'. */ Test(IL_FAUT(charger_un_fond)) Bblock Test(PAS_D_ERREUR(CODE_ERROR(Iload_image(ImageR,nom_imageF)))) Bblock EGAL(effacement_preliminaire,FAUX); /* Pour ne surtout pas effacer l'image Resultat. */ Eblock ATes Bblock Test__CODE_ERREUR__ERREUR07; Eblock ETes Eblock ATes Bblock Eblock ETes #ifdef TYPE_DE_imageA_surface_VERSION_01 CALS(Imontagnes(ImageR ,echelle_du_champ,imageSURFACE ,imageTEXTURE ,effacement_preliminaire ,ADRESSE(translation_de_la_montagne) ,generer_les_ombres_portees,largeur_de_la_zone_de_penombre,ADRESSE(source_lumineuse) ,faire_du_depth_cueing,minimum_du_depth_cueing ,vue_d_avion ,faire_le_traitement_anti_aliasing ) ); #Aifdef TYPE_DE_imageA_surface_VERSION_01 #Eifdef TYPE_DE_imageA_surface_VERSION_01 #ifdef TYPE_DE_imageA_surface_VERSION_02 Test(EST_VRAI(la_surface_est_une_image_standard)) Bblock /* Cas d'une image 'image' : */ CALS(Imontagnes(ImageR ,echelle_du_champ,imageSURFACE ,imageTEXTURE ,effacement_preliminaire ,ADRESSE(translation_de_la_montagne) ,generer_les_ombres_portees,largeur_de_la_zone_de_penombre,ADRESSE(source_lumineuse) ,faire_du_depth_cueing,minimum_du_depth_cueing ,vue_d_avion ,faire_le_traitement_anti_aliasing ) ); Eblock ATes Bblock /* Cas d'une image 'imageF' : */ Test(IL_NE_FAUT_PAS(renormaliser_la_surface)) Bblock CALS(IFmove(IFmageR,FimageSURFACE)); /* Cas ou la surface n'est pas renormalisee... */ Eblock ATes Bblock DEFV(genere_Float,INIT(nivo_minimum,minimum_force)); DEFV(genere_Float,INIT(nivo_maximum,maximum_force)); /* Niveaux extrema de la surface. */ Test(EST_VRAI(il_faut_calculer_les_extrema_des_images_non_standards)) Bblock CALS(IFnivo_extrema(FimageSURFACE,ADRESSE(nivo_minimum),ADRESSE(nivo_maximum))); Eblock ATes Bblock Eblock ETes Test(IL_FAUT(conserver_le_zero)) Bblock CALS(IFnormalisation_avec_le_vrai_zero(IFmageR,FimageSURFACE,nivo_minimum,nivo_maximum)); /* Cas ou la surface est renormalisee en conservant le vrai zero... */ Eblock ATes Bblock CALS(IFnormalisation(IFmageR,FimageSURFACE,nivo_minimum,nivo_maximum)); /* Cas ou la surface est renormalisee... */ Eblock ETes Eblock ETes CALS(Imontagnes_precises(ImageR ,echelle_du_champ,IFmageR ,imageTEXTURE ,effacement_preliminaire ,ADRESSE(translation_de_la_montagne) ,generer_les_ombres_portees,largeur_de_la_zone_de_penombre,ADRESSE(source_lumineuse) ,faire_du_depth_cueing,minimum_du_depth_cueing ,vue_d_avion ,faire_le_traitement_anti_aliasing ) ); Eblock ETes #Aifdef TYPE_DE_imageA_surface_VERSION_02 #Eifdef TYPE_DE_imageA_surface_VERSION_02 CALi(Iupdate_image(nom_imageR,ImageR)); Test(IL_FAUT(memoriser_le_Z_Buffer)) Bblock Test(IL_FAUT(memoriser_le_Z_Buffer_comme_une_image_standard)) Bblock CALS(Ifloat_std_du_Z_Buffer(ImageA)); /* Conversion du 'Z-Buffer' en une image "standard"... */ CALi(Iupdate_image(nom_imageZ,ImageA)); Eblock ATes Bblock CALi(IupdateF_image(nom_imageZ,Z_Buffer)); Eblock ETes Eblock ATes Bblock Eblock ETes Test(IL_FAUT(aider_au_cadrage)) Bblock CAL3(Prme3("%+.^^^ %+.^^^ Ty=%+.^^^\n" ,Itrace_segment_vertical_____plus_grande_ordonnee_sur_la_montagne ,Itrace_segment_vertical_____plus_grande_ordonnee_sur_la_last_ligne_de_la_montagne ,SOUS(ASD1(translation_de_la_montagne,dy) ,Itrace_segment_vertical_____plus_grande_ordonnee_sur_la_last_ligne_de_la_montagne ) ) ); /* Edition des plus grandes ordonnees denormalisees : */ /* */ /* */ /* :#-* --...................................................... */ /* :--o#** o-##o plus grande */ /* -:.+-##o#+-*+#+#*o ordonnee sur */ /* o -:.:+#-*+o:o-**o:*+ la montagne */ /* o*.--*-#-###-*-o*oo*#* - o */ /* ##*#:-:-*o++#+*o-*+*#**oo. :+-*-- */ /* ##-#o-:-*--****+o+*o#++*+o++# +* .+#++:- */ /* +*oo#*.:--*+*#*o-o-##o*-o**-+#### +####:+#*+* o -+**+.-: */ /* *#o-#*-:+-o+#+##o#-o###-o#*-o*+-:-:-++:#o*#o**o*oo+*++-###+o-:*: */ /* --#####*oo*o:+-#o#*o+##o**+o+*+-+.**:o+##--:o--#+:#:-++o:*oo:#:- */ /* o-###+o+#*##--**oo#*o*##o**+++::::--+-o*:##+o*-*++*---++o*#++o:- */ /* o+#-o#o#o*#*-**o*oo*o*#o##oo*o:..:o---*-:-#ooooo:o*-#:o*oo#:#**: */ /* *+o###-#-**+oo#****#-*o##--*oo.:.:-.+++-+***o*o+o:o*-*+o+*#:+-:+ */ /* ##**###+###+***#*-++****o#+*o:::.-::.o+++---*:::--#-***+o++++-+# */ /* **##+#:-#**+--#oo#-o+*+-#*#+---::::.-----:#:o-.--*##*#:-##++:+o: */ /* o+#o*-*+*ooo*+*#o*#*o**+-#*o+:::..-:-+-o#:o-::--:o**o+**+*-*#:#- */ /* o*#*#+#*o#*#o**##-*##-*#:##*-::..+::-#++:::::-.-:*+:**+*:--o-+o# */ /* +++*####o+*#*+o+*++*#o#*##*#:.+*oo:o#*-++-::.-:--*ooo#*+..+:o##- */ /* o++o###*####*o##o:+o*#+*-#o*--:-+#:.::*-o+-#::-+++o:##+**::*o#+o */ /* o+o:*o#o-#*--*#+-::+#**oo+#+-.:+o#.#-#+##***++:#-o-*o:-+-:+#-o++ */ /* o+o-o***##+#*-*#-:+#o#*o#---::-.+o++*o**o-*#-.+#:::*-:-o:+-#*o+: */ /* **.*-o##o*#**-:-#-######o+:+.....++++o*##:*-*+#oo.::.+.+-:o*+o*+ */ /* o+oo:##**##o:#*#-*#o#o#***+::...-:o+:-##:**+*-#+o+-:.:.-.-+o+#** */ /* #oo-:--*#+.-*#*#:-***oo*#+::...:++o:-oo#:*oo#-#*-::.....:o+o#oo: */ /* #o---.+:+##**o:oo#:--#*+oo-*+:.#-#*--+-*#*o:#*oo:-:::...::+-#+o# */ /* +#*:--:#+:+#-:*#-#*o##-o#+:*::o*o-#*:-+##*-#o++o--::##+:-::+#**+ */ /* -*:*-*o-o#*-:-+:-+*##o:#*-##o#***#o##.-*o## ........................... */ /* +o:----++*o--#+o#o:-+o#*###**+##*+#*o-:# +:o-#-::-+::+*oo## plus grande */ /* -...--o.#**--#o*-###*#-o#*o-+-*#*o+*-- #+:#**:++::o*:oo+ ordonnee sur */ /* *o+-+#o+-o+o*.+:.+o-###*#o#o*:-o#+*#: ###+---:-*++*#: la 'last' */ /* ligne de la */ /* montagne */ /* */ /* */ /* Le 20060105155204, le format "16g" est passe a "^^g" pour plus de souplesse... */ /* */ /* Le 20091123123248, le format "^^g" est passe a "^^^" pour plus de souplesse... */ /* */ /* Le 20151209113217, fut introduit l'edition de la valeur optimale de "Ty=" afin de voir */ /* le bas de la montagne, sans zones noires... */ Test(IL_FAUT(editer_les_extrema_du_Z_Buffer)) Bblock CAL3(Prme2("Zmin=%+.^^^ Zmax=%+.^^^\n" ,Z_Buffer_____minimum ,Z_Buffer_____maximum ) ); /* Edition des extrema du 'Z-Buffer'. */ /* */ /* Le 20060105155204, le format "16g" est passe a "^^g" pour plus de souplesse... */ /* */ /* Le 20091123123248, le format "^^g" est passe a "^^^" pour plus de souplesse... */ Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes Test(IL_FAUT(traitement_anti_aliasing_les_lignes_de_crete)) Bblock /* Test introduit le 20151208113024... */ DEFV(CHAR,INIC(POINTERc(nom_ZBuffer),generation_d_un_nom_absolu_dans_xT_temporaire(Gvar("Z_BUFFER")))); DEFV(CHAR,INIC(POINTERc(nom_ZBufferMasque),generation_d_un_nom_absolu_dans_xT_temporaire("MASQUE"))); DEFV(CHAR,INIC(POINTERc(nom_ZBufferDilate),generation_d_un_nom_absolu_dans_xT_temporaire("DILATE"))); DEFV(CHAR,INIC(POINTERc(nom_ZBufferErode),generation_d_un_nom_absolu_dans_xT_temporaire("ERODE"))); CALS(Ifloat_std_du_Z_Buffer(imageZ_BUFFER)); CALi(Iupdate_image(nom_ZBuffer,imageZ_BUFFER)); /* Conversion du 'Z-Buffer' en une image "standard" et sauvegarde... */ #define arguments_de_dilatation \ traitement_anti_aliasing_des_lignes_de_crete__arguments_de_dilatation #define arguments_de_convolution \ traitement_anti_aliasing_des_lignes_de_crete__arguments_de_convolution /* Afin de raccourcir des lignes a suivre... */ EXECUTION_D_UNE_SUITE_DE_COMMANDES_SOUS_SH (chain_Aconcaten11(GENERATION_NOM_D_UNE_COMMANDE_X(Direct_xci,"seuil") ," A=",nom_ZBuffer ," seuil=",chain_Aentier(NOIR) ,GENERATION_DE_formatI ,C_SH__REDIRECTION_PROGRAMME ,GENERATION_NOM_D_UNE_COMMANDE_X(Direct_xci,"complement") ," R=",nom_ZBufferMasque ,GENERATION_DE_formatI ) ); /* Creation, a partir du 'Z-Buffer" d'un masque binaire definissant tout ce qui est */ /* au-dessus des lignes de crete... */ EXECUTION_D_UNE_SUITE_DE_COMMANDES_SOUS_SH (chain_Aconcaten13(GENERATION_NOM_D_UNE_COMMANDE_X(Direct_xci,"dilate.01") ," A=",nom_ZBufferMasque ," dilater=VRAI"," circulaire=VRAI"," circulaire_optimale=VRAI" ," points=",chain_Aentier(EXP2(CINQ)) ," ",arguments_de_dilatation ," R=",nom_ZBufferDilate ,GENERATION_DE_formatI ) ); /* Dilatation de ce masque... */ EXECUTION_D_UNE_SUITE_DE_COMMANDES_SOUS_SH (chain_Aconcaten13(GENERATION_NOM_D_UNE_COMMANDE_X(Direct_xci,"dilate.01") ," A=",nom_ZBufferMasque ," dilater=FAUX"," circulaire=VRAI"," circulaire_optimale=VRAI" ," points=",chain_Aentier(EXP2(CINQ)) ," ",arguments_de_dilatation ," R=",nom_ZBufferErode ,GENERATION_DE_formatI ) ); /* Erosion de ce masque... */ EXECUTION_D_UNE_SUITE_DE_COMMANDES_SOUS_SH (chain_Aconcaten22(GENERATION_NOM_D_UNE_COMMANDE_X(Direct_xci,"eor") ," A1=",nom_ZBufferDilate ," A2=",nom_ZBufferErode ,GENERATION_DE_formatI ,C_SH__REDIRECTION_PROGRAMME ,GENERATION_NOM_D_UNE_COMMANDE_X(Direct_xci,"convol.02") ," A=",nom_imageR ," V=",chain_Aentier(BLANC) ," F=",chain_Aentier(BLANC) ," messages_noyau_convolution_variable=FAUX" ," circulaire=VRAI"," circulaire_optimale=VRAI" ," ",arguments_de_convolution ," R=",nom_imageR ,GENERATION_DE_formatI ) ); /* Le ou exclusif entre le masque erode et le masque dilate donne un masque situe */ /* "a cheval" sur les lignes de crete. C'est lui qui sert alors de noyau de convolution */ /* variable qui ne portera donc que sur les lignes de crete... */ #undef arguments_de_dilatation #undef arguments_de_convolution CALS(Idelete_image(nom_ZBufferErode)); CALS(Idelete_image(nom_ZBufferDilate)); CALS(Idelete_image(nom_ZBufferMasque)); CALS(Idelete_image(nom_ZBuffer)); /* Nettoyage final... */ Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Test__CODE_ERREUR__ERREUR07; Eblock ETes Eblock ATes Bblock Test__CODE_ERREUR__ERREUR07; Eblock ETes RETU_Commande; Eblock ECommande