procedure Triangle(vA,vB,vC:tV3DVertex;where:gfxImage); var v1,v2,v3:tV3DVertex; color:longint; 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 MakeProjection(vA,v1.X,v1.Y,v1.Z); MakeProjection(vB,v2.X,v2.Y,v2.Z); MakeProjection(vC,v3.X,v3.Y,v3.Z); asm mov eax,16 mov my16,eax // Y1:= round(16.0 * v1.y); finit fild my16 fld v1.y fmul fist Y1 // Y2:= round(16.0 * v2.y); finit fild my16 fld v2.y fmul fist Y2 // Y3:= round(16.0 * v3.y); finit fild my16 fld v3.y fmul fist Y3 // X1:= round(16.0 * v1.x); finit fild my16 fld v1.x fmul fist X1 // X2:= round(16.0 * v2.x); finit fild my16 fld v2.x fmul fist X2 // X3:= round(16.0 * v3.x); finit fild my16 fld v3.x fmul fist X3 // Z1:= round(16.0 * v1.z); finit fild my16 fld v1.z fmul fist Z1 //Z2:= round(16.0 * v2.z); finit fild my16 fld v2.z fmul fist Z2 // Z3:= round(16.0 * v3.z); finit fild my16 fld v3.z fmul fist Z3 // color:=RGB32(vA.r,vA.g,vA.b); mov ah,vA.r mov al,vA.g mov cl,vA.b and eax,$0000ffff shl eax,8 mov al,cl mov color,eax // 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) shr 4 + (y1*b) shr 4 - (z1*c) shr 4; imul esi,b shr esi,4 mov eax,z1 imul eax,c shr eax,4 sub esi,eax mov eax,x1 neg eax imul eax,a shr eax,4 add eax,esi 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 @L1 @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 // jmp @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 @Q1: end; end;