DATE PROG TRN < < < D E F I N I T I O N S G E N E R A L E S : < < XUNDEF:: VAL -1 < POUR NE DEFINIR QUE LES 'XX...' DANS LES < FICHIERS DE DEFINITION... CALL #SIP DEFINITION CTTE# < < PREPARATION DE L'APPEL DE #SIP UTILITAIRES# : < XXXDEF: VAL XUNDEF XXXLOC: VAL XUNDEF XXXTAB: VAL XUNDEF XXXPRO: VAL XUNDEF CALL #SIP UTILITAIRES# < < < D E F I N I T I O N D E L ' I M A G E : < < XXXVEC: VAL XUNDEF < AFIN DE NE DEFINIR QUE LES 'XXVEC'... CALL #SIP VECTEUR 512# XXXVEC: VAL XXVEC1 < DEFINITION DES CONSTANTES IMAGE/VECTEUR. CALL #SIP VECTEUR 512# < < CONSTANTES DES IMAGES (256,256) : < ORDI:: VAL "@" < TYPE DE L'ORDINATEUR... CALL #SIP IMAGE 256# NMOTL:: VAL CNMPL < NOMBRE DE MOTS PAR LIGNE D'IMAGE (256). NPOL:: VAL NMOTL*NBITMO < NOMBRE DE POINTS PAR LIGNE, NLIG:: VAL LIMAG/NMOTL < NOMBRE DE LIGNES PAR IMAGE (256,256). NPOLM1:: VAL NPOL-Z < ABSCISSE MAXIMALE. NLIGM1:: VAL NLIG-Z < ORDONNEE MAXIMALE. TV1:: MOT O < PREMIERE IMAGE (256,256), TV2:: MOT '5000 < DEUXIEME IMAGE (256,256). NCOOL:: VAL XNCOOL < NOMBRE DE COULEURS PRIMAIRES, NIVMX7:: VAL BIT>NCOOL-N < NIVEAU MAXIMAL EN (256,256)... < < < D E F I N I T I O N D E S E S P A C E S : < < DIMGRA:: VAL 3 < ON TRACE DANS L'ESPACE EUCLIDIEN < A 3 DIMENSIONS... DIMGR2:: VAL DIMGRA-I < ET UNE DIMENSION DE MOINS... PAGE < < < O P T I O N S D ' A S S E M B L A G E : < < XOPT01: @ XWOR%1: VAL KOLF=FMASK+KOLTES=FVAL XWOR%1: VAL KOLC=FMASK+KDP=FVAL?XWOR%1 XWOR%2: VAL KOLTED=FMASK+KOL0=FVAL XWOR%2: VAL KOLTEF=FMASK+KOL0+KOLON=FVAL?XWOR%2 XWOR%3: VAL XWOR%2=XWOR%1-KOL0 < LONGUEUR DU SYMBOLE COURANT... XWOR%4: VAL MSYMBI=FMASK+KOL0=FVAL XWOR%4: VAL MSYMBL=FMASK+XWOR%3=FVAL?XWOR%4 XWOR%5: VAL XWOR%4=FCSYMT < ETAT DU SYMBOLE 'XOPT01'... XWOR%6: VAL XWOR%5=FCSIGN XWOR%7: VAL XWOR%5(MSYMBN)MSYMBN=FCSIGN IF XWOR%6*XWOR%7,XEIF%,,XEIF% XOPT01:: VAL EXIST < TRACE GRAPHIQUE, ET VERIFICATIONS CROI- < SEES DES EQUATIONS CALCULEES... XEIF%: VAL ENDIF PAGE < < < B A S D E L A M E M O I R E : < < ZERO: EQU $ DZS PEPROG-D+Z < < POINT D'ENTREE : < ENTRY: EQU $ LRM A,K WORD DEBUT < POINT D'ENTREE DU PROGRAMME, WORD STACK-DEPILE < INITIALISATION DE LA PILE. PSR A RSR < ON EFFECTUE AINSI UN 'GOTO' 'DEBUT'... PAGE < < < M E S S A G E S : < < TABLE < < BUFFER BANDE : < LBUFMT: @ XWOR%1: VAL KOLF=FMASK+KOLTES=FVAL XWOR%1: VAL KOLC=FMASK+KDP=FVAL?XWOR%1 XWOR%2: VAL KOLTED=FMASK+KOL0=FVAL XWOR%2: VAL KOLTEF=FMASK+KOL0+KOLON=FVAL?XWOR%2 XWOR%3: VAL XWOR%2=XWOR%1-KOL0 < LONGUEUR DU SYMBOLE COURANT... XWOR%4: VAL MSYMBI=FMASK+KOL0=FVAL XWOR%4: VAL MSYMBL=FMASK+XWOR%3=FVAL?XWOR%4 XWOR%5: VAL XWOR%4=FCSYMT < ETAT DU SYMBOLE 'LBUFMT'... XWOR%6: VAL XWOR%5=FCSIGN XWOR%7: VAL XWOR%5(MSYMBN)MSYMBN=FCSIGN IF XWOR%6*XWOR%7,XEIF%,,XEIF% LBUFMT:: VAL 4096 XEIF%: VAL ENDIF BUFMT: EQU $ DZS LBUFMT/NOCMO < < < C O M M O N : < < COMMON COM: EQU $ < < MOT DESTINE AU BLOC FLOTTANT : < COMFLO: WORD NILK < MOT "BIDON" DESTINE AU BLOC FLOTTANT < POUR QU'IL Y FIT SES MERDES... ATSFLO: WORD TSFLO < POUR TESTER DE TEMPS EN TEMPS 'COMFLO'... < < INDICATEURS DE CONTROLE : < AMPLI: FLOAT <NILK<NILK<NILK < MULTIPLICATEUR DU RESULTAT FINAL. MOYENE: FLOAT <NILK<NILK<NILK < VALEUR MOYENEE DU RESULTAT FINAL. MAXREC:: VAL 100 < VALEUR MAXIMALE DE 'NRECUR'... MRECUR: WORD NILK < NOMBRE DE RECURSIONS MAXIMAL LORS DE LA < SOMMATION DES FONCTION ALEATOIRES. NMM: WORD NILK < NOMBRE DE POINTS DES SPIR-MAPS GENEREES < A PARTIR DES IMAGES 'TV1'/'TV2'. EXPOP0: FLOAT <NILK<NILK<NILK < EXPOSANT DE CALCUL DES EXPONENTIELLES. ALPHA: FLOAT <NILK<NILK<NILK < FACTEUR DE TENTATIVE D'ELIMINATION DES < PICS "VISUELS" PAR FILTRAGE... PASIX0: WORD NILK < PAS SUR OX, PASIY0: WORD NILK < PAS SUR OY. GRAINE: WORD NILK < GRAINE DE 'RDN'... SUPRDN: WORD NILK < SUP(RDN), INFRDN: WORD NILK < INF(RDN). AMPLIR: FLOAT <NILK<NILK<NILK < AMPLIFICATEUR DES VALEURS ALEATOIRES < CORRELEES... MAXNIV: WORD NILK < MAXIMUM DES NIVEAUX TRACES, MINNIV: WORD NILK < MINIMUM DES NIVEAUX TRACES. IERASE: WORD NEXIST < EFFACER ('EXIST'), OU NON ('NEXIST') < L'ECRAN 512... IOMBRE: WORD EXIST < TRACER ('EXIST') OU PAS ('NEXIST') LES < OMBRES PORTEES... NPENOM: WORD NILK < LARGEUR DE LA ZONE DE PENOMBRE (DOIT < ETRE STRICTEMENT POSITIVE) ; SI LA VALEUR < EST 1, IL N'Y EN A PAS... IALIAS: WORD NEXIST < FAIRE ('EXIST') OU PAS ('NEXIST') UN < TRAITEMENT ANTI-ALIASING... IBANDE: WORD NEXIST < CHOIX DU MODE D'"ENTREE" DE LA FONCTION : < 'NEXIST' : ELLE EST CALCULEE A PARTIR < DE LA FORMULE ALEATOIRE RECUR- < SIVE, < 'EXIST' : ELLE EST LUE SUR BANDE, ET < ALORS ON A INTERET A FAIRE : < (ALPHA)=0... ABLOC0: WORD K < NUMERO DU PREMIER BLOC A LIRE SUR LA < BANDE MAGNETIQUE. < NOTA : SI (ABLOC0)<0 : ON TRAVAILLE EN < SEQUENTIEL STRICT, SANS JAMAIS RE- < INITIALISER L'ADRESSE COURANTE < SUR LA BANDE... IDEPTH: WORD NEXIST < FAIRE ('EXIST') OU PAS ('NEXIST') DU < "DEPTH-CUEING" CONSISTANT A MODULER LES < NIVEAUX PAR LA PROFONDEUR DE LA SCENE... < NOTA : CETTE OPTION N'EST PRISE EN < COMPTE QUE S'IL Y A "OMBRES PORTEES", < C'EST-A-DIRE SI : (IOMBRE)='EXIST'... TRDNX: WORD K < TRANSLATION EN 'X' DU CHAMP RDN, TRDNY: WORD K < TRANSLATION EN 'Y' DU CHAMP RDN. IRDNRC: WORD NEXIST < GENERER ('EXIST') ALEATOIREMENT LE < NOMBRE D'ITERATIONS DE LA FONCTION < 'NRECUR' OU PAS ('NEXIST'). GRAINR: WORD NILK < GRAINE DU GENERATEUR DE 'NRECUR'... INFREC: WORD NILK < BORNE INFERIEURE DE 'NRECUR', SUPREC: WORD NILK < BORNE SUPERIEURE DE 'NRECUR' LORSQUE < CELUI-CI EST GENERE ALEATOIREMENT... IMODTV: WORD NEXIST < MODULER ('EXIST') OU NE PAS MODULER < ('NEXIST') L'INTENSITE LUMINEUSE MAXI- < MALE PAR L'IMAGE 'TV2' ; CETTE OPTION < N'A DE SENS QUE SI (IOMBRE)='EXIST'... FH: FLOAT <NILK<NILK<NILK < POUR DEFINIR LA FONCTION DE MODULATION < DU "DEPTH-CUEING" ; EN EFFET, ON CAL- < CULE UN NOMBRE 'X' APPARTENANT A (0,255) < FONCTION DE LA PROFONDEUR PAR RAPPORT < A L'ECRAN. ENSUITE CET 'X' EST MODULE < PAR UNE FONCTION LINEAIRE : < Y=(255-'FH')*X/255+'FH', AVEC 'FH' DANS ( < 'Y' EST DONC DANS (FH,255) ; ET : < SI FH=0 : "DEPTH-CUEING" MAXIMAL, < SI FH=1 : PAS DE "DEPTH-CUEING"... IVIDEO: WORD NEXIST < ECRIRE ('EXIST') L'IMAGE COURANTE SUR LE < DISQUE VIDEO OU PAS ('NEXIST'). IQUIT: WORD EXIST < S'ARRETER ('EXIST') OU PAS ('NEXIST') < APRES CHAQUE IMAGE (POINT D'ARRET). IPERS: WORD EXIST < TRACER EN PERSPECTIVE ('EXIST') OU EN < VUE D'AVION ('NEXIST'). FPERSB: FLOAT <NILK<NILK<NILK < CONSTANTE PERMETTANT DE SIMULER UNE < "FUITE" DE LA PERSPECTIVE : EN EFFET, < ON MULTIPLIERA LES NIVEAUX CALCULES PAR < LA FONCTION : < (1-B)*Y/255+B, OU 'B' EST 'FPERSB' ; DE < PLUS, ON CHOISIRA 'B' DANS (0,1) ; AVEC < B=1, IL N'Y AURA PAS DE FUITE... ITEXTU: WORD NEXIST < DOIT-ON ('EXIST') OU PAS ('NEXIST') < TEXTURER LA MONTAGNE AVEC UNE FONCTION < ALEATOIRE RAN(X,Y,Z) ??? SCOUCH: WORD NILK < SEUIL DONNANT LE NIVEAU FRONTIERE ENTRE < L'EXTERIEUR ET L'INTERIEUR DE LA SUR- < FACE ALEATOIRE. AMPLYR: FLOAT <NILK<NILK<NILK < AMPLYFICATEUR DU RESULTAT FINAL. MOYENF: FLOAT <NILK<NILK<NILK < VALEUR MOYENFE DU RESULTAT FINAL. MAXREK:: VAL MAXREC < VALEUR MAXIMALE DE 'NREKUR'... MREKUR: WORD NILK < NOMBRE DE REKURSIONS MAXIMAL LORS DE LA < SOMMATION DES FUNCTION ALEATOIRES. EXPOQ0: FLOAT <NILK<NILK<NILK < EXPOSANT DE CALCUL DES EXPONENTIELLES. PAZIX0: WORD NILK < PAZ SUR OX, PAZIY0: WORD NILK < PAZ SUR OY, PAZIZ0: WORD NILK < PAZ SUR OZ. GRAINF: WORD NILK < GRAINF DE 'RAN'... SUPRAN: WORD NILK < SUP(RAN), INFRAN: WORD NILK < INF(RAN). TRONIV: WORD NEXIST < TRONQUER BRUTALEMENT ('EXIST') OU UTILI- < SER UNE FUNCTION EN DENTS DE SCIE < ('NEXIST') POUR LES VALEURS DU CHAMP... NFUNCT: WORD NEXIST < INDICATEUR DE MODULATION DE LA FUNCTION < 'RAN' CALCULEE : < 'NEXIST' : PAZ DE MODULATION, < TOUTE AUTRE VALEUR INDEXE UNE FUNCTION < DE MODULATION TELLE 'FGAUSS'... FGAUSS:: VAL EXIST < INDEX DE LA MODULATION GAUSSIENNE QUI < VA CENTRER LA GENERATION AU CENTRE DU < CUBE VISUALISE... TRANX: WORD K < TRANSLATION EN 'X' DU CHAMP RAN, TRANY: WORD K < TRANSLATION EN 'Y' DU CHAMP RAN, TRANZ: WORD K < TRANSLATION EN 'Z' DU CHAMP RAN. IALEAT: WORD EXIST < LA TEXTURE SERA-T'ELLE ALEATOIRE < ('EXIST') OU UTILISERA-T'ELLE UNE < COMBINAISON LINEAIRE DES COORDONNEES < (XS,YS,ZS) ('NEXIST'), DONT LES COEF- < FICIENTS SUIVENT : FALTX: FLOAT <NILK<NILK<NILK < COEFFICIENT DE 'XS', FALTY: FLOAT <NILK<NILK<NILK < COEFFICIENT DE 'YS', FALTZ: FLOAT <NILK<NILK<NILK < COEFFICIENT DE 'ZS', FALTR: FLOAT <NILK<NILK<NILK < CONSTANTE DE TRANSLATION. NDM: WORD NILK < NOMBRE DE POINTS DES SPIR-DEPS GENEREES < A PARTIR DES IMAGES 'TV1'/'TV2'. FCOEFA: FLOAT <NILK<NILK<NILK < POUR PONDERER LA SOMME DES POINTS SUR < UNE SPIR-DEP DE DEPLACEMENT VERTICAL. FCOEFB: FLOAT <NILK<NILK<NILK < POUR PONDERER LES EXPOSANTS DES EXPO- < NENTIELLES DE PONDERATION DES POINTS < D'UNE SPIR-DEP DE DEPLACEMENT VERTICAL. IMODMT: WORD NEXIST < N'A DE SENS QUE SI (IBANDE)='EXIST', < C'EST-A-DIRE SI L'ON FAIT UNE ENTREE < A PARTIR DE LA BANDE MAGNETIQUE ; ALORS, < 'IMODMT' INDIQUE SI L'ON DOIT N'UTILISER < ('NEXIST') QUE LE CONTENU DE LA BANDE, < OU BIEN ('EXIST') SI L'ON DOIT SOMMER < CE DERNIER A UNE CONTRIBUTION ALEATOIRE < ET/OU SPIRALE... FHOMO: FLOAT <NILK<NILK<NILK < POUR AGRANDIR OU REDUIRE HOMOTHETIQUEMENT < LE CHAMP ALEATOIRE... IF XOPT01-EXIST,XOPT1,,XOPT1 XOPT1: VAL ENDIF < < CONSTANTES FLOTTANTES DE BASE : < F0: FLOAT <K<K<K < REMISE A ZERO FLOTTANTE... F1: FLOAT <W<K<K < L'UNITE EN FLOTTANT... XXXLOC: VAL YYYFLO < 'YYYFLO'. CALL #SIP UTILITAIRES# APWORK: EQU APFWOR < POUR LA COMPATIBILITE AVEC LES OVERLAYS < DE " +" (CF. 'SIO...'). < < POINT COURANT : < CS2D: EQU $ < DEBUT DES COORDONNEES 2D : YS: WORD NILK < COORDONNEES 2D DU XS: WORD NILK < POINT 3D PROJETE... LBUF2D:: VAL $-CS2D < NOMBRE DE MOTS NECESSAIRES POUR UN POINT, LBUFGR:: VAL LBUF2D+LBUF2D < ET POUR UN VECTEUR. COORDX:: VAL XS-CS2D < INDEX DE LA COORDONNEE 'X', COORDY:: VAL YS-CS2D < INDEX DE LA COORDONNEE 'Y'. < < DEMANDE DE TEMPORISATION < APRES EFFACEMENT : < TEMPO: BYTE NVPSER;FONDOR WORD NILK < INUTILE... WORD XXXMOY < 2 PETITES SECONDES... XXXLOC: VAL YYYGOT < 'YYYGOT'. CALL #SIP UTILITAIRES# XXXVEC: VAL XXVEC2 < DEFINITION DES DONNEES DU VECTEUR 512... CALL #SIP VECTEUR 512# APOINT: WORD POINT < SOUS-PROGRAMME DE MARQUAGE D'UN POINT < DE COORDONNEES (X), DONT LE NIVEAU EST < CALCULE VIA LA TABLE 'LNIVO'. ALNIVO: WORD LNIVO,X < TABLE DE CORRESPONDANCE DES NIVEAUX POUR < LE SOUS-PROGRAMME 'POINT'. < < ACCES AUX REGISTRES DE CONTROLE : < ACTRL1: WORD RCTRL1 ACTRL2: WORD RCTRL2 < < CALCUL D'UN PRODUIT SCALAIRE : < APRSCA: WORD PRSCA < SOUS-PROGRAMME DE CALCUL D'UN PRODUIT < SCALAIRE DE 2 VECTEURS 3D... < < POINT TRI-DIMENSIONNEL COURANT : < CS3D: EQU $ < DEBUT DES COORDONNEES 3D : FXS: FLOAT <NILK<NILK<NILK < COORDONNEE 'X' 3D, FYS: FLOAT <NILK<NILK<NILK < COORDONNEE 'Y' 3D, FZS: FLOAT <NILK<NILK<NILK < COORDONNEE 'Z' 3D. LBUF3D:: VAL $-CS3D < NOMBRE DE MOTS POUR UN POINT 3D... IF LBUF3D/DFLOT-DIMGRA,,XEIF%, IF ATTENTION : INCOHERENCE DANS LES IF DIMENSIONS DE L'ESPACE DE TRACE GRAPHIQUE !!! XEIF%: VAL ENDIF < < DEFINITION DE LA NORMALE : < CN3D: EQU $ < DEBUT DES COORDONNEES DE LA NORMALE : FXN: FLOAT <NILK<NILK<NILK < X(N), FYN: FLOAT <NILK<NILK<NILK < Y(N), FZN: FLOAT <W+W<K<K < Z(N) : VAUT 2 (1+1) CAR LE VECTEUR < NORMAL EST EN FAIT LA SOMME DE < DEUX VECTEURS NORMAUX VOISINS... < < DEFINITION DE LA SOURCE LUMINEUSE : < CL3D: EQU $ < DEBUT DES COORDONNEES DE LA SOURCE 'L' : FXL: FLOAT <NILK<NILK<NILK < X(L), FYL: FLOAT <NILK<NILK<NILK < Y(L), FZL: FLOAT <NILK<NILK<NILK < Z(L). < < BUFFER DES LIGNES CONSECUTIVES : < ALIGP2: WORD LIGP2,X < RELAI VERS LA LIGNE SUIVANTE-SUIVANTE, ALIGP1: WORD LIGP1,X < RELAI VERS LA LIGNE SUIVANTE, ALIG: WORD LIG,X < RELAI VERS LA LIGNE COURANTE, ALIGM1: WORD LIGM1,X < RELAI VERS LA LIGNE PRECEDENTE. < < POUR CALCULER L'ECLAIRAGE : < FNIVC: FLOAT <NILK<NILK<NILK < NIVEAU MAXIMAL COURANT (VAUT 'FNIVMX' < OU 'FNIVMX' MOINS UNE FRACTION DE < 'FNIVOM' SUIVANT L'OMBRAGE...). FNIVMX: FLOAT <XXN255<K<K NTRN FNIVOM: FLOAT <-XXN255/XXXMOY<K<K TRN FPENOM: FLOAT <NILK<NILK<NILK < BAISSE MAXIMALE DU NIVEAU D'ECLAIRAGE < DANS LA ZONE D'OMBRE : 'FPENOM' DONNE EN < FAIT L'INVERSE DE 'FNIVOM/NPENOM'. FIVMX7: FLOAT <NIVMX7<K<K < POUR MODULER L'INTENSITE LUMINEUSE < MAXIMALE PAR L'IMAGE 'TV2'... FHP: FLOAT <NILK<NILK<NILK < FHP=255*FH, F255MH: FLOAT <NILK<NILK<NILK < F255MH=255-FHP. < < VARIABLES MONTAGNEUSES : < GXS: FLOAT <NILK<NILK<NILK < COORDONNEES ABSOLUES GYS: FLOAT <NILK<NILK<NILK < DU POINT COURANT. FCUMR: FLOAT <NILK<NILK<NILK < SIGMA DES FONCTIONS ALEATOIRES < SCALANTES. FPOND: FLOAT <NILK<NILK<NILK < POUR LES PONDERER... FPOND0: FLOAT <NILK<NILK<NILK < VALEUR INITIALE DE LA PONDERATION : < FPOND0=RAC(PASIX*PASIY). RENORM: FLOAT <NILK<NILK<NILK < POUR NORMALISER LA FONCTION ALEATOIRE. < < DEFINITION DE LA GRILLE : < NRECUR: WORD NILK < NOMBRE COURANT DE RECURSIONS... SRECUR: WORD NILK < ET SAUVEGARDE AU CAS OU EN FAIT 'NRECUR' < EST CALCULE ALEATOIREMENT... PASIX: WORD NILK < PAS SUR 'OX', PASIY: WORD NILK < PAS SUR 'OY'. FPASIX: FLOAT <NILK<NILK<NILK < DE MEME FPASIY: FLOAT <NILK<NILK<NILK < EN FLOTTANT... XNOEUD: WORD NILK < X(NOEUD HAUT-GAUCHE) DE LA MAILLE, YNOEUD: WORD NILK < Y(NOEUD HAUT-GAUCHE) DE LA MAILLE. AFNIV1: FLOAT <NILK<NILK<NILK AFNIV2: FLOAT <NILK<NILK<NILK AFNIV3: FLOAT <NILK<NILK<NILK AFNIV4: FLOAT <NILK<NILK<NILK KITER: WORD NILK < COMPTAGE DES RECURSIONS... PAGE < < < L O C A L : < < LOCAL LOC: EQU $ < < RELAIS MONTAGNEUX : < AFONCT: WORD FONCT < CALCUL DE LA FONCTION COURANTE. AFONKT: WORD FONCT < IDEM LORS DES ENTREES BANDES ET SI L'ON < A : (IMODMT)='EXIST'. < < PARAMETRES DU GENERATEUR ALEATOIRE : < RDN: WORD 4397 < NOMBRE ALEATOIRE COURANT. RDN1: WORD 5189 < CONSTANTE RDN2: WORD 6791 < DE CALCUL DES RDN3:: VAL 19 < NOMBRE ALEATOIRES... RDN4: WORD 7993 < 2EME NOMBRE ALEATOIRE COURANT. RDN5: WORD 4021 RDN6:: VAL 23 POINTS: WORD 16807 INF32: FLOAT 32768 INF64: FLOAT 65536 FWORK4: FLOAT <NILK<NILK<NILK FWORK5: FLOAT <NILK<NILK<NILK HINCU: FLOAT <NILK<NILK<NILK < POUR HINCV: FLOAT <NILK<NILK<NILK < L'INTERPOLATION... FSUP: FLOAT <NILK<NILK<NILK < 'SUPRDN' EN FLOTTANT, FINF: FLOAT <NILK<NILK<NILK < 'INFRDN' EN FLOTTANT. SUP64: FLOAT <NILK<NILK<NILK < SUP/65536, UNMIS: FLOAT <NILK<NILK<NILK < 1-(INF/SUP), UNPIS: FLOAT <NILK<NILK<NILK < 32768*(1+INF/SUP)). SUP64R: FLOAT <NILK<NILK<NILK < SUPREC/65536, UNMISR: FLOAT <NILK<NILK<NILK < 1-(INFREC/SUPREC), UNPISR: FLOAT <NILK<NILK<NILK < 32768*(1+INFREC/SUPREC)). < < POUR LE CALCUL DU LOGARITHME : < POLLO1: FLOAT <NILK<NILK<NILK < VARAIBLE DE MANOEUVRE... POLLO2: FLOAT <NILK<NILK<NILK POLLO3: FLOAT <NILK<NILK<NILK POLLO4: FLOAT 0.7071067 < RACINE(2)/2. POLLO5: FLOAT 1.2920088 < COEFFICIENTS POLLO6: FLOAT 2.6398577 < DU POLLO7: FLOAT 1.656763 < DEVELOPPEMENT. POLLO8: EQU F05 < CONSTANTE 1/2. POLLO9: FLOAT 0.6931472 < LN(2). < < POUR LE CALCUL DE L'EXPONENTIELLE : < POLEX1: EQU POLLO1 < VARIABLE DE MANOEUVRE... POLEX2: EQU POLLO2 POLEX3: EQU POLLO3 POLEX4: FLOAT 1.442695 < LOG2(E). POLEX5: WORD NILK < RELEVE DE L'EXPOSANT POLEX6: EQU F1 < 1.0 POLEX7: EQU F05 < 2 (PAR L'INTERMEDIAIRE DE SON INVERSE). POLEX8: FLOAT 87.417488 < COEFFICIENTS POLEX9: FLOAT 0.0346573 < DU POLEY0: FLOAT -17830.91 < DEVELOPPEMENT. POLEY1: FLOAT 9.9545955 SIGNE: WORD NILK < POUR DETERMINER LE SIGNE DE X**Y... < < POUR CALCULER < LES EXPOSANTS : < XXMASK:: VAL MOCG XX7F:: VAL '7F < MAXIMUM POSITIF, XX80:: VAL -'80 < MIMIMUM NEGATIF. < < RELAIS DE SOUS-PROGRAMMES : < ASPRDN: WORD SPRDN < GENERATEUR ALEATOIRE DONNANT UNE VALEUR < RDN(XS,YS,KITER,GRAINE). APRDNR: WORD SPRDNR < GENERATEUR ALEATOIRE DONNANT UNE VALEUR < RDN(XS,YS,GRAINR) ET UTILISE LORS DE LA < GENERATION ALEATOIRE DE 'NRECUR'... EXPOP: FLOAT <NILK<NILK<NILK < EXPOSANT COURANT... ARAK: WORD RAK < CALCUL DE LA PUISSANCE P/(2**Q) D'UN < NOMBRE... < < VARAIBLES DE MANOEUVRE : < FWORK1: FLOAT <NILK<NILK<NILK FWORK2: FLOAT <NILK<NILK<NILK < < POUR LE CALCUL D'UNE < INTENSITE LUMINEUSE : < AINTEN: WORD INTEN < SOUS-PROGRAMME DE CALCUL DE L'INTENSITE < LUMINEUSE AU POINT COURANT. NIVBAS:: VAL XXNOIR+I < NIVEAU MINIMAL... FNIVBA: FLOAT <NIVBAS<K<K < POUR ELIMINER LA GENERATION DE POINTS < NOIRS... INTENH: FLOAT <NILK<NILK<NILK < INTENSITE "HAUTE", INTENB: FLOAT <NILK<NILK<NILK < INTENSITE "BASSE", PINTEN: FLOAT <NILK<NILK<NILK < PAS D'INTERPOLATION DE L'INTENSITE... < (DE "HAUT" VERS "BAS"...) AINT: WORD INTH,X < ACCES A LA LISTE DES 'INTH' DE LA LIGNE < COURANTE (Y+I), AINTM1: WORD INTHM1,X < ACCES A LA LISTE DES 'INTH' DE LA LIGNE < PRECEDENTE (Y). < < DONNEES DE L'ANTI-ALIASING : < ASEGV: WORD SEGV < SOUS-PROGRAMME DE TRACE D'UN SEGMENT < VERTICAL (SERT AUSSI POUR LE MODE < NON ANTI-ALIASING...). LSTENH: FLOAT <NILK<NILK<NILK < MEMORISE 'INTENH' DU VECTEUR VERTICAL < PRECEDENT. LSTGY2: WORD NILK < MEMORISE 'VECGY2' DU VECTEUR VERTICAL < PRECEDENT. ALISTY: WORD LISTY,X < RELAI D'ACCES A LA LSITE DE DETECTION < DES DISCONTINUITES : POUR CHAQUE ABSCISSE < 'X', ELLE MEMORISE L'ORDONNEE 'Y' DU < DERNIER VECTEUR VERTICAL TRACE... ALNOVI: WORD LNOVI,X < RELAI VERS LA TABLE INVERSE DE 'LNIVO', < ET QUI PERMET DE RETROUVER APPROXIMATI- < VEMENT (CORRESPONDANCE NON BIJECTIVE...) < LE NIVEAU CALCULE A PARTIR DU NIVEAU < TRACE. < < RELAIS D'ACCES AUX LISTES < DE DESCRIPTION DU MAILLAGE : < ALPASX: WORD LPASX,X < RELAI D'ACCES A 'PASIX' FLOTTANT, ALPSIX: WORD LPSIX,X < RELAI D'ACCES A 'PASIX' ENTIER. ALPASY: WORD LPASY,X < RELAI D'ACCES A 'PASIY' FLOTTANT, ALPSIY: WORD LPSIY,X < RELAI D'ACCES A 'PASIY' ENTIER. ALPOND: WORD LPOND,X < RELAI D'ACCES A 'FPOND'. < < POUR ACCEDER AUX IMAGES : < SAVER: WORD NILK < SAUVEGARDE D'UN MOT DE LA TRAME < RESIDENTE ROUGE, SAVEV: WORD NILK < DE MEME POUR LE VERT, SAVEB: WORD NILK < DE MEME POUR LE BLEU. MCDAR: EQU SAVER < SAUVEGARDE D'UN MOT DE LA TRAME < SCRATCH ROUGE, MCDAV: EQU SAVEV < DE MEME POUR LE VERT, MCDAB: EQU SAVEB < DE MEME POUR LE BLEU. XCTCDA: WORD NILK < CONSTANTE DE TRANSLATION PERMETTANT < D'ATTEINDRE INDIFFEREMMENT 'TV1' OU < 'TV2'... CTCDA: WORD TV2-TV1 < POUR ATTEINDRE 'TV2'... < < DEFINITION DE L'ACCELERATEUR < DES ACCES A 'TV1' ET 'TV2' : < ASHPR: @ XWOR%1: VAL KOLF=FMASK+KOLTES=FVAL XWOR%1: VAL KOLC=FMASK+KDP=FVAL?XWOR%1 XWOR%2: VAL KOLTED=FMASK+KOL0=FVAL XWOR%2: VAL KOLTEF=FMASK+KOL0+KOLON=FVAL?XWOR%2 XWOR%3: VAL XWOR%2=XWOR%1-KOL0 < LONGUEUR DU SYMBOLE COURANT... XWOR%4: VAL MSYMBI=FMASK+KOL0=FVAL XWOR%4: VAL MSYMBL=FMASK+XWOR%3=FVAL?XWOR%4 XWOR%5: VAL XWOR%4=FCSYMT < ETAT DU SYMBOLE 'ASHPR'... XWOR%6: VAL XWOR%5=FCSIGN XWOR%7: VAL XWOR%5(MSYMBN)MSYMBN=FCSIGN IF XWOR%6*XWOR%7,XEIF%,,XEIF% ASHPR:: VAL 53 < ON SE DONNE UN NOMBRE PREMIER... XEIF%: VAL ENDIF LASHT: WORD ASHPR < POUR FAIRE DES CALCULS MODULO 'ASHPR'. SAVYX: BYTE NILK;NILK < POUR MEMORISER UN COUPLE (Y,X). INOC:: VAL -EXIST < ETAT INOCCUPE D'UNE ENTREE DE LA TABLE. ASHT1:: MOT O < POUR ACCEDER A LA PARTIE (Y,X) DE LA < TABLE, ASHT2:: MOT ASHT1+ASHPR < POUR ACCEDER A LA PARTIE TV1/TV2/NIVEAU < DE LA TABLE. < < DEFINITION DE LA SPIR-MAP < DE CALCUL D'UN SIGMA(X,Y) : < PASM: WORD NILK < PAS DE PARCOURS DE LA SPIR-MAP, DELTAX: WORD NILK < VECTEUR TRANSLATION DELTAY: WORD NILK < COMPLEXE COURANT. LB: WORD NILK < LONGUEUR DES LB0: WORD NILK < BRANCHES DE LA SPIR-MAP. NP: WORD NILK < NOMBRE DE POINT COURANT, FNMM: FLOAT <NILK<NILK<NILK < NOMBRE DE POINTS FLOTTANT DE LA SPIR-MAP. < < SIGMA(X,Y) SUR UNE SPIR-MAP : < F2:: FLOAT <XXXMOY<K<K F4:: FLOAT <XXXMOY*XXXMOY<K<K CUMUL: WORD NILK < SIGMA(NIVEAU(X,Y)). ASPIRM: WORD SPIRAM < SOUS-PROGRAMME DE CALCUL DE 'CUMUL'... < < DEFINITION DE LA SPIR-DEP < DE CALCUL D'UN SIGMA(X,Y) : < XWOR%1: VAL XXXMOY=K XWOR%1: VAL -XWOR%1 XCENTR: WORD NPOLM1>XWOR%1 < DEFINITION DU YCENTR: WORD NLIGM1>XWOR%1 < CENTRE DE 'TV1'/'TV2'. PASD: WORD NILK < PAS DE PARCOURS DE LA SPIR-DEP, < NOTA : 'NP', 'DELTAX', 'DELTAY', 'LB' ET < 'LB0' SONT COMMUNS AVEC LA SPIR-DEP DE CA < DE L'IMAGE MAPPEE... < < SIGMA(X,Y) SUR UNE SPIR-DEP : < ALCOEF: WORD LCOEF,X < RELAI D'ACCES A LA LISTE DES COEFFICIENTS < DE PONDERATION DES SPIR-DEPS... FCOEFC: FLOAT <NILK<NILK<NILK < SIGMA(COEFFICIENTS)/FCOEFA. FCUMUL: FLOAT <NILK<NILK<NILK < SIGMA(NIVEAU(X,Y)). ASPIRD: WORD SPIRAD < SOUS-PROGRAMME DE CALCUL DE 'CUMUL'... < < PARTICIPATIONS RELATIVES DE < LA GENERATION ALEATOIRE ET < DE LA SOMMATION SUR UNE < SPIR-MAP CENTREE EN (256,256) : < PONRDN: FLOAT <NILK<NILK<NILK < CONTRIBUTION DE LA GENERATION ALEATOIRE, PONSPI: FLOAT <NILK<NILK<NILK < CONTRIBUTION DES SPIR-MAPS. < < < C O N S T A N T E M A G I Q U E : < < MAGIK:: VAL 7 < CONSTANTE MAGIQUE... IF K*MAGIK/BASE16(K=FCREST-K,,XEIF%, IF ATTENTION : IL FAUT MAGIK(K)=K POUR IF SIMPLIFIER LES CHOSES EN BASE 16 !!! XEIF%: VAL ENDIF XWOR%3: VAL MAGIK < CONSTANTE MAGIQUE... XWOR%7: VAL K < INITIALISATION DU CUMUL... NTRN DO BASE16 XWOR%7: VAL K=FCDO*XWOR%3/BASE16(K=FCREST?COSBT=FMASK(K?XWOR%7=FCINST XWOR%8: VAL K < INITIALISATION DU CUMUL... DO BASE16 XWOR%8: VAL K=FCDO?COSBT=FMASK(K?XWOR%8=FCINST TRN IF XWOR%7-XWOR%8,,XEIF%, IF ATTENTION : LA CONSTANTE MAGIQUE 'MAGIK' IF N'OPERE PAS UNE PERMUTATION DES 16 CHIFFRES IF DE 0 A F !!! XEIF%: VAL ENDIF IF K*MAGIK/BASE10(K=FCREST-K,,XEIF%, IF ATTENTION : IL FAUT MAGIK(K)=K POUR IF SIMPLIFIER LES CHOSES EN BASE 10 !!! XEIF%: VAL ENDIF XWOR%3: VAL MAGIK < CONSTANTE MAGIQUE... XWOR%7: VAL K < INITIALISATION DU CUMUL... NTRN DO BASE10 XWOR%7: VAL K=FCDO*XWOR%3/BASE10(K=FCREST?COSBT=FMASK(K?XWOR%7=FCINST XWOR%8: VAL K < INITIALISATION DU CUMUL... DO BASE10 XWOR%8: VAL K=FCDO?COSBT=FMASK(K?XWOR%8=FCINST TRN IF XWOR%7-XWOR%8,,XEIF%, IF ATTENTION : LA CONSTANTE MAGIQUE 'MAGIK' IF N'OPERE PAS UNE PERMUTATION DES 10 CHIFFRES IF DE 0 A 9 !!! XEIF%: VAL ENDIF AMAGIK: WORD MAGIK < < GESTION DU DEROULEUR : < NVPMT:: VAL '0B < 'NVP' D'ACCES AU DEROULEUR DE BANDES. DEMMT: BYTE NVPMT;XFMTRA < DEMANDE DE LECTURE A ACCES DIRECT. WORD BUFMT=FCTA*NOCMO WORD LBUFMT WORD NILK < ADRESSE DU BLOC COURANT. IBUFMT: WORD LBUFMT-Z+I < INDEX COURANT DU BUFFER 'MT', ZBUFMT: WORD LBUFMT-Z+I < ET POUR FORCER LA LECTURE DU PREMIER < BLOC DE CHAQUE IMAGE... ABUFMT: WORD BUFMT,X < ET RELAI D'ACCES... < < "CADRAGE" DES OCTETS : < TRANMT: FLOAT <NILK<NILK<NILK < TRANSLATION ET MULTMT: FLOAT <NILK<NILK<NILK < MISE A L'ECHELLE... < < TRANSLATION DE LA FUNCTION : < ICOUCH: WORD NILK < VAUT F(SCOUCH) SUIVANT LA MODULATION < DE RAN(X,Y,Z), VOIR A CE PROPOS LES < FUNCTIONS DU TYPE 'FGAUS'... < < MISE D'UN NIVEAU DANS (MINNIV,MAXNIV) : < F255: WORD XXN255 F511: WORD NIV256+NIV256-Z APNIV: WORD PNIV < SOUS-PROGRAMME DE MISE DANS (MINNIV, < MAXNIV). < < VARIABLES TEXTUREUSES : < ZS: WORD NILK < AFIN DE COMPLETER (XS,YS)... HXS: FLOAT <NILK<NILK<NILK < COORDONNEES HYS: FLOAT <NILK<NILK<NILK < ABSOLUES HZS: FLOAT <NILK<NILK<NILK < DU POINT COURANT. FKUMR: FLOAT <NILK<NILK<NILK < SIGMA DES FUNCTIONS ALEATOIRES < SCALANTES. FPONT: FLOAT <NILK<NILK<NILK < POUR LES PONDERER... FPONT0: FLOAT <NILK<NILK<NILK < VALEUR INITIALE DE LA PONDERATION : < FPONT0=RAC(PAZIX*PAZIY). RENORN: FLOAT <NILK<NILK<NILK < DONNE LE SIGMA DES 'FPONT' SCALANTS < DIVISE PAR 'FPONT0', ET PERMET DE CAL- < CULER LA FUNCTION ALEATOIRE DANS UN < SEGMENT PREDETERMINE, ET QUI EST : < (INFRAN*AMPLY*AMPLYR,SUPRAN*AMPLY*AMPLYR) < < RELAIS DE TEXTURAGE : < TEXTUR: WORD NILK < CONSTANTE DE TRANSLATION CALCULEE ET < APPLIQUEE AU NIVEAU DES POINTS, CE QUI < DEFINIT LA TEXTURE... AFUNCT: WORD FUNCT < CALCUL DE LA FUNCTION COURANTE. ANTEXT: WORD NTEXT < RELAI... < < DEFINITION DE LA GRILLE : < NREKUR: WORD NILK < NOMBRE COURANT DE REKURSIONS... PAZIX: WORD NILK < PAZ SUR 'OX', PAZIY: WORD NILK < PAZ SUR 'OY', PAZIZ: WORD NILK < PAZ SUR 'OZ'. FPAZIX: FLOAT <NILK<NILK<NILK < DE MEME FPAZIY: FLOAT <NILK<NILK<NILK < EN FPAZIZ: FLOAT <NILK<NILK<NILK < FLOTTANT... AFNJV1: FLOAT <NILK<NILK<NILK AFNJV2: FLOAT <NILK<NILK<NILK AFNJV3: FLOAT <NILK<NILK<NILK AFNJV4: FLOAT <NILK<NILK<NILK AFNJV5: FLOAT <NILK<NILK<NILK AFNJV6: FLOAT <NILK<NILK<NILK AFNJV7: FLOAT <NILK<NILK<NILK AFNJV8: FLOAT <NILK<NILK<NILK KJTER: WORD NILK < COMPTAGE DES REKURSIONS... < < PARAMETRES DU GENERATEUR ALEATOIRE : < RAN: WORD 4397 < NOMBRE ALEATOIRE COURANT. RAN1: WORD 5189 < CONSTANTE RAN2: WORD 6791 < DE CALCUL DES RAN3:: VAL 19 < NOMBRE ALEATOIRES... RAN4: WORD 7993 < 2EME NOMBRE ALEATOIRE COURANT. RAN5: WORD 4021 RAN6:: VAL 23 HJNCU: FLOAT <NILK<NILK<NILK < POUR HJNCV: FLOAT <NILK<NILK<NILK HJNCW: FLOAT <NILK<NILK<NILK < L'INTERPOLATION... HJNCU1: FLOAT <NILK<NILK<NILK < HJNCU1=1-HJNCU, HJNCV1: FLOAT <NILK<NILK<NILK < HJNCV1=1-HJNCV, HJNCW1: FLOAT <NILK<NILK<NILK < HJNCW1=1-HJNCW. GSUP: FLOAT <NILK<NILK<NILK < 'SUPRAN' EN FLOTTANT, GINF: FLOAT <NILK<NILK<NILK < 'INFRAN' EN FLOTTANT. ZUP64: FLOAT <NILK<NILK<NILK < SUP/65536, UNMJS: FLOAT <NILK<NILK<NILK < 1-(INF/SUP), UNPJS: FLOAT <NILK<NILK<NILK < 32768*(1+(INF/SUP)). F3: FLOAT <DIMGRA<K<K < POUR CALCULER UNE RACINE CUBIQUE (PASSA- < D'UN VOLUME A UNE DIMENSION...). AMPLY: FLOAT <NILK<NILK<NILK < AMPLYFICATEUR DU SIGMA DES 'FPONT' < CALCULE A PARTIR DE 'NREKUR'. XAMPLY:: VAL 31 < POUR CALCULER 'KAMPLY'... KAMPLY: FLOAT <XAMPLY-I<K<K < POUR CALCULER 'AMPLY' A PARTIR DE < 'NREKUR'... ASPRAN: WORD SPRAN < SOUS-PROGRAMME DE GENERATION ALEATOIRE < TRI-DIMENSIONNELLE... < < DEFINITION DE LA MODULATION GAUSSIENNE : < TXGAUS: WORD NILK < TRANSLATION DES COORDONNEES 'X', TYGAUS: WORD NILK < TRANSLATION DES COORDONNEES 'Y', ZCOUCH:: VAL NIV256 < VALEUR MAXIMALE DE LA COORDONNEE 'Z' ; < CETTE VALEUR EST LIEE A UNE UTILISATION < EN MODE "DEPTH-CUEING"... TZGAUS: WORD NILK < TRANSLATION DES COORDONNEES 'Z'. DXGAUS: FLOAT <NILK<NILK<NILK < POUR "NORMALISER" (X-TX)**2, DYGAUS: FLOAT <NILK<NILK<NILK < POUR "NORMALISER" (Y-TY)**2, DZGAUS: FLOAT <NILK<NILK<NILK < POUR "NORMALISER" (Z-TZ)**2. AEXPON: WORD EXPON < SOUS-PROGRAMME DE CALCUL D'UNE EXPO- < NENTIELLE. < < PARTICIPATIONS RELATIVES DE < LA GENERATION ALEATOIRE ET < DE LA SOMMATION SUR UNE < SPIR-MAP CENTREE EN (256,256) : < PONRAN: FLOAT <NILK<NILK<NILK < CONTRIBUTION DE LA GENERATION ALEATOIRE, PONSPJ: FLOAT <NILK<NILK<NILK < CONTRIBUTION DES SPIR-MAPS. < < DONNEES DE TRANSCODAGE DES TEXTURES : < ALTIVO: WORD LTIVO,X < LISTE DE TRANSCODAGE. FIV255: FLOAT <NIV256-Z<K<K < POUR OBTENIR UNE VALEUR DANS (0,1). < < RELAIS D'ACCES AUX LISTES < DE DESCRIPTION DU MAILLAGE < POUR LE TEXTURAGE TRI-DIMENSIONNEL : < ALPAZX: WORD LPAZX,X < RELAI D'ACCES A 'PAZIX' FLOTTANT, ALPZIX: WORD LPZIX,X < RELAI D'ACCES A 'PAZIX' ENTIER. ALPAZY: WORD LPAZY,X < RELAI D'ACCES A 'PAZIY' FLOTTANT, ALPZIY: WORD LPZIY,X < RELAI D'ACCES A 'PAZIY' ENTIER. ALPAZZ: WORD LPAZZ,X < RELAI D'ACCES A 'PAZIZ' FLOTTANT, ALPZIZ: WORD LPZIZ,X < RELAI D'ACCES A 'PAZIZ' ENTIER. ALPONT: WORD LPONT,X < RELAI D'ACCES A 'FPONT'. < < DONNEES DE "FUITE" : < FPERSA: FLOAT <NILK<NILK<NILK < FPERSA=(1-FPERSB)/255, FPERSK: FLOAT <NILK<NILK<NILK < FPERSK=FPERSA*Y+FPERSB, OU 'Y' EST LA < COORDONNEE 'Y'. < < CONSTANTES DE CALCUL < DES OMBRES PORTEES : < PRAYON: FLOAT <NILK<NILK<NILK < PENTE DE LA DROITE "RAYON LUMINEUX" < ALLANT DE LA SOURCE LUMINEUSE AU POINT < DE COTE MAXIMALE COURANT, EN FAISANT LES < HYPOTHESES SUIVANTES : < 1 - ON TRACE DE DROITE A GAUCHE, < 2 - ON SUPPOSE CE RAYON LUMINEUX CONTENU < DANS LE PLAN DE PROJECTION (Z=0)... < ENFIN, ON A : < PRAYON=(YMAX-YL)/(XMAX-XL). INCIX:: VAL -I < ON PARCOURT DONC LES LIGNES DE LA DROITE < VERS LA GAUCHE... < < DONNEES DE PROJECTION : < TRX: WORD NILK < TRANSLATION EN 'X', TRY: WORD NILK < TRANSLATION EN 'Y'. PAGE < < < G E S T I O N D U D I S Q U E - V I D E O : < < BUFVIW: BYTE "J";KCR XWOR%1: VAL '0000000@@@@(MOCD XWOR%3: VAL $-BUFVIW*NOCMO IF XWOR%1-K,XEIF%,,XEIF% XWOR%3: VAL XWOR%3-W XEIF%: VAL ENDIF LBUFVW:: VAL XWOR%3 < LONGUEUR DE LA COMMANDE AU DISQUE < VIDEO... XWOR%2: VAL COSBT?XASSIM=FMASK(K?NVPVDK=FCINST DEMVIW: BYTE XWOR%2;FAVW < COMMANDE DE L'ECRITURE SUR LE DISQUE < VIDEO... WORD BUFVIW=FCTA*NOCMO WORD LBUFVW BUFVIR: DZS W < BUFFER DE LECTURE DES ACQUITTEMENTS. LBUFVR:: VAL $-BUFVIR*NOCMO DEMVIR: BYTE XWOR%2;FAVR < LECTURE DES ACQUITTEMENTS DU DISQUE. WORD BUFVIR=FCTA*NOCMO WORD LBUFVR PAGE < < < T A B L E A A C C E S A L E A T O I R E : < < ASHT: EQU $ DO ASHPR BYTE NILK;NILK < COUPLES (Y,X). IF INOC-K,XEIF%,, IF ATTENTION : LA VALEUR DE 'INOC' EST INACCEPTABLE !!! XEIF%: VAL ENDIF DO ASHPR WORD INOC < ETAT INOCCUPE. PAGE < < < T A B L E D E S P O N D E R A T I O N S D E S < P O I N T S D ' U N E S P I R - D E P D E < D E P L A C E M E N T V E R T I C A L : < < MAXNDM:: VAL 32 < NOMBRE DE POINTS MAX... LCOEF: EQU $ DO MAXNDM FLOAT <NILK<NILK<NILK PAGE < < < T A B L E D E T R A N S C O D A G E D E S N I V E A U X : < < < ARGUMENTS D'ASSEMBLAGE : < ND=DIVISEUR DES NIVEAUX DE 'LNIVO' (0 OU 2), < NI=TRANSLATION DES NIVEAUX DE 'LNIVO' (0 OU 128)... < < NI: @ XWOR%1: VAL KOLF=FMASK+KOLTES=FVAL XWOR%1: VAL KOLC=FMASK+KDP=FVAL?XWOR%1 XWOR%2: VAL KOLTED=FMASK+KOL0=FVAL XWOR%2: VAL KOLTEF=FMASK+KOL0+KOLON=FVAL?XWOR%2 XWOR%3: VAL XWOR%2=XWOR%1-KOL0 < LONGUEUR DU SYMBOLE COURANT... XWOR%4: VAL MSYMBI=FMASK+KOL0=FVAL XWOR%4: VAL MSYMBL=FMASK+XWOR%3=FVAL?XWOR%4 XWOR%5: VAL XWOR%4=FCSYMT < ETAT DU SYMBOLE 'NI'... XWOR%6: VAL XWOR%5=FCSIGN XWOR%7: VAL XWOR%5(MSYMBN)MSYMBN=FCSIGN IF XWOR%6*XWOR%7,XEIF%,,XEIF% NI:: VAL XXNOIR < LE NIVEAU INITIAL SERA LE NIVEAU NOIR. XEIF%: VAL ENDIF ND: @ XWOR%1: VAL KOLF=FMASK+KOLTES=FVAL XWOR%1: VAL KOLC=FMASK+KDP=FVAL?XWOR%1 XWOR%2: VAL KOLTED=FMASK+KOL0=FVAL XWOR%2: VAL KOLTEF=FMASK+KOL0+KOLON=FVAL?XWOR%2 XWOR%3: VAL XWOR%2=XWOR%1-KOL0 < LONGUEUR DU SYMBOLE COURANT... XWOR%4: VAL MSYMBI=FMASK+KOL0=FVAL XWOR%4: VAL MSYMBL=FMASK+XWOR%3=FVAL?XWOR%4 XWOR%5: VAL XWOR%4=FCSYMT < ETAT DU SYMBOLE 'ND'... XWOR%6: VAL XWOR%5=FCSIGN XWOR%7: VAL XWOR%5(MSYMBN)MSYMBN=FCSIGN IF XWOR%6*XWOR%7,XEIF%,,XEIF% ND:: VAL W < PAS DE DIVISEUR DES NIVEAUX... XEIF%: VAL ENDIF LNIVO: EQU $ NTRN XWOR%1: VAL NIV256+NOCMO-E/NOCMO XWOR%2: VAL NIV256/NOCMO(K=FCREST TRN XWOR%3: VAL NIV256+XWOR%2 < INCREMENT DES OCTETS GAUCHES, XWOR%4: VAL XWOR%3+NOCMO-Z < INCREMENT DES OCTETS DROITS. NTRN <******************************************************************************* DO XWOR%1 BYTE K=FCDO)MFFFF+N-Z*NOCMO+XWOR%3/ND+NI;K=FCDO)MFFFF+N-Z*NOCMO+XWOR%4/ND+NI XWOR%5: VAL '0000000@@@@ < RECUPERATION DU DERNIER MOT, <******************************************************************************* TRN IF XWOR%2-K,,XEIF%, XWOR%5: VAL XWOR%5(MOCG < DANS LE CAS D'UNE TABLE DE LONGUEUR < IMPAIRE, ON EFFACE LE DERNIER OCTET < GENERE, $EQU $-D < ON REVIENT D'UN MOT EN ARRIERE, WORD XWOR%5 < ET ON REGENERE LE DERNIER MOT... XEIF%: VAL ENDIF < < < T A B L E I N V E R S E D E ' L N I V O ' : < < < NOTA : < DANS LA MESURE OU PLUSIEURS < NIVEAUX CALCULES PEUVENT DONNER < NAISSANCE AU MEME NIVEAU TRACE, < LA CORRESPONDANCE N'EST PAS BI- < JECTIVE, ET DONC 'LNOVI' NE DON- < QU'APPROXIMATIVEMENT L'INVERSE < DE 'LNIVO'... < < LNOVI: EQU $ DO XWOR%1 BYTE NILK;NILK PAGE < < < T A B L E D E T R A N S C O D A G E D E S T E X T U R E S : < < < FONCTION : < ON VA DECOUPER L'ESPACE DES TEXTURES < EN 'N' BANDES DE 'BW' NIVEAUX DE LARGE, < ET DONC TEL QUE : N*BW=256. PAR EXEMPLE < S'IL N'Y A PAS DE TEXTURES (N=1), LA < LARGEUR SERA : BW=256. SI L'ON SOUHAITE < 4 TYPES DE TEXTURES, ON FERA BW=64, ET LES < 4 TYPES UTILISERONT LES GROUPES DE NIVEAUX < ('00,'3F), ('40,'7F), ('80,'BF) ET ('C0,'FF) < EN SORTIE, ET ON REDUIRA LES NIVEAUX < DISPONIBLES EN PRENANT : ND=4 ET NI=0. < < < ARGUMENTS D'ASSEMBLAGE : < BW=LARGEUR DES BANDES DE TEXTURAGE (256 SI PAS DE TEXTURE), < TB=TRANSLATION DES NIVEAUX DE 'LTIVO'. < < TB: @ XWOR%1: VAL KOLF=FMASK+KOLTES=FVAL XWOR%1: VAL KOLC=FMASK+KDP=FVAL?XWOR%1 XWOR%2: VAL KOLTED=FMASK+KOL0=FVAL XWOR%2: VAL KOLTEF=FMASK+KOL0+KOLON=FVAL?XWOR%2 XWOR%3: VAL XWOR%2=XWOR%1-KOL0 < LONGUEUR DU SYMBOLE COURANT... XWOR%4: VAL MSYMBI=FMASK+KOL0=FVAL XWOR%4: VAL MSYMBL=FMASK+XWOR%3=FVAL?XWOR%4 XWOR%5: VAL XWOR%4=FCSYMT < ETAT DU SYMBOLE 'TB'... XWOR%6: VAL XWOR%5=FCSIGN XWOR%7: VAL XWOR%5(MSYMBN)MSYMBN=FCSIGN IF XWOR%6*XWOR%7,XEIF%,,XEIF% TB:: VAL XXNOIR < LE NIVEAU ITITIAL SERA LE NIVEAU NOIR. XEIF%: VAL ENDIF BW: @ XWOR%1: VAL KOLF=FMASK+KOLTES=FVAL XWOR%1: VAL KOLC=FMASK+KDP=FVAL?XWOR%1 XWOR%2: VAL KOLTED=FMASK+KOL0=FVAL XWOR%2: VAL KOLTEF=FMASK+KOL0+KOLON=FVAL?XWOR%2 XWOR%3: VAL XWOR%2=XWOR%1-KOL0 < LONGUEUR DU SYMBOLE COURANT... XWOR%4: VAL MSYMBI=FMASK+KOL0=FVAL XWOR%4: VAL MSYMBL=FMASK+XWOR%3=FVAL?XWOR%4 XWOR%5: VAL XWOR%4=FCSYMT < ETAT DU SYMBOLE 'BW'... XWOR%6: VAL XWOR%5=FCSIGN XWOR%7: VAL XWOR%5(MSYMBN)MSYMBN=FCSIGN IF XWOR%6*XWOR%7,XEIF%,,XEIF% BW:: VAL NIV256 < UNE SEULE BANDE DE 256 NIVEAUX DE LARGE. XEIF%: VAL ENDIF LTIVO: EQU $ NTRN XWOR%1: VAL NIV256+NOCMO-E/NOCMO XWOR%2: VAL NIV256/NOCMO(K=FCREST TRN XWOR%3: VAL NIV256+XWOR%2 < INCREMENT DES OCTETS GAUCHES, XWOR%4: VAL XWOR%3+NOCMO-Z < INCREMENT DES OCTETS DROITS. X%3: VAL XWOR%3 < POUR REDUIRE LA LONGUEUR X%4: VAL XWOR%4 < DU "...BYTE...". NTRN <******************************************************************************* DO XWOR%1 BYTE K=FCDO)MFFFF+N-Z*NOCMO+X%3/BW*BW+TB;K=FCDO)MFFFF+N-Z*NOCMO+X%4/BW*BW+TB XWOR%5: VAL '0000000@@@@ < RECUPERATION DU DERNIER MOT, <******************************************************************************* TRN IF XWOR%2-K,,XEIF%, XWOR%5: VAL XWOR%5(MOCG < DANS LE CAS D'UNE TABLE DE LONGUEUR < IMPAIRE, ON EFFACE LE DERNIER OCTET < GENERE, $EQU $-D < ON REVIENT D'UN MOT EN ARRIERE, WORD XWOR%5 < ET ON REGENERE LE DERNIER MOT... XEIF%: VAL ENDIF PAGE < < < L I S T E S D E D E S C R I P T I O N < D U M A I L L A G E D E T E X T U R A G E 3 D : < < LPAZX: EQU $ NLS DO MAXREK FLOAT <NILK<NILK<NILK < 'PAZIX'. LST LPZIX: EQU $ NLS DO MAXREK WORD NILK LST LPAZY: EQU $ NLS DO MAXREK FLOAT <NILK<NILK<NILK < 'PAZIY', LST LPZIY: EQU $ NLS DO MAXREK WORD NILK LST LPAZZ: EQU $ NLS DO MAXREK FLOAT <NILK<NILK<NILK < 'PAZIZ'. LST LPZIZ: EQU $ NLS DO MAXREK WORD NILK LST LPONT: EQU $ NLS DO MAXREK FLOAT <NILK<NILK<NILK < 'FPONT'. LST PAGE < < < T A B L E D E D E T E C T I O N D E S < D I S C O N T I N U I T E S P O U R LE < T R A I T E M E N T A N T I - A L I A S I N G : < < LISTY: EQU $ DZS XC512 PAGE < < < L I S T E S D E D E S C R I P T I O N < D U M A I L L A G E : < < LPASX: EQU $ NLS DO MAXREC FLOAT <NILK<NILK<NILK < 'PASIX'. LST LPSIX: EQU $ NLS DO MAXREC WORD NILK LST LPASY: EQU $ NLS DO MAXREC FLOAT <NILK<NILK<NILK < 'PASIY'. LST LPSIY: EQU $ NLS DO MAXREC WORD NILK LST LPOND: EQU $ NLS DO MAXREC FLOAT <NILK<NILK<NILK < 'FPOND'. LST PAGE < < < L I S T E D E S I N T E N S I T E S H A U T E S : < < INTH: EQU $ NLS DO XC512 FLOAT <NILK<NILK<NILK < LIGNE COURANTE. LST INTHM1: EQU $ NLS DO XC512 FLOAT <NILK<NILK<NILK < LIGNE PRECEDENTE. LST PAGE < < < B U F F E R D E T R O I S L I G N E S C O N S E C U T I V E S < < LIGP2: EQU $ NLS DO XC512 FLOAT <NILK<NILK<NILK < LIGNE SUIVANTE-SUIVANTE. LST LIGP1: EQU $ NLS DO XC512 FLOAT <NILK<NILK<NILK < LIGNE SUIVANTE. LST LIG: EQU $ NLS DO XC512 FLOAT <NILK<NILK<NILK < LIGNE COURANTE. LST LIGM1: EQU $ NLS DO XC512 FLOAT <NILK<NILK<NILK < LIGNE PRECEDENTE. LST PAGE < < < P I L E D E T R A V A I L : < < STACK: EQU $ DZS 64 PROG NLS XXXVEC: VAL XXVEC3 < DEFINITION DES PROGRAMMES VECTEUR 512... CALL #SIP VECTEUR 512# LST PAGE < < < M A R Q U A G E D ' U N P O I N T : < < < FONCTION : < CE SOUS-PROGRAMME MARQUE < LE POINT ARGUMENT (X,Y) AVEC < COMME NIVEAU, LE NIVEAU ARGU- < MENT (A) TRANSCODE VIA LA TA- < BLE 'LNIVO', CE QUI PERMET PAR < EXEMPLE LA SUPERPOSITION DE < PLUSIEURS IMAGES, EN FAISANT < QUE LEURS TABLES 'LNIVO' SOIENT < COMPLEMENTAIRES... < < < ARGUMENTS : < (A)=NIVEAU, < (X,Y)=COORDONNEES DU POINT. < < < RESULTAT : < (A)=NIVEAU TRANSCODE. < < POINT: EQU $ < < TRANSCODAGE DU NIVEAU : < PSR X < SAUVEGARDE DE LA COORDONNEE 'X'... LR A,X < (X)=NIVEAU ARGUMENT, LBY &ALNIVO < (A)=NIVEAU TRANSCODE, PLR X < RESTAURE : < (X)=COORDONNEE 'X'. < < TEXTURAGE EVENTUEL : < CPZ ITEXTU < DOIT-ON TEXTURER ??? JE POINT1 < NON... AD TEXTUR < OUI, ON TRANSLATE LE NIVEAU DU POINT, BSR APNIV < ET ON LE MET DANS (MINNIV,MAXNIV)... POINT1: EQU $ < < MARQUAGE DU POINT : < BSR ASTORP < MARQUAGE : (X,Y) <-- (A)... < < ET RETOUR : < RSR PAGE < < < T E S T P E R I O D I Q U E D E ' C O M F L O ' : < < < FONCTION : < CE SOUS-PROGRAMME EST < APPELE DERRIERE CHAQUE < 'FDV' EXPLICITE AINSI < QU'APRES LES APPELS DE < 'RAC' ET 'CRAMR'... < < TSFLO: EQU $ PSR A LA COMFLO < TEST DE 'COMFLO' PAR UN 'LA' AFIN DE NE < PAS MODIFIER LES CODES (CARY & CO)... JAE TSFLO1 < OK... QUIT XXQUIT < E R R E U R P R O G R A M M E ... < ON A : < (A)=INDICATEURS FLOTTANTS... < BIT 0 : UNDERFLOW, < BIT 1 : OVERFLOW, < BIT 2 : DIVISION PAR ZERO, < BIT 3 : 'FIX' IMPOSSIBLE. STZ COMFLO < PUIS RAZ, CAR CES INDICATEURS SONT < REMANENTS... TSFLO1: EQU $ PLR A RSR NLS XXXPRO: VAL YYYGOT < 'YYYGOT'. CALL #SIP UTILITAIRES# XXXPRO: VAL YYYFLO < 'YYYFLO'. CALL #SIP UTILITAIRES# LST PAGE < < < P R O D U I T S C A L A I R E D E 2 V E C T E U R S : < < < ARGUMENTS : < (A)=ADRESSE DU PREMIER VECTEUR 'VECT1', < (B)=ADRESSE DU DEUXIEME VECTEUR 'VECT2'. < < < RESULTAT : < (A,B)=VALEUR DU PRODUIT SCALAIRE... < < < ATTENTION : < AUX BASES 'L' ET 'W' !!! < < PRSCA: EQU $ VECT1X:: MOT O < X(VECT1), VECT1Y:: MOT VECT1X+DFLOT < Y(VECT1), VECT1Z:: MOT VECT1Y+DFLOT < Z(VECT1). VECT2X:: MOT O < X(VECT2), VECT2Y:: MOT VECT2X+DFLOT < Y(VECT2), VECT2Z:: MOT VECT2Y+DFLOT < Z(VECT2). < < INITIALISATIONS : < PSR L,W < SAUVEGARDE DE 2 BASES ; MAIS 'C' NE DOIT < PAS ETRE UTILISEE A CAUSE DU BLOC FLOT- < TANT... LR A,L < (L)=BASE DU VECTEUR 'VECT1', LR B,W < (W)=BASE DU VECTEUR 'VECT2'. < < CALCUL DU PRODUIT SCALAIRE : < #/FLD# VECT1X,L < X(1), FMP VECT2X,W < X(1)*X(2), #/FST# FWORK < ET SAVE... #/FLD# VECT1Y,L < Y(1), FMP VECT2Y,W < Y(1)*Y(2), FAD FWORK < X(1)*X(2)+Y(1)*Y(2), #/FST# FWORK < ET SAVE... #/FLD# VECT1Z,L < Z(1), FMP VECT2Z,W < Z(1)*Z(2), FAD FWORK < (A,B)=X(1)*X(2)+Y(1)*Y(2)+Z(1)*Z(2), < SOIT LE PRODUIT SCALAIRE DES 2 < VECTEURS 'VECT1' ET 'VECT2'... < < ET RETOUR : < PLR L,W RSR PAGE < < < G E N E R A T E U R R E D O N N A N T T O U J O U R S < L E M E M E V E C T E U R A L E A T O I R E E N < U N P O I N T D O N N E : < < < FONCTION : < CE GENERATEUR EST UTILISE < POUR LE CALCUL DES ALTITUDES < ALEATOIRES. < < < ARGUMENT : < (X,Y)=COORDONNEES DU POINT COURANT. < < < RESULTAT : < (A,B)=RDN(XS,YS,KITER,GRAINE). < < SPRDN: EQU $ < < GENERATION ALEATOIRE : < LR X,A < (A)=COORDONNEE 'X', MP KITER < ON UTILISE 'KITER' AFIN DE FAIRE < VARIER LA GENERATION ALEATOIRE A (X,Y) < CONSTANT SUIVANT LE NIVEAU DE RECUR- < SIVITE... EORR B,A < ET ON SE RAMENE SUR UN MOT... STA FWORK4 < SAVE F1(XS)... LR Y,A < (A)=COORDONNEE 'Y', EOR RDN1 < ??!???! STA FWORK5 < SAVE F2(YS)... MP FWORK4 < ET ON CONSTRUIT XR A,B < UNE FONCTION UNIQUE AD FWORK5 < DU NOEUD COURANT, SB FWORK4 < TELLE QUE : < F(X,Y)#F(Y,X), < F(X,Y)=X*Y+Y-X. EORR B,A MP GRAINE < D'OU F(GRAINE,KITER,X,Y), TELLE QUE : < F(X,Y)#F(Y,X) AFIN D'EVITER UNE SYMETRIE < PAR RAPPORT A UNE DIAGONALE... EORR B,A MP AMAGIK < DONT ON FAIT UN "SHUFFLING"... EORR B,A < ON CUMULE LES 2 MOTS, < < MISE A L'ECHELLE : < < < NOTA : < ON DOIT POUR METTRE LA < VALEUR 'RDN' A L'ECHELLE < CALCULER L'EXPRESSION : < < (SUP/(-32768))*(-RDN/2+16384+(RDN/2-16384)*(INF/SUP)), < < QUI SE SIMPLIFIE EN : < < (SUP/65536)*(RDN*(1-(INF/SUP))+32768*(1+(INF/SUP))). < FLT < ON FLOTTE 'RDN', FMP UNMIS < RDN*(1-(INF/SUP)), FAD UNPIS < RDN*(1-(INF/SUP))+32768*(1+(INF/SUP)), FMP SUP64 < (SUP/65536)*(...). < < ET SORTIE : < RSR PAGE < < < G E N E R A T E U R R E D O N N A N T T O U J O U R S < L E M E M E V E C T E U R A L E A T O I R E E N < U N P O I N T D O N N E : < < < FONCTION : < CE GENERATEUR EST UTILISE < POUR LES CALCULS ALEATOIRES < DE 'NRECUR'. < < < ARGUMENT : < (X,Y)=COORDONNEES DU POINT COURANT. < < < RESULTAT : < (A,B)=RDN(XS,YS,GRAINE). < < SPRDNR: EQU $ < < GENERATION ALEATOIRE : < LR X,A < (A)=COORDONNEE 'X', EORR B,A < ET ON SE RAMENE SUR UN MOT... STA FWORK4 < SAVE F1(XS)... LR Y,A < (A)=COORDONNEE 'Y', EOR RDN1 < ??!???! STA FWORK5 < SAVE F2(YS)... MP FWORK4 < ET ON CONSTRUIT XR A,B < UNE FONCTION UNIQUE AD FWORK5 < DU NOEUD COURANT, SB FWORK4 < TELLE QUE : < F(X,Y)#F(Y,X), < F(X,Y)=X*Y+Y-X. EORR B,A MP GRAINR < D'OU F(GRAINF,X,Y), TELLE QUE : < F(X,Y)#F(Y,X) AFIN D'EVITER UNE SYMETRIE < PAR RAPPORT A UNE DIAGONALE... EORR B,A MP AMAGIK < DONT ON FAIT UN "SHUFFLING"... EORR B,A < ON CUMULE LES 2 MOTS, FLT < ON FLOTTE 'RDN', < < MISE A L'ECHELLE : < < < NOTA : < ON DOIT POUR METTRE LA < VALEUR 'RDN' A L'ECHELLE < CALCULER L'EXPRESSION : < < (SUP/(-32768))*(-RDN/2+16384+(RDN/2-16384)*(INF/SUP)), < < QUI SE SIMPLIFIE EN : < < (SUP/65536)*(RDN*(1-(INF/SUP))+32768*(1+(INF/SUP))). < FMP UNMISR < RDN*(1-(INF/SUP)), FAD UNPISR < RDN*(1-(INF/SUP))+32768*(1+(INF/SUP)), FMP SUP64R < (SUP/65536)*(...). < < ET RETOUR : < RSR PAGE < < < S O M M A T I O N S U R U N E S P I R - M A P < C E N T R E E S U R ( X S , Y S ) D E S < N I V E A U X D E S E S P O I N T S : < < < ARGUMENT : < (X,Y)=COORDONNEES DANS L'ESPACE (256,256). < < < RESULTAT : < (A,B)=CUMUL CENTRE SUR LE POINT ARGUMENT (X,Y). < < SPIRAM: EQU $ < < INITIALISATION DE LA SPIR-MAP : < PSR X,Y < SAUVEGARDE DU POINT (X,Y). STZ CUMUL < CUMUL <-- 0. STZ NP < NP=NOMBRE DE POINTS TRAITES. LA PASM STA DELTAX < DELTAX <-- +1, STZ DELTAY < DELTAY <-- 0. LAI W STA LB0 < INITIALISATION DE LA LONGUEUR DU < PREMIER BRAS DE LA SPIR-MAP. < < PARCOURS D'UN BRAS : < SPIRM1: EQU $ LA LB0 STA LB < LONGUEUR DU BRAS COURANT. < < TRAITEMENT DU POINT COURANT : < SPIRM2: EQU $ IC NP < COMPTAGE DES POINTS TRAITES : LA NP CP NMM < FINI ??? JG SPIRM3 < OUI... LR X,A < NON, TEST DE LA COORDONNEE 'X' : JAL SPIRM4 < LE POINT EST HORS-ECRAN... CPI NPOLM1 JG SPIRM4 < HORS-ECRAN... LR Y,A < TEST DE LA COORDONNEE 'Y' : JAL SPIRM4 < HORS-ECRAN... CPI NLIGM1 JG SPIRM4 < HORS-ECRAN... < < ACCES AU NIVEAU DU POINT (X,Y) : < PSR X,Y < SAUVEGARDE DU POINT COURANT... < < TENTATIVE D'ACCELERATION : < SWBR Y,B ORR X,B < (B)=(Y,X), STB SAVYX < ET SAUVEGARDE... RBT NBITMO < SUPRESSION DU BIT DE SIGNE DE 'B' AFIN < QUE LE RESTE SOIT POSITIF OU NUL, LRM W WORD ASHT < (W)=ADRESSE DE LA TABLE D'ACCELERATION. LAI K DV LASHT < (B)=COUPLE (Y,X) MODULO 'ASHPR', ADR B,W < CE QUI DONNE DANS 'W' L'ADRESSE D'UNE < ENTREE : LA ASHT1,W CP SAVYX < L'ENTREE COURANTE CONTIENT-ELLE (Y,X) ??? JNE SPIRM6 < NON, IL FAUT ACCEDER REELLEMENT A 'TV1'/ < 'TV2'... LA ASHT2,W < OUI, MAIS EOR XCTCDA < ON VA ANSI REGARDER SIMULTANEMENT SI < L'ENTREE EST OCCUPEE, ET SI OUI, S'IL < Y A COINCIDENCE AVEC 'TV1'/'TV2'... JAL SPIRM6 < ET BIEN NON, CE N'EST PAS (X,Y)... CPI NIVMX7 < ALORS ??? JLE SPIRM7 < ON A TROUVE (X,Y), ET 'TV1'/'TV2' EST < LE MEME, ALORS : < (A)=NIVEAU(X,Y)... < < ACCES REEL AU POINT (X,Y) : < SPIRM6: EQU $ LR X,A LBI K XWOR%1: VAL NBITMO=K SCLD NBITMO-XWOR%1 < (B)=NUMERO DU MOT DANS LA LIGNE, SLRS NBITMO-XWOR%1 LXI NBITMO-BIT SBR A,X < (X)=DECALAGE D'ACCES AUX BITS, PSR X XR Y,B SLLD NMOTL=K+NBITMO ORR Y,A < (A)=NUMERO DU MOT DANS LA TRAME. AD XCTCDA < POUR PERMETTRE UN ACCES A TV1/TV2... LRM B,X,Y WORD MCDAR WORD D*W WORD LIMAG < (Y)=POUR PASSER D'UNE COULEUR A L'AUTRE. RCDA < ACCES AU MOT ROUGE, LRM B,X WORD MCDAV WORD D*W ADR Y,A RCDA < ACCES AU MOT VERT, LRM B,X WORD MCDAB WORD D*W ADR Y,A RCDA < ACCES AU MOT BLEU. PLR X < RESTAURATION DU DECALAGE, LA MCDAR SLRS L,X SLRD BIT < RECUPERATION D'UN BIT ROUGE, LA MCDAV SLRS L,X SLRD BIT < RECUPERATION D'UN BIT VERT, LA MCDAB SLRS L,X ANDI BIT < RECUPERATION D'UN BIT BLEU, SLLD NCOOL-BIT < (A)=NIVEAU DE GRIS DU POINT. < < MEMORISATION DE (X,Y) : < OR XCTCDA < (A)='TV1'/'TV2',NIVEAU(X,Y) : IF TV1?TV2(NIVMX7,,XEIF%, IF ATTENTION : LA CONCATENATION 'TV1'/'TV2' ET NIVEAU IF EST IMPOSSIBLE !!! XEIF%: VAL ENDIF STA ASHT2,W < MEMORISATION DE LA TRANSLATION ET DU < NIVEAU, ANDI NIVMX7 < ET RESTAURATION DU NIVEAU(X,Y)... LB SAVYX STB ASHT1,W < ET MEMORISATION DE (X,Y)... < < RESTAURATION DU POINT < COURANT ET CUMUL : < SPIRM7: EQU $ PLR X,Y AD CUMUL < ET STA CUMUL < CUMULE... < < PARCOURS DE LA SPIR-MAP : < SPIRM4: EQU $ LA DELTAX < CHANGEMENT DE ADR A,X LA DELTAY < POINT COURANT (X,Y). ADR A,Y DC LB < DECOMPTAGE DES POINTS SUR LA BRANCHE : JG SPIRM2 < OK, IL EN RESTE... CPZ DELTAX < NON, ON EST AU BOUT, FAUT-IL AUGMENTER < LA LONGUEUR COURANTE DES BRANCHES ??? JNE SPIRM5 < NON (DX#0) ... IC LB0 < OUI (DX=0) ... SPIRM5: EQU $ LA DELTAY < ON FAIT SUBIR AU NOMBRE COMPLEXE NGR A,A < (DX,DY) UNE ROTATION DE PI/2, SOIT LB DELTAX < UNE MULTIPLICATION PAR LA MATRICE < (0,-1,1,0)... STA DELTAX < DELTAX=-DELTAY, STB DELTAY < DELTAY=DELTAX. JMP SPIRM1 < VERS LA BRANCHE SUIVANTE < < GENERATION DU POINT (X,Y) : < SPIRM3: EQU $ PLR X,Y < RESTAURATION DU POINT COURANT (X,Y). < < NORMALISATION DU CUMUL : < LA CUMUL FLT FDV FNMM RSR PAGE < < < S O M M A T I O N S U R U N E S P I R - D E P < C E N T R E E S U R ( X S , Y S ) D E S < N I V E A U X D E S E S P O I N T S : < < < ARGUMENT : < (X,Y)=COORDONNEES DANS L'ESPACE (256,256). < < < RESULTAT : < (A,B)=CUMUL CENTRE SUR LE POINT ARGUMENT (X,Y). < < SPIRAD: EQU $ < < INITIALISATION DE LA SPIR-DEP : < PSR X,Y < SAUVEGARDE DU POINT (X,Y). #/FLD# F0 #/FST# FCUMUL < CUMUL <-- 0. STZ NP < NP=NOMBRE DE POINTS TRAITES. LA PASD STA DELTAX < DELTAX <-- +1, STZ DELTAY < DELTAY <-- 0. LAI W STA LB0 < INITIALISATION DE LA LONGUEUR DU < PREMIER BRAS DE LA SPIR-DEP. < < PARCOURS D'UN BRAS : < SPIRD1: EQU $ LA LB0 STA LB < LONGUEUR DU BRAS COURANT. < < TRAITEMENT DU POINT COURANT : < SPIRD2: EQU $ IC NP < COMPTAGE DES POINTS TRAITES : LA NP CP NDM < FINI ??? JG SPIRD3 < OUI... LR X,A < NON, TEST DE LA COORDONNEE 'X' : JAL SPIRD4 < LE POINT EST HORS-ECRAN... CPI NPOLM1 JG SPIRD4 < HORS-ECRAN... LR Y,A < TEST DE LA COORDONNEE 'Y' : JAL SPIRD4 < HORS-ECRAN... CPI NLIGM1 JG SPIRD4 < HORS-ECRAN... < < ACCES AU NIVEAU DU POINT (X,Y) : < PSR X,Y < SAUVEGARDE DU POINT COURANT... < < TENTATIVE D'ACCELERATION : < SWBR Y,B ORR X,B < (B)=(Y,X), STB SAVYX < ET SAUVEGARDE... RBT NBITMO < SUPRESSION DU BIT DE SIGNE DE 'B' AFIN < QUE LE RESTE SOIT POSITIF OU NUL, LRM W WORD ASHT < (W)=ADRESSE DE LA TABLE D'ACCELERATION. LAI K DV LASHT < (B)=COUPLE (Y,X) MODULO 'ASHPR', ADR B,W < CE QUI DONNE DANS 'W' L'ADRESSE D'UNE < ENTREE : LA ASHT1,W CP SAVYX < L'ENTREE COURANTE CONTIENT-ELLE (Y,X) ??? JNE SPIRD6 < NON, IL FAUT ACCEDER REELLEMENT A 'TV1'/ < 'TV2'... LA ASHT2,W < OUI, MAIS EOR XCTCDA < ON VA ANSI REGARDER SIMULTANEMENT SI < L'ENTREE EST OCCUPEE, ET SI OUI, S'IL < Y A COINCIDENCE AVEC 'TV1'/'TV2'... JAL SPIRD6 < ET BIEN NON, CE N'EST PAS (X,Y)... CPI NIVMX7 < ALORS ??? JLE SPIRD7 < ON A TROUVE (X,Y), ET 'TV1'/'TV2' EST < LE MEME, ALORS : < (A)=NIVEAU(X,Y)... < < ACCES REEL AU POINT (X,Y) : < SPIRD6: EQU $ LR X,A LBI K XWOR%1: VAL NBITMO=K SCLD NBITMO-XWOR%1 < (B)=NUMERO DU MOT DANS LA LIGNE, SLRS NBITMO-XWOR%1 LXI NBITMO-BIT SBR A,X < (X)=DECALAGE D'ACCES AUX BITS, PSR X XR Y,B SLLD NMOTL=K+NBITMO ORR Y,A < (A)=NUMERO DU MOT DANS LA TRAME. AD XCTCDA < POUR PERMETTRE UN ACCES A TV1/TV2... LRM B,X,Y WORD MCDAR WORD D*W WORD LIMAG < (Y)=POUR PASSER D'UNE COULEUR A L'AUTRE. RCDA < ACCES AU MOT ROUGE, LRM B,X WORD MCDAV WORD D*W ADR Y,A RCDA < ACCES AU MOT VERT, LRM B,X WORD MCDAB WORD D*W ADR Y,A RCDA < ACCES AU MOT BLEU. PLR X < RESTAURATION DU DECALAGE, LA MCDAR SLRS L,X SLRD BIT < RECUPERATION D'UN BIT ROUGE, LA MCDAV SLRS L,X SLRD BIT < RECUPERATION D'UN BIT VERT, LA MCDAB SLRS L,X ANDI BIT < RECUPERATION D'UN BIT BLEU, SLLD NCOOL-BIT < (A)=NIVEAU DE GRIS DU POINT. < < MEMORISATION DE (X,Y) : < OR XCTCDA < (A)='TV1'/'TV2',NIVEAU(X,Y) : IF TV1?TV2(NIVMX7,,XEIF%, IF ATTENTION : LA CONCATENATION 'TV1'/'TV2' ET NIVEAU IF EST IMPOSSIBLE !!! XEIF%: VAL ENDIF STA ASHT2,W < MEMORISATION DE LA TRANSLATION ET DU < NIVEAU, ANDI NIVMX7 < ET RESTAURATION DU NIVEAU(X,Y)... LB SAVYX STB ASHT1,W < ET MEMORISATION DE (X,Y)... < < RESTAURATION DU POINT < COURANT ET CUMUL : < SPIRD7: EQU $ LX NP ADRI -I,X ADR X,X < (X)=INDEX FLOTTANT DU POINT COURANT... FLT < FLOTTAGE DU NIVEAU CALCULE, FMP &ALCOEF < PONDERATION, FAD FCUMUL < ET #/FST# FCUMUL < CUMUL... PLR X,Y < < PARCOURS DE LA SPIR-DEP : < SPIRD4: EQU $ LA DELTAX < CHANGEMENT DE ADR A,X LA DELTAY < POINT COURANT (X,Y). ADR A,Y DC LB < DECOMPTAGE DES POINTS SUR LA BRANCHE : JG SPIRD2 < OK, IL EN RESTE... CPZ DELTAX < NON, ON EST AU BOUT, FAUT-IL AUGMENTER < LA LONGUEUR COURANTE DES BRANCHES ??? JNE SPIRD5 < NON (DX#0) ... IC LB0 < OUI (DX=0) ... SPIRD5: EQU $ LA DELTAY < ON FAIT SUBIR AU NOMBRE COMPLEXE NGR A,A < (DX,DY) UNE ROTATION DE PI/2, SOIT LB DELTAX < UNE MULTIPLICATION PAR LA MATRICE < (0,-1,1,0)... STA DELTAX < DELTAX=-DELTAY, STB DELTAY < DELTAY=DELTAX. JMP SPIRD1 < VERS LA BRANCHE SUIVANTE < < GENERATION DU POINT (X,Y) : < SPIRD3: EQU $ PLR X,Y < RESTAURATION DU POINT COURANT (X,Y). < < NORMALISATION DU CUMUL : < #/FLD# FCUMUL FDV FCOEFC RSR PAGE < < < C A L C U L D E L A S O M M E P O N D E R E E < D E S F O N C T I O N S A L E A O I R E S : < < < ARGUMENT : < (X,Y)=POINT COURANT. < < < RESULTAT : < (A,B)=((MOYENE)+(AMPLI)*F(XS,YS))*(CONTRIBUTION ALEATOIRE)+ < (F(SIGMA(NIVEAU(X,Y)))*(CONTRIBUTION DES SPIR-MAPS). < < FONCT: EQU $ PSR X,Y < SAUVEGARDES... < < FLOTTAGE DU POINT COURANT : < LR X,A < COORDONNEE 'X' : AD TRDNX < TRANSLATION EN 'X' DU GENERATEUR, FLT FMP FHOMO < HOMOTHETIE... #/FST# GXS < COORDONNEE 'XS' DU POINT COURANT. FIX STA XS LR Y,A < COORDONNEE 'Y' : AD TRDNY < TRANSLATION EN 'Y' DU GENERATEUR, FLT FMP FHOMO < HOMOTHETIE... #/FST# GYS < COORDONNEE 'YS' DU POINT COURANT. FIX STA YS < < DISCRIMINATION DES < CONTRIBUTIONS ALEATOIRES < ET DES SPIR-MAPS : < #/FLD# PONRDN < (A,B)=PONDERATION ALEATOIRE : FCAZ < EXISTE-T'ELLE ??? JNE FONCT1 < OUI, ALLONS LA CALCULER... BSR AGOTO WORD FONCT6 < NON, ALLONS VERS LA CONTRIBUTION DES < SPIR-MAPS, EN NOTANT QUE L'ON A : < (A,B)=0... < < < C O N T R I B U T I O N A L E A T O I R E : < < FONCT1: EQU $ IF NEXIST-K,,XEIF%, IF ATTENTION : LE TEST SUIVANT VA MERDER !!! XEIF%: VAL ENDIF CPZ IRDNRC < GENERE-T'ON 'NRECUR' ALEATOIREMENT ??? JNE FONCTA < OUI... BSR AGOTO WORD FONCTN < NON... FONCTA: EQU $ < < < G E N E R A T I O N D E ' N R E C U R ' < R E C U R S I V E D E F O N C T I O N S < A L E A T O I R E S " D E C R O I S S A N T E S " : < < #/FLD# F0 #/FST# FCUMR < INITIALISATION DU CUMUL DES FONKTIONS < ALEATOIRES SCALANTES... < < ITERATION POUR CHAQUE < FONKTION ALEATOIRE : < STZ KITER < INITIALISATION DES RECURSIONS... LXI K < (X)=INDEX DES RECURSIONS... FONKT5: EQU $ IC KITER < COMPTAGE DES RECURSIONS... < < INITIALISATION DU MAILLAGE : < LA &ALPSIX STA PASIX < 'PASIX' ENTIER, LA &ALPSIY STA PASIY < 'PASIY' ENTIER. PSR X ADR X,X < PASSAGE A UN INDEX FLOTTANT... FLD &ALPASX #/FST# FPASIX < 'PASIX' FLOTTANT, FLD &ALPASY #/FST# FPASIY < 'PASIY' FLOTTANT. FLD &ALPOND #/FST# FPOND < 'FPOND'. < < RECHERCHE DU NOEUD < VOISIN PAR "DEFAUT" : < LA XS SARD NBITMO DV PASIX MP PASIX LR B,X < X(NOEUD HAUT-GAUCHE) DE LA MAILLE < COURANTE, LA YS SARD NBITMO DV PASIY MP PASIY LR B,Y < Y(NOEUD HAUT-GAUCHE) DE LA MAILLE < COURANTE. LA XS CPR A,X < EST-ON EN UN NOEUD ??? JNE FONKT3 < NON... LA YS < PEUT-ETRE : CPR A,Y < EST-ON EN UN NOEUD ??? JNE FONKT3 < NON, INTERPOLONS... < < CAS OU LE POINT (XS,YS) < COURANT EST UN NOEUD : < BSR APRDNR < LE POINT COURANT EST UN NOEUD... JMP FONKT4 < VERS L'ACCES A LA VALEUR DU NOEUD... < < CAS OU LE POINT (XS,YS) < COURANT N'EST PAS UN NOEUD : < FONKT3: EQU $ NGR X,A < ABSCISSE DU NOEUD "HAUT-GAUCHE"... FLT FAD GXS < X-XNOEUD, FDV FPASIX < (X-XNOEUD)/PASIX, #/FST# HINCU < DISTANCE NORMALISEE A 1 LE LONG DE OX, < DU POINT COURANT AU NOEUD DE LA MAILLE. NGR Y,A < ORDONNEE DU NOEUD "HAUT-GAUCHE"... FLT FAD GYS < Y-YNOEUD, FDV FPASIY < (Y-YNOEUD)/PASIY, #/FST# HINCV < DISTANCE NORMALISEE A 1 LE LONG DE OY, < DU POINT COURANT AU NOEUD DE LA MAILLE. BSR APRDNR #/FST# AFNIV1 < NIVEAU(XNOEUD,YNOEUD), LA PASIX ADR A,X BSR APRDNR #/FST# AFNIV2 < NIVEAU(XNOEUD+PASIX,YNOEUD), LA PASIY ADR A,Y BSR APRDNR #/FST# AFNIV3 < NIVEAU(XNOEUD+PASIX,YNOEUD+PASIY), LA PASIX SBR A,X BSR APRDNR #/FST# AFNIV4 < NIVEAU(XNOEUD,YNOEUD+PASIY). < < INTERPOLATION ENTRE LES < QUATRE SOMMETS D'UN CARRE < PORTANT LES VALEURS (NIV1, < NIV2,NIV3,NIV4), LES COOR- < DONNEES DU POINT DANS LE < CARRE ETANT (HINCU,HINCV) : < < < NOTA : < ON DOIT INTERPOLER ENTRE < LES NIVEAUX (N1,N2,N3,N4) SUR < LES SOMMETS ((1-U,1-V),(U,1-V),(U,V),(1-U,V)), < CE QUI CONDUIT A CALCULER LA < FORMULE : < < (1-U)*(1-V)*N1+U*(1-V)*N2+U*V*N3+(1-U)*V*N4, < < QUI SE REECRIT, EN SUPPOSANT U#0 : < < (1-V)*((1-U)*N1+U*N2)+V*(U*N3+(1-U)*N4), < < SOIT : < < U*(1-V)*(N2+((1-U)/U)*N1)+U*V*(N3+((1-U)/U)*N4), < < ET ENFIN (SI U#0) : < < U*((1-V)*(N2+((1-U)/U)*N1)+V*(N3+((1-U)/U)*N4)). < < OU (SI V#0) : < < V*((1-U)*(N4+((1-V)/V)*N1)+U*(N3+((1-V)/V)*N2)). < FCMZ HINCU < 'U' EST-IL NUL ??? JNE FONKT8 < NON, ON PEUT DIVISER PAR LUI... FCMZ HINCV < 'V' EST-IL NUL ??? JNE FONKT9 < NON, ON PEUT DIVISER PAR LUI... QUIT XXQUIT < E R R E U R P R O G R A M M E ... JMP FONKT7 < ET ON SORT... < < CAS OU 'V' EST NON NUL : < FONKT9: EQU $ #/FLD# F1 < 1, FSB HINCU < 1-U, #/FST# FWORK1 < W1=1-U. #/FLD# F1 < 1, FSB HINCV < 1-V, FDV HINCV < (1-V)/V, PSR A,B < ET SAVE... FMP AFNIV1 < ((1-V)/V)*N1, FAD AFNIV4 < N4+((1-V)/V)*N1, FMP FWORK1 < (1-U)*(N4+((1-V)/V)*N1, #/FST# FWORK < ET SAVE... PLR A,B < (1-V)/V, FMP AFNIV2 < ((1-V)/V)*N2, FAD AFNIV3 < N3+((1-V)/V)*N2, FMP HINCU < U*(N3+((1-V)/V)*N2), FAD FWORK < (1-U)*(N4+((1-V)/V)*N1) < +U*(N3+((1-V)/V)*N2), FMP HINCV < V*(...). JMP FONKT7 < ET L'INTERPOLATION EST FINIE... < < CAS OU 'U' EST NON NUL : < FONKT8: EQU $ #/FLD# F1 < 1, FSB HINCV < 1-V, #/FST# FWORK1 < W1=1-V. #/FLD# F1 < 1, FSB HINCU < 1-U, FDV HINCU < (1-U)/U, PSR A,B < ET SAVE... FMP AFNIV1 < ((1-U)/U)*N1, FAD AFNIV2 < N2+((1-U)/U)*N1, FMP FWORK1 < (1-V)*(N2+((1-U)/U)*N1, #/FST# FWORK < ET SAVE... PLR A,B < (1-U)/U, FMP AFNIV4 < ((1-U)/U)*N4, FAD AFNIV3 < N3+((1-U)/U)*N4, FMP HINCV < V*(N3+((1-U)/U)*N4), FAD FWORK < (1-V)*(N2+((1-U)/U)*N1) < +V*(N3+((1-U)/U)*N4), FMP HINCU < U*(...). < < FIN DE L'INTERPOLATION : < FONKT7: EQU $ < < RESTAURATION DE (XS,YS) : < FONKT4: EQU $ PLR X < < CALCUL RECURSIF DE LA FONKTION : < FMP FPOND < ET ON PONDERE PAR LES 'FPOND' < AFIN D'OBTENIR DES VALEURS ALEATOIRES < DECROISSANTES STATISTIQUEMENT... FAD FCUMR < QUE L'ON CUMULE, #/FST# FCUMR < ON A AINSI EN CHAQUE POINT UNE SOMME < DE FONKTION ALEATOIRE DONT LA FREQUENCE < AUGMENTE PROGRESSIVEMENT PAR REDUCTION < DE LA MAILLE, MAIS DONT L'AMPLITUDE < DIMINUE STATISTIQUEMENT... < < PASSAGE A LA COMPOSANTE SUIVANTE : < ADRI I,X < PROGRESSION DE L'INDEX DE RECURSION... LR X,A CP SRECUR < EST-CE FINI ??? JGE FONKT2 < OUI, ON ARRETE LA... BSR AGOTO WORD FONKT5 < NON, ON CONTINUE... FONKT2: EQU $ < < FIN DE RECURSION : < #/FLD# FCUMR < (A,B)=SOMME DES FONCTION ALEATOIRES... < < MISE A L'ECHELLE : < < < NOTA : < ON DOIT POUR METTRE LA < VALEUR 'RDN' A L'ECHELLE < CALCULER L'EXPRESSION : < < (SUP/(-32768))*(-RDN/2+16384+(RDN/2-16384)*(INF/SUP)), < < QUI SE SIMPLIFIE EN : < < (SUP/65536)*(RDN*(1-(INF/SUP))+32768*(1+(INF/SUP))). < FMP UNMISR < RDN*(1-(INF/SUP)), FAD UNPISR < RDN*(1-(INF/SUP))+32768*(1+(INF/SUP)), FMP SUP64R < (SUP/65536)*(...). BSR AROND STA NRECUR < NOMBRE ALEATOIRE D'ITERATIONS... FONCTN: EQU $ < < < G E N E R A T I O N D ' U N E S O M M A T I O N < R E C U R S I V E D E F O N C T I O N S < A L E A T O I R E S " D E C R O I S S A N T E S " : < < #/FLD# F0 #/FST# FCUMR < INITIALISATION DU CUMUL DES FONCTIONS < ALEATOIRES SCALANTES... < < ITERATION POUR CHAQUE < FONCTION ALEATOIRE : < STZ KITER < INITIALISATION DES RECURSIONS... LXI K < (X)=INDEX DES RECURSIONS... FONCT5: EQU $ IC KITER < COMPTAGE DES RECURSIONS... < < INITIALISATION DU MAILLAGE : < LA &ALPSIX STA PASIX < 'PASIX' ENTIER, LA &ALPSIY STA PASIY < 'PASIY' ENTIER. PSR X ADR X,X < PASSAGE A UN INDEX FLOTTANT... FLD &ALPASX #/FST# FPASIX < 'PASIX' FLOTTANT, FLD &ALPASY #/FST# FPASIY < 'PASIY' FLOTTANT. FLD &ALPOND #/FST# FPOND < 'FPOND'. < < RECHERCHE DU NOEUD < VOISIN PAR "DEFAUT" : < LA XS SARD NBITMO DV PASIX MP PASIX LR B,X < X(NOEUD HAUT-GAUCHE) DE LA MAILLE < COURANTE, LA YS SARD NBITMO DV PASIY MP PASIY LR B,Y < Y(NOEUD HAUT-GAUCHE) DE LA MAILLE < COURANTE. LA XS CPR A,X < EST-ON EN UN NOEUD ??? JNE FONCT3 < NON... LA YS < PEUT-ETRE : CPR A,Y < EST-ON EN UN NOEUD ??? JNE FONCT3 < NON, INTERPOLONS... < < CAS OU LE POINT (XS,YS) < COURANT EST UN NOEUD : < BSR ASPRDN < LE POINT COURANT EST UN NOEUD... JMP FONCT4 < VERS L'ACCES A LA VALEUR DU NOEUD... < < CAS OU LE POINT (XS,YS) < COURANT N'EST PAS UN NOEUD : < FONCT3: EQU $ NGR X,A < ABSCISSE DU NOEUD "HAUT-GAUCHE"... FLT FAD GXS < X-XNOEUD, FDV FPASIX < (X-XNOEUD)/PASIX, #/FST# HINCU < DISTANCE NORMALISEE A 1 LE LONG DE OX, < DU POINT COURANT AU NOEUD DE LA MAILLE. NGR Y,A < ORDONNEE DU NOEUD "HAUT-GAUCHE"... FLT FAD GYS < Y-YNOEUD, FDV FPASIY < (Y-YNOEUD)/PASIY, #/FST# HINCV < DISTANCE NORMALISEE A 1 LE LONG DE OY, < DU POINT COURANT AU NOEUD DE LA MAILLE. BSR ASPRDN #/FST# AFNIV1 < NIVEAU(XNOEUD,YNOEUD), LA PASIX ADR A,X BSR ASPRDN #/FST# AFNIV2 < NIVEAU(XNOEUD+PASIX,YNOEUD), LA PASIY ADR A,Y BSR ASPRDN #/FST# AFNIV3 < NIVEAU(XNOEUD+PASIX,YNOEUD+PASIY), LA PASIX SBR A,X BSR ASPRDN #/FST# AFNIV4 < NIVEAU(XNOEUD,YNOEUD+PASIY). < < INTERPOLATION ENTRE LES < QUATRE SOMMETS D'UN CARRE < PORTANT LES VALEURS (NIV1, < NIV2,NIV3,NIV4), LES COOR- < DONNEES DU POINT DANS LE < CARRE ETANT (HINCU,HINCV) : < < < NOTA : < ON DOIT INTERPOLER ENTRE < LES NIVEAUX (N1,N2,N3,N4) SUR < LES SOMMETS ((1-U,1-V),(U,1-V),(U,V),(1-U,V)), < CE QUI CONDUIT A CALCULER LA < FORMULE : < < (1-U)*(1-V)*N1+U*(1-V)*N2+U*V*N3+(1-U)*V*N4, < < QUI SE REECRIT, EN SUPPOSANT U#0 : < < (1-V)*((1-U)*N1+U*N2)+V*(U*N3+(1-U)*N4), < < SOIT : < < U*(1-V)*(N2+((1-U)/U)*N1)+U*V*(N3+((1-U)/U)*N4), < < ET ENFIN (SI U#0) : < < U*((1-V)*(N2+((1-U)/U)*N1)+V*(N3+((1-U)/U)*N4)). < < OU (SI V#0) : < < V*((1-U)*(N4+((1-V)/V)*N1)+U*(N3+((1-V)/V)*N2)). < FCMZ HINCU < 'U' EST-IL NUL ??? JNE FONCT8 < NON, ON PEUT DIVISER PAR LUI... FCMZ HINCV < 'V' EST-IL NUL ??? JNE FONCT9 < NON, ON PEUT DIVISER PAR LUI... QUIT XXQUIT < E R R E U R P R O G R A M M E ... JMP FONCT7 < ET ON SORT... < < CAS OU 'V' EST NON NUL : < FONCT9: EQU $ #/FLD# F1 < 1, FSB HINCU < 1-U, #/FST# FWORK1 < W1=1-U. #/FLD# F1 < 1, FSB HINCV < 1-V, FDV HINCV < (1-V)/V, PSR A,B < ET SAVE... FMP AFNIV1 < ((1-V)/V)*N1, FAD AFNIV4 < N4+((1-V)/V)*N1, FMP FWORK1 < (1-U)*(N4+((1-V)/V)*N1, #/FST# FWORK < ET SAVE... PLR A,B < (1-V)/V, FMP AFNIV2 < ((1-V)/V)*N2, FAD AFNIV3 < N3+((1-V)/V)*N2, FMP HINCU < U*(N3+((1-V)/V)*N2), FAD FWORK < (1-U)*(N4+((1-V)/V)*N1) < +U*(N3+((1-V)/V)*N2), FMP HINCV < V*(...). JMP FONCT7 < ET L'INTERPOLATION EST FINIE... < < CAS OU 'U' EST NON NUL : < FONCT8: EQU $ #/FLD# F1 < 1, FSB HINCV < 1-V, #/FST# FWORK1 < W1=1-V. #/FLD# F1 < 1, FSB HINCU < 1-U, FDV HINCU < (1-U)/U, PSR A,B < ET SAVE... FMP AFNIV1 < ((1-U)/U)*N1, FAD AFNIV2 < N2+((1-U)/U)*N1, FMP FWORK1 < (1-V)*(N2+((1-U)/U)*N1, #/FST# FWORK < ET SAVE... PLR A,B < (1-U)/U, FMP AFNIV4 < ((1-U)/U)*N4, FAD AFNIV3 < N3+((1-U)/U)*N4, FMP HINCV < V*(N3+((1-U)/U)*N4), FAD FWORK < (1-V)*(N2+((1-U)/U)*N1) < +V*(N3+((1-U)/U)*N4), FMP HINCU < U*(...). < < FIN DE L'INTERPOLATION : < FONCT7: EQU $ < < RESTAURATION DE (XS,YS) : < FONCT4: EQU $ PLR X < < CALCUL RECURSIF DE LA FONCTION : < FMP FPOND < ET ON PONDERE PAR LES 'FPOND' < AFIN D'OBTENIR DES VALEURS ALEATOIRES < DECROISSANTES STATISTIQUEMENT... FAD FCUMR < QUE L'ON CUMULE, #/FST# FCUMR < ON A AINSI EN CHAQUE POINT UNE SOMME < DE FONCTION ALEATOIRE DONT LA FREQUENCE < AUGMENTE PROGRESSIVEMENT PAR REDUCTION < DE LA MAILLE, MAIS DONT L'AMPLITUDE < DIMINUE STATISTIQUEMENT... < < PASSAGE A LA COMPOSANTE SUIVANTE : < ADRI I,X < PROGRESSION DE L'INDEX DE RECURSION... LR X,A CP NRECUR < EST-CE FINI ??? JGE FONCT2 < OUI, ON ARRETE LA... BSR AGOTO WORD FONCT5 < NON, ON CONTINUE... FONCT2: EQU $ < < FIN DE RECURSION : < #/FLD# FCUMR < ET ON RENVOIE LA SOMME DES < FONCTIONS ALEATOIRES... FMP RENORM < QUE L'ON NORMALISE... < < CALCUL FINAL DE LA < CONTRIBUTION ALEATOIRE : < FAD MOYENE < ET TRANSLATION. FMP PONRDN < ET PONDERATION PAR LA CONTRIBUTION < ALEATOIRE... FONCT6: EQU $ < < TEST DE LA CONTRIBUTION < DES SPIR-MAPS (256,256) : < FCMZ PONSPI < LES SPIR-MAPS SONT-ELLES LA ??? JE FONCT0 < NON, (A,B) DONNE LA FONCTION... < < < C O N T R I B U T I O N D E S S P I R - D E P S : < < PSR A,B < SAUVEGARDE DE LA CONTRIBUTION ALEATOIRE. < < TEST DE LA POSITION < DU POINT COURANT (XS,YS) < DE LA MAILLE (512,512) < PAR RAPPORT A LA MAILLE < DES SPIR-DEPS 2*(256,256) : < LA XS < (A)=ABSCISSE '512', SLRS XC512/NPOL=K LR A,X < (X)=ABSCISSE '256'. JC FONC01 < ELLE NE "TOMBE PAS JUSTE"... LA YS < (A)=ORDONNEE '512', SB VECTNL NGR A,A < EN EFFET, LES AXES 'Y' '512' ET '256' < SONT INVERSES... SLRS XL512/NLIG=K LR A,Y < (Y)=ORDONNEE '256'. JC FONC02 < ELLE NE "TOMBE PAS JUSTE", ET LE POINT < '512' EST SUR SUR UNE HORIZONTALE ENTRE < DEUX POINTS '256'... < < CAS D'UN POINT '512' < COINCIDANT AVEC UN < POINT '256' : < BSR ASPIRD < (A,B)=SIGMA(NIVEAU(X,Y)). FMP F4 < ET ON LE QUADRUPLE : < (A,B)=4*SIGMA(NIVEAU(X,Y)). JMP FONC09 < VERS LA SORTIE... < < CAS D'UN POINT '512' < ENTRE DEUX POINTS '256' < SUR UNE VERTICALE : < FONC02: EQU $ BSR ASPIRD < (A,B)=SIGMA(NIVEAU(X,Y)), #/FST# FWORK < ET SAVE... ADRI I,Y BSR ASPIRD < (A,B)=SIGMA(NIVEAU(X,Y-1)). FAD FWORK < (A,B)=SIGMA(NIVEAU(X,Y))+ < SIGMA(NIVEAU(X,Y-1)). FMP F2 < ET ON LE DOUBLE : < (A,B)=2*(SIGMA(NIVEAU(X,Y))+ < SIGMA(NIVEAU(X,Y-1))). JMP FONC09 < VERS LA SORTIE... < < AUTRES CAS : < FONC01: EQU $ LA YS < (A)=ORDONNEE '512' : SB VECTNL NGR A,A < EN EFFET, LES AXES 'Y' '512' ET '256' < SONT INVERSES... SLRS XL512/NLIG=K LR A,Y < (Y)=ORDONNEE '256'. JC FONC03 < ELLE NE "TOMBE PAS JUSTE", ET LE POINT < '512' ET AU CENTRE D'UN CARRE DE QUATRE < POINTS '256'... < < CAS D'UN POINT '512' < ENTRE DEUX POINTS '256' < SUR UNE HORIZONTALE : < BSR ASPIRD < (A,B)=SIGMA(NIVEAU(X,Y)), #/FST# FWORK < ET SAVE... ADRI I,X BSR ASPIRD < (A,B)=SIGMA(NIVEAU(X+1,Y)). FAD FWORK < (A,B)=SIGMA(NIVEAU(X,Y))+ < SIGMA(NIVEAU(X+1,Y)). FMP F2 < ET ON LE DOUBLE : < (A,B)=2*(SIGMA(NIVEAU(X,Y))+ < SIGMA(NIVEAU(X+1,Y))). JMP FONC09 < VERS LA SORTIE... < < CAS D'UN POINT '512' AU < CENTRE D'UN CARRE FAIT < DE QUATRE POINTS '256' : < FONC03: EQU $ BSR ASPIRD < (A,B)=SIGMA(NIVEAU(X,Y)), #/FST# FWORK1 ADRI I,X BSR ASPIRD < (A,B)=SIGMA(NIVEAU(X+1,Y)), #/FST# FWORK2 ADRI I,Y BSR ASPIRD < (A,B)=SIGMA(NIVEAU(X+1,Y-1)), #/FST# FWORK ADRI -I,X BSR ASPIRD < (A,B)=SIGMA(NIVEAU(X,Y-1)). FAD FWORK FAD FWORK2 FAD FWORK1 < (A,B)=SIGMA(NIVEAU(X,Y))+ < SIGMA(NIVEAU(X+1,Y))+ < SIGMA(NIVEAU(X+1,Y-1))+ < SIGMA(NIVEAU(X,Y-1)). < < PONDERATION "SPIR-DEP" : < FONC09: EQU $ FMP PONSPI < ET CONTRIBUTION DES SPIR-DEPS... < < < C A L C U L D E L A F O N C T I O N C O U R A N T E : < < #/FST# FWORK < SAUVEGARDE TEMPORAIRE... PLR A,B < (A,B)=CONTRIBUTION ALEATOIRE, FAD FWORK < (A,B)=CONTRIBUTION ALEATOIRE+ < CONTRIBUTION DES SPIR-DEPS. FONCT0: EQU $ < < HOMOTHETIE : < FMP FHOMO < < RETOUR : < PLR X,Y RSR PAGE < < < G E N E R A T E U R R E D O N N A N T T O U J O U R S < L E M E M E V E C T E U R A L E A T O I R E E N < U N P O I N T D O N N E : < < < ARGUMENT : < (X,Y,W)=COORDONNEES DU POINT COURANT. < < < RESULTAT : < (A,B)=RAN(XS,YS,ZS,KJTER,GRAINF). < < SPRAN: EQU $ < < GENERATION ALEATOIRE : < LR X,A < (A)=COORDONNEE 'X', MP KJTER < ON UTILISE 'KJTER' AFIN DE FAIRE < VARIER LA GENERATION ALEATOIRE A (X,Y) < CONSTANT SUIVANT LE NIVEAU DE REKUR- < SIVITE... EORR B,A < ET ON SE RAMENE SUR UN MOT... STA FWORK4 < SAVE F1(XS)... LR Y,A < (A)=COORDONNEE 'Y', EOR RAN1 < ??!???! STA FWORK5 < SAVE F2(YS)... MP FWORK4 < ET ON CONSTRUIT XR A,B < UNE FUNCTION UNIQUE AD FWORK5 < DU NOEUD COURANT, SB FWORK4 < TELLE QUE : < F(X,Y)#F(Y,X), < F(X,Y)=X*Y+Y-X. EORR B,A EORR W,A < ET ON RAJOUTE LA TROISIEME COORDONNEE... MP GRAINF < D'OU F(GRAINF,KJTER,X,Y,Z), TELLE QUE : < F(X,Y)#F(Y,X) AFIN D'EVITER UNE SYMETRIE < PAR RAPPORT A UNE DIAGONALE... EORR B,A MP AMAGIK < DONT ON FAIT UN "SHUFFLING"... EORR B,A < ON CUMULE LES 2 MOTS, < < MISE A L'ECHELLE : < < < NOTA : < ON DOIT POUR METTRE LA < VALEUR 'RAN' A L'ECHELLE < CALCULER L'EXPRESSION : < < (SUP/(-32768))*(-RAN/2+16384+(RAN/2-16384)*(INF/SUP)), < < QUI SE SIMPLIFIE EN : < < (SUP/65536)*(RAN*(1-(INF/SUP))+32768*(1+(INF/SUP))). < FLT < ON FLOTTE 'RAN', FMP UNMJS < RAN*(1-(INF/SUP)), FAD UNPJS < RAN*(1-(INF/SUP))+32768*(1+(INF/SUP)), FMP ZUP64 < (SUP/65536)*(...). < < ET SORTIE : < RSR PAGE < < < C A L C U L D ' U N E T E X T U R E 3 D P A R < C A L C U L D E L A S O M M E P O N D E R E E < D E S F O N C T I O N S A L E A O I R E S : < < < ARGUMENT : < (X,Y,W)=COORDONNEES DU POINT COURANT. < < < RESULTAT : < (TEXTUR)=((MOYENF)+(AMPLY)*F(XS,YS,ZS))*(CONTRIBUTION ALEAT < (F(SIGMA(NIVEAU(X,Y)))*(CONTRIBUTION DES SPIR-MA < < FUNCT: EQU $ PSR A,B < SAUVEGARDES... PSR X,Y,W < SAUVEGARDES... < < FLOTTAGE DU POINT COURANT : < LR X,A < COORDONNEE 'X' : AD TRANX < TRANSLATION EN 'X' DU GENERATEUR, FLT FMP FHOMO #/FST# HXS < COORDONNEE 'XS' DU POINT COURANT. FIX STA XS LR Y,A < COORDONNEE 'Y' : AD TRANY < TRANSLATION EN 'Y' DU GENERATEUR, FLT FMP FHOMO #/FST# HYS < COORDONNEE 'YS' DU POINT COURANT. FIX STA YS LR W,A < COORDONNEE 'Z' : AD TRANZ < TRANSLATION EN 'Z' DU GENERATEUR, FLT FMP FHOMO #/FST# HZS < COORDONNEE 'ZS' DU POINT COURANT. FIX STA ZS < < CHOIX DU TYPE DE TEXTURE : < CPZ IALEAT < EST-ELLE ALEATOIRE ??? JNE FUNCT8 < OUI... < < CAS D'UNE TEXTURE QUI EST < EN FAIT UNE COMBINAISON < LINEAIRE DES COORDONNEES < (XS,YS,ZS), CE QUI PERMET < PAR EXEMPLE DE NE PRENDRE < EN COMPTE QUE 'ZS' < ET FAIRE AINSI DES LIGNES DE NIVEAUX : < #/FLD# FXS < XS, FMP FALTX < FALTX*XS, BSR ASFWOR #/FLD# FYS < YS, FMP FALTY < FALTY*YS, BSR APFWOR < FALTX*XS+FALTY*YS, #/FLD# FZS < ZS, FMP FALTZ < FALTZ*ZS, BSR APFWOR < FALTX*XS+FALTY*YS+FALTZ*ZS, FAD FALTR < FALTX*XS+FALTY*YS+FALTZ*ZS+FALTR. PLR X,Y,W < RESTAURATIONS, BSR AGOTO WORD FUNCT7 < ET VERS LA SORTIE... < < DISCRIMINATION DES < CONTRIBUTIONS ALEATOIRES < ET DES SPIR-MAPS : < FUNCT8: EQU $ #/FLD# PONRAN < (A,B)=PONDERATION ALEATOIRE : FCAZ < EXISTE-T'ELLE ??? JNE FUNCT1 < OUI, ALLONS LA CALCULER... BSR AGOTO WORD FUNCT6 < NON, ALLONS VERS LA CONTRIBUTION DES < SPIR-MAPS, EN NOTANT QUE L'ON A : < (A,B)=0... < < < C O N T R I B U T I O N A L E A T O I R E : < < FUNCT1: EQU $ < < < G E N E R A T I O N D ' U N E S O M M A T I O N < R E C U R S I V E D E F O N C T I O N S < A L E A T O I R E S " D E C R O I S S A N T E S " : < < #/FLD# F0 #/FST# FKUMR < INITIALISATION DU CUMUL DES FUNCTIONS < ALEATOIRES SCALANTES... < < ITERATION POUR CHAQUE < FUNCTION ALEATOIRE : < STZ KJTER < INITIALISATION DES REKURSIONS... LXI K < (X)=INDEX DES REKURSIONS... FUNCT5: EQU $ IC KJTER < COMPTAGE DES REKURSIONS... < < INITIALISATION DU MAILLAGE : < LA &ALPZIX STA PAZIX < 'PAZIX' ENTIER, LA &ALPZIY STA PAZIY < 'PAZIY' ENTIER, LA &ALPZIZ STA PAZIZ < 'PAZIZ' ENTIER. PSR X ADR X,X < PAZSAGE A UN INDEX FLOTTANT... FLD &ALPAZX #/FST# FPAZIX < 'PAZIX' FLOTTANT, FLD &ALPAZY #/FST# FPAZIY < 'PAZIY' FLOTTANT. FLD &ALPAZZ #/FST# FPAZIZ < 'PAZIZ' FLOTTANT. FLD &ALPONT #/FST# FPONT < 'FPONT'. < < REKHERCHE DU NOEUD < VOISIN PAR "DEFAUT" : < LA XS SARD NBITMO DV PAZIX MP PAZIX LR B,X < X(NOEUD BAS-GAUCHE) DE LA MAILLE < COURANTE, LA YS SARD NBITMO DV PAZIY MP PAZIY LR B,Y < Y(NOEUD BAS-GAUCHE) DE LA MAILLE < COURANTE. LA ZS SARD NBITMO DV PAZIZ MP PAZIZ LR B,W < Z(NOEUD BAS-GAUCHE) DE LA MAILLE < COURANTE. LA XS CPR A,X < EST-ON EN UN NOEUD ??? JNE FUNCT3 < NON... LA YS < PEUT-ETRE : CPR A,Y < EST-ON EN UN NOEUD ??? JNE FUNCT3 < NON, INTERPOLONS... LA ZS < PEUT-ETRE : CPR A,W < EST-ON EN UN NOEUD ??? JNE FUNCT3 < NON, INTERPOLONS... < < CAS OU LE POINT (XS,YS,ZS) < COURANT EST UN NOEUD : < BSR ASPRAN < LE POINT COURANT EST UN NOEUD... BSR AGOTO WORD FUNCT4 < VERS L'ACCES A LA VALEUR DU NOEUD... < < CAS OU LE POINT (XS,YS,ZS) < COURANT N'EST PAZ UN NOEUD : < FUNCT3: EQU $ NGR X,A < ABSCISSE DU NOEUD "BAS-GAUCHE"... FLT FAD HXS < X-XNOEUD, FDV FPAZIX < (X-XNOEUD)/PAZIX, #/FST# HJNCU < DISTANCE NORMALISEE A 1 LE LONG DE OX, < DU POINT COURANT AU NOEUD DE LA MAILLE. NGR Y,A < ORDONNEE DU NOEUD "BAS-GAUCHE"... FLT FAD HYS < Y-YNOEUD, FDV FPAZIY < (Y-YNOEUD)/PAZIY, #/FST# HJNCV < DISTANCE NORMALISEE A 1 LE LONG DE OY, < DU POINT COURANT AU NOEUD DE LA MAILLE. NGR W,A < Z-COORDONNEE DU NOEUD "BAS-GAUCHE"... FLT FAD HZS < Z-ZNOEUD, FDV FPAZIZ < (Z-ZNOEUD)/PAZIZ, #/FST# HJNCW < DISTANCE NORMALISEE A 1 LE LONG DE OZ, < DU POINT COURANT AU NOEUD DE LA MAILLE. < NOTA : PAR LA SUITE, 'XN', 'YN' ET 'ZN' < DESIGNERONT LES 3 COORDONNEES DU < NOEUD DE LA MAILLE COURANTE. BSR ASPRAN #/FST# AFNJV1 < NIVEAU(XN,YN,ZN), LA PAZIX ADR A,X BSR ASPRAN #/FST# AFNJV2 < NIVEAU(XN+PAZIX,YN,ZN), LA PAZIY ADR A,Y BSR ASPRAN #/FST# AFNJV3 < NIVEAU(XN+PAZIX,YN+PAZIY,ZN), LA PAZIX SBR A,X BSR ASPRAN #/FST# AFNJV4 < NIVEAU(XN,YN+PAZIY,ZN), LA PAZIZ ADR A,W BSR ASPRAN #/FST# AFNJV5 < NIVEAU(XN,YN+PAZIY,ZN+PAZIZ), LA PAZIX ADR A,X BSR ASPRAN #/FST# AFNJV6 < NIVEAU(XN+PAZIX,YN+PAZIY,ZN+PAZIZ), LA PAZIY SBR A,Y BSR ASPRAN #/FST# AFNJV7 < NIVEAU(XN+PAZIX,YN,ZN+PAZIZ), LA PAZIX SBR A,X BSR ASPRAN #/FST# AFNJV8 < NIVEAU(XN,YN,ZN+PAZIZ). < < INTERPOLATION ENTRE LES < HUIT SOMMETS D'UN CUBE < PORTANT LES VALEURS (NIV1, < NIV2,NIV3,NIV4,NIV5,NIV6, < NIV7,NIV8), LES COOR- < DONNEES DU POINT DANS LE < CUBE ETANT (HJNCU,HJNCV,HJNCW) : < < < NOTA : < ON DOIT INTERPOLER ENTRE LES < HUIT NIVEAUX (NIV1,...,NIV8) < PORTES PAR LES HUIT SOMMETS D'UN < CUBE : < < < (1-U,V,1-W) ----------------- (U,V,1-W) < /I /I < / I / I < / I / I < / I / I < / I / I < / I / I < / I / I < (1-U,V,W) ------------------- (U,V,W) I < I I I I < I I I I < I I I I < I I I I < I (1-U,1-V,1-W) ----------- I - (U,1-V,1-W) < I / I / < I / I / < I / I / < I / I / < I / I / < I / I / < I/ I/ < (1-U,1-V,W) ----------------- (U,1-V,W) < < < NIV 4 --------------------- NIV 3 < /I /I < / I / I < / I / I < / I / I < / I / I < / I / I < / I / I < NIV 5 --------------------- NIV 6 I < I I I I < I I I I < I I I I < I I I I < I NIV 1 --------------- I --- NIV 2 < I / I / < I / I / < I / I / < I / I / < I / I / < I / I / < I/ I/ < NIV 8 --------------------- NIV 7 < < < CE QUI DONNE LA FORMULE < D'INTERPOLATION POUR LE POINT < INTERIEUR AU CUBE ET DE COOR- < DONNEES (U,V,W) RELATIVES AU < SOMMET '1' : < < NIVEAU(U,V,W) = (1-U)*(1-V)*(1-W)*NIV1 < +U*(1-V)*(1-W)*NIV2 < +U*V*(1-W)*NIV3 < +(1-U)*V*(1-W)*NIV4 < +(1-U)*V*W*NIV5 < +U*V*W*NIV6 < +U*(1-V)*W*NIV7 < +(1-U)*(1-V)*W*NIV8. < < < CALCUL DE (1-U,1-V,1-W) < #/FLD# F1 < 1, FSB HJNCU < 1-U, #/FST# HJNCU1 < HJNCU1=1-HJNCU. #/FLD# F1 < 1, FSB HJNCV < 1-V, #/FST# HJNCV1 < HJNCV1=1-HJNCV. #/FLD# F1 < 1, FSB HJNCW < 1-W, #/FST# HJNCW1 < HJNCW1=1-HJNCW. < < INTERPOLATION TRI-DIMENSIONNELLE : < < 1-W, FMP AFNJV1 < (1-W)*N1, #/FST# FWORK #/FLD# HJNCW < W, FMP AFNJV8 < W*N8, FAD FWORK < (1-W)*N1+W*N8, FMP HJNCU1 < (1-U)*((1-W)*N1+W*N8), #/FST# FWORK1 < ET SAVE... #/FLD# HJNCW1 < 1-W, FMP AFNJV2 < (1-W)*N2, #/FST# FWORK #/FLD# HJNCW < W, FMP AFNJV7 < W*N7, FAD FWORK < (1-W)*N2+W*N7, FMP HJNCU < U*((1-W)*N2+W*N7), FAD FWORK1 < U*((1-W)*N2+W*N7)+(1-U)*((1-W)*N1+W*N8), FMP HJNCV1 < (1-V)*(U*((1-W)*N2+W*N7) < +(1-U)*((1-W)*N1+W*N8)), #/FST# FWORK1 < ET SAVE... #/FLD# HJNCW1 < 1-W, FMP AFNJV3 < (1-W)*N3, #/FST# FWORK #/FLD# HJNCW < W, FMP AFNJV6 < W*N6, FAD FWORK < (1-W)*N3+W*N6, FMP HJNCU < U*((1-W)*N3+W*N6), #/FST# FWORK2 < ET SAVE... #/FLD# HJNCW1 < 1-W, FMP AFNJV4 < (1-W)*N4, #/FST# FWORK #/FLD# HJNCW < W, FMP AFNJV5 < W*N5, FAD FWORK < (1-W)*N4+W*N5, FMP HJNCU1 < (1-U)*((1-W)*N4+W*N5), FAD FWORK2 < (1-U)*((1-W)*N4+W*N5)+U*((1-W)*N3+W*N6), FMP HJNCV < V*((1-U)*((1-W)*N4+W*N5) < +U*((1-W)*N3+W*N6)), FAD FWORK1 < CUMUL GENERAL... < < FIN DE L'INTERPOLATION : < FUNCT4: EQU $ PLR X < < CALCUL REKURSIF DE LA FUNCTION : < FMP FPONT < ET ON PONDERE PAR LES 'FPONT' < AFIN D'OBTENIR DES VALEURS ALEATOIRES < DECROISSANTES STATISTIQUEMENT... < NOTA : ON NE DIVISE PLUS PAR 'FPONT0', < CAR LA DEFINITION DE 'RENORN' INCLUE < SON INVERSE, ET DONC : FPONT0/FPONT0=1... FAD FKUMR < QUE L'ON CUMULE, #/FST# FKUMR < ON A AINSI EN CHAQUE POINT UNE SOMME < DE FUNCTION ALEATOIRE DONT LA FREQUENCE < AUGMENTE PROGRESSIVEMENT PAR REDUCTION < DE LA MAILLE, MAIS DONT L'AMPLYTUDE < DIMINUE STATISTIQUEMENT... < < PAZSAGE A LA COMPOSANTE SUIVANTE : < ADRI I,X < PROGRESSION DE L'INDEX DE REKURSION... LR X,A CP NREKUR < EST-CE FINI ??? JGE FUNCT2 < OUI, ON ARRETE LA... BSR AGOTO WORD FUNCT5 < NON, ON CONTINUE... FUNCT2: EQU $ < < FIN DE REKURSION : < #/FLD# FKUMR < ET ON RENVOIE LA SOMME DES < FUNCTIONS ALEATOIRES... FDV RENORN < ET ON MULTIPLIE PAR 'AMPLY', 'AMPLYR', < ET ON DIVISE PAR LE SIGMA DES 'FPONT'... < < CALCUL FINAL DE LA < CONTRIBUTION ALEATOIRE : < FAD MOYENF < ET TRANSLATION. FMP PONRAN < ET PONDERATION PAR LA CONTRIBUTION < ALEATOIRE... FUNCT6: EQU $ < < TEST DE LA CONTRIBUTION < DES SPIR-MAPS (256,256) : < FCMZ PONSPJ < LES SPIR-MAPS SONT-ELLES LA ??? JE FUNCT0 < NON, (A,B) DONNE LA FUNCTION... < < < C O N T R I B U T I O N D E S S P I R - D E P S : < < PSR A,B < SAUVEGARDE DE LA CONTRIBUTION ALEATOIRE. < < TEST DE LA POSITION < DU POINT COURANT (XS,YS) < DE LA MAILLE (512,512) < PAR RAPPORT A LA MAILLE < DES SPIR-DEPS 2*(256,256) : < LA XS < (A)=ABSCISSE '512', SLRS XC512/NPOL=K LR A,X < (X)=ABSCISSE '256'. JC FUNC01 < ELLE NE "TOMBE PAZ JUSTE"... LA YS < (A)=ORDONNEE '512', SB VECTNL NGR A,A < EN EFFET, LES AXES 'Y' '512' ET '256' < SONT INVERSES... SLRS XL512/NLIG=K LR A,Y < (Y)=ORDONNEE '256'. JC FUNC02 < ELLE NE "TOMBE PAZ JUSTE", ET LE POINT < '512' EST SUR SUR UNE HORIZONTALE ENTRE < DEUX POINTS '256'... < < CAS D'UN POINT '512' < COINCIDANT AVEC UN < POINT '256' : < BSR ASPIRD < (A,B)=SIGMA(NIVEAU(X,Y)). FMP F4 < ET ON LE QUADRUPLE : < (A,B)=4*SIGMA(NIVEAU(X,Y)). JMP FUNC09 < VERS LA SORTIE... < < CAS D'UN POINT '512' < ENTRE DEUX POINTS '256' < SUR UNE VERTICALE : < FUNC02: EQU $ BSR ASPIRD < (A,B)=SIGMA(NIVEAU(X,Y)), #/FST# FWORK < ET SAVE... ADRI I,Y BSR ASPIRD < (A,B)=SIGMA(NIVEAU(X,Y+1)). FAD FWORK < (A,B)=SIGMA(NIVEAU(X,Y))+ < SIGMA(NIVEAU(X,Y+1)). FMP F2 < ET ON LE DOUBLE : < (A,B)=2*(SIGMA(NIVEAU(X,Y))+ < SIGMA(NIVEAU(X,Y+1))). JMP FUNC09 < VERS LA SORTIE... < < AUTRES CAS : < FUNC01: EQU $ LA YS < (A)=ORDONNEE '512' : SB VECTNL NGR A,A < EN EFFET, LES AXES 'Y' '512' ET '256' < SONT INVERSES... SLRS XL512/NLIG=K LR A,Y < (Y)=ORDONNEE '256'. JC FUNC03 < ELLE NE "TOMBE PAZ JUSTE", ET LE POINT < '512' ET AU CENTRE D'UN CARRE DE QUATRE < POINTS '256'... < < CAS D'UN POINT '512' < ENTRE DEUX POINTS '256' < SUR UNE HORIZONTALE : < BSR ASPIRD < (A,B)=SIGMA(NIVEAU(X,Y)), #/FST# FWORK < ET SAVE... ADRI I,X BSR ASPIRD < (A,B)=SIGMA(NIVEAU(X+1,Y)). FAD FWORK < (A,B)=SIGMA(NIVEAU(X,Y))+ < SIGMA(NIVEAU(X+1,Y)). FMP F2 < ET ON LE DOUBLE : < (A,B)=2*(SIGMA(NIVEAU(X,Y))+ < SIGMA(NIVEAU(X+1,Y))). JMP FUNC09 < VERS LA SORTIE... < < CAS D'UN POINT '512' AU < CENTRE D'UN CARRE FAIT < DE QUATRE POINTS '256' : < FUNC03: EQU $ BSR ASPIRD < (A,B)=SIGMA(NIVEAU(X,Y)), #/FST# FWORK1 ADRI I,X BSR ASPIRD < (A,B)=SIGMA(NIVEAU(X+1,Y)), #/FST# FWORK2 ADRI I,Y BSR ASPIRD < (A,B)=SIGMA(NIVEAU(X+1,Y+1)), #/FST# FWORK ADRI -I,X BSR ASPIRD < (A,B)=SIGMA(NIVEAU(X,Y+1)). FAD FWORK FAD FWORK2 FAD FWORK1 < (A,B)=SIGMA(NIVEAU(X,Y))+ < SIGMA(NIVEAU(X+1,Y))+ < SIGMA(NIVEAU(X+1,Y+1))+ < SIGMA(NIVEAU(X,Y+1)). < < PONDERATION "SPIR-DEP" : < FUNC09: EQU $ FMP PONSPJ < ET CONTRIBUTION DES SPIR-DEPS... < < < C A L C U L D E L A F O N C T I O N C O U R A N T E : < < #/FST# FWORK < SAUVEGARDE TEMPORAIRE... PLR A,B < (A,B)=CONTRIBUTION ALEATOIRE, FAD FWORK < (A,B)=CONTRIBUTION ALEATOIRE+ < CONTRIBUTION DES SPIR-DEPS. < < < M O D U L A T I O N : < < FUNCT0: EQU $ PLR X,Y,W < RESTAURATION DES COORDONNEES (X,Y,Z)... IF NEXIST-K,,XEIF%, IF ATTENTION : CE QUI SUIT EST IDIOT !!! XEIF%: VAL ENDIF CPZ NFUNCT < Y-A-T'IL UNE MODULATION ??? JE FUNCT7 < NON, (A,B) EST BON... PSR A,B < OUI, ON EMPILE LA VALEUR COURANTE DE < LA FUNCTION RAN(X,Y,Z)... PSR X,Y,W < ET SAUVEGARDE DES COORDONNEES, ON NE < SAIT JAMAIS... LA NFUNCT < (A)=INDEX DE LA FUNCTION DEMANDEE : CPI FGAUSS < EST-CE UNE GAUSSIENNE ??? JE GAUS01 < OUI... QUIT XXQUIT < E R R E U R P R O G R A M M E ... PLR A,B < (A,B)=RAN(X,Y,Z) COURANTE, JMP FUNCT7 < ET VERS LA SORTIE... < < < G A U S S I E N N E : < < GAUS01: EQU $ LR X,A < X, SB TXGAUS < X-TX, FLT #/FST# FWORK FMP FWORK < (X-TX)**2, FDV DXGAUS < ((X-TX)**2)/DX. #/FST# FWORK1 LR Y,A < Y, SB TYGAUS < Y-TY, FLT #/FST# FWORK FMP FWORK < (Y-TY)**2, FDV DYGAUS < ((Y-TY)**2)/DY. FAD FWORK1 < ((X-TX)**2)/DX+((Y-TY)**2)/DY. #/FST# FWORK1 LR W,A < Z, SB TZGAUS < Z-TZ, FLT #/FST# FWORK FMP FWORK < (Z-TZ)**2, FDV DZGAUS < ((Z-TZ)**2)/DZ. FAD FWORK1 < ((X-TX)**2)/DX+((Y-TY)**2)/DY+ < +((Z-TZ)**2)/DZ, FNEG BSR AEXPON < EXP(-(((X-TX)**2)/DX+((Y-TY)**2)/DY+ < ((Z-TZ)**2)/DZ)). < < ET MODULATION : < GINFUN: EQU $ #/FST# FWORK < SAUVEGARDE DU FACTEUR MULTIPLICATIF, PLR X,Y,W < RESTAURATION DES COORDONNEES (X,Y,Z)... PLR A,B < (A,B)=RAN(X,Y,Z), FMP FWORK < ET MODULATION... FUNCT7: EQU $ < < HOMOTHETIE : < FMP FHOMO < < CALCUL DE LA TRANSLATION DE TEXTURAGE : < PSR X BSR AROND < (A)=VALEUR ALEATOIRE, BSR APNIV < CORECTION... < (NOTA : CE SOUS-PROGRAMME EST AUSSI < APPELE AILLEURS, ET CES APPELS POUR- < RAIENT ETRE SUPPRIMES, MAIS ON NE SAIT < JAMAIS...). LR A,X < (X)=INDEX ALEATOIRE, LBY &ALTIVO < (A)=TRANSLATION DE TEXTURAGE... STA TEXTUR < ET SAUVEGARDE POUR 'POINT'... PLR X < < RETOUR : < PLR A,B < RESTAURATIONS... RSR PAGE < < < M I S E D ' U N N I V E A U < D A N S ( M I N N I V , M A X N I V ) : < < < ARGUMENT : < (A)=NIVEAU A VALIDER. < < < RESULTAT : < (A)=NIVEAU DANS (MINNIV,MAXNIV). < < PNIV: EQU $ IF EXIST-K,XEIF%,,XEIF% IF ATTENTION : LE TEST QUI SUIT EST IDIOT !!! XEIF%: VAL ENDIF CPZ TRONIV < DOIT-ON TRONQUER BRUTALEMENT ??? JNE PNI400 < OUI... < < CAS DE LA FONCTION < EN DENTS DE SCIE : < PNI401: EQU $ JAGE PNI402 NGR A,A < ABS(NIVEAU), PNI402: EQU $ CP F255 JLE PNI400 < ON DOIT ETRE DANS (0,255)... SB F511 < SINON, ON S'Y RAMENE... JMP PNI401 < ET ON ATTEND DE S'ETRE STABILISER... < < TRONCAGE : < PNI400: EQU $ CP MINNIV < ET VALIDATION : JL PNI314 < TROP PETIT : ON TRONQUE INFERIEUREMENT... CP MAXNIV < ET VALIDATION : JG PNI315 < TROP GRAND : ON TRONQUE SUPERIEUREMENT... PNI311: EQU $ JMP PNI312 < VERS LE MARQUAGE DE (X,Y) AVEC (A). PNI314: EQU $ LA MINNIV < (A)=NIVEAU PLANCHER, JMP PNI311 < VERS SON MARQUAGE... PNI315: EQU $ LA MAXNIV < (A)=NIVEAU PLAFOND, JMP PNI311 < VERS SON MARQUAGE... < < ET RETOUR : < PNI312: EQU $ RSR PAGE < < < A C C E S A U N I V E A U C O U R A N T : < < < ARGUMENT : < (IBUFMT)=INDEX DE L'OCTET COURANT. < < < RESULTAT : < (A,B)=OCTET COURANT EN FLOTTANT... < < NIVO: EQU $ < < INITIALISATIONS : < PSR X < < TEST DE L'ETAT DU BUFFER : < LA IBUFMT < (A)=INDEX COURANT : CP ZBUFMT < LE BUFFER A-T'IL ETE VIDE (OU EST-CE < L'ETAT INITIAL) ??? JL NIVO1 < NON... < < CAS OU LE BUFFER EST VIDE : < NIVO2: EQU $ LAD DEMMT < (A)=ADRESSE DE LA DEMANDE, SVC < QUE L'ON ENVOIE... JE NIVO3 < OK... QUIT XXQUIT < E R R E U R D ' A S S I G N A T I O N.. JMP NIVO2 < ET ON RE-TENTE, OU BIEN ON ARRETE S'IL < S'AGIT D'UN 'TAPE-MARK'... NIVO3: EQU $ IC DEMMT+ARGESC < PREPARATION DE L'ADRESSE DU BLOC SUIVANT, ACTD XXXSIZ < RECUPERATION DE LA 'BOX'... LR B,A < (A)=NOMBRE D'OCTETS REELS DU BLOC : CP DEMMT+COESC < LE BUFFER EST-IL BON ??? JNE NIVO2 < NON, ON LIT L'ENREGISTREMENT SUIVANT... LAI K < (A)=INDEX DU PREMIER OCTET. < < ACCES A L'OCTET COURANT : < NIVO1: EQU $ LR A,X < (X)=INDEX DE L'OCTET COURANT, LBY &ABUFMT < (A)=OCTET COURANT... ADRI I,X < ET PREPARATION DE STX IBUFMT < L'ACCES SUIVANT... < < MISE A L'ECHELLE : < FLT < ET PASSAGE EN FLOTTANT... FAD TRANMT < TRANSLATION ET FMP MULTMT < MISE A L'ECHELLE... < < PRISE EN COMPTE DE LA < GENERATION ALEATOIRE < ET DES SPIR-DEPS : < PLR X < RESTAURATION DE LA COORDONNEE 'X'... CPZ IMODMT < FAUT-IL LES IGNORER ??? JE NIVO4 < OUI ('NEXIST')... PSR A,B < NON : SAUVEGARDE DE L'ENTREE BANDE, BSR AFONKT < (A,B)=CONTRIBUTION ALEATOIRE ET DES < SPIR-DEPS, #/FST# FWORK < QUE L'ON SAUVEGARDE, PLR A,B FAD FWORK < ET CUMUL GENERAL : < 'BANDE'+'ALEATOIRE'+'SPIR-DEP'. NIVO4: EQU $ < < ET RETOUR : < RSR PAGE < < < C A L C U L D ' U N E P U I S S A N C E < Q U E L C O N Q U E R E E L L E ' P ' : < < < ARGUMENT : < (A,B)=NOMBRE 'N' ARGUMENT, < < < RESULTAT : < (A,B)='N' A LA PUISSANCE P. < < RAK: EQU $ PSR Y < < < L O G N E P E R I E N : < < LOGN: EQU $ STZ SIGNE < =0 : SIGNE "+" A PRIORI... FCAZ JGE LOGN1 < POSITIF... IC SIGNE < =1 : SIGNE "-"... LOGN1: EQU $ LR A,Y FABS ANDI XXMASK #/FST# POLLO3 FAD POLLO4 #/FST# POLLO2 LR Y,A SWBR A SARS XXMASK=K FLT #/FST# POLLO1 #/FLD# POLLO3 FSB POLLO4 FDV POLLO2 #/FST# POLLO3 FMP POLLO3 FNEG FAD POLLO7 #/FST# POLLO2 #/FLD# POLLO6 FDV POLLO2 FAD POLLO5 FMP POLLO3 FSB POLLO8 FAD POLLO1 FMP POLLO9 < < < G E S T I O N D U S I G N E D E L ' E X P O S A N T : < < PSR A,B < SAVE LE 'LOG'... #/FLD# EXPOP FABS BSR AROND < ON PREND LA PARTIE ENTIERE (PAR EXCES < OU PAR DEFAUT) DE LA VALEUR ABSOLUE DE < L'EXPOSANT... TBT NBITMO-B < QUELLE EST SA PARITE ??? JC RAK1 < IMPAIRE, 'SIGNE' RESTE TEL QUEL... STZ SIGNE < PAIRE : ON FORCE "+" (SIGNE INCHANGE)... RAK1: EQU $ PLR A,B < RESTAURATION DU LOG, FMP EXPOP < ET ON CALCULE P*LOG... < < < E X P O N E N T I E L L E : < < EXP: EQU $ FMP POLEX4 #/FST# POLEX3 FIX STA POLEX5 FLT FCAM POLEX3 JNV EXPON3 #/FLD# POLEX6 #/FST# POLEX3 JMP EXPON5 EXPON3: EQU $ CPZ POLEX3 JGE EXPON4 DC POLEX5 LA POLEX5 FLT EXPON4: EQU $ FSB POLEX3 FNEG #/FST# POLEX2 FMP POLEX2 #/FST# POLEX1 FAD POLEX8 #/FST# POLEX3 #/FLD# POLEY0 FDV POLEX3 FAD POLEX1 FMP POLEX9 FAD POLEY1 FSB POLEX2 #/FST# POLEX3 #/FLD# POLEX2 FDV POLEX7 FDV POLEX3 FAD POLEX6 #/FST# POLEX3 EXPON5: EQU $ SWBR A SARS XXMASK=K AD POLEX5 CPI XX7F JG $ < E R R E U R P R O G R A M M E ... CPI XX80 JGE EXPON6 #/FLD# F0 < ON PREND LE MINIMUM... JMP EXPON7 EXPON6: EQU $ XWOR%1: VAL XXMASK=K XWOR%1: VAL -XWOR%1 ANDI XXMASK>XWOR%1 STA POLEX5 LA POLEX3 ANDI XXMASK AD POLEX5 EXPON7: EQU $ CPZ SIGNE < PRISE EN COMPTE DU SIGNE SIMULE : JE EXP1 < POSITIF, ON LAISSE LE RESULTAT TEL QUEL.. FNEG < NEGATIF, ON INVERSE... EXP1: EQU $ BSR ATSFLO PLR Y RSR < < < E X P O N E N T I E L L E : < < EXPON: EQU $ PSR Y STZ SIGNE < "+" A PRIORI... JMP EXP < VERS LE CALCUL DE L'EXPONENTIELLE... PAGE < < < C A L C U L D ' U N E I N T E N S I T E L U M I N E U S E : < < < FONCTION : < ETANT DONNE LE POINT COURANT, < ET SA NORMALE, CE SOUS-PROGRAM- < ME CALCULE EN FONCTION DE LA < SOURCE LUMINEUSE L'INTENSITE < A ATTRIBUER AU POINT COURANT. < < < ARGUMENTS : < (X)=COORDONNEE 'X' (PERMET D'INDEXER LE 'Z'...), < (FXN,FYN,FZN)=COORDONNEES DU VECTEUR NORMAL, < (FXL,FYL,FZL)=COORDONNEES DE LA SOURCE LUMINEUSE. < < < RESULTAT : < (A,B)=INTENSITE LUMINEUSE. < < INTEN: EQU $ < < INITIALISATIONS : < PSR X < SAUVEGARDE DE LA COORDONNEE 'X'... ADR X,X < ET PASSAGE A UN INDEX FLOTTANT... < < NORME DE LA NORMALE : < LRM A,B WORD CN3D < (A)=ADRESSE DE LA NORMALE, WORD CN3D < (B)=ADRESSE DE LA NORMALE, BSR APRSCA < ET CALCUL DU CARRE DE SA NORME, #/FST# FWORK1 < (FWORK1)=NORME(X(N),Y(N),Z(N))**2, < < RECHERCHE DE Z(A) : < FLD &ALIG < Z(A), PLR X < (X)=COORDONNEE 'X'... < < CALCUL DU RAYON LUMINEUX : < FSB FZL < Z(A)-Z(L), FNEG #/FST# FZS < (FZS)=Z(L)-Z(A). LR Y,A < Y(A), FLT FSB FYL < Y(A)-Y(L), FNEG #/FST# FYS < (FYS)=Y(L)-Y(A). LR X,A < X(A), FLT FSB FXL < X(A)-X(L), FNEG #/FST# FXS < (FXS)=X(L)-X(A). < < NORME DU RAYON LUMINEUX : < LRM A,B WORD CS3D < (A)=ADRESSE DU RAYON LUMINEUX, WORD CS3D < (B)=ADRESSE DU RAYON LUMINEUX, BSR APRSCA < ET CALCUL DU CARRE DE SA NORME, FMP FWORK1 < CALCUL DU CARRE DU PRODUIT DU MODULE < DE LA NORMALE ET DU RAYON LUMINEUX, BSR ARAC #/FST# FWORK1 < (FWORK1)=PRODUIT DE LA NORME DE LA NOR- < MALE ET DE LA NORME DU RAYON < LUMINEUX. < < CALCUL DE L'ANGLE ENTRE LE < NORMALE ET LE RAYON LUMINEUX : < LRM A,B WORD CN3D < (A)=ADRESSE DE LA NORMALE, WORD CS3D < (B)=ADRESSE DU RAYON LUMINEUX, BSR APRSCA < (A,B)=PRODUIT SCALAIRE DE LA NORMALE, < ET DU RAYON LUMINEUX, FDV FWORK1 < (A,B)=COS(TETA), OU 'TETA' DESIGNE < L'ANGLE ENTRE LA NORMALE ET LE < RAYON LUMINEUX. < < CALCUL DE L'INTENSITE < LUMINEUSE AU POINT COURANT : < FAD F1 < (A,B)=1+COS(TETA), FMP F05 < (A,B)=(1+COS(TETA))/2, < SOIT UN NOMBRE DANS (0,1)... FMP FNIVC < (A,B)=NIVEAU FLOTTANT A DONNER AU POINT < COURANT. FCAM FNIVBA < NE VA-T'ON PAS CREER UN POINT NOIR ??? JGE GEN33 < NON, OK... #/FLD# FNIVBA < OUI, ON LE "SATURE"... GEN33: EQU $ < < ET RETOUR : < BSR ATSFLO RSR PAGE < < < T R A C E D ' U N S E G M E N T V E R T I C A L : < < < ARGUMENTS : < (VECGX1,VECGY1)=COORDONNEES DU POINT "BAS", < (VECGX2,VECGY2)=COORDONNEES DU POINT "HAUT", < (INTENB)=NIVEAU "BAS", < (INTENH)=NIVEAU "HAUT". < < SEGV: EQU $ CPZ IPERS < EST-CE UNE VUE D'AVION ??? JNE SEGV20 < NON, UNE PERSPECTIVE... IF EXIST-K,XEIF%,,XEIF% IF ATTENTION : LE TEST CI-DESSUS VA MERDER !!! XEIF%: VAL ENDIF < < CAS DE LA VUE D'AVION : < #/FLD# INTENH BSR AROND < (A)=NIVEAU D'ECLAIRAGE DU POINT COURANT, CPZ ITEXTU < DOIT-ON TEXTURER ??? JE SEGV30 < NON... PSR A,W < OUI, SAUVEGARDE DE 'W' ET DU NIVEAU... LA VECGY2 LR A,W < (X,Y,W)=COORDONNEES (X,Y,Z) DU POINT < TRI-DIMENSIONNEL COURANT, BSR AFUNCT < (TEXTUR)=TRANSLATION DE TEXTURAGE (X,Y,Z) PLR A,W SEGV30: EQU $ BSR APOINT < ET MARQUAGE DE CELUI-CI (X,Y). JMP SEGV21 < ET C'EST TOUT... < < CAS DE LA PERSPECTIVE : < SEGV20: EQU $ < < INITIALISATIONS : < PSR X,Y,W < SAUVEGARDE DES COORDONNEES 'X' ET 'Y'... < ET DE 'W'... LR Y,W < (W)=SAUVEGARDE DE LA COORDONNEE 'Y'... < < CALCUL DU NOMBRE DE POINTS : < LA VECGY2 < (A)=ORDONNEE "HAUTE", SB VECGY1 < (A)=ORDONNEE "HAUTE"-ORDONNEE "BASSE", LR A,X < (A)=NOMBRE D'INTERVALLES, ADRI Z,X < (X)=NOMBRE DE POINTS A TRACER... JAE SEGV00 < RIEN A FAIRE, PAS D'INTERVALLE... JAG SEGV01 < OK... QUIT XXQUIT < E R R E U R P R O G R A M M E ... SEGV01: EQU $ < < CALCUL DU PAS D'INTER- < POLATION DES NIVEAUX : < FLT < IL Y A AU MOINS UN INTERVALLE : #/FST# FWORK1 #/FLD# INTENB < (A,B)=INTENSITE "BASSE", FSB INTENH < (A,B)=INTENSITE "BASSE"-INTENSITE "HAUTE" FDV FWORK1 < (A,B)=PAS D'INTERPOLATION DE L'INTENSITE < LUMINEUSE... #/FST# PINTEN < ET MEMORISATION... SEGV00: EQU $ < < TRACE POINT A POINT : < LY VECGY2 < (Y)=ORDONNEE "HAUTE", #/FLD# INTENH < (A,B)=INTENSITE LUMINEUSE COURANTE, SEGV10: EQU $ PSR A,B,X < QUE L'ON SAUVEGARDE, AINSI QUE LE DE- < COMPTE DES POINTS A TRACER... BSR AROND < (A)=NIVEAU ENTIER DU POINT COURANT, LX VECGX2 < (X)=(VECGX1)=(VECGX2)=ABSCISSE DU POINT < COURANT, < (Y)=ORDONNEE OK... CPZ ITEXTU < DOIT-ON TEXTURER ??? JE SEGV31 < NON... XR Y,W < OUI, < (X,Y,W)=COORDONNEES (X,Y,Z) DU POINT < TRI-DIMENSIONNEL COURANT, BSR AFUNCT < (TEXTUR)=TRANSLATION DE TEXTURAGE (X,Y,Z) XR Y,W < RESTAURE 'Y' ET 'W'... SEGV31: EQU $ BSR APOINT < ET TRACE DU POINT COURANT... PLR A,B,X < RESTAURE : < (X)=DECOMPTE DES POINTS, < (A,B)=NIVEAU COURANT, FAD PINTEN < QUE L'ON MODIFIE... ADRI -I,Y < ET MODIFICATION DE L'ORDONNEE... JDX SEGV10 < VERS LE POINT COURANT, S'IL EXISTE... < < ET RETOUR : < PLR X,Y,W < ET ENFIN, RESTAURE : < (X,Y)=COORDONNES COURANTES DE GENERATION. SEGV21: EQU $ RSR PAGE < < < P O I N T D ' E N T R E E : < < DEBUT: EQU $ < < INITIALISATION DES REGISTRES : < LRM C,L,K WORD COM+DEPBAS < POSITIONNEMENT DE 'C', WORD LOC+DEPBAS < POSITIONNEMENT DE 'L', WORD STACK-DEPILE < ET DE 'K'. < < CONNEXION A LA 'CDA' : < LAI PAGER BSR AGPCDA < AFIN D'ATTEINDRE LA MEMOIRE DU '68000' < ET LA MEMOIRE 'SOLAR' QUI LA PRECEDE < AFIN D'Y METTRE 'BUF'... < < < E N T R Y D E R E B O U C L A G E : < < DEBUT4: EQU $ < < MODIFICATION A PRIORI DU 'PRESC' : < LRM A WORD DEBUT5 < POUR 'XXXPRE'... ACTD XXXPRE < ON CHANGE ALORS SYSTEMATIQUEMENT APRES < PASSAGE ICI LE 'PRESC' DU PROGRAMME, AFIN < DE REVENIR SUR LA VISUALISATION APRES < CHAQUE ALT-MODE (VIA 'DEBUT5'...). < < < I N I T I A L I S A T I O N S : < < INIT01: EQU $ < < INITIALISATION DES DIFFERENTS < POINTEURS "ROTATIFS" : < LRM A,B,X,Y WORD LIGP2,X < RELAI VERS LA LIGNE SUIVANTE-SUIVANTE, WORD LIGP1,X < RELAI VERS LA LIGNE SUIVANTE, WORD LIG,X < RELAI VERS LA LIGNE COURANTE, WORD LIGM1,X < RELAI VERS LA LIGNE PRECEDENTE. STA ALIGP2 STB ALIGP1 STX ALIG STY ALIGM1 LRM A,B WORD INTH,X < ACCES A LA LISTE DES 'INTH' DE LA LIGNE < COURANTE (Y+I), WORD INTHM1,X < ACCES A LA LISTE DES 'INTH' DE LA LIGNE < PRECEDENTE (Y). STA AINT STB AINTM1 < < MISE EN PLACE DE LA < SOURCE DE LA FONCTION : < LA AFONKT < (A)=ADRESSE DU SOUS-PROGRAMME DE CALCUL < DE LA FONCTION ALEATOIRE RECURSIVE < A PRIORI... IF NEXIST-K,,XEIF%, IF ATTENTION : LE TEST CI-DESSOUS EST IDIOT !!! XEIF%: VAL ENDIF CPZ IBANDE < EN FAIT DOIT-ON LIRE UNE BANDE ??? JE INIT10 < NON... LRM A < OUI : WORD NIVO < (A)=ADRESSE DU SOUS-PROGRAMME DE RECUPE- < RATION DES VALEURS DE LA FONCTION < SUR BANDE... INIT10: EQU $ STA AFONCT < ET MISE EN PLACE DU RELAI D'ACCES A LA < FONCTION... < < INITIALISATION DU GESTIONNAIRE < DE BANDES MAGNETIQUES (A PRIORI) : < LA ABLOC0 JAL INIT20 < ON FERA DU SEQUENTIEL STRICT... STA DEMMT+ARGESC < ADRESSE DU PREMIER BLOC A LIRE, INIT20: EQU $ LA ZBUFMT STA IBUFMT < POUR FORCER LA PREMIERE LECTURE... < < INITIALISATION DES < DIFFERENTS BUFFERS : < LX VECTNC < (X)=INDEX DES INITIALISATIONS... ADR X,X < PASSAGE A UN INDEX FLOTTANT... IF DFLOT-W-W,,XEIF%, IF ATTENTION : CE QUI PRECEDE EST IDIOT !!! XEIF%: VAL ENDIF #/FLD# F0 < (A,B)=VALEUR D'INITIALISATION DES < BUFFERS DE LIGNE... INIT02: EQU $ FST &ALIGP2 < INITIALISATION FST &ALIGP1 < DES FST &ALIG < BUFFERS FST &ALIGM1 < DE LIGNE... FST &AINT < LISTE FST &AINTM1 < DES 'INTH'... ADRI -I*DFLOT,X < ET REGRESSION, CPZR X < EST-CE FINI ??? JGE INIT02 < NON... IF NEXIST-K,,XEIF%, IF ATTENTION : LE TEST CI-DESSOUS EST IDIOT !!! XEIF%: VAL ENDIF CPZ IALIAS < L'ANTI-ALIASING EST-IL DEMANDE ??? JE INIT04 < NON, RIEN A FAIRE... LX VECTNC < OUI, (X)=INDEX DES INITIALISATIONS... LYI K-I-I < (Y)=VALEUR INEXISTANTE D'ORDONNEE... INIT03: EQU $ STY &ALISTY < INITIALISATION DU BUFFER DE DETECTION < DES DISCONTINUITES... ADRI -I,X < ET REGRESSION, CPZR X < EST-CE FINI ??? JGE INIT03 < NON... INIT04: EQU $ < < INVERSION DE 'LNIVO' : < XXINIT:: VAL NIVBAS < VALEUR TRES ARBITRAIRE D'INITIALISATION < DES ENTREES DE 'LNOVI' QUI NE FIGURENT < PAS DANS 'LNIVO' ; NOTONS MALGRE TOUT < QU'IL EVITE L'UTILISATION DU NOIR... IF NEXIST-K,,XEIF%, IF ATTENTION : LE TEST CI-DESSOUS EST IDIOT !!! XEIF%: VAL ENDIF CPZ IALIAS < L'ANTI-ALIASING EST-IL DEMANDE ??? JE INIT07 < NON, RIEN A FAIRE... LXI XXN255 < (X)=INDEX D'INITIALISATION DE 'LNOVI', LAI XXINIT < (A)=VALEUR (FINALEMENT ASSEZ ARBITRAIRE) < DES ENTREES NON UTILISEES DE 'LNOVI'. INIT05: EQU $ STBY &ALNOVI < INITIALISATION, ADRI -I,X < PASSAGE A L'ENTREE PRECEDENTE, CPZR X < SI ELLE EXISTE... JGE INIT05 < OUI... IF XXNOIR-K,,XEIF%, IF ATTENTION : LE TEST DE FIN EST MAUVAIS !!! XEIF%: VAL ENDIF LXI XXN255 < (X)=INDEX D'INVERSION DE 'LNIVO', < DONNE LE 'NIVEAU CALCULE', INIT06: EQU $ LBY &ALNIVO < (A)=NIVEAU TRACE(NIVEAU CALCULE), XR A,X STBY &ALNOVI < (A)=NIVEAU CALCULE(NIVEAU TRACE). < NOTA : RAPPELONS QUE LA CORRESPONDANCE < N'EST PAS BIJECTIVE, ET QUE LA MEME < ENTREE PEUT ETRE POSITIONNE PLUSIEURS < FOIS ; SEULE LA DERNIERE CORRESPONDANCE < EST CONSERVEE... XR A,X ADRI -I,X < PASSAGE A L'ENTREE PRECEDENTE, CPZR X < SI ELLE EXISTE... JGE INIT06 < OUI... IF XXNOIR-K,,XEIF%, IF ATTENTION : LE TEST DE FIN EST MAUVAIS !!! XEIF%: VAL ENDIF INIT07: EQU $ < < GENERATEUR ALEATOIRE : < LA SUPRDN FLT #/FST# FSUP < BORNE SUPERIEURE ('SUP'), LA INFRDN FLT #/FST# FINF < BORNE INFERIEURE ('INF'), FDV FSUP < INF/SUP, PSR A,B < ET SAVE... FSB F1 < (INF/SUP)-1, FNEG < 1-(INF/SUP), #/FST# UNMIS < UNMIS=1-(INF/SUP). PLR A,B < INF/SUP, FAD F1 < 1+(INF/SUP), FMP INF32 < 32768*(1+(INF/SUP)), #/FST# UNPIS < UNPIS=32768*(1+(INF/SUP)). #/FLD# FSUP < SUP, FDV INF64 < SUP/65536, #/FST# SUP64 < SUP64=SUP/65536. < < INITIALISATION DES < CALCULS DE SPIR-MAPS : < LA NMM FLT #/FST# FNMM < FLOTTAGE DE 'NMM'... < < < I N I T I A L I S A T I O N D U C A L C U L < D E S S P I R - D E P S D E D E P L A C E M E N T < V E R T I C A L : < < LA NDM CPI MAXNDM < ET VALIDATION DE 'NDM'... JLE SPIRI7 < OK... QUIT XXQUIT < E R R E U R P A R A M E T R E ... SPIRI7: EQU $ LX XCENTR < DEFINITION DU LY YCENTR < CENTRE DE 'TV1'/'TV2'. < < INITIALISATION DE LA SPIR-DEP : < #/FLD# F0 #/FST# FCOEFC < CUMUL <-- 0. STZ NP < NP=NOMBRE DE POINTS TRAITES. LA PASD STA DELTAX < DELTAX <-- +1, STZ DELTAY < DELTAY <-- 0. LAI W STA LB0 < INITIALISATION DE LA LONGUEUR DU < PREMIER BRAS DE LA SPIR-DEP. < < PARCOURS D'UN BRAS : < SPIRI1: EQU $ LA LB0 STA LB < LONGUEUR DU BRAS COURANT. < < TRAITEMENT DU POINT COURANT : < SPIRI2: EQU $ IC NP < COMPTAGE DES POINTS TRAITES : LA NP CP NDM < FINI ??? JG SPIRI3 < OUI... LR X,A < NON, TEST DE LA COORDONNEE 'X' : JAL SPIRI4 < LE POINT EST HORS-ECRAN... CPI NPOLM1 JG SPIRI4 < HORS-ECRAN... LR Y,A < TEST DE LA COORDONNEE 'Y' : JAL SPIRI4 < HORS-ECRAN... CPI NLIGM1 JG SPIRI4 < HORS-ECRAN... < < CALCUL DU COEFFICIENT < DE PONDERATION DE CHAQUE < POINT D'UNE SPIR-DEP : < PSR X LR X,A SB XCENTR FLT #/FST# FWORK1 < ON VA TRAVAILLER EN RELATIF PAR RAPPORT < AU CENTRE D'UNE SPIR-DEP QUELCONQUE... FMP FWORK1 < XR**2 (OU 'R' SIGNIFIE 'RELATIF'...), #/FST# FWORK LX NP ADRI -I,X ADR X,X < (X)=INDEX FLOTTANT DU FUTUR COEFFICIENT < DE PONDERATION QUE L'ON CALCULE... LR Y,A SB YCENTR FLT #/FST# FWORK2 < YR, FMP FWORK2 < YR**2, FAD FWORK < XR**2+YR**2, SOIT LE CARRE DU RAYON < POLAIRE DU POINT COURANT AU CENTRE DE < LA SPIR-DEP... FMP FCOEFB < QUE L'ON PONDERE (EN GENERAL PAR -1, < AFIN D'AVOIR UNE GAUSSIENNE...), BSR AEXPON < ET ON EXPONENTIE, FST &ALCOEF < CE QUI DONNE LE COEFFICIENT DE PONDERA- < TION DU POINT COURANT DE LA SPIR-DEP DE < RANG (NP)-1. FAD FCOEFC #/FST# FCOEFC < ET L'ON CUMULE... PLR X < < PARCOURS DE LA SPIR-DEP : < SPIRI4: EQU $ LA DELTAX < CHANGEMENT DE ADR A,X LA DELTAY < POINT COURANT (X,Y). ADR A,Y DC LB < DECOMPTAGE DES POINTS SUR LA BRANCHE : JG SPIRI2 < OK, IL EN RESTE... CPZ DELTAX < NON, ON EST AU BOUT, FAUT-IL AUGMENTER < LA LONGUEUR COURANTE DES BRANCHES ??? JNE SPIRI5 < NON (DX#0) ... IC LB0 < OUI (DX=0) ... SPIRI5: EQU $ LA DELTAY < ON FAIT SUBIR AU NOMBRE COMPLEXE NGR A,A < (DX,DY) UNE ROTATION DE PI/2, SOIT LB DELTAX < UNE MULTIPLICATION PAR LA MATRICE < (0,-1,1,0)... STA DELTAX < DELTAX=-DELTAY, STB DELTAY < DELTAY=DELTAX. JMP SPIRI1 < VERS LA BRANCHE SUIVANTE < < FIN DU CALCUL DES COEFFICIENTS < DE PONDERATION D'UNE SPIR-DEP : < SPIRI3: EQU $ #/FLD# FCOEFC FDV FCOEFA #/FST# FCOEFC < ET PONDERATION DE LA SOMME DES < COEFFICIENTS... < < PAS INITIAUX DU MAILLAGE : < LA PASIX0 < VALEUR INITIALE DE 'PASIX' : JALE $ < ??? STA PASIX < PAS EN 'X', FLT #/FST# FWORK < ET SAUVEGARDE... LA PASIY0 < VALEUR INITIALE DE 'PASIY' : JALE $ < ??? STA PASIY < ET PAS EN 'Y'... FLT FMP FWORK < CALCUL DE PASIX*PASIY*K*K CE QUI DONNE < L'AIRE DE LA MAILLE ELEMENTAIRE... BSR ARAC #/FST# FPOND0 < LA PONDERATION INITIALE DES FONCTIONS < ALEATOIRES EST EN FAIT LA TAILLE DE LA < MAILLE... < < PREPARATION A PRIORI DE LA < MODULATION DU "DEPTH-CUEING" : < #/FLD# FH < FH, FMP FNIVMX < 255*FH, #/FST# FHP #/FLD# FNIVMX < 255, FSB FHP < 255-FHP, FDV FNIVMX < (255-FHP)/255, #/FST# F255MH < QUE L'ON MEMORISE SANS VALIDATION... < < INITIALISATION DU CALCUL DES "FUITES" : < LA VECTNL < 255, FLT #/FST# FWORK #/FLD# F1 < 1, FSB FPERSB < 1-FPERSB, FDV FWORK < (1-FPERSB)/255, #/FST# FPERSA < FPERSA=(1-FPERSB)/255. < < VALIDATION DES DEMANDES < D'OMBRES PORTEES : < IF NEXIST-K,,XEIF%, IF ATTENTION : LE TEST SUIVANT EST MAUVAIS !!! XEIF%: VAL ENDIF CPZ IOMBRE < A-T'ON DEMANDE LES OMBRES PORTEES ??? JE GEN400 < NON, RIEN A VALIDER... GEN401: EQU $ FCMZ FZL < OUI, DANS CE CAS, ON FAIT LES HYPOTHESES < SUIVANTES : < 1 - ON TRACE DE DROITE A GAUCHE, < 2 - LA SOURCE LUMINEUSE 'S' EST A DROITE < DE LA MONTAGNE (XL > XMAX), PUISQU'ON < TRACE DE DROITE A GAUCHE, ET DANS LE < PLAN DE PROJECTION (ZL=0) POUR SIMPLIFIER < LES CALCULS (EN FAIT ON VA MEME LA SUP- < POSER A L'INFINI, EN IGNORANT SYLTEMATI- < QUEMENT LA TROISIEME COORDONNEE DU RAYON < LUMINEUX...). JNE GEN402 < ERREUR : 'ZL' EST NON NUL !!! #/FLD# FXL BSR AROND CP VECTNC JG GEN400 < OK, LA SOURCE LUMINEUSE EST A DROITE DE < LA MONTAGNE... GEN402: EQU $ QUIT XXQUIT < ERREUR SUR LA SOURCE LUMINEUSE, ON < REDEMANDE LES PARAMETRES... JMP GEN401 < ET ON REVALIDE... GEN400: EQU $ #/FLD# FNIVMX #/FST# FNIVC < ON INITIALISE A PRIORI 'FNIVC' POUR < LE CAS OU L'OMBRAGE N'EST PAS DEMANDE... GEN441: EQU $ LA NPENOM < (A)=LARGEUR DE LA ZONE DE PENOMBRE : JAG GEN440 < OK, ELLE EST STRICTEMENT POSITIVE... QUIT XXQUIT < E R R E U R ... JMP GEN441 < ET ON RE-VALIDE... GEN440: EQU $ FLT FDV FNIVOM #/FST# FPENOM < FPENOM=NPENOM/FNIVOM. < < < I N I T I A L I S A T I O N D E S M A I L L A G E S : < < GEN200: EQU $ LA MRECUR < VALIDATION DE 'MRECUR' : JALE GEN201 < MAUVAIS... CPI MAXREC < ALORS ??? JLE GEN202 < OK... GEN201: EQU $ QUIT XXQUIT < E R R E U R U T I L I S A T E U R ... JMP GEN200 < ET ON RE-VALIDE... GEN202: EQU $ < < INITIALISATIONS : < LA PASIX FLT #/FST# FPASIX < 'PASIX', LA PASIY FLT #/FST# FPASIY < 'PASIY'. #/FLD# FPOND0 #/FST# FPOND < 'FPOND'. < < REDUCTION RECURSIVE DU MAILLAGE : < #/FLD# EXPOP0 #/FST# EXPOP < INITIALISATION DE L'EXPOSANT... LXI K < (X)=INDEX DE RECURSION... GEN210: EQU $ PSR X LR X,Y < (Y)=INDEX ENTIER, ADR X,X < PASSAGE A UN INDEX FLOTTANT... #/FLD# FPOND FST &ALPOND < 'LPOND', BSR ARAK < EXPONENTIATION, #/FST# FPOND < ET REDUCTION... #/FLD# FPASIX FST &ALPASX < 'PASIX' FLOTTANT, PSR A,B,X LR Y,X BSR AROND STA &ALPSIX < 'PASIX' ENTIER. PLR A,B,X BSR ARAK < EXPONENTIATION, #/FST# FPASIX < ET REDUCTION... #/FLD# FPASIY FST &ALPASY < 'PASIY' FLOTTANT, PSR A,B,X LR Y,X BSR AROND STA &ALPSIY < 'PASIY' ENTIER. PLR A,B,X BSR ARAK < EXPONENTIATION, #/FST# FPASIY < ET REDUCTION... FAD FPASIX BSR AROND < (A)=PASIX+PASIY, PLR X < RESTAURE L'INDEX DE RECURSION... ADRI I,X < PASSAGE A LA RECURSION SUIVANTE... CPI W+W < EST-ON ARRIVE A UNE MAILLE IRREDUCTIBLE, < SOIT ELEMENTAIRE (1*1) ??? JE GEN220 < OUI, ON ARRETE LA... LR X,A < NON, CP MRECUR < MAIS A-T'ON ATTEINT LE MAXIMUM ??? JL GEN210 < NON, ON CONTINUE... GEN220: EQU $ STX NRECUR < MISE EN PLACE DU 'NRECUR' A UTILISER... STX SRECUR < ET DE SA SAUVEGARDE AU CAS OU EN FAIT < IL SERAIT CALCULE ALEATOIREMENT... < < INITIALISATION DU GENERATEUR < ALEATOIRE DE 'NRECUR' : < IF NEXIST-K,,XEIF%, IF ATTENTION : LE TEST SUIVANT VA MERDER !!! XEIF%: VAL ENDIF CPZ IRDNRC < EST-CE NECESSAIRE ??? JE GEN223 < NON... LA SUPREC < OUI : CP NRECUR < ET VALIDATION : JLE GEN221 < OK... LA NRECUR < ON PREND MIN(NRECUR,SUPREC)... GEN221: EQU $ LR A,Y < (Y)=MIN(NRECUR,SUPREC)... FLT #/FST# FSUP < BORNE SUPERIEURE ('SUP'), LA INFREC CPR Y,A < ET VALIDATION : JLE GEN222 < OK... LR Y,A < ON PREND MIN(MIN(NRECUR,SUPREC),INFREC).. GEN222: EQU $ FLT #/FST# FINF < BORNE INFERIEURE ('INF'), FDV FSUP < INF/SUP, PSR A,B < ET SAVE... FSB F1 < (INF/SUP)-1, FNEG < 1-(INF/SUP), #/FST# UNMISR < UNMIS=1-(INF/SUP). PLR A,B < INF/SUP, FAD F1 < 1+(INF/SUP), FMP INF32 < 32768*(1+(INF/SUP)), #/FST# UNPISR < UNPIS=32768*(1+(INF/SUP)). #/FLD# FSUP < SUP, FDV INF64 < SUP/65536, #/FST# SUP64R < SUP64=SUP/65536. GEN223: EQU $ < < FACTEUR DE RENORMALISATION : < #/FLD# AMPLI FMP AMPLIR FDV FPOND0 #/FST# RENORM < RENORM=AMPLI*AMPLIR/FPOND0. < < < I N I T I A L I S A T I O N S D E T E X T U R A G E < T R I - D I M E N S I O N N E L : < < CPZ ITEXTU < Y-AURA-T'IL TEXTURAGE ??? JNE GEN999 < OUI, INITIALISONS... BR ANTEXT < NON... GEN999: EQU $ < < DEFINITION DU SEUIL < DE DEFINITION DE LA < SURFACE : < LB SCOUCH < (B)=SEUIL A PRIORI ('SCOUCH')... LA NFUNCT < (A)=FUNCTION DE MODULATION DE LA FUNCTION < ALEATOIRE RAN(X,Y,Z) : CPI FGAUSS < EST-CE LA MODULATION GAUSSIENNE ??? JNE INIT30 < NON, (B) EST BON... GCOUCH:: VAL 4 < LOGARITHME EN BASE 2 DU DIVISEUR DE < 'SCOUCH' LORSQUE LA MODULATION GAUS- < SIENNE EST UTILISEE ; EN EFFET, IL FAUT < DIMINUER LE SEUIL DE DEFINITION DE LA < SURFACE, CAR LA MODULATION GAUSSIENNE EST < INFERIEURE A 1, ET ALORS PRATIQUEMENT < TOUS LES POINTS SE TROUVERAIENT A L'EX- < TERIEUR... LAI K < CLEAR 'A', SLRD GCOUCH < ET ON DIMINUE LE SEUIL... INIT30: EQU $ STB ICOUCH < MISE A JOUR DU SEUIL COURANT DE DEFINI- < TION DE LA SURFACE... < < GENERATEUR ALEATOIRE : < LA SUPRAN FLT #/FST# GSUP < BORNE SUPERIEURE ('SUP'), LA INFRAN FLT #/FST# GINF < BORNE INFERIEURE ('INF'), FDV GSUP < INF/SUP, PSR A,B < ET SAVE... FSB F1 < (INF/SUP)-1, FNEG < 1-(INF/SUP), #/FST# UNMJS < UNMJS=1-(INF/SUP). PLR A,B < INF/SUP, FAD F1 < 1+(INF/SUP), FMP INF32 < 32768*(1+(INF/SUP)), #/FST# UNPJS < UNPJS=32768*(1+(INF/SUP)). #/FLD# GSUP < SUP, FDV INF64 < SUP/65536, #/FST# ZUP64 < ZUP64=SUP/65536. < < PAZ INITIAUX DU MAILLAGE : < #/FLD# F1 FDV F3 #/FST# EXPOP < POUR CALCULER UNE RACINE CUBIQUE POUR < PAZSER D'UN VOLUME A UNE DIMENSION... LA PAZIX0 < VALEUR INITIALE DE 'PAZIX' : JALE $ < ??? STA PAZIX < PAZ EN 'X', FLT #/FST# FWORK < ET SAUVEGARDE... LA PAZIY0 < VALEUR INITIALE DE 'PAZIY' : JALE $ < ??? STA PAZIY < ET PAZ EN 'Y'... FLT FMP FWORK < CALCUL DE PAZIX*PAZIY... #/FST# FWORK LA PAZIZ0 < VALEUR INITIALE DE 'PAZIZ' : JALE $ < ??? STA PAZIZ < ET PAZ EN 'Z'... FLT FMP FWORK < ET CALCUL DE PAZIX*PAZIY*PAZIZ, SOIT LE < VOLUME DE LA PLUS GRANDE MAILLE INITIALE, BSR ARAK #/FST# FPONT0 < LA PONDERATION INITIALE DES FUNCTIONS < ALEATOIRES EST EN FAIT LA TAILLE DE LA < MAILLE... < < INITIALISATION DU REDUC- < TEUR REKURSIF : < #/FLD# EXPOQ0 #/FST# EXPOP < < < I N I T I A L I S A T I O N D E S M A I L L A G E S : < < GEN700: EQU $ LA MREKUR < VALIDATION DE 'MREKUR' : JALE GEN701 < MAUVAIS... CPI MAXREK < ALORS ??? JLE GEN702 < OK... GEN701: EQU $ QUIT XXQUIT < E R R E U R U T I L I S A T E U R ... JMP GEN700 < ET ON RE-VALIDE... GEN702: EQU $ < < INITIALISATIONS : < LA PAZIX FLT #/FST# FPAZIX < 'PAZIX', LA PAZIY FLT #/FST# FPAZIY < 'PAZIY', LA PAZIZ FLT #/FST# FPAZIZ < 'PAZIZ'. #/FLD# FPONT0 #/FST# FPONT < 'FPONT'. < < REDUCTION REKURSIVE DU MAILLAGE : < LXI K < (X)=INDEX DE REKURSION... GEN710: EQU $ PSR X LR X,Y < (Y)=INDEX ENTIER, ADR X,X < PAZSAGE A UN INDEX FLOTTANT... #/FLD# FPONT FST &ALPONT < 'LPONT', BSR ARAK < EXPONENTIATION, #/FST# FPONT < ET REDUCTION... #/FLD# FPAZIX FST &ALPAZX < 'PAZIX' FLOTTANT, PSR A,B,X LR Y,X BSR AROND STA &ALPZIX < 'PAZIX' ENTIER. PLR A,B,X BSR ARAK < EXPONENTIATION, #/FST# FPAZIX < ET REDUCTION... #/FLD# FPAZIY FST &ALPAZY < 'PAZIY' FLOTTANT, PSR A,B,X LR Y,X BSR AROND STA &ALPZIY < 'PAZIY' ENTIER. PLR A,B,X BSR ARAK < EXPONENTIATION, #/FST# FPAZIY < ET REDUCTION... #/FLD# FPAZIZ FST &ALPAZZ < 'PAZIZ' FLOTTANT, PSR A,B,X LR Y,X BSR AROND STA &ALPZIZ < 'PAZIZ' ENTIER. PLR A,B,X BSR ARAK < EXPONENTIATION, #/FST# FPAZIZ < ET REDUCTION... FAD FPAZIY FAD FPAZIX BSR AROND < (A)=PAZIX+PAZIY+PAZIZ, PLR X < RESTAURE L'INDEX DE REKURSION... ADRI I,X < PAZSAGE A LA REKURSION SUIVANTE... CPI W+W+W < EST-ON ARRIVE A UNE MAILLE IRREDUCTIBLE, < SOIT ELEMENTAIRE (1*1*1) ??? JE GEN720 < OUI, ON ARRETE LA... LR X,A < NON, CP MREKUR < MAIS A-T'ON ATTEINT LE MAXIMUM ??? JL GEN710 < NON, ON CONTINUE... GEN720: EQU $ STX NREKUR < MISE EN PLACE DU 'NREKUR' A UTILISER... < < CALCUL DU FACTEUR DE < RENORNALISATION DE LA < FUNCTION ALEATOIRE : < LR X,A < (A)='NREKUR', FLT < QUE L'ON FLOTTE... FAD KAMPLY FSB F1 FDV KAMPLY #/FST# AMPLY < (AMPLY)=(NREKUR+30)/31... #/FLD# F0 < INITIALISATION DU SIGMA DES 'FPONT', GEN910: EQU $ PSR X ADRI -IJIJDX,X ADR X,X < PAZSAGE A UN INDEX FLOTTANT... FAD &ALPONT < CALCUL DE SIGMA(FPONT), PLR X JDX GEN910 < AU SUIVANT... FDV AMPLY FDV AMPLYR #/FST# RENORN < RENORN=SIGMA(FPONT)/(AMPLY*AMPLYR). NTEXT: EQU $ < < < G E N E R A T I O N D E L ' I M A G E : < < GEN69: EQU $ < < REINITIALISATION DES REGISTRES < DE L'IMAGEUR : < LRM A WORD INFINY < AFIN DE BIEN REPARTIR... STA SNIVOP STA SXHP STA SXLP STA SYHP STA SYLP CPZ IERASE < FAUT-IL EFFACER ??? JE GEN69N < NON... IF NEXIST-K,,XEIF%, IF ATTENTION : LE TEST CI-DESSUS EST IDIOT !!! XEIF%: VAL ENDIF < < EFFACEMENT DE L'ECRAN : < XWOR%1: VAL NIV256=K IF BIT>XWOR%1-NIV256,,XWOR%, IF ATTENTION : LE CALCUL DU MASQUE SELECTANT TOUS IF LES PLANS EST ABSURDE !!! XWOR%: VAL ENDIF LAI NIV256-MASK)MOCD STA MCDAJ LA ARPLAN < (A)=ADRESSE DU REGISTRE DE SELECTION... BSR APWCDA < ET ON SELECTIONNE TOUS LES PLANS... LAI ERASE STA MCDAJ LA ARCMD BSR APWCDA < EFFACEMENT DE L'ECRAN, ET REINITIALISA- < TION DE TOUS LES REGISTRES... LAD TEMPO SVC < ET ON FAIT UN PETIT DODO... LAI XCTRL1 STA MCDAJ LA ACTRL1 BSR APWCDA < INITIALISATION DE 'CTRL1'. LAI XCTRL2 STA MCDAJ LA ACTRL2 BSR APWCDA < INITIALISATION DE 'CTRL2'. < < INITIALISATION DES < CONDITIONS DE TRACE : < GEN69N: EQU $ < < < G E N E R A T I O N D U C H A M P A L E A T O I R E : < < LYI K < (Y)=COORDONNEE 'Y'. GEN01: EQU $ LR Y,A < Y, FLT FMP FPERSA < FPERSA*Y, FAD FPERSB < FPERSA*Y+FPERSB, #/FST# FPERSK < FPERSK=FPERSA*Y+FPERSB, SOIT LA CONSTANTE < DE CALCUL DES "FUITES"... LXI K < (X)=COORDONNEE 'X'. GEN02: EQU $ BSR AFONCT < CALCUL DANS (A,B) DE LA SOMME < PONDEREE DES FONCTIONS ALEATOIRES, < ASSOCIEE AU POINT COURANT (X,Y) < SANS OUBLIER LES CONTRIBUTIONS DES < SPIR-MAPS EVENTUELLEMENT... FMP FPERSK < ET MISE EN "FUITE", EN MULTIPLIANT PAR < UNE CONSTANTE APPARTENANT A (FPERSB,1), < ET FONCTION DE 'Y'... IF DFLOT-XXXMOY,,XEIF%, IF ATTENTION : LES 'ADR' VONT MERDER !!! XEIF%: VAL ENDIF PSR X ADR X,X < PASSAGE A UNE INDEX FLOTTANT... FST &ALIGP2 < ET ON MEMORISE Z(X,Y) DANS LA LIGNE < SUIVANTE-SUIVANTE... PLR X ADRI I,X < PROGRESSION SUR LA LIGNE : LR X,A CP VECTNC < EST-ON AU BOUT ??? JLE GEN02 < NON... < < < T E N T A T I V E D ' E L I M I N A T I O N < D E S P I C S P A R F I L T R A G E : < < < FONCTION : < CONSIDERONS 3 POINTS SUC- < CESSIFS : A(X-I), M(X), B(X+I). < POUR CHAQUE POINT M(X), ON VA < TESTER : < < SI : Z(M(X)) > Z(A(X-I)) ET Z(M(X)) > Z(B(X+I)), < ALORS : Z(M(X)) <-- ALPHA*(Z(A(X-I))+Z(B(X+I)))/2+ < (1-ALPHA)*Z(M(X)), < < PUIS, CONSIDERONS 3 POINTS SUC- < CESSIFS : A(Y), M(Y+I), B(Y+I+I). < POUR CHAQUE POINT M(Y+I), ON VA < TESTER : < < SI : Z(M(Y+I)) > Z(A(Y)) ET Z(M(Y+I)) > Z(B(Y+I+I)), < ALORS : Z(M(Y+I)) <-- ALPHA*(Z(A(Y))+Z(B(Y+I+I)))/2+ < (1-ALPHA)*Z(M(Y+I)), < < C'EST-A-DIRE QUE SI LE POINT 'M' < EST AU-DESSUS DE 'A' ET 'B', CE < QUI GENERE UN PLI, ALORS ON REDES- < CEND 'M'... < ENFIN, ON FAIT DE MEME, EN < TESTANT 'M' PAR RAPPORT A LA < POSITION EN-DESSOUS DE "A" ET < "B", AUQUEL CAS ON LE REMONTE... < < #/FLD# F1 FSB ALPHA #/FST# FWORK1 < (FWORK1)=1-ALPHA. #/FLD# ALPHA FMP F05 #/FST# FWORK2 < (FWORK2)=ALPHA/2. < < TRAITEMENT LE LONG DE 'X' : < LXI W < ON NE COMMENCE PAS SUR LE PREMIER POINT.. GEN120: EQU $ PSR X ADR X,X < PASSAGE A UN INDEX FLOTTANT... FLD &ALIGP2 < Z(M(X)), ADRI -DFLOT,X FCAM &ALIGP2 < COMPARAISON A Z(A(X-I)) : JL GEN122 < OK, 'M' EST AU-DESSOUS DE 'A'... ADRI DFLOT+DFLOT,X < 'M' EST AU-DESSUS DE 'A', FCAM &ALIGP2 < COMPARAISON A Z(B(X+I)) : JL GEN121 < OK, 'M' EST AU-DESSOUS DE 'B' ET AU- < DESSUS DE 'A'... GEN124: EQU $ < CAS OU 'M' EST AU-DESSUS DE 'A' ET 'B', < OU BIEN AU-DESSOUS DE 'A' ET 'B'... FMP FWORK1 < Z(M(X))*(1-ALPHA), #/FST# FWORK < ET SAUVEGARDE... FLD &ALIGP2 < Z(B(X+I)), ADRI -DFLOT-DFLOT,X FAD &ALIGP2 < Z(A(X-I))+Z(B(X+I)), FMP FWORK2 < ALPHA*(Z(A(X-I))+Z(B(X+I)))/2, FAD FWORK < +(1-ALPHA)*Z(M(X)), ADRI DFLOT,X FST &ALIGP2 < D'OU LE NOUVEAU Z(M(X))... JMP GEN121 < VERS LE POINT SUIVANT... GEN122: EQU $ ADRI DFLOT+DFLOT,X FCAM &ALIGP2 < COMPARAISON A Z(B(X+I)) : JL GEN124 < 'M' EST AU-DESSOUS DE 'B' (ET DE 'A'...). GEN121: EQU $ PLR X < RESTAURE LA COORDONNEE 'X', ADRI I,X < PASSAGE AU POINT SUIVANT, LR X,A CP VECTNC < S'IL EXISTE... JL GEN120 < OUI, MAIS ON NE TRAITE PAS LE DERNIER < POINT... < < DISCRIMINATION DE LA PREMIERE < ET DE LA DEUXIEME LIGNE : < LR Y,A < (A)=ORDONNEE COURANTE : CPI W < EST-ON SUR LA PREMIERE OU SUR LA < DEUXIEME LIGNE ??? JLE GEN300 < OUI, IL FAUT AU MOINS 3 LIGNES POUR < POUVOIR FILTRER, ON ATTEND DONC... < < TRAITEMENT LE LONG DE 'Y' : < LXI K < ON COMMENCE SUR LE PREMIER POINT... GEN130: EQU $ PSR X ADR X,X < PASSAGE A UN INDEX FLOTTANT... FLD &ALIGP1 < Z(M(Y+I)), FCAM &ALIG < COMPARAISON A Z(A(Y)) : JL GEN132 < OK, 'M' EST AU-DESSOUS DE 'A'... FCAM &ALIGP2 < COMPARAISON A Z(B(Y+I+I)) : JL GEN131 < OK, 'M' EST AU-DESSOUS DE 'B' ET AU- < DESSUS DE 'A'... GEN134: EQU $ < CAS OU 'M' EST AU-DESSUS DE 'A' ET 'B', < OU BIEN AU-DESSOUS DE 'A' ET 'B'... FMP FWORK1 < Z(M(Y+I))*(1-ALPHA), #/FST# FWORK < ET SAUVEGARDE... FLD &ALIGP2 < Z(B(Y+I+I)), FAD &ALIG < Z(A(Y))+Z(B(Y+I+I)), FMP FWORK2 < ALPHA*(Z(A(Y))+Z(B(Y+I+I)))/2, FAD FWORK < +(1-ALPHA)*Z(M(Y+I)), FST &ALIGP1 < D'OU LE NOUVEAU Z(M(Y+I))... JMP GEN131 < VERS LE POINT SUIVANT... GEN132: EQU $ FCAM &ALIGP2 < COMPARAISON A Z(B(Y+I+I)) : JL GEN134 < 'M' EST AU DESSOUS DE 'B' (ET DE 'A'...). GEN131: EQU $ PLR X < RESTAURE LA COORDONNEE 'X', ADRI I,X < PASSAGE AU POINT SUIVANT, LR X,A CP VECTNC < S'IL EXISTE... JLE GEN130 < OUI... GEN300: EQU $ < < DISCRIMINATION DE LA PREMIERE, DE LA < DEUXIEME ET DE LA TROISIEME LIGNE : < LR Y,A < (A)=ORDONNEE COURANTE : YPLAN2:: VAL W+W < ORDONNEE DU PLAN VERTICAL 2... CPI YPLAN2 < EST-ON SUR LA PREMIERE, LA DEU- < XIEME OU LA TROISIEME LIGNE ??? JG GEN21 < NON, ON PEUT GENERER LE RELIEF... BSR AGOTO WORD GEN50 < OUI, ATTENDONS LA LIGNE SUIVANTE... < (MAIS ROTATION DES BUFFERS DE LIGNE < MALGRE TOUT...) GEN21: EQU $ < < < G E N E R A T I O N D U R E L I E F : < < STZ PRAYON < AU DEBUT DE CHAQUE NOUVELLE LIGNE, ON < ATTRIBUE A 'PRAYON' UNE VALEUR IMPOS- < SIBLE EN FLOTTANT... < ET CE AFIN DE FORCER SON CALCUL... STZ LSTENH < AU DEBUT DE CHAQUE LIGNE, ON DONNE A < 'LSTENH' UNE VALEUR INACESSIBLE EN < FLOTTANT, QUI PERMETTRA DE SAVOIR < ULTERIEUREMENT QU'ON EN EST OU PAS AU < PREMIER VECTEUR VERTICAL D'UNE LIGNE... LX VECTNC < ON COMMENCE SUR LE PREMIER POINT, MAIS < ATTENTION, ON NE FINIT PAS SUR LE PREMIER < AFIN DE POUVOIR SYSTEMATIQUEMENT TRAITER < UN TRIANGLE DU TYPE : < (A(X,Y),B(X-I,Y),C(X,Y-I)). IF INCIX+I,,XEIF%, IF ATTENTION : L'INITIALISATION DE 'X' IF DOIT ETRE FAITE AVEC 0 !!! XEIF%: VAL ENDIF GEN30: EQU $ < < CALCUL DU VECTEUR "VERTICAL" < A TRACER POUR CONSTRUIRE LE < RELIEF DE LA MONTAGNE : < LR X,A < X(A), AD TRX < TRANSLATION, STA VECGX1 < (VECGX1)=ABSCISSE DU VECTEUR VECTICAL, STA VECGX2 < (VECGX2)=(VECGX1), CAR VERTICAL... PSR X ADR X,X < PASSAGE A UN INDEX FLOTTANT... FLD &ALIGP1 < Z(BAS), BSR AROND SBR Y,A < Z(BAS)-Y(A), AD TRY < TRANSLATION, STA VECGY1 < (VECGY1)=ORDONNEE DU "BAS" DU VECTEUR < VERTICAL... FLD &ALIG < Z(A)=Z(HAUT), BSR AROND LR A,B < (B)=SAUVEGARDE DE Z(HAUT)... SBR Y,A < Z(HAUT)-Y(A), ADRI I,A < Z(HAUT)-(Y(A)-1), (Y-1 POUR LA LIGNE < D'AVANT LA LIGNE SUIVANTE... PLR X AD TRY < TRANSLATION, STA VECGY2 < (VECGY2)=ORDONNEE DU "HAUT" DU VECTEUR < VERTICAL... < < TEST DES OMBRES PORTEES : < IF NEXIST-K,,XEIF%, IF ATTENTION : LE TEST CI-DESSOUS EST IDIOT !!! XEIF%: VAL ENDIF CPZ IOMBRE < L'OMBRAGE EST-IL DEMANDE ??? JNE AGN420 < OUI... BSR AGOTO WORD GEN420 < NON, RIEN A FAIRE... AGN420: EQU $ LR B,A < (A)=Z(HAUT)... CPZ PRAYON < OUI, ALORS EST-ON EN DEBUT DE LIGNE ??? JE GEN412 < OUI, IL FAUT INITIALISER 'PRAYON'... < < TEST DE VISIBILITE DU < POINT COURANT DEPUIS < LA SOUCE LUMINEUSE : < PSR A < SAUVEGARDE DE L'ORDONNEE DU "HAUT" DU < VECTEUR COURANT, NOTEE 'YC'. LR X,A < ABSCISSE, NOTEE 'XC', FLT FSB FXL < XC-XL, FMP PRAYON < ((YH-YL)/(XH-XL))*(XC-XL), FAD FYL < YL+((YH-YL)/(XH-XL))*(XC-XL), CE QUI < DONNE LE SEUIL DE VISIBILITE DEPUIS LA < SOURCE LUMINEUSE, FIX LR A,B < (B)=PLUS PETITE ORDONNEE "HAUTE" D'UN < VECTEUR QUE L'ON VOIT DEPUIS 'S', PLR A < (A)=ORDONNEE "HAUTE" DU VECTEUR COURANT, CPR B,A < ALORS LE VECTEUR COURANT EST-IL VU < DEPUIS LA SOURCE LUMINEUSE ??? JLE GEN410 < (A) <= (B) : NON, IL EST EN-DESSOUS DU < SEUIL DE VISIBILITE... < < CAS OU L'ON EST VISIBLE < DEPUIS LA SOURCE LUMINEUSE, < OU BIEN DE LA PREMIERE < FOIS : < GEN412: EQU $ PSR A < RE-SAUVEGARDE DE L'ORDONNEE "HAUTE"... LR X,A < ABSCISSE (NOTEE 'XH') DU VECTEUR "MAXI- < MAL" COURANT, C'EST-A-DIRE VU DEPUIS LA < SOURCE LUMINEUSE, SACHANT QUE L'ON TRACE < DE DROITE A GAUCHE... FLT FSB FXL < XH-XL, #/FST# FWORK < ET SAVE... PLR A < YH, FLT FSB FYL < YH-YL, FDV FWORK < (YH-YL)/(XH-XL), #/FST# PRAYON < PRAYON=(YH-YL)/(XL-XH). #/FLD# FNIVMX < (A,B)=NIVEAU LUMINEUX MAXIMAL PUIQU'ON < EST VU, DONC AU SOLEIL... JMP GEN411 < VERS LA MISE EN PLACE DE 'FNIVC'... < < CAS OU L'ON EST INVISIBLE < DEPUIS LA SOURCE LUMINEUSE : < GEN410: EQU $ SBR B,A NGR A,A < (A)=DISTANCE D'INVISIBILITE (STRICTE- < MENT POSITIVE). CP NPENOM < EST-ON DANS LA PENOMBRE ??? JL GEN433 < OUI, IL FAUT INTERPOLER POUR OBTENIR < LE NIVEAU MAXIMAL... #/FLD# FNIVOM < NON, OU BIEN ON NE CALCULE PAS LA < PENOMBRE : < (A,B)=VALEUR DU DECREMENT DU NIVEAU < MAXIMAL D'ECLAIRAGE POUR PASSER < DANS LA ZONE D'OMBRE... JMP GEN434 GEN433: EQU $ FLT < (A,B)=DISTANCE D'INVISIBILITE, FDV FPENOM < (A,B)=VALEUR ABSOLUE DU DECREMENT DU < NIVEAU MAXIMAL D'ECLAIRAGE DANS LA < LA ZONE DE PENOMBRE COURANTE... GEN434: EQU $ FAD FNIVMX < (A,B)=NIVEAU LUMINEUX MAXIMAL DE LA < ZONE D'OMBRE OU DE PENOMBRE DANS < LAQUELLE ON SE SITUE... < < MISE EN PLACE DE 'FNIVC' : < GEN411: EQU $ IF NEXIST-K,,XEIF%, IF ATTENTION : LE TEST SUIVANT EST IDIOT !!! XEIF%: VAL ENDIF CPZ IDEPTH < FAIT-ON DU "DEPTH-CUEING" ??? JE GEN421 < NON, (A,B) EST BON... PSR A,B < OUI, SAUVEGARDE DE (A,B)... < RAPPEL : L'OPTION "DEPTH-CUEING" N'EST < PRISE EN COMPTE QU'AVEC LES OMBRES < PORTEES A CAUSE DES PROBLEMES D'INI- < TIALISATION DE 'FNIVC' SINON... LR Y,A < Y, SLRS XL512/NIV256=K < REDUCTION DE LA COORDONNEE 'Y', JANE GEN422 < NON NUL... LAI Z < ON NE PEUT CONSERVER LES VALEURS NULLES, GEN422: EQU $ FLT #/FST# FWORK PLR A,B < RESTAURATION DU 'FNIVC', FDV FNIVMX < ET MODULATION FMP FWORK < PAR LA COORDONNEE 'Y'... FMP F255MH < PUIS ON PLACE CETTE VALEUR DE (0,255) FAD FHP < DANS LE SEGMENT (FHP,255)... GEN421: EQU $ #/FST# FNIVC < < < M O D U L A T I O N E V E N T U E L L E P A R ' T V 2 ' : < < IF NEXIST-K,,XEIF%, IF ATTENTION : LE TEST SUIVANT VA MERDER !!! XEIF%: VAL ENDIF CPZ IMODTV < FAUT-IL MODULER PAR 'TV2' ??? JE GEN423 < NON... PSR X,Y < OUI, SAUVEGARDE DES COORDONNEES DU < POINT COURANT (X,Y) EN 512*512... < < TEST DE LA POSITION < DU POINT COURANT (X,Y) : < DE LA MAILLE (512,512) < PAR RAPPORT A LA MAILLE < DES SPIR-MAPS 2*(256,256) : < LR X,A < (A)=ABSCISSE '512', SLRS XC512/NPOL=K LR A,X < (X)=ABSCISSE '256'. JC MAPTV1 < ELLE NE "TOMBE PAS JUSTE"... LR Y,A < (A)=ORDONNEE '512', SB VECTNL NGR A,A < EN EFFET, LES AXES 'Y' '512' ET '256' < SONT INVERSES... SLRS XL512/NLIG=K LR A,Y < (Y)=ORDONNEE '256'. JC MAPTV2 < ELLE NE "TOMBE PAS JUSTE", ET LE POINT < '512' EST SUR SUR UNE HORIZONTALE ENTRE < DEUX POINTS '256'... < < CAS D'UN POINT '512' < COINCIDANT AVEC UN < POINT '256' : < BSR ASPIRM < (A,B)=SIGMA(NIVEAU(X,Y)). FMP F4 < ET ON LE QUADRUPLE : < (A,B)=4*SIGMA(NIVEAU(X,Y)). JMP MAPTV9 < VERS LA SORTIE... < < CAS D'UN POINT '512' < ENTRE DEUX POINTS '256' < SUR UNE VERTICALE : < MAPTV2: EQU $ BSR ASPIRM < (A,B)=SIGMA(NIVEAU(X,Y)), #/FST# FWORK < ET SAVE... ADRI I,Y BSR ASPIRM < (A,B)=SIGMA(NIVEAU(X,Y-1)). FAD FWORK < (A,B)=SIGMA(NIVEAU(X,Y))+ < SIGMA(NIVEAU(X,Y-1)). FMP F2 < ET ON LE DOUBLE : < (A,B)=2*(SIGMA(NIVEAU(X,Y))+ < SIGMA(NIVEAU(X,Y-1))). JMP MAPTV9 < VERS LA SORTIE... < < AUTRES CAS : < MAPTV1: EQU $ LR Y,A < (A)=ORDONNEE '512' : SB VECTNL NGR A,A < EN EFFET, LES AXES 'Y' '512' ET '256' < SONT INVERSES... SLRS XL512/NLIG=K LR A,Y < (Y)=ORDONNEE '256'. JC MAPTV3 < ELLE NE "TOMBE PAS JUSTE", ET LE POINT < '512' ET AU CENTRE D'UN CARRE DE QUATRE < POINTS '256'... < < CAS D'UN POINT '512' < ENTRE DEUX POINTS '256' < SUR UNE HORIZONTALE : < BSR ASPIRM < (A,B)=SIGMA(NIVEAU(X,Y)), #/FST# FWORK < ET SAVE... ADRI I,X BSR ASPIRM < (A,B)=SIGMA(NIVEAU(X+1,Y)). FAD FWORK < (A,B)=SIGMA(NIVEAU(X,Y))+ < SIGMA(NIVEAU(X+1,Y)). FMP F2 < ET ON LE DOUBLE : < (A,B)=2*(SIGMA(NIVEAU(X,Y))+ < SIGMA(NIVEAU(X+1,Y))). JMP MAPTV9 < VERS LA SORTIE... < < CAS D'UN POINT '512' AU < CENTRE D'UN CARRE FAIT < DE QUATRE POINTS '256' : < MAPTV3: EQU $ BSR ASPIRM < (A,B)=SIGMA(NIVEAU(X,Y)), #/FST# FWORK1 ADRI I,X BSR ASPIRM < (A,B)=SIGMA(NIVEAU(X+1,Y)), #/FST# FWORK2 ADRI I,Y BSR ASPIRM < (A,B)=SIGMA(NIVEAU(X+1,Y-1)), #/FST# FWORK ADRI -I,X BSR ASPIRM < (A,B)=SIGMA(NIVEAU(X,Y-1)). FAD FWORK FAD FWORK2 FAD FWORK1 < (A,B)=SIGMA(NIVEAU(X,Y))+ < SIGMA(NIVEAU(X+1,Y))+ < SIGMA(NIVEAU(X+1,Y-1))+ < SIGMA(NIVEAU(X,Y-1)). < < PONDERATION "SPIR-MAP" : < MAPTV9: EQU $ FDV F4 < POUR SE RAMENER ULTERIEUREMENT DANS < LE SEGMENT (0,1)... FDV FIVMX7 < QUE L'ON NORMALISE, FMP FNIVC < ET QUI MODULE #/FST# FNIVC < L'INTENSITE LUMINEUSE... PLR X,Y < RESTAURE LE POINT COURANT (X,Y)... GEN423: EQU $ GEN420: EQU $ < < CALCUL DE L'INTENSITE LUMINEUSE "HAUTE" : < LR Y,A < (A)=ORDONNEE COURANTE : YPLAN3:: VAL YPLAN2+I < ORDONNEE DU PLAN VERTICAL 3... CPI YPLAN3 < 'INTENH' EXISTE-T'ELLE ??? JLE GEN801 < NON, PAS ENCORE, ON NE VA PAS TRACER... PSR X < OUI, SAUVEGARDE DE L'ABSCISSE 'X', ADR X,X < PASSAGE A UN INDEX FLOTTANT, FLD &AINTM1 < (A,B)=INTENSITE LUMINEUSE "HAUTE", #/FST# INTENH < ET SAUVEGARDE... PLR X < RESTAURATION DU POINT COURANT 'A'... GEN801: EQU $ < < GENERATION DE LA NORMALE "BASSE" : < < < CALCUL : < ON CONSIDERE LA FACETTE TRIANGULAIRE : < (A(X,Y+I,Z(A)),B(X-I,Y+I,Z(B)),C(X,Y,Z(C))), < ELLE DEFINIT UN PLAN D'EQUATION : < < I X-XA Y-YA Z-ZA I < I XB-XA YB-YA ZB-ZA I = 0 < I XC-XA YC-YA ZC-ZA I < < SOIT, PAR DEFINITION : < < I X-XA Y-YA Z-ZA I < I -1 0 ZB-ZA I = 0 < I 0 -1 ZC-ZA I < < LA NORMALE DE CETTE FACETTE EST < DONC LE VECTEUR DE COORDONNEES : < < ((ZB-ZA),(ZC-ZA),1). < PSR X ADR X,X < PASSAGE A UN INDEX FLOTTANT... ADRI -DFLOT,X FLD &ALIGP1 < Z(B), ADRI DFLOT,X FSB &ALIGP1 < Z(B)-Z(A), #/FST# FXN < X(N)=Z(B)-Z(A). FLD &ALIG < Z(C), FSB &ALIGP1 < Z(C)-Z(A), #/FST# FYN < Y(N)=Z(C)-Z(A). < NOTA : Z(N) VAUT TOUJOURS 2... < < PASSAGE DU RESEAU TRIANGULAIRE < AU RESEAU CARRE DE BASE : < < < CALCUL : < ON CONSIDERE LA FACETTE TRIANGULAIRE : < (D(X-I,Y,Z(D)),B(X-I,Y+I,Z(B)),C(X,Y,Z(C))), < ELLE DEFINIT UN PLAN D'EQUATION : < < I X-XD Y-YD Z-ZD I < I XB-XD YB-YD ZB-ZD I = 0 < I XC-XD YC-YD ZC-ZD I < < SOIT, PAR DEFINITION : < < I X-XD Y-YD Z-ZD I < I 0 1 ZB-ZD I = 0 < I 1 0 ZC-ZD I < < LA NORMALE DE CETTE FACETTE EST < DONC LE VECTEUR DE COORDONNEES : < < ((ZC-ZD),(ZB-ZD),-1), < < OU EN INVERSANT L'ORIENTATION : < < (-(ZC-ZD),-(ZB-ZD),1). < < ENFIN, ON FAIT LA MOYENNE ENTRE < CETTE NORMALE (-(ZB-ZD),-(ZC-ZD),1), < ET LA NORMALE CALCULEE PRECEDEMMENT... < FLD &ALIG < Z(C), ADRI -DFLOT,X FSB &ALIG < Z(C)-Z(D), FSB FXN < -X(N)+(Z(C)-Z(D)), FNEG #/FST# FXN < CE QUI DONNE X(N) SUR LA MAILLE CARREE. FLD &ALIGP1 < Z(B), FSB &ALIG < Z(B)-Z(D), FSB FYN < -Y(N)+(Z(B)-Z(D)), FNEG #/FST# FYN < CE QUI DONNE Y(N) SUR LA MAILLE CARREE. < NOTA : Z(N) VAUT TOUJOURS 2... ADRI DFLOT,X < ET RETOUR SUR LE POINT 'A'... < < CALCUL DE L'INTENSITE LUMINEUSE "BASSE" : < PLR X < RESTAURATION DE LA COORDONNEE 'X'... BSR AINTEN < (A,B)=INTENSITE LUMINEUSE "BASSE", #/FST# INTENB < ET SAUVEGARDE... PSR X < RE-SAUVEGARDE DE 'X', ADR X,X < PASSAGE A UN INDEX FLOTTANT, FST &AINT < ET SAUVEGARDE DANS LA LIGNE COURANTE... PLR X < ET RESTAURE 'X'... < < TEST DE VISIBILITE : < (NOTA : AUTREFOIS, CE < TEST SE TROUVAIT JUSTE < DERRIERE 'GEN420', MAIS < EN FAIT IL FAUT LE METTRE < ICI AFIN QUE LA LISTE 'INT' < SOIT A JOUR...) < CPZ IPERS < EST-CE UNE VUE D'AVION ??? JE GEN80 < OUI, DONC PAS DE LIGNES CACHEES !!! LA VECGY2 < (A)=ORDONNEE DU "HAUT" DU VECTEUR < VERTICAL... CP VECGY1 < ALORS, LE "HAUT" EST-IL BIEN AU-DESSUS < DU "BAS" ??? JGE GEN80 < OUI... BSR AGOTO WORD GEN32 < NON, ON IGNORE CE VECTEUR... GEN80: EQU $ < < TRACE DU VECTEUR : < LR Y,A < (A)=ORDONNEE COURANTE : CPI YPLAN3 < CONNAIT-ON 'INTENH' ??? JLE GEN802 < NON, ON NE TRACE PAS... BSR ASEGV < TRACE NORMAL... < < TEST DE L'ANTI-ALIASING : < IF NEXIST-K,,XEIF%, IF ATTENTION : LES TESTS CI-DESSOUS SONT IDIOTS !!! XEIF%: VAL ENDIF CPZ IPERS < EST-CE UNE VUE D'AVION ??? JE GEN520 < OUI, DONC PAS D'ANTI-ALIASING... CPZ IALIAS < NON, L'ANTI-ALIASING EST-IL DEMANDE ??? JE GEN520 < NON, RIEN A FAIRE... < < OUI, TRAITEMENT ANTI-ALIASING : < LA VECGY2 < (A)=ORDONNEE "HAUTE" COURANTE, XM LSTGY2 < (A)=ORDONNEE "HAUTE" PRECEDENTE, ET MISE < A JOUR DE 'LSTGY2'... STA FWORK2 < ET SAUVEGARDE DE 'LSTGY2' AVANT SA MISE < A JOUR POUR UNE UTILISATION ULTERIEURE... #/FLD# LSTENH < (A,B)=INTENSITE LUMINEUSE "HAUTE" DU < VECTEUR VERTICAL PRECEDENT A < PRIORI... #/FST# FWORK1 < ET SAUVEGARDE DE 'LSTENH' AVANT SA MISE < A JOUR, POUR UNE UTILISATION ULTE- < RIEURE... #/FLD# INTENH #/FST# LSTENH < ET MISE A JOUR DE 'LSTENH'... LA &ALISTY < BON, MAINTENANT QUE L'ON A CORRECTEMENT < POSITIONNE 'LSTGY2' ET 'LSTENH', EST-ON < EN PRESENCE D'UNE DISCONTINUITE ??? < (A)=NUMERO DE LA LIGNE CORRESPONDANT < AU DERNIER VECTEUR VERTICAL TRACE < AVEC LE NUMERO DE COLONNE (X) OU < ABSCISSE COURANTE, ADRI I,A STY &ALISTY < ET MISE-A-JOUR DE LA LISTE 'LISTY'... CPR A,Y < Y-A-T'IL DISCONTINUITE ??? JE GEN520 < NON, PUISQU'IL Y A UNE DIFFERENCE D'UNE < SEULE UNITE... ADRI -INCIX,X < OUI : LA &ALISTY < (A)=NUMERO DE LA LIGNE CORRESPONDANT < A L'HYPOTHETIQUE VECTEUR VERTICAL < PRECEDENT... ADRI INCIX,X CPR A,Y < A-T'ON EFFECTIVEMENT TRAITE LE VECTEUR < VERTICAL PRECEDENT SUR CETTE MEME LIGNE < D'ORDONNEE (Y) ??? JNE GEN520 < NON, ON NE PEUT DONC RIEN FAIRE... CPZ FWORK1 < EST-CE EN FAIT LE PREMIER POINT DE LA < LIGNE COURANTE ??? JE GEN520 < OUI, RIEN A FAIRE... LA FWORK2 < (A)=ORDONNEE "HAUTE" PRECEDENTE, STA VECGY1 < ET MISE EN PLACE A PRIORI DE L'ORDONNEE < "BASSE" DU TRACE ANTI-ALIASING... CP VECGY2 < ET COMPARAISON A L'ORDONNEE "HAUTE" DU < POINT COURANT : JE GEN520 < RIEN A FAIRE, ON EST SUR UN PALIER < HORIZONTAL... JG GEN501 < (LSTGY2) > (VECGY2) : LE POINT "HAUT" < COURANT EST AU-DESSOUS DU POINT "HAUT" < PRECEDENT, C'EST DONC LE VECTEUR COURANT < QU'IL CONVIENT DE MODIFIER... IF INCIX+I,,XEIF%, IF ATTENTION : IL FAUT REMPLACER LES 'IC' IF QUI SUIVENT PAR DES 'DC' !!! XEIF%: VAL ENDIF IC VECGX1 < ET PASSAGE SUR LE VECTEUR IC VECGX2 < PRECEDENT... #/FLD# FWORK1 < (A,B)=INTENSITE LUMINEUSE "HAUTE" DU < VECTEUR VERTICAL COURANT... JMP GEN502 < VERS LE TRACE... GEN501: EQU $ LA VECGY1 < DANS LE CAS OU LE POINT "HAUT" COURANT XM VECGY2 < EST AU-DESSOUS DU POINT "HAUT" PRECEDENT, STA VECGY1 < ON PERMUTE 'VECGY1' ET 'VECGY2'... < NOTA : (VECGX1)=(VECGX2), DONC IL EST < INUTILE DE LES PERMUTER... #/FLD# INTENH < (A,B)=INTENSITE LUMINEUSE "HAUTE"... GEN502: EQU $ #/FST# INTENB < ET L'INTENSITE "BASSE" COURANTE EST < SOIT L'INTENSITE "HAUTE", SOIT L'INTE- < SITE "HAUTE" DU VECTEUR PRECEDENT, < SUIVANT QUE L'ON MODIFIE LE VECTEUR < COURANT OU LE VECTEUR PRECEDENT... PSR X,Y < OUI, IL FAUT FAIRE DE L'ANTI-ALIASING... LX VECGX2 < (X)=ABSCISSE DU POINT "HAUT", LY VECGY2 < (Y)=ORDONNEE DU POINT "HAUT", BSR ALOADP < RENVOIE : < (A)=NIVEAU DE TRACE DU POINT (X,Y), LR A,X LBY &ALNOVI < (A)=NIVEAU CALCULE APPROXIMATIF DU < POINT (X,Y), FLT < QUE L'ON FLOTTE... PLR X,Y #/FST# INTENH < ET CECI AFIN D'INTERPOLER A PARTIR DU < NIVEAU PRESENT ANTERIEUREMENT, OU A < PARTIR DU NIVEAU DE NOIR, SI LE NIVEAU < TROUVE PAR 'LOADP' NE FIGURE PAS DANS < 'LNIVO' (C'EST LE CAS PAR EXEMPLE DE LA < SUPERPOSITION DE 2 IMAGES...). BSR ASEGV < ET CORRECTION ANTI-ALIASING SOIT DU < VECTEUR COURANT, SOIT DU VECTEUR < PRECEDENT, SUIVANT LEURS TAILLES < RELATIVES... GEN520: EQU $ GEN802: EQU $ < < PASSAGE AU VECTEUR VERTICAL SUIVANT : < GEN32: EQU $ ADRI INCIX,X < REGRESSION DE L'ABSCISSSE, LR X,A CPI W < EST-ON EN DEBUT DE LIGNE ??? < ET CE AFIN DE POUVOIR TRAITER DES TRIAN- < GLES DU TYPE : < (A(X,Y),B(X-I,Y),C(X,Y-I))... JL GEN31 < OUI, ON ABANDONNE... BSR AGOTO WORD GEN30 < NON, ON CONTINUE LE TRACE... GEN31: EQU $ < < "ROTATION" DES BUFFERS DE LIGNES : < GEN50: EQU $ LA ALIGM1 < LIGNE PRECEDENTE, XM ALIGP2 < QUI EST ECRASEE... XM ALIGP1 < LA LIGNE SUIVANTE-SUIVANTE DEVIENT LA < LIGNE SUIVANTE, XM ALIG < LA LIGNE SUIVANTE DEVIENT LA LIGNE < COURANTE, STA ALIGM1 < ET LA LIGNE COURANTE DEVIENT LA LIGNE < PRECEDENTE... LA AINTM1 < LIGNE PRECEDENTE, XM AINT < QUI EST ECRASEE, STA AINTM1 < ET LA LIGNE COURANTE DEVIENT LA LIGNE < PRECEDENTE... < < < P O U R S U I T E D E L A G E N E R A T I O N : < < GEN20: EQU $ ADRI I,Y < PASSAGE A LA LIGNE SUIVANTE : LR Y,A CP VECTNL < EST-ON AU BOUT DE L'IMAGE ??? JG GEN40 < OUI, C'EST FINI... BSR AGOTO WORD GEN01 < NON... GEN40: EQU $ BSR ATSFLO < < TRAITEMENT DE FIN... < CPZ IQUIT < FAUT-IL S'ARRETER ??? JE GEN610 < NON... IF EXIST-K,XEIF%,,XEIF% IF ATTENTION : LE TEST CI-DESSUS EST IDIOT !!! XEIF%: VAL ENDIF QUIT XXQUIT < OUI... GEN610: EQU $ CPZ IVIDEO < FAUT-IL ECRIRE ??? JE GEN600 < NON... IF EXIST-K,XEIF%,,XEIF% IF ATTENTION : LE TEST CI-DESSUS EST IDIOT !!! XEIF%: VAL ENDIF PSR X < OUI : LRM A WORD DEMVIW SVC < ON ECRIT L'IMAGE COURANTE... LRM A WORD DEMVIR SVC < ET ON ATTEND L'ACQUITTEMENT... PLR X GEN600: EQU $ < < PASSAGE A L'IMAGE SUIVANTE : < BSR AGOTO < ET ON ITERE EVENTUELLEMENT... WORD DEBUT4 < < < E N T R Y A L T - M O D E : < < DEBUT5: EQU $ QUIT XXQUIT < A T T E N T E ... LRM C,L,K < ON REINITIALISE 'C', 'L' ET 'K' AU CAS < D'UNE RE-ENTREE PAR UN 'ALT-MODE'... WORD COM+DEPBAS < 'C', WORD LOC+DEPBAS < 'L', WORD STACK-DEPILE < 'K'. BSR AGOTO WORD DEBUT4 < (A)=ADRESSE D'ITERATION SUR ALT-MODE... PAGE < < < U P D A T E D E F I N I T I O N S U R F A C E 3 D : < < $EQU AMPLI FLOAT 1 < AMPLIFICATEUR DE LA FONCTION. $EQU MOYENE FLOAT <NIV256/XXXMOY<K<K < VALEUR MOYENNE DE LA FONCTION. $EQU EXPOP0 FLOAT 0.9 < EXPOSANT DE DECROISSANCE DE PONDERATION. $EQU PASIX0 WORD 200 < PAS INITIAL SUR 'OX'. $EQU PASIY0 WORD 200 < PAS INITIAL SUR 'OY'. $EQU MRECUR WORD 32 < PROFONDEUR MAXIMALE DE RECURENCE. $EQU GRAINE WORD 5713 < GRAINE DU GENERATEUR ALEATOIRE. $EQU SUPRDN NTRN WORD XXN255/XXXMOY < SUP(RDN). TRN $EQU INFRDN NTRN WORD -XXN255/XXXMOY < INF(RDN). TRN $EQU AMPLIR FLOAT <W<K<K < AMPLIFICATEUR DE L'ALEATOIRE. < < < U P D A T E S T R A C E F I N A L : < < $EQU MAXNIV WORD XXN255 < NIVEAU MAXIMAL AUTORISE... $EQU MINNIV WORD XXNOIR+Z < NIVEAU MINIMAL AUTORISE... < < < U P D A T E S E C L A I R A G E : < < $EQU TRX WORD 0 < TRANSLATION EN 'X'. $EQU TRY WORD 128 < TRANSLATION EN 'Y'. $EQU FXL FLOAT 1000 < X(SOURCE LUMINEUSE). $EQU FYL FLOAT 400 < Y(SOURCE LUMINEUSE). $EQU FZL FLOAT 0 < Z(SOURCE LUMINEUSE). $EQU NPENOM WORD 12 < LARGEUR DE LA ZONE DE PENOMBRE. < < < U P D A T E S F I L T R A G E : < < $EQU ALPHA FLOAT 0.5 < CONSTANTE D'ELIMINATION DES PICS. < < < M O D U L A T I N D E L A L U M I N A N C E : < P A R ' T V 1 ' ( ' I M O D T V ' ) : < < $EQU PASM WORD W < PAS DE PARCOURS DE LA SPIR-MAP, $EQU NMM WORD 15 < NOMBRE DE POINTS DE CHAQUE SPIR-MAP. $EQU XCTCDA WORD TV1 < POUR ATTEINDRE L'IMAGE 'TV1'... < < < C O N T R I B U T I O N A L E A T O I R E / ' T V 2 ' < A L A D E F I N I T I O N D E L A S U R F A C E : < < $EQU PONRDN FLOAT <W<K<K < CONTRIBUTION DE LA GENERATION ALEATOIRE, $EQU PONSPI FLOAT <K<K<K < CONTRIBUTION DES SPIR-MAPS. < < < E N T R E E B A N D E M A G N E T I Q U E : < < $EQU TRANMT FLOAT <K<K<K < TRANSLATION FONCTION BANDE. $EQU MULTMT FLOAT <W<K<K < ECHELLE FONCTION BANDE. < < < U P D A T E S T E X T U R A G E 3 D : < < $EQU GRAINR WORD 9237 < GRAINE DU GENERATEUR DE 'NRECUR'. $EQU FH FLOAT <K<K<K < "DEPTH-CUEING" MAXIMAL... $EQU FPERSB FLOAT <W<K<K < PAS DE MISE EN "FUITE" A PRIORI... $EQU AMPLYR FLOAT 1.5 < AMPLYFICATEUR DE LA FUNCTION. $EQU MOYENF FLOAT <NIV256/XXXMOY<K<K < VALEUR MOYENNE DE LA FUNCTION. $EQU EXPOQ0 FLOAT 0.5 < EXPOSANT DE DECROISSANCE DE PONDERATION. $EQU PAZIX0 WORD 50 < PAZ INITIAL SUR 'OX'. $EQU PAZIY0 WORD 50 < PAZ INITIAL SUR 'OY'. $EQU PAZIZ0 WORD 50 < PAZ INITIAL SUR 'OZ'. $EQU MREKUR WORD 1 < PROFONDEUR MAXIMALE DE REKURENCE. $EQU GRAINF WORD 4660 < GRAINF DU GENERATEUR ALEATOIRE. $EQU SUPRAN NTRN WORD XXN255/XXXMOY < SUP(RAN). TRN $EQU INFRAN NTRN WORD -XXN255/XXXMOY < INF(RAN). TRN < < < U P D A T E S G A U S S I E N N E T E X T U R A G E 3 D : < < $EQU TXGAUS XWOR%1: VAL XC512/XXXMOY WORD XWOR%1 < TRANSLATION DES COORDONNEES 'X', $EQU DXGAUS XWOR%2: VAL XWOR%1/XXXMOY FLOAT <XWOR%2*XWOR%2<NILK<NILK < NORMALISATEUR DE (X-TX)**2. $EQU TYGAUS XWOR%1: VAL XL512/XXXMOY WORD XWOR%1 < TRANSLATION DES COORDONNEES 'Y', $EQU DYGAUS XWOR%2: VAL XWOR%1/XXXMOY FLOAT <XWOR%2*XWOR%2<NILK<NILK < NORMALISATEUR DE (Y-TY)**2. $EQU TZGAUS XWOR%1: VAL ZCOUCH/XXXMOY WORD XWOR%1 < TRANSLATION DES COORDONNEES 'Z', $EQU DZGAUS XWOR%2: VAL XWOR%1/XXXMOY FLOAT <XWOR%2*XWOR%2<NILK<NILK < NORMALISATEUR DE (Z-TZ)**2. < < < C O N T R I B U T I O N S D E S T E X T U R A G E S 3 D < ( ' I T E X T U ' ) : < < $EQU PONRAN FLOAT <W<K<K < CONTRIBUTION TEXTURE ALEATOIRE, $EQU PONSPJ FLOAT <K<K<K < CONTRIBUTION TEXTURE SPIR-MAP : PRENDRE < 0 (ABSENCE) OU 256/7/4=8 (PRESENCE ; 256, < AFIN DE BALAYER TOUTE LA PLAGE, < DIVISE PAR 7 AFIN DE COMPENSER LA < MULTIPLICATION PAR LA NIVEAU MAX DES < IMAGES 'TV2' ET DIVISER PAR 4 POUR COM- < PENSER LA MULTIPLICATION PAR 4 DES < RESULTATS DE 'SPIRD'...). < < < S E U I L L A G E P A R D E S P L A N S D E C O U P E : < < $EQU FALTX FLOAT <K<K<K $EQU FALTY FLOAT <K<K<K $EQU FALTZ FLOAT <W<K<K < AINSI, ON TEXTURE PAR 'ZS'... $EQU FALTR FLOAT <K<K<K < < < S U P E R P O S I T I O N D ' U N C H A M P D ' A L T I T U D E S < D E F I N I P A R ' T V 2 ' ( ' P O N S P I ' ) : < < $EQU PASD WORD W < PAS DE PARCOURS DE LA SPIR-DEP, $EQU NDM WORD 15 < NOMBRE DE POINTS DE CHAQUE SPIR-DEP. $EQU FCOEFB FLOAT -1.0 < COEFFICIENT DES EXPOSANTS DES EXPO- < NENTIELLES DE PONDERATION DES POINTS < DES SPIR-DEPS. $EQU FCOEFA FLOAT 1.0 < POUR PONDERER LA SOMME DES POINTS SUR < UNE SPIR-DEP DE MODULATION VERTICALE... < < < H O M O T H E T I E D U C H A M P : < < $EQU FHOMO FLOAT 1.0 < A PRIORI, PAS D'HOMOTHETIE... PAGE < < < T A B L E D E S S Y M B O L E S : < < IF '00000000000@,XEIF%,,XEIF% EST XEIF%: VAL ENDIF DATE END DEBUT