
Code : Tout sélectionner
poly_asm:
!zone_lam: ;-- trie "y" par ordre croissant --------------------
x=0
y=0
z=0
!pushad ;sauve tous les registres généraux (en les mettant sur la pile)
!lea esi,[zbuffer] ;adresse du zbuffer à remplir -> esi
!mov [madzbuffer],esi ;->madzbuffer (une variable, voir plus bas)
!cVTSS2SI eax,[v_ax1] ;on convertit les flottants en entiers, et on les balance dans les registres généraux (le maximum possible)
!cVTSS2SI ebx,[v_ay1]
!cVTSS2SI ecx,[v_ax2]
!cVTSS2SI edx,[v_ay2]
!cVTSS2SI edi,[v_ax3]
!cVTSS2SI esi,[v_ay3]
!MOVss xmm0,[v_az1] ;les z dans les registres xm
!movss xmm1,[v_az2]
!movss xmm2,[v_az3]
!CMP ebx,esi ;cherche le y le plus haut (teste le contenu des deux registres)
!Jnge rien01_lam ; si nge-> not greater or equal (<), on continue
!XCHG ebx,esi ;sinon on inverse les points 1 et 3
!XCHG eax,edi
!movss xmm3,xmm0
!movss xmm0,xmm2
!movss xmm2,xmm3
!rien01_lam:
!CMP ebx,edx ;pareil pour les points 1 et 2
!Jnge rien02_lam
!XCHG ebx,edx
!XCHG eax,ecx
!movss xmm3,xmm0
!movss xmm0,xmm1
!movss xmm1,xmm3
!rien02_lam:
!CMP edx,esi ;pareil pour les points 2 et 3
!Jnge rien03_lam
!XCHG edx,esi
!XCHG ecx,edi
!movss xmm3,xmm1
!movss xmm1,xmm2
!movss xmm2,xmm3
!rien03_lam:
!MOV [fillx1],eax ;on balance tout dans des variables
!MOV [filly1],ebx
!MOV [fillx2],ecx
!MOV [filly2],edx
!MOV [fillx3],edi
!MOV [filly3],esi
!MOVss [fillz1],xmm0
!MOVss [fillz2],xmm1
!MOVss [fillz3],xmm2