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



Copyright © Jean-François COLONNA, 2019-2024.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / École polytechnique, Institut Polytechnique de Paris, 2019-2024.