home *** CD-ROM | disk | FTP | other *** search
/ PC Interdit / pc-interdit.iso / graph / texture.inc < prev    next >
Text File  |  1994-10-17  |  10KB  |  317 lines

  1. txt_makevarl macro              ;recharge les variables 3D du côté gauche
  2. .386
  3.   movsx ebx,dyl                 ;nombre de pas 
  4.   inc ebx
  5.   push ecx
  6.   push edx
  7.  
  8.   movsx eax,poly3d[bp]          ;lit 3d-x 
  9.   shl eax,8                     ;les 8 bits inf sont la partie décimale
  10.   mov xl_3d,eax                 ;enregistre
  11.   movsx ecx,poly3d[bp+8]        ;forme la différence
  12.   shl ecx,8
  13.   sub eax,ecx
  14.   neg eax
  15.   cdq
  16.   idiv ebx                      ;définit le pas
  17.   mov inc_xl,eax
  18.  
  19.   movsx eax,poly3d[bp+2]        ;lit 3d-y 
  20.   shl eax,8
  21.   mov yl_3d,eax
  22.   movsx ecx,poly3d[bp+10d]      ;forme la différence
  23.   shl ecx,8
  24.   sub eax,ecx
  25.   neg eax
  26.   cdq
  27.   idiv ebx                      ;définit le pas
  28.   mov inc_yl,eax
  29.  
  30.   movsx eax,poly3d[bp+4]        ;lit 3d-z
  31.   shl eax,8
  32.   mov zl_3d,eax
  33.   movsx ecx,poly3d[bp+12d]      ;forme la différence
  34.   shl ecx,8
  35.   sub eax,ecx
  36.   neg eax
  37.   cdq
  38.   idiv ebx                      ;définit le pas
  39.   mov inc_zl,eax
  40.   pop edx
  41.   pop ecx
  42. endm
  43.  
  44.  
  45. txt_makevarr macro              ;recharge les variables 3D du côté droit
  46. .386
  47.   push eax
  48.   push ebx
  49.   movsx ebx,dyr                 ;nombre de pas 
  50.   inc ebx
  51.  
  52.   movsx eax,poly3d[bp+8]        ;lit 3d-x 
  53.   shl eax,8                     ;les 8 bits inf sont la partie décimale
  54.   mov xr_3d,eax                 ;enregistre
  55.   movsx ecx,poly3d[bp]          ;forme la différence
  56.   shl ecx,8
  57.   sub eax,ecx
  58.   neg eax
  59.   cdq
  60.   idiv ebx                      ;définit le pas
  61.   mov inc_xr,eax
  62.  
  63.   movsx eax,poly3d[bp+10d]      ;lit 3d-y 
  64.   shl eax,8
  65.   mov yr_3d,eax
  66.   movsx ecx,poly3d[bp+2]        ;forme la différence
  67.   shl ecx,8
  68.   sub eax,ecx
  69.   neg eax
  70.   cdq
  71.   idiv ebx                      ;définit le pas
  72.   mov inc_yr,eax
  73.  
  74.   movsx eax,poly3d[bp+12d]      ;lit 3d-z
  75.   shl eax,8
  76.   mov zr_3d,eax
  77.   movsx ecx,poly3d[bp+4]        ;forme la différence
  78.   shl ecx,8
  79.   sub eax,ecx
  80.   neg eax
  81.   cdq
  82.   idiv ebx                      ;définit le pas
  83.   mov inc_zr,eax
  84.   pop ebx
  85.   pop eax
  86. endm
  87.  
  88.  
  89. txt_hline macro
  90. hline_texture proc near      ;remplace la procedure "hline" avec des textures
  91. .386
  92.   push es
  93.   pusha
  94.   mov x0,ax                  ;sauvegarde des coordonnées pour usage ultérieur
  95.   mov y0,bx
  96.   mov x1,cx
  97.   sub cx,ax                     ;calcule le nombre de points à tracer
  98.   jne zzok2
  99.   inc cx
  100. zzok2:
  101.   mov zz,cx
  102.  
  103.   mov bp,ligne_sup
  104.   mov bx,ligne_inf
  105.   mov eax,xr_3d[bx]             ;détermine l'abscisse relative x
  106.   movsx ecx,poly3d[2]
  107.   shl ecx,8                     ;ramène au format "virgule fixe"
  108.   sub eax,ecx
  109.   mov d_y,eax
  110.   movsx ecx,w colonne2[0]
  111.   imul ecx                      ;multiplie par Delta2 x
  112.   mov esi,eax                   ;sauvegarde intermédiaire
  113.  
  114.   mov eax,xr_3d[bp]             ;détermine l'ordonnée relative y
  115.   movsx ecx,poly3d[0]
  116.   shl ecx,8                     ;ramène au format "virgule fixe"
  117.   sub eax,ecx
  118.   mov d_x,eax
  119.   movsx ecx,w colonne2[4]
  120.   imul ecx                      ;multiplie par Delta2 y 
  121.   sub eax,esi                   ;forme la différence (D1)
  122.   cdq                           ;prépare la division
  123.   idiv dword ptr D              ;divise par le déterminant principal
  124.   shl eax,8
  125.   neg eax
  126.   mov inc_lambda1,eax           ;sauvegarde pour soustraction
  127.  
  128.   mov eax,d_x                   ;lit l'abscisse relative x
  129.   movsx ecx,w colonne1[4]
  130.   imul ecx                      ;multiplie par Delta1 y
  131.   mov esi,eax                   ;sauvegarde intermédiaire
  132.  
  133.   mov eax,d_y                   ;lit l'ordonnée relative y
  134.   movsx ecx,w colonne1[0]
  135.   imul ecx                      ;multiplie par Delta1 x
  136.   sub eax,esi                   ;forme la différence (D2)
  137.   cdq                           ;prépare la division
  138.   idiv dword ptr D              ;divise par le déterminant principal
  139.   shl eax,8
  140.   neg eax
  141.   mov inc_lambda2,eax           ;sauvegarde pour soustraction
  142. mov eax,xl_3d[bx]               ;définit l'abscisse relative x
  143.   movsx ecx,poly3d[2]
  144.   shl ecx,8                     ;convertit au format virgule fixe
  145.   sub eax,ecx
  146.   mov d_y,eax
  147.   movsx ecx,w colonne2[0]
  148.   imul ecx                      ;multiplie par Delta2 x
  149.   mov esi,eax                   ;sauvegarde intermédiaire
  150.  
  151.   mov eax,xl_3d[bp]             ;définit l'ordonnée relative y
  152.   movsx ecx,poly3d[0]
  153.   shl ecx,8                     ;convertit au format virgule fixe
  154.   sub eax,ecx
  155.   mov d_x,eax
  156.   movsx ecx,w colonne2[4]
  157.   imul ecx                      ;multiplie par Delta2 y
  158.   sub eax,esi                   ;forme la différence (D1)
  159.   cdq                           ;prépare la division 
  160.   idiv dword ptr D              ;divise par le déterminant principal
  161.   shl eax,8
  162.   neg eax
  163.   mov lambda1,eax               ;lambda1 déterminé 
  164.   sub inc_lambda1,eax
  165.  
  166.   mov eax,d_x                   ;lit l'abscisse relative x
  167.   movsx ecx,w colonne1[4]
  168.   imul ecx                      ;multiplie par Delta1 y 
  169.   mov esi,eax                   ;sauvegarde intermédiaire
  170.  
  171.   mov eax,d_y                   ;lit l'oronnée relative y
  172.   movsx ecx,w colonne1[0]
  173.   imul ecx                      ;multiplie par Delta1 x
  174.   sub eax,esi                   ;forme la différence (D2) 
  175.   cdq                           ;prépare la division 
  176.   idiv dword ptr D              ;divise par le déterminant principal 
  177.   neg eax
  178.   shl eax,8
  179.   mov lambda2,eax               ;lambda2 déterminé
  180.   sub inc_lambda2,eax
  181. mov ax,80d                      ;définit l'offset
  182.   mov bx,y0
  183.   mul bx
  184.   mov bx,x0                     ;(x div 4) + y*80
  185.   shr bx,2
  186.   add ax,bx
  187.   add ax,vpage
  188.   mov di,ax
  189.   mov ax,0a000h                 ;charge le segment VGA
  190.   mov es,ax
  191.  
  192.   mov cx,x0                     ;masque le plan de début
  193.   and cx,3
  194.   mov ax,1
  195.   shl ax,cl                     ;met à un le bit correspondant
  196.   mov b plane+1,al
  197.   shl al,4                      ;extension au quartet supérieur
  198.   or b plane+1,al
  199. movsx ecx,zz                    ;calcule les accroissements des lambda
  200.   mov eax,inc_lambda1           ;lit la longueur totale
  201.   cdq
  202.   idiv ecx                      ;divise par le nombre de pas
  203.   mov inc_lambda1,eax
  204.   mov eax,inc_lambda2           ;lit la longueur totale
  205.   cdq
  206.   idiv ecx                      ;divise par le nombre de pas
  207.   mov inc_lambda2,eax
  208. mov bp,Txt_Nr                   ;lit le numéro de la texture courante
  209.   shl bp,1                      ;2 octets par élément
  210.   mov bx,Txt_Taille[bp]         ;lit l'indication de taille courante
  211.   mov b cs:Taille_Patch+3,bl    ;et modifie le code en conséquence
  212.   mov b cs:Taille_Patch+7,bh
  213.  
  214.   mov ax,word ptr Txt_Offs[bp]  ;lit l'offset de cette texture
  215.  
  216.   push ds
  217.   shl bp,1                      ;4 octets par élément
  218.   lds si,dword ptr Txt_Data[bp] ;pointe sur les données proprement dites
  219.   add si,ax
  220.   mov w cs:Ofs_Patch+2,si       ;et modifie le code en conséquence
  221.  
  222.   mov dx,3c4h                   ;timing sequencer
  223.   mov ebp,lambda1               ;variables dans registres
  224.   mov esi,lambda2
  225. lp:                             ;boucle parcourue pour chaque point
  226.   add ebp,inc_lambda1           ;mise à jour lambda1 et 2 
  227.   add esi,inc_lambda2
  228.  
  229.   mov ax,plane                  ;lit le plan
  230.   out dx,ax                     ;et le sélectionne
  231.  
  232.   mov eax,ebp                  ;détermine l'offset à l'intérieur du graphique de texture
  233.   mov ebx,esi
  234. Taille_Patch:
  235.   sar eax,11d                   ;fixe la taille (modifiée)
  236.   sar ebx,11d
  237.    imul eax,320d
  238.   add ebx,eax
  239.  
  240. Ofs_Patch:
  241.   mov al,ds:[bx+1111h]          ;lit la couleur de la texture (modifiée)
  242.   mov es:[di],al                ;reporte la couleur
  243.   dec cx                        ;diminue le nombre de points
  244.   je hlt_fini                   ;tous les points traités ?
  245.   rol b plane+1,1               ;plan suivant
  246.   cmp b plane+1,11h             ;débordement de plan de 3 à  0 ?
  247.   jne lp                        ;non, on continue
  248.   inc di                        ;sinon on augmente l'offset
  249.   jmp lp                        ;et on continue
  250. hlt_fini:
  251.   pop ds
  252.   popa
  253.   pop es
  254.   ret
  255. hline_texture endp
  256. endm
  257.  
  258.  
  259. txt_Detprinc macro              ;calcul de déterminant principal
  260.   xor si,si                     ;premier essai : lignes  0 et 1
  261.   mov di,2
  262. suivante:
  263.   mov ax,w delta1[si]           ;calcule le déterminant principal
  264.   imul w delta2[di]
  265.   mov bx,ax                     ;sauvegarde résultat intermédiaire
  266.   mov cx,dx
  267.   mov ax,w delta2[si]
  268.   imul w delta1[di]
  269.   sub bx,ax                     ;sauvegarde la différence
  270.   sbb cx,dx
  271.   mov w D,bx
  272.   mov w D+2,cx
  273.   or bx,cx                      ;déterminant principal = 0 ?
  274.   jne D_fini
  275.   add si,2                      ;alors nouvelles composantes
  276.   add di,2
  277.   cmp di,4                      ;dans la ligne disponible?
  278.   jbe suivante
  279.   xor di,di                     ;non, on recommence en haut
  280.   jmp suivante
  281. D_fini:
  282.   movsx eax,delta1[si]          ;sauvegarde les valeurs de colonnes utilisées
  283.   mov colonne1[0],eax
  284.   movsx eax,delta1[di]
  285.   mov colonne1[4],eax
  286.   movsx eax,delta2[si]
  287.   mov colonne2[0],eax
  288.   movsx eax,delta2[di]
  289.   mov colonne2[4],eax
  290.   shl si,1                      ;prend note des colonnes utilisées
  291.   shl di,1
  292.   mov ligne_sup,si
  293.   mov ligne_inf,di
  294. endm
  295.  
  296.  
  297. txt_incl macro                  ;poursuite du comptage à gauche
  298.   push eax
  299.   mov eax,inc_xl                ;avance l'abscisse 3d x
  300.   add xl_3d,eax
  301.   mov eax,inc_yl                ;avance l'ordonnée 3d y
  302.   add yl_3d,eax
  303.   mov eax,inc_zl                ;avance la profondeur 3d z
  304.   add zl_3d,eax
  305.   pop eax
  306. endm
  307. txt_incr macro                  ;poursuite du comptage à droite
  308.   push eax
  309.   mov eax,inc_xr                ;avance l'abscisse 3d x
  310.   add xr_3d,eax
  311.   mov eax,inc_yr                ;avance l'ordonnée 3d y
  312.   add yr_3d,eax
  313.   mov eax,inc_zr                ;avance la profondeur 3d z
  314.   add zr_3d,eax
  315.   pop eax
  316. endm
  317.