/*************************************************************************************************************************************/ /* */ /* M I S E E N M O N T A G N E A V E C P E R S P E C T I V 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.04$K' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 1990??????????). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 : */ /* */ /*************************************************************************************************************************************/ #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 \ FAUX \ /* 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 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 OMBRES \ VRAI \ /* Pour generer les ombres portees. */ #define DEPTH \ FAUX \ /* Pour ne pas faire du "depth-cueing". */ #define MIN_DEPTH_CUEING \ FZERO \ /* Pour que le "depth-cueing" soit maximal lorsqu'il est demande. */ #define ECHELLE \ GRO2(FRA10(FU)) \ /* On reduit a priori l'amplitude du champ... */ #define X_TRANSLATION \ FZERO \ /* Translation le long de 'OX', */ #define Y_TRANSLATION \ FZERO \ /* Translation le long de 'OY', */ #define Z_TRANSLATION \ FZERO \ /* Translation le long de 'OZ'. */ #define X_OBSERVATEUR \ FDU \ /* Position de l'observateur sur 'OX', */ #define Y_OBSERVATEUR \ FDEUX \ /* Position de l'observateur sur 'OY', */ #define Z_OBSERVATEUR \ FQUATRE \ /* Position de l'observateur sur 'OZ'. */ #define X_LUMIERE \ FLOT(HUIT) \ /* Abscisse de la source lumineuse, */ #define Y_LUMIERE \ FLOT(HUIT) \ /* Ordonnee de la source lumineuse, */ #define Z_LUMIERE \ FZERO \ /* Profondeur la source lumineuse. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* M A C R O S U T I L E S : */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 A V E C P E R S P E C T I V 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)); #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'). */ #Aifdef TYPE_DE_imageA_surface_VERSION_02 #Eifdef TYPE_DE_imageA_surface_VERSION_02 DEFV(Float,INIT(echelle,ECHELLE)); /* Facteur d'echelle a appliquer a l'image Argument. */ DEFV(deltaF_3D,translation); /* Translation de la montagne dans l'image. */ DEFV(pointF_3D,observateur); /* Position de l'observateur. */ DEFV(pointF_3D,source_lumineuse); /* Position de la source lumineuse. */ DEFV(Logical,INIT(ombres,OMBRES)); /* Pour mettre ou pas les ombres portees, */ DEFV(Logical,INIT(charger_un_fond,CHARGER_UN_FOND)); /* Pour charger un fond a placer en arriere-plan de la montagne. */ DEFV(Logical,INIT(depth,DEPTH)); /* Pour faire ou pas du "depth-cueing", */ DEFV(Float,INIT(min_depth_cueing,MIN_DEPTH_CUEING)); /* Pour ponderer dans [0,1] le "depth-cueing" : plus on est proche de */ /* zero, plus il est fort... */ /*..............................................................................................................................*/ INITIALISATION_ACCROISSEMENT_3D(translation,X_TRANSLATION,Y_TRANSLATION,Z_TRANSLATION); /* Initialisation par defaut de la translation de la montagne. */ INITIALISATION_POINT_3D(source_lumineuse,X_LUMIERE,Y_LUMIERE,Z_LUMIERE); /* Initialisation par defaut de la source lumineuse. */ INITIALISATION_POINT_3D(observateur,X_OBSERVATEUR,Y_OBSERVATEUR,Z_OBSERVATEUR); /* Initialisation par defaut de la position de l'observateur. */ #ifdef TYPE_DE_imageA_surface_VERSION_01 GET_ARGUMENTSv(nombre_d_arguments ,BLOC(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_L("fond=",charger_un_fond); GET_ARGUMENT_F("Tx=",ASD1(translation,dx)); GET_ARGUMENT_F("Ty=",ASD1(translation,dy)); GET_ARGUMENT_F("Tz=",ASD1(translation,dz)); GET_ARGUMENT_F("sx=""sX=""Sx=""SX=",ASD1(source_lumineuse,x)); GET_ARGUMENT_F("sy=""sY=""Sy=""SY=",ASD1(source_lumineuse,y)); GET_ARGUMENT_F("sz=""sZ=""Sz=""SZ=",ASD1(source_lumineuse,z)); GET_ARGUMENT_F("ox=",ASD1(observateur,x)); GET_ARGUMENT_F("oy=",ASD1(observateur,y)); GET_ARGUMENT_F("oz=",ASD1(observateur,z)); GET_ARGUMENT_F("echelle=""e=",echelle); GET_ARGUMENT_L("ombres=",ombres); GET_ARGUMENT_L("depth_cueing=""depth=",depth); GET_ARGUMENT_F("minimum=""min_depth_cueing=""min=",min_depth_cueing); /* Le 20110223145544 furent introduits "depth_cueing=" et "min_depth_cueing="... */ ) ); #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_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_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("fond=",charger_un_fond); GET_ARGUMENT_F("Tx=",ASD1(translation,dx)); GET_ARGUMENT_F("Ty=",ASD1(translation,dy)); GET_ARGUMENT_F("Tz=",ASD1(translation,dz)); GET_ARGUMENT_F("sx=""sX=""Sx=""SX=",ASD1(source_lumineuse,x)); GET_ARGUMENT_F("sy=""sY=""Sy=""SY=",ASD1(source_lumineuse,y)); GET_ARGUMENT_F("sz=""sZ=""Sz=""SZ=",ASD1(source_lumineuse,z)); GET_ARGUMENT_F("ox=",ASD1(observateur,x)); GET_ARGUMENT_F("oy=",ASD1(observateur,y)); GET_ARGUMENT_F("oz=",ASD1(observateur,z)); GET_ARGUMENT_F("echelle=""e=",echelle); GET_ARGUMENT_L("ombres=",ombres); GET_ARGUMENT_L("depth_cueing=""depth=",depth); GET_ARGUMENT_F("minimum=""min_depth_cueing=""min=",min_depth_cueing); /* Le 20110223145544 furent introduits "depth_cueing=" et "min_depth_cueing="... */ GET_ARGUMENT_F("epsilon=",IFnormalisation_____epsilon_de_seuillage_inferieur_par_rapport_au_niveau_origine); ) ); #Aifdef TYPE_DE_imageA_surface_VERSION_02 #Eifdef TYPE_DE_imageA_surface_VERSION_02 EGAL(Zmin,Ymin); EGAL(Zmax,Ymax); /* Les axes 'OY' et 'OZ' etant interchanges en permanence, il est imperatif qu'ils soient */ /* definis de facon identiques... */ CALi(Inoir(ImageR)); /* Initialisation de l'image Resultat. */ #ifdef TYPE_DE_imageA_surface_VERSION_01 Test(PAS_D_ERREUR(CODE_ERROR(Iload_image(ImageA1,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(ImageA1,nom_imageA) ,IloadF_image(IFmageA,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(ImageA2,nom_imageT)))) /* Chargement de la texture. */ Bblock Test(IL_FAUT(charger_un_fond)) Bblock Test(PAS_D_ERREUR(CODE_ERROR(Iload_image(ImageR,nom_imageF)))) Bblock Eblock ATes Bblock Test__CODE_ERREUR__ERREUR07; Eblock ETes Eblock ATes Bblock Eblock ETes #ifdef TYPE_DE_imageA_surface_VERSION_01 CALS(Imontagnes_en_perspective(ImageR ,echelle,ImageA1 ,ImageA2 ,ADRESSE(translation) ,ADRESSE(observateur) ,ombres,ADRESSE(source_lumineuse) ,depth,min_depth_cueing ) ); #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_en_perspective(ImageR ,echelle,ImageA1 ,ImageA2 ,ADRESSE(translation) ,ADRESSE(observateur) ,ombres,ADRESSE(source_lumineuse) ,depth,min_depth_cueing ) ); Eblock ATes Bblock /* Cas d'une image 'imageF' : */ Test(IL_NE_FAUT_PAS(renormaliser_la_surface)) Bblock CALS(IFmove(IFmageR,IFmageA)); /* Cas ou la surface n'est pas renormalisee... */ Eblock ATes Bblock DEFV(genere_Float,INIT(nivo_minimum,FLOT__NIVEAU_UNDEF)); DEFV(genere_Float,INIT(nivo_maximum,FLOT__NIVEAU_UNDEF)); /* Niveaux extrema de la surface. */ CALS(IFnivo_extrema(IFmageA,ADRESSE(nivo_minimum),ADRESSE(nivo_maximum))); Test(IL_FAUT(conserver_le_zero)) Bblock CALS(IFnormalisation_avec_le_vrai_zero(IFmageR,IFmageA,nivo_minimum,nivo_maximum)); /* Cas ou la surface est renormalisee en conservant le vrai zero... */ Eblock ATes Bblock CALS(IFnormalisation(IFmageR,IFmageA,nivo_minimum,nivo_maximum)); /* Cas ou la surface est renormalisee... */ Eblock ETes Eblock ETes CALS(Imontagnes_en_perspective_precises(ImageR ,echelle,IFmageR ,ImageA2 ,ADRESSE(translation) ,ADRESSE(observateur) ,ombres,ADRESSE(source_lumineuse) ,depth,min_depth_cueing ) ); Eblock ETes #Aifdef TYPE_DE_imageA_surface_VERSION_02 #Eifdef TYPE_DE_imageA_surface_VERSION_02 CALi(Iupdate_image(nom_imageR,ImageR)); Eblock ATes Bblock Test__CODE_ERREUR__ERREUR07; Eblock ETes Eblock ATes Bblock Test__CODE_ERREUR__ERREUR07; Eblock ETes RETU_Commande; Eblock ECommande