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