voici, une routine asm compatible avec ton moteur avec zbuffer.
Code : Tout sélectionner
InitSprite()
InitKeyboard()
InitMouse()
OpenScreen(1024,768, 32, "")
deb:
Gosub clear_zbuffer
StartDrawing(ScreenOutput())
ax1.f=600
ay1.f=200
az1.f=20
ax2.f=800
ay2.f=420
az2.f=20
ax3.f=410
ay3.f=330
az3.f=20
color= $0000ff
Gosub poly_asm
ExamineMouse()
xx=MouseX()
yy=MouseY()
ax1.f=xx
ay1.f=yy
az1.f=10
ax2.f=xx+300
ay2.f=yy+150
az2.f=30
ax3.f=xx-340
ay3.f=yy+253
az3.f=30
color=$00ff00
Gosub poly_asm
StopDrawing()
FlipBuffers()
ClearScreen(RGB(0,0,0))
ExamineKeyboard()
If KeyboardPushed(#PB_Key_Escape)
End
EndIf
Goto deb
poly_asm:
!zone_lam: ;-- trie "y" par ordre croissant --------------------
x=0
y=0
z=0
!pushad
!lea esi,[zbuffer]
!mov [madzbuffer],esi
!cVTSS2SI eax,[v_ax1]
!cVTSS2SI ebx,[v_ay1]
!cVTSS2SI ecx,[v_ax2]
!cVTSS2SI edx,[v_ay2]
!cVTSS2SI edi,[v_ax3]
!cVTSS2SI esi,[v_ay3]
!MOVss xmm0,[v_az1]
!movss xmm1,[v_az2]
!movss xmm2,[v_az3]
!CMP ebx,esi
!Jnge rien01_lam
!XCHG ebx,esi
!XCHG eax,edi
!movss xmm3,xmm0
!movss xmm0,xmm2
!movss xmm2,xmm3
!rien01_lam:
!CMP ebx,edx
!Jnge rien02_lam
!XCHG ebx,edx
!XCHG eax,ecx
!movss xmm3,xmm0
!movss xmm0,xmm1
!movss xmm1,xmm3
!rien02_lam:
!CMP edx,esi
!Jnge rien03_lam
!XCHG edx,esi
!XCHG ecx,edi
!movss xmm3,xmm1
!movss xmm1,xmm2
!movss xmm2,xmm3
!rien03_lam:
!MOV [fillx1],eax
!MOV [filly1],ebx
!MOV [fillx2],ecx
!MOV [filly2],edx
!MOV [fillx3],edi
!MOV [filly3],esi
!MOVss [fillz1],xmm0
!MOVss [fillz2],xmm1
!MOVss [fillz3],xmm2
!affizone_lam: ;-- determine different cas de polygones -----------
!SUB esi,ebx
!INC esi
!MOV [linn],esi
!LEA ebx,[memzone]
!CMP ecx,edi
!JGE form1_lam
!CMP eax,ecx
!JNGE depass01ac_lam
!CMP eax,edi
!JG depass01c_lam
!MOV edx,[fillx1]
!MOV edi,[filly1]
!MOV ebp,[fillx2]
!MOV esi,[filly2]
!MOVss xmm0,[fillz1]
!movss xmm1,[fillz2]
!MOV ecx,1
!CALL tracage_lam
!MOV edx,[fillx2]
!MOV edi,[filly2]
!MOV ebp,[fillx3]
!MOV esi,[filly3]
!movss xmm0,[fillz2]
!movss xmm1,[fillz3]
!MOV ecx,0
!CALL tracage_lam
!ADD ebx,16
!MOV edx,[fillx1]
!MOV edi,[filly1]
!MOV ebp,[fillx3]
!MOV esi,[filly3]
!MOVss xmm0,[fillz1]
!movss xmm1,[fillz3]
!MOV ecx,1
!CALL tracage_lam
!JMP rempli_lam
!depass01c_lam:
!MOV edx,[fillx1]
!MOV edi,[filly1]
!MOV ebp,[fillx2]
!MOV esi,[filly2]
!MOVss xmm0,[fillz1]
!movss xmm1,[fillz2]
!MOV ecx,1
!CALL tracage_lam
!MOV edx,[fillx2]
!MOV edi,[filly2]
!MOV ebp,[fillx3]
!MOV esi,[filly3]
!movss xmm0,[fillz2]
!movss xmm1,[fillz3]
!MOV ecx,0
!CALL tracage_lam
!ADD ebx,16
!MOV edx,[fillx1]
!MOV edi,[filly1]
!MOV ebp,[fillx3]
!MOV esi,[filly3]
!MOVss xmm0,[fillz1]
!movss xmm1,[fillz3]
!MOV ecx,0
!CALL tracage_lam
!JMP rempli_lam
!depass01ac_lam:
!MOV edx,0
!MOV eax,[fillx3]
!SUB eax,[fillx1]
!MOV edi,[filly3]
!SUB edi,[filly1]
!JE sanscond01ac_lam
!SAL eax,16
!DIV edi
!MOV esi,eax
!MOV edx,0
!MOV eax,[fillx3]
!SUB eax,[fillx2]
!MOV edi,[filly3]
!SUB edi,[filly2]
!JE sanscond01ac_lam
!SAL eax,16
!DIV edi
!MOV edi,eax
!CMP esi,edi
!JGE depass01bc_lam
!sanscond01ac_lam:
!MOV edx,[fillx1]
!MOV edi,[filly1]
!MOV ebp,[fillx2]
!MOV esi,[filly2]
!MOVss xmm0,[fillz1]
!movss xmm1,[fillz2]
!MOV ecx,0
!CALL tracage_lam
!MOV eax,[ebx]
!MOV [sauvad],ebx
!MOV [sauvpt],eax
!MOV edx,[fillx2]
!MOV edi,[filly2]
!MOV ebp,[fillx3]
!MOV esi,[filly3]
!movss xmm0,[fillz2]
!movss xmm1,[fillz3]
!MOV ecx,0
!CALL tracage_lam ;
!MOV edx,[sauvad]
!MOV eax,[sauvpt]
!MOV [edx],eax
!ADD ebx,16
!MOV edx,[fillx1]
!MOV edi,[filly1]
!MOV ebp,[fillx3]
!MOV esi,[filly3]
!MOVss xmm0,[fillz1]
!movss xmm1,[fillz3]
!MOV ecx,1
!CALL tracage_lam
!JMP rempli_lam
!depass01bc_lam:
!MOV edx,[fillx1]
!MOV edi,[filly1]
!MOV ebp,[fillx3]
!MOV esi,[filly3]
!MOVss xmm0,[fillz1]
!movss xmm1,[fillz3]
!MOV ecx,0
!CALL tracage_lam
!ADD ebx,16
!MOV edx,[fillx1]
!MOV edi,[filly1]
!MOV ebp,[fillx2]
!MOV esi,[filly2]
!MOVss xmm0,[fillz1]
!movss xmm1,[fillz2]
!MOV ecx,1
!CALL tracage_lam
!MOV edx,[fillx2]
!MOV edi,[filly2]
!MOV ebp,[fillx3]
!MOV esi,[filly3]
!movss xmm0,[fillz2]
!movss xmm1,[fillz3]
!MOV ecx,1
!CALL tracage_lam
!JMP rempli_lam
!form1_lam:
!CMP eax,ecx
!JG depass01_lam
!CMP eax,edi
!JNG depass01a_lam
!MOV edx,[fillx1]
!MOV edi,[filly1]
!MOV ebp,[fillx3]
!MOV esi,[filly3]
!MOVss xmm0,[fillz1]
!movss xmm1,[fillz3]
!MOV ecx,1
!CALL tracage_lam
!ADD ebx,16
!MOV edx,[fillx1]
!MOV edi,[filly1]
!MOV ebp,[fillx2]
!MOV esi,[filly2]
!MOVss xmm0,[fillz1]
!movss xmm1,[fillz2]
!MOV ecx,1
!CALL tracage_lam
!MOV edx,[fillx2]
!MOV edi,[filly2]
!MOV ebp,[fillx3]
!MOV esi,[filly3]
!movss xmm0,[fillz2]
!movss xmm1,[fillz3]
!MOV ecx,0
!CALL tracage_lam
!JMP rempli_lam
!depass01_lam:
!MOV edx,0
!MOV eax,[fillx1]
!SUB eax,[fillx3]
!MOV edi,[filly3]
!SUB edi,[filly1]
!JE sanscond01a_lam
!SAL eax,16
!DIV edi
!MOV esi,eax
!MOV edx,0
!MOV eax,[fillx2]
!SUB eax,[fillx3]
!MOV edi,[filly3]
!SUB edi,[filly2]
!JE sanscond01a_lam
!SAL eax,16
!DIV edi
!MOV edi,eax
!CMP esi,edi
!JGE depass01b_lam
!sanscond01a_lam:
!MOV edx,[fillx1]
!MOV edi,[filly1]
!MOV ebp,[fillx3]
!MOV esi,[filly3]
!MOVss xmm0,[fillz1]
!movss xmm1,[fillz3]
!MOV ecx,1
!CALL tracage_lam
!ADD ebx,16
!MOV edx,[fillx1]
!MOV edi,[filly1]
!MOV ebp,[fillx2]
!MOV esi,[filly2]
!MOVss xmm0,[fillz1]
!movss xmm1,[fillz2]
!MOV ecx,0
!CALL tracage_lam
!MOV eax,[ebx]
!MOV [sauvad],ebx
!MOV [sauvpt],eax
!MOV edx,[fillx2]
!MOV edi,[filly2]
!MOV ebp,[fillx3]
!MOV esi,[filly3]
!movss xmm0,[fillz2]
!movss xmm1,[fillz3]
!MOV ecx,0
!CALL tracage_lam
!MOV edx,[sauvad]
!MOV eax,[sauvpt]
!MOV [edx],eax
!JMP rempli_lam
!depass01a_lam:
!MOV edx,[fillx1]
!MOV edi,[filly1]
!MOV ebp,[fillx3]
!MOV esi,[filly3]
!MOVss xmm0,[fillz1]
!movss xmm1,[fillz3]
!MOV ecx,0
!CALL tracage_lam
!ADD ebx,16
!MOV edx,[fillx1]
!MOV edi,[filly1]
!MOV ebp,[fillx2]
!MOV esi,[filly2]
!MOVss xmm0,[fillz1]
!movss xmm1,[fillz2]
!MOV ecx,1
!CALL tracage_lam
!MOV edx,[fillx2]
!MOV edi,[filly2]
!MOV ebp,[fillx3]
!MOV esi,[filly3]
!movss xmm0,[fillz2]
!movss xmm1,[fillz3]
!MOV ecx,0
!CALL tracage_lam
!JMP rempli_lam
!depass01b_lam:
!MOV edx,[fillx1]
!MOV edi,[filly1]
!MOV ebp,[fillx2]
!MOV esi,[filly2]
!MOVss xmm0,[fillz1]
!movss xmm1,[fillz2]
!MOV ecx,1
!CALL tracage_lam
!MOV edx,[fillx2]
!MOV edi,[filly2]
!MOV ebp,[fillx3]
!MOV esi,[filly3]
!movss xmm0,[fillz2]
!movss xmm1,[fillz3]
!MOV ecx,1
!CALL tracage_lam
!ADD ebx,16
!MOV edx,[fillx1]
!MOV edi,[filly1]
!MOV ebp,[fillx3]
!MOV esi,[filly3]
!MOVss xmm0,[fillz1]
!movss xmm1,[fillz3]
!MOV ecx,0
!CALL tracage_lam
!JMP rempli_lam
!tracage_lam: ;-- mise en memoire des coordonees "x" , "x1" et "z","z1"----------------
!SUBss xmm1,xmm0
!mov dword[pointx],1
!mov eax,edx
!SUB ebp,edx
!JNS positifx_lam
!NEG ebp
!NEG dword[pointx]
!positifx_lam:
!SUB esi,edi
!CMP ebp,esi
!JNL zone1_a_lam
!XCHG ebp,esi
!zone2_lam:
!MOV ecx,ebp
!MOV edx,ebp
!SAR edx,1
!INC ecx
!cVTSI2SS xmm2,ecx
!divss xmm1,xmm2
!dezo2_lam:
!MOV [ebx],eax
!MOV [ebx+4],edi
!MOVss [ebx+8],xmm0
!ADDss xmm0,xmm1
!ADD ebx,16
!ADD edi,1;[largecr]
!SUB edx,esi
!JGE depzo2_lam
!ADD eax,dword[pointx];eax
!ADD edx,ebp
!depzo2_lam:
!LOOP dezo2_lam
!SUB ebx,16
!RET
!zone1_a_lam:
!CMP ecx,[sens]
!JE zone1a_lam
!zone1_lam:
!MOV ecx,ebp
!MOV edx,ebp
!SAR edx,1
!INC ecx
!cVTSI2SS xmm2,ecx
!divss xmm1,xmm2
!dezo1_lam:
!ADDss xmm0,xmm1
!SUB edx,esi
!JGE depzo1_lam
!MOV [ebx],eax
!MOV [ebx+4],edi
!MOVss [ebx+8],xmm0
!ADD ebx,16
!ADD edi,1;[largecr]
!ADD edx,ebp
!ADD eax,dword[pointx];eax
!LOOP dezo1_lam
!SUB eax,dword[pointx];eax
!SUB edi,1;[largecr]
!SUB ebx,16
!RET
!depzo1_lam:
!ADD eax,dword[pointx];eax
!LOOP dezo1_lam
!SUB eax,dword[pointx];eax
!MOV [ebx],eax
!MOV [ebx+4],edi
!MOVss [ebx+8],xmm0
!RET
!zone1a_lam:
!MOV ecx,ebp
!MOV edx,ebp
!SAR edx,1
!INC ecx
!cVTSI2SS xmm2,ecx
!divss xmm1,xmm2
!MOV [ebx],eax
!MOV [ebx+4],edi
!MOVss [ebx+8],xmm0
!ADD ebx,16
!dezo1a_lam:
!ADDss xmm0,xmm1
!ADD eax,dword[pointx];eax
!SUB edx,esi
!JGE depzo1a_lam
!ADD edi,1;[largecr]
!MOV [ebx],eax
!MOV [ebx+4],edi
!MOVss [ebx+8],xmm0
!ADD ebx,16
!ADD edx,ebp
!LOOP dezo1a_lam
!SUB ebx,32
!RET
!depzo1a_lam:
!LOOP dezo1a_lam
!SUB ebx,16
!RET
!rempli_lam: ;-- remplissage de la zone --------------------
!LEA ebx,[memzone]
!MOV ebp,[linn]
!MOV [deczon],ebp
!SAL ebp,4
!rempli2_lam:
!MOV ecx,[ebx+ebp]
!MOV edi,[ebx]
!cmp ecx,[largecr]
!jnge depecr
!mov ecx,[largecr]
!depecr:
!cmp edi,0
!jnle depecr1
!mov edi,0
!depecr1:
!MOV eax,[ebx+4]
!SUB ecx,edi
!Jnge rempli2a_lam
!MOVss xmm0,[ebx+8]
!MOVss xmm1,[ebx+ebp+8]
!subss xmm1,xmm0
!INC ecx
!cVTSI2SS xmm2,ecx
!DIVss xmm1,xmm2
!rempzo_lam:
!cmp eax,[hautecr]
!jnge depecr2
!mov eax,[hautecr]
!jmp paspoint_lam
!depecr2:
!cmp eax,0
!jnle depecr3
!mov eax,0
!jmp paspoint_lam
!depecr3:
!cmp edi,[largecr]
!jnge depecr4
!mov edi,[largecr]
!jmp paspoint_lam
!depecr4:
!cmp edi,0
!jnle depecr5
!mov edi,0
!jmp paspoint_lam
!depecr5:
!mov dword[v_y],eax
!mov dword[v_x],edi
!push edi
!push eax
!sal edi,2
!imul eax,4096
!add eax,edi
!lea esi,[zbuffer]
!add esi,eax
!comiss xmm0,[esi]
!ja affi1
!movss [esi],xmm0
!pushad
Plot (x,y,color) ;************* une ligne en basic, pour que ce soit plus claire *****************
!popad
!affi1:
!pop eax
!pop edi
!paspoint_lam:
!addss xmm0,xmm1
!ADD edi,1
!dec ecx
!jne rempzo_lam
!ADD ebx,16
!DEC dword[deczon]
!Jnle rempli2_lam
!rempli2a_lam:
!popad
Return
clear_zbuffer: ;-- cls zbuffer-----
!eraz_zbuffer:
!push esi
!push ecx
!lea esi,[zbuffer]
!mov ecx,786432
!eraz:
!mov dword[esi],-100000
!add esi,4
!loop eraz
!pop ecx
!pop esi
Return
!section '.data' align 16
!fillx1:
!dd 0
!filly1:
!dd 0
!fillz1:
!dd 0
!fillx2:
!dd 0
!filly2:
!dd 0
!fillz2:
!dd 0
!fillx3:
!dd 0
!filly3:
!dd 0
!fillz3:
!dd 0
!largecr:
!dd 1023
!hautecr:
!dd 767
!linn:
!dd 0
!pointx:
!dd 0
!af:
!dd 0
!sauvad:
!dd 0
!sauvpt:
!dd 0
!sens:
!dd 0
!madzbuffer:
!dd 0
!deczon:
!dd 0
!moins1:
! dd -1.0
!memzone:
!rd 40000
!section '.data' align 16
!zbuffer:
!rd 786432