Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- procedure TriangleFLATZ(theX1,theY1,theZ1,theX2,theY2,theZ2,theX3,theY3,theZ3:single;color:dword;where:gfxImage);
- var
- X1,X2,X3,Y1,Y2,Y3,Z1,Z2,Z3:longint;
- DX12,DX23,DX31,DY12,DY23,DY31:longint;
- FDX12,FDX23,FDX31,FDY12,FDY23,FDY31:longint;
- minx,maxx,miny,maxy:longint;
- C1,C2,C3:longint;
- CX1,CX2,CX3,CY1,CY2,CY3:longint;
- a,b,c,D:longint;
- Z:longint;
- initialZ:Longint;
- ddx,ddy:Longint;
- x,y:longint;
- my16:Longint;
- begin
- asm
- mov eax,16
- mov my16,eax
- // Y1:= round(16.0 * v1.y);
- finit
- fild my16
- fld theY1
- fmul st,st(1)
- fistp Y1
- // Y2:= round(16.0 * v2.y);
- fld theY2
- fmul st,st(1)
- fistp Y2
- // Y3:= round(16.0 * v3.y);
- fld theY3
- fmul st,st(1)
- fistp Y3
- // X1:= round(16.0 * v1.x);
- fld theX1
- fmul st,st(1)
- fistp X1
- // X2:= round(16.0 * v2.x);
- fld theX2
- fmul st,st(1)
- fistp X2
- // X3:= round(16.0 * v3.x);
- fld theX3
- fmul st,st(1)
- fistp X3
- // Z1:= round(16.0 * v1.z);
- fld theZ1
- fmul st,st(1)
- fistp Z1
- //Z2:= round(16.0 * v2.z);
- fld theZ2
- fmul st,st(1)
- fistp Z2
- // Z3:= round(16.0 * v3.z);
- fld theZ3
- fmul st,st(1)
- fistp Z3
- fstp st
- // a:= ((y2 - y1)*(z3 - z1) shr 4) - ((y3 - y1)*(z2 - z1) shr 4);
- mov esi,z1
- mov edi,y1
- mov eax,z2
- sub eax,esi
- mov ebx,y3
- sub ebx,edi
- imul eax,ebx
- shr eax,4
- mov ebx,z3
- sub ebx,esi
- mov ecx,y2
- sub ecx,edi
- imul ebx,ecx
- shr ebx,4
- sub ebx,eax
- mov a,ebx
- // b:= ((x2 - x1)*(z3 - z1) shr 4) - ((x3 - x1)*(z2 - z1) shr 4);
- mov edi,x1
- mov eax,z2
- sub eax,esi
- mov ebx,x3
- sub ebx,edi
- imul eax,ebx
- shr eax,4
- mov ebx,z2
- sub ebx,esi
- mov ecx,x2
- sub ecx,edi
- imul ebx,ecx
- shr ebx,4
- sub ebx,eax
- mov b,ebx
- // c:= ((x2 - x1)*(y3 - y1) shr 4) - ((x3 - x1)*(y2 - y1) shr 4);
- mov esi,y1
- mov eax,y2
- sub eax,esi
- mov ebx,x3
- sub ebx,edi
- imul eax,ebx
- shr eax,4
- mov ebx,y3
- sub ebx,esi
- mov ecx,x2
- sub ecx,edi
- imul ebx,ecx
- shr ebx,4
- sub ebx,eax
- mov c,ebx
- // D:= ((-x1*a) + (y1*b) - (z1*c)) shr 4;
- imul esi,b
- mov eax,z1
- imul eax,c
- sub esi,eax
- mov eax,x1
- neg eax
- imul eax,a
- add eax,esi
- shr eax,4
- mov d,eax
- // DX12:= X1 - X2;
- // FDX12:= DX12 shl 4;
- mov esi,x1
- mov edi,x2
- mov edx,x3
- mov eax,esi
- sub eax,edi
- mov DX12,eax
- shl eax,4
- mov FDX12,eax
- // DX23:= X2 - X3;
- // FDX23:= DX23 shl 4;
- mov eax,edi
- sub eax,edx
- mov DX23,eax
- shl eax,4
- mov FDX23,eax
- // DX31:= X3 - X1;
- // FDX31:= DX31 shl 4;
- sub edx,esi
- mov DX31,edx
- shl edx,4
- mov FDX31,edx
- // DY12:= Y1 - Y2;
- // FDY12:= DY12 shl 4;
- mov esi,y1
- mov edi,y2
- mov edx,y3
- mov eax,esi
- sub eax,edi
- mov DY12,eax
- shl eax,4
- mov FDY12,eax
- // DY23:= Y2 - Y3;
- // FDY23:= DY23 shl 4;
- mov eax,edi
- sub eax,edx
- mov DY23,eax
- shl eax,4
- mov FDY23,eax
- // DY31:= Y3 - Y1;
- // FDY31:= DY31 shl 4;
- sub edx,esi
- mov DY31,edx
- shl edx,4
- mov FDY31,edx
- // minx:= round(min(x1,min(x2, x3))) shr 4;
- mov esi,x1
- mov edi,x2
- mov edx,x3
- mov eax,esi
- mov ebx,edi
- mov ecx,edx
- cmp ebx,ecx
- jb @l1
- mov ebx,ecx
- @l1:
- cmp eax,ebx
- jb @l2
- mov eax,ebx
- @l2:
- shr eax,4
- mov minx,eax
- // maxx:= round(max(x1,max(x2, x3))) shr 4;
- mov eax,esi
- mov ebx,edi
- mov ecx,edx
- cmp ebx,ecx
- ja @l3
- mov ebx,ecx
- @l3:
- cmp eax,ebx
- ja @l4
- mov eax,ebx
- @l4:
- shr eax,4
- mov maxx,eax
- mov esi,y1
- mov edi,y2
- mov edx,y3
- // miny:= round(min(y1,min(y2, y3))) shr 4;
- mov eax,esi
- mov ebx,edi
- mov ecx,edx
- cmp ebx,ecx
- jb @l5
- mov ebx,ecx
- @l5:
- cmp eax,ebx
- jb @l6
- mov eax,ebx
- @l6:
- shr eax,4
- mov miny,eax
- // maxy:= round(max(y1,max(y2, y3))) shr 4;
- mov eax,esi
- mov ebx,edi
- mov ecx,edx
- cmp ebx,ecx
- ja @l7
- mov ebx,ecx
- @l7:
- cmp eax,ebx
- ja @l8
- mov eax,ebx
- @l8:
- shr eax,4
- mov maxy,eax
- // C1:= DY12 * X1 - DX12 * Y1;
- mov eax,DX12
- imul eax,esi
- mov ebx,DY12
- imul ebx,X1
- sub ebx,eax
- mov C1,ebx
- // C2:= DY23 * X2 - DX23 * Y2;
- mov eax,DX23
- imul eax,edi
- mov ebx,DY23
- imul ebx,X2
- sub ebx,eax
- mov C2,ebx
- // C3:= DY31 * X3 - DX31 * Y3;
- mov eax,DX31
- imul eax,edx
- mov ebx,DY31
- imul ebx,X3
- sub ebx,eax
- mov C3,ebx
- // if (DY12 < 0) or ((DY12 = 0) and (DX12 > 0)) then inc(C1);
- mov eax,DY12
- cmp eax,0
- jb @l9
- mov eax,DY12
- cmp eax,0
- jne @l10
- mov eax,DX12
- cmp eax,0
- jb @l10
- @l9:
- inc C1
- @l10:
- // if (DY23 < 0) or ((DY23 = 0) and (DX23 > 0)) then inc(C2);
- mov eax,DY23
- cmp eax,0
- jb @l12
- mov eax,DY23
- cmp eax,0
- jne @l11
- mov eax,DX23
- cmp eax,0
- jb @l12
- @l11:
- inc C2
- @l12:
- // if (DY31 < 0) or ((DY31 = 0) and (DX31 > 0)) then inc(C3);
- mov eax,DY31
- cmp eax,0
- jb @l14
- mov eax,DY31
- cmp eax,0
- jne @l13
- mov eax,DX31
- cmp eax,0
- jb @l14
- @l13:
- inc C3
- @l14:
- // CY1:= C1 + DX12 * (miny shl 4) - DY12 * (minx shl 4);
- mov esi,miny
- shl esi,4
- mov edi,minx
- shl edi,4
- mov eax,DX12
- imul eax,esi
- mov ebx,DY12
- imul ebx,edi
- sub eax,ebx
- add eax,C1
- mov CY1,eax
- // CY2:= C2 + DX23 * (miny shl 4) - DY23 * (minx shl 4);
- mov eax,DX23
- imul eax,esi
- mov ebx,DY23
- imul ebx,edi
- sub eax,ebx
- add eax,C2
- mov CY2,eax
- // CY3:= C3 + DX31 * (miny shl 4) - DY31 * (minx shl 4);
- mov eax,DX31
- imul eax,esi
- mov ebx,DY31
- imul ebx,edi
- sub eax,ebx
- add eax,C3
- mov CY3,eax
- // if (c shr 4) = 0 then exit;
- mov eax,c
- shr eax,4
- cmp eax,0
- jne @ok
- jmp @q
- @ok:
- // initialZ:= (((A * -(minx)) shr 4 + ((B * -(miny)) shr 4 -D)) div (C shr 4));
- mov eax,minx
- neg eax
- imul eax,A
- shr eax,4
- mov ebx,miny
- neg ebx
- imul ebx,B
- shr ebx,4
- sub ebx,D
- add eax,ebx
- mov ebx,C
- shr ebx,4
- cdq
- idiv ebx
- mov initialZ,eax
- // ddx:= ((-A) div (C shr 4));
- mov eax,A
- neg eax
- cdq
- idiv ebx
- mov ddx,eax
- // ddy:= ((-B) div (C shr 4));
- mov eax,B
- neg eax
- cdq
- idiv ebx
- mov ddy,eax
- // for y:= miny to maxy do begin
- mov eax,miny
- mov y,eax
- @YLoop:
- // CX1:=CY1;
- mov eax,CY1
- mov CX1,eax
- // CX2:=CY2;
- mov eax,CY2
- mov CX2,eax
- //CX3:=CY3;
- mov eax,CY3
- mov CX3,eax
- //Z:=initialZ;
- mov eax,initialZ
- mov Z,eax
- // for x:=minx to maxx do begin
- mov eax,minx
- mov x,eax
- @XLoop:
- // if (CX1 > 0) and (CX2 > 0) and (CX3 > 0) then begin
- mov eax,CX1
- cmp eax,0
- jle @SkipPixel
- mov eax,CX2
- cmp eax,0
- jle @SkipPixel
- mov eax,CX3
- cmp eax,0
- jle @SkipPixel
- // Z:=Z+ddx;
- mov edx,z
- add edx,ddx
- mov z,edx
- // tempZ:=z-(zAddValue shl 4);
- mov eax,zAddValue
- shl eax,4
- sub edx,eax
- mov esi,edx // tempZ
- // if tempZ < getL(zbuffer+(y * xscale + x) shl 2) then begin
- // PutPixel32(x, y, color, where);
- mov eax,x
- mov edx,y
- mov ecx,color
- imul edx,where.width
- add edx,eax
- shl edx,2
- mov edi,edx
- add edi,zBuffer
- mov eax,esi // tempZ
- cmp eax,[edi]
- jle @SkipPixel
- mov [edi],eax
- add edx,where.data
- mov [edx],ecx
- @SkipPixel:
- // putL(zbuffer+(y*xscale + x) shl 2,tempZ);
- //end;
- // CX1:=CX1-FDY12;
- mov eax,CX1
- sub eax,FDY12
- mov CX1,eax
- // CX2:=CX2-FDY23;
- mov eax,CX2
- sub eax,FDY23
- mov CX2,eax
- // CX3:=CX3-FDY31;
- mov eax,CX3
- sub eax,FDY31
- mov CX3,eax
- mov eax,x
- inc eax
- mov x,eax
- cmp eax,maxx
- jbe @Xloop
- // initialZ:=initialZ+ddy;
- mov eax,initialZ
- add eax,ddy
- mov initialZ,eax
- // CY1:=CY1+FDX12;
- mov eax,CY1
- add eax,FDX12
- mov CY1,eax
- // CY2:=CY2+FDX23;
- mov eax,CY2
- add eax,FDX23
- mov CY2,eax
- // CY3:=CY3+FDX31;
- mov eax,CY3
- add eax,FDX31
- mov CY3,eax
- inc y
- mov eax,y
- cmp eax,maxy
- jbe @Yloop
- @Q:
- {$IFDEF PAS_FPC}end ['EAX','EBX','ECX','EDX','ESI','EDI'];{$ELSE}end;{$ENDIF}
- end;
Add Comment
Please, Sign In to add comment