/*************************************************************************************************************************************/
/* */
/* P R E S E N T A T I O N D E L ' I M A G E A R G U M E N T E N 4 V U E S S A N S T E X T U R E : */
/* */
/* */
/* Definition : */
/* */
/* Cette commande genere une image */
/* dont le nom est le premier argument */
/* d'appel ; elle donne 4 vues de celle-ci : */
/* */
/* HG : telle quelle, */
/* HD : montagne vue d'avion, */
/* BD : montagne (sens positif), */
/* BG : montagne (sens negatif). */
/* */
/* */
/* Author of '$xci/montagne.02$K' : */
/* */
/* Jean-Francois COLONNA (LACTAMME, 1988??????????). */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* 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
#include image_image_MONTAGNES_EXT
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* P A R A M E T R E S : */
/* */
/*************************************************************************************************************************************/
#define EFFACEMENT \
VRAI \
/* Pour effacer initialement l'image a generer. */
#define OMBRES \
VRAI \
/* Pour generer les ombres portees. */
#define PENOMBRE \
FLOT(DOUZE) \
/* Largeur de la zone de penombre. */
#define DEPTH \
VRAI \
/* Pour faire du "depth-cueing". */
#define MIN_DEPTH_CUEING \
FZERO \
/* Pour faire du "depth-cueing". */
#define AVION \
FAUX \
/* Pour voir la montagne en perspective. */
#define ALIAS \
VRAI \
/* Pour faire le traitement anti-aliasing. */
#define ECHELLE \
FU \
/* On laisse le champ invariant... */
#define X_TRANSLATION \
FZERO \
/* Translation horizontale, */
#define Y_TRANSLATION \
PARE(0.85000) \
/* Translation verticale, */
#define X_LUMIERE \
FLOT(HUIT) \
/* Abscisse de la source lumineuse, */
#define Y_LUMIERE \
FLOT(HUIT) \
/* Ordonnee de la source lumineuse. */
#define FACTEUR_MULTIPLICATIF_DE_CONVOLUTION \
FU \
/* Facteur multiplicatif du produit de convolution en chaque point {X,Y}. */
#define NOMBRE_DE_POINTS_DU_NOYAU \
EXP2(DOUP(ZERO)) \
/* Nombre de points du noyau (introduit sous cette forme le 20111031144434). */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* C H O I X D E S C O U L E U R S : */
/* */
/*************************************************************************************************************************************/
/* Le 20030316103105, les 'VERSION_0?' ont ete remplace par 'CHOIX_DES_COULEURS_VERSION_0?' */
/* afin de permettre leur recuperation dans 'v $xcc/cpp$Z _VERSION_'. */
#nodefine CHOIX_DES_COULEURS_VERSION_01 \
/* Version avec deux jeux de couleurs. */
#define CHOIX_DES_COULEURS_VERSION_02 \
/* Version avec quatre jeux de couleurs. */
#ifdef CHOIX_DES_COULEURS_VERSION_01
# define LISTE_HG \
SUBSTITUTION(L_SUBSTITUTION_01);
# define LISTE_HD \
SUBSTITUTION(L_SUBSTITUTION_02);
# define LISTE_BD \
SUBSTITUTION(L_SUBSTITUTION_02);
# define LISTE_BG \
SUBSTITUTION(L_SUBSTITUTION_02);
#Aifdef CHOIX_DES_COULEURS_VERSION_01
#Eifdef CHOIX_DES_COULEURS_VERSION_01
#ifdef CHOIX_DES_COULEURS_VERSION_02
# define LISTE_HG \
SUBSTITUTION(L_SUBSTITUTION_11);
# define LISTE_HD \
SUBSTITUTION(L_SUBSTITUTION_12);
# define LISTE_BD \
SUBSTITUTION(L_SUBSTITUTION_14);
# define LISTE_BG \
SUBSTITUTION(L_SUBSTITUTION_13);
#Aifdef CHOIX_DES_COULEURS_VERSION_02
#Eifdef CHOIX_DES_COULEURS_VERSION_02
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* M A C R O S U T I L E S : */
/* */
/*************************************************************************************************************************************/
#define NOYAU(numero,valeur) \
Bblock \
EGAL(ITb1(noyau,INDX(numero,PREMIER_POINT)),valeur); \
EGAL(ITb1(inhibition_du_noyau,INDX(numero,PREMIER_POINT)),ACTIF); \
Eblock
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* 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_imageA),NOM_PIPE));
DEFV(Float,INIT(echelle,ECHELLE));
/* Facteur d'echelle a appliquer a l'image Argument. */
DEFV(deltaF_2D,translation);
/* Translation de la montagne dans l'image. */
DEFV(pointF_2D,source_lumineuse);
/* Position de la source lumineuse. */
DEFV(Logical,INIT(effacement,EFFACEMENT));
/* Pour l'effacement initial de l'image Resultat. */
DEFV(Logical,INIT(ombres,OMBRES));
/* Pour mettre ou pas les ombres portees, */
DEFV(Float,INIT(penombre,PENOMBRE));
/* Largeur de la zone de penombre. */
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... */
DEFV(Logical,INIT(avion,AVION));
/* Pour voir d'avion ou pas la montagne. */
DEFV(Logical,INIT(alias,ALIAS));
/* Pour faire ou pas le traitement anti-aliasing. */
DEFV(Positive,INIT(hauteur,CINQ));
/* Hauteur par defaut de la mire de barres. */
DEFV(Logical,DTb1(niveaux_a_traiter,COULEURS));
/* Definit les niveaux sur lesquels on doit faire la convolution par 'Pconvolution()'. */
DEFV(Logical,DTb1(niveaux_cumulables,COULEURS));
/* Definit les niveaux cumulables lors du calcul de 'Pconvolution_____cumul_courant'. */
DEFV(Float,INIT(facteur_multiplicatif,FACTEUR_MULTIPLICATIF_DE_CONVOLUTION));
/* Facteur multiplicatif du produit de convolution en chaque point {X,Y}. */
DEFV(Int,INIT(nombre_de_points,EXP2(DOUP(ZERO))));
/* Nombre de points du noyau. */
DEFV(Float,DTb1(noyau,TAILLE_MAXIMALE_D_UN_NOYAU_DE_CONVOLUTION));
/* Noyau de la convolution, */
DEFV(Logical,DTb1(inhibition_du_noyau,TAILLE_MAXIMALE_D_UN_NOYAU_DE_CONVOLUTION));
/* Et sa liste d'inhibition. */
DEFV(Int,INIT(index,UNDEF));
/* Index d'initialisation du noyau. */
/*..............................................................................................................................*/
INITIALISATION_ACCROISSEMENT_2D(translation,X_TRANSLATION,Y_TRANSLATION);
/* Initialisation par defaut de la translation de la montagne. */
INITIALISATION_POINT_2D(source_lumineuse,X_LUMIERE,Y_LUMIERE);
/* Initialisation par defaut de la source lumineuse. */
GET_ARGUMENTSg(nombre_d_arguments
,BLOC(GET_ARGUMENT_L("Ireduction_moitie_____compatibilite_20030611=""compatibilite_20030611="
,Ireduction_moitie_____compatibilite_20030611
);
GET_ARGUMENT_L("SX_SY_SZ_____compatibilite_20070416=""compatibilite_20070416="
,SX_SY_SZ_____compatibilite_20070416
);
/* Parametre introduit le 20070416161136... */
GET_ARGUMENT_C("imageA=""A=",nom_imageA);
GET_ARGUMENT_C("imageR=""R=",nom_imageR);
GET_ARGUMENT_L("tore=",Pconvolution_____placer_l_image_sur_un_tore);
GET_ARGUMENT_L("ponderations_utiles=",Pconvolution_____normaliser_uniquement_avec_les_ponderations_utilisees);
GET_ARGUMENT_F("Tx=",ASD1(translation,dx));
GET_ARGUMENT_F("Ty=",ASD1(translation,dy));
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("init=",effacement);
GET_ARGUMENT_L("ombres=",ombres);
GET_ARGUMENT_F("penombre=",penombre);
GET_ARGUMENT_L("depth_cueing=""depth=",depth);
GET_ARGUMENT_F("minimum=""min_depth_cueing=""min=",min_depth_cueing);
/* Le 20110223145305 furent introduits "depth_cueing=" et "min_depth_cueing="... */
GET_ARGUMENT_L("avion=",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 20170413104007... */
GET_ARGUMENT_L("alias=",alias);
GET_ARGUMENT_L("Imontagnes_precises_____compatibilite_20061220=""compatibilite_20061220="
,Imontagnes_precises_____compatibilite_20061220
);
/* Introduit le 20061220110401... */
GET_ARGUMENT_L("Imontagnes_precises_____compatibilite_20090130=""compatibilite_20090130="
,Imontagnes_precises_____compatibilite_20090130
);
/* Introduit le 20090130182220... */
GET_ARGUMENT_L("Imontagnes_precises_____compatibilite_20090202=""compatibilite_20090202="
,Imontagnes_precises_____compatibilite_20090202
);
/* Introduit le 20090202104109... */
GET_ARGUMENT_L("Imontagnes_precises_____compatibilite_20090203=""compatibilite_20090203="
,Imontagnes_precises_____compatibilite_20090203
);
/* Introduit le 20090203155145... */
GET_ARGUMENT_L("Imontagnes_precises_____compatibilite_20210928=""compatibilite_20210928="
,Imontagnes_precises_____compatibilite_20210928
);
/* Introduit le 20210928141455... */
GET_ARGUMENT_L("Imontagnes_precises_____compatibilite_20211001=""compatibilite_20211001="
,Imontagnes_precises_____compatibilite_20211001
);
/* Introduit le 20211001180959... */
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 20061220120509 et etendu le 20061220135129 a deux facteurs... */
GET_ARGUMENT_I("h=",hauteur);
GET_ARGUMENT_F("facteur=""f=",facteur_multiplicatif);
GET_ARGUMENT_I("points=""p=",nombre_de_points);
GET_ARGUMENT_I("spirale_horizontal=",SPIRALE_DEFINITION_____facteur_delta_horizontal);
GET_ARGUMENT_I("spirale_vertical=",SPIRALE_DEFINITION_____facteur_delta_vertical);
)
);
CALi(Inoir(ImageR));
/* Initialisation de l'image Resultat. */
Test(PAS_D_ERREUR(CODE_ERROR(Iload_image(ImageA1,nom_imageA))))
/* Chargement de l'image a transformer. */
Bblock
Test(IFLE(nombre_de_points,TAILLE_MAXIMALE_D_UN_NOYAU_DE_CONVOLUTION))
Bblock
DoIn(index,PREMIER_POINT,LSTX(PREMIER_POINT,nombre_de_points),I)
Bblock
NOYAU(index,FU);
/* Initialisation du noyau de convolution. */
Eblock
EDoI
Eblock
ATes
Bblock
PRINT_ERREUR("la taille demandee pour le noyau de convolution est incompatible avec les definitions");
EGAL(nombre_de_points,NOMBRE_DE_POINTS_DU_NOYAU);
CAL1(Prer1("(la valeur %d par defaut est forcee)\n",nombre_de_points));
/* Introduit le 20111031141404 car, en effet, manquait cruellement... */
Eblock
ETes
CALS(Imove(ImageG,ImageA1));
MIRE_DE_BARRES(hauteur);
/* Et enfin, mise en place d'une mire de barres... */
CALS(Imove(ImageA2,ImageG));
CALi(Inoir(ImageG));
/* Initialisation de l'image finale... */
SET_FILTRAGE(ACTIF);
LISTE_HG;
DEMI_FENETRE_HG(ImageG,ImageA2,VRAI,CALCUL_DU_MAXIMUM_DANS_UNE_DEMI_FENETRE);
/* HG : presentation de l'image telle quelle... */
SET_FILTRAGE(INACTIF);
BoIn(niveau,NOIR,BLANC,PAS_COULEURS)
Bblock
EGAL(ITb1(niveaux_a_traiter,INDX(niveau,NOIR)),VRAI);
EGAL(ITb1(niveaux_cumulables,INDX(niveau,NOIR)),VRAI);
/* Initialisation telle que tous les niveaux soient a la fois "traitables" et "cumulables". */
Eblock
EBoI
CALS(Iconvolution(ImageR
,facteur_multiplicatif
,ImageA1
,niveaux_a_traiter,niveaux_cumulables
,nombre_de_points,noyau,inhibition_du_noyau
)
);
/* Et "legere" convolution de l'image Argument. */
CALS(Imove(ImageA1,ImageR));
CALS(Iblanc(ImageA2));
/* Initialisation de la texture (neutre). */
CALS(Iinit_Z_Buffer());
/* Initialisation du 'Z-Buffer'. */
CALS(Imontagnes(ImageR
,echelle,ImageA1
,ImageA2
,effacement
,ADRESSE(translation)
,ombres,penombre,ADRESSE(source_lumineuse)
,NOTL(DEPTH),min_depth_cueing
,NOTL(AVION)
,NOTL(ALIAS)
)
);
SET_FILTRAGE(ACTIF);
LISTE_HD;
DEMI_FENETRE_HD(ImageG,ImageR,VRAI,CALCUL_DU_MAXIMUM_DANS_UNE_DEMI_FENETRE);
/* HD : presentation de l'image en montagnes vues d'avion... */
SET_FILTRAGE(INACTIF);
CALS(Iinit_Z_Buffer());
/* Initialisation du 'Z-Buffer'. */
CALS(Imontagnes(ImageR
,echelle,ImageA1
,ImageA2
,effacement
,ADRESSE(translation)
,ombres,penombre,ADRESSE(source_lumineuse)
,depth,min_depth_cueing
,avion
,alias
)
);
SET_FILTRAGE(ACTIF);
LISTE_BD;
DEMI_FENETRE_BD(ImageG,ImageR,VRAI,CALCUL_DU_MAXIMUM_DANS_UNE_DEMI_FENETRE);
/* BD : presentation de l'image en montagnes (sens positif)... */
SET_FILTRAGE(INACTIF);
CALS(Iinit_Z_Buffer());
/* Initialisation du 'Z-Buffer'. */
CALS(Imontagnes(ImageR
,NEGA(echelle),ImageA1
,ImageA2
,effacement
,ADRESSE(translation)
,ombres,penombre,ADRESSE(source_lumineuse)
,depth,min_depth_cueing
,avion
,alias
)
);
SET_FILTRAGE(ACTIF);
LISTE_BG;
DEMI_FENETRE_BG(ImageG,ImageR,VRAI,CALCUL_DU_MAXIMUM_DANS_UNE_DEMI_FENETRE);
/* BG : presentation de l'image en montagnes (sens negatif)... */
SET_FILTRAGE(INACTIF);
CALS(Imove(ImageR,ImageG));
SET_FILTRAGE(ACTIF);
MODIFICATION_LISTE_DE_SUBSTITUTION(NOIR,SUCC(NOIR));
MODIFICATION_LISTE_DE_SUBSTITUTION(BLANC,PRED(BLANC));
/* Afin de reserver le noir et le blanc pour la croix de separation */
/* des quatre images. */
SUBSTITUTION(L_SUBSTITUTION_VARIABLE);
CALS(Imove(ImageG,ImageR));
/* Suppression du BLANC... */
SET_FILTRAGE(INACTIF);
DECOUPAGE_EN_QUATRE(NOIR,BLANC);
/* Trace d'une croix blanche de separation des quatre images. */
CALi(Iupdate_image(nom_imageR,ImageG));
Eblock
ATes
Bblock
Test__CODE_ERREUR__ERREUR07;
Eblock
ETes
RETU_Commande;
Eblock
ECommande