Guest User

Untitled

a guest
Jul 16th, 2018
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.54 KB | None | 0 0
  1. procedure TriangleFLATZ(theX1,theY1,theZ1,theX2,theY2,theZ2,theX3,theY3,theZ3:single;color:dword;where:gfxImage);
  2. var
  3. X1,X2,X3,Y1,Y2,Y3,Z1,Z2,Z3:longint;
  4.  
  5. DX12,DX23,DX31,DY12,DY23,DY31:longint;
  6. FDX12,FDX23,FDX31,FDY12,FDY23,FDY31:longint;
  7.  
  8. minx,maxx,miny,maxy:longint;
  9.  
  10. C1,C2,C3:longint;
  11.  
  12. CX1,CX2,CX3,CY1,CY2,CY3:longint;
  13.  
  14. a,b,c,D:longint;
  15. Z:longint;
  16. initialZ:Longint;
  17. ddx,ddy:Longint;
  18.  
  19. x,y:longint;
  20.  
  21. my16:Longint;
  22. begin
  23. asm
  24. mov eax,16
  25. mov my16,eax
  26. // Y1:= round(16.0 * v1.y);
  27. finit
  28. fild my16
  29. fld theY1
  30. fmul st,st(1)
  31. fistp Y1
  32. // Y2:= round(16.0 * v2.y);
  33. fld theY2
  34. fmul st,st(1)
  35. fistp Y2
  36. // Y3:= round(16.0 * v3.y);
  37. fld theY3
  38. fmul st,st(1)
  39. fistp Y3
  40. // X1:= round(16.0 * v1.x);
  41. fld theX1
  42. fmul st,st(1)
  43. fistp X1
  44. // X2:= round(16.0 * v2.x);
  45. fld theX2
  46. fmul st,st(1)
  47. fistp X2
  48. // X3:= round(16.0 * v3.x);
  49. fld theX3
  50. fmul st,st(1)
  51. fistp X3
  52. // Z1:= round(16.0 * v1.z);
  53. fld theZ1
  54. fmul st,st(1)
  55. fistp Z1
  56. //Z2:= round(16.0 * v2.z);
  57. fld theZ2
  58. fmul st,st(1)
  59. fistp Z2
  60. // Z3:= round(16.0 * v3.z);
  61. fld theZ3
  62. fmul st,st(1)
  63. fistp Z3
  64. fstp st
  65.  
  66. // a:= ((y2 - y1)*(z3 - z1) shr 4) - ((y3 - y1)*(z2 - z1) shr 4);
  67. mov esi,z1
  68. mov edi,y1
  69.  
  70. mov eax,z2
  71. sub eax,esi
  72. mov ebx,y3
  73. sub ebx,edi
  74. imul eax,ebx
  75. shr eax,4
  76.  
  77. mov ebx,z3
  78. sub ebx,esi
  79. mov ecx,y2
  80. sub ecx,edi
  81. imul ebx,ecx
  82. shr ebx,4
  83.  
  84. sub ebx,eax
  85. mov a,ebx
  86.  
  87. // b:= ((x2 - x1)*(z3 - z1) shr 4) - ((x3 - x1)*(z2 - z1) shr 4);
  88. mov edi,x1
  89.  
  90. mov eax,z2
  91. sub eax,esi
  92. mov ebx,x3
  93. sub ebx,edi
  94. imul eax,ebx
  95. shr eax,4
  96.  
  97. mov ebx,z2
  98. sub ebx,esi
  99. mov ecx,x2
  100. sub ecx,edi
  101. imul ebx,ecx
  102. shr ebx,4
  103.  
  104. sub ebx,eax
  105. mov b,ebx
  106.  
  107. // c:= ((x2 - x1)*(y3 - y1) shr 4) - ((x3 - x1)*(y2 - y1) shr 4);
  108. mov esi,y1
  109.  
  110. mov eax,y2
  111. sub eax,esi
  112. mov ebx,x3
  113. sub ebx,edi
  114. imul eax,ebx
  115. shr eax,4
  116.  
  117. mov ebx,y3
  118. sub ebx,esi
  119. mov ecx,x2
  120. sub ecx,edi
  121. imul ebx,ecx
  122. shr ebx,4
  123.  
  124. sub ebx,eax
  125. mov c,ebx
  126.  
  127. // D:= ((-x1*a) + (y1*b) - (z1*c)) shr 4;
  128. imul esi,b
  129.  
  130. mov eax,z1
  131. imul eax,c
  132. sub esi,eax
  133.  
  134. mov eax,x1
  135. neg eax
  136. imul eax,a
  137.  
  138. add eax,esi
  139. shr eax,4
  140. mov d,eax
  141.  
  142.  
  143.  
  144.  
  145. // DX12:= X1 - X2;
  146. // FDX12:= DX12 shl 4;
  147. mov esi,x1
  148. mov edi,x2
  149. mov edx,x3
  150.  
  151. mov eax,esi
  152. sub eax,edi
  153. mov DX12,eax
  154. shl eax,4
  155. mov FDX12,eax
  156. // DX23:= X2 - X3;
  157. // FDX23:= DX23 shl 4;
  158. mov eax,edi
  159. sub eax,edx
  160. mov DX23,eax
  161. shl eax,4
  162. mov FDX23,eax
  163. // DX31:= X3 - X1;
  164. // FDX31:= DX31 shl 4;
  165. sub edx,esi
  166. mov DX31,edx
  167. shl edx,4
  168. mov FDX31,edx
  169.  
  170. // DY12:= Y1 - Y2;
  171. // FDY12:= DY12 shl 4;
  172. mov esi,y1
  173. mov edi,y2
  174. mov edx,y3
  175.  
  176. mov eax,esi
  177. sub eax,edi
  178. mov DY12,eax
  179. shl eax,4
  180. mov FDY12,eax
  181. // DY23:= Y2 - Y3;
  182. // FDY23:= DY23 shl 4;
  183. mov eax,edi
  184. sub eax,edx
  185. mov DY23,eax
  186. shl eax,4
  187. mov FDY23,eax
  188. // DY31:= Y3 - Y1;
  189. // FDY31:= DY31 shl 4;
  190. sub edx,esi
  191. mov DY31,edx
  192. shl edx,4
  193. mov FDY31,edx
  194.  
  195.  
  196.  
  197. // minx:= round(min(x1,min(x2, x3))) shr 4;
  198. mov esi,x1
  199. mov edi,x2
  200. mov edx,x3
  201.  
  202.  
  203. mov eax,esi
  204. mov ebx,edi
  205. mov ecx,edx
  206.  
  207.  
  208. cmp ebx,ecx
  209. jb @l1
  210. mov ebx,ecx
  211. @l1:
  212. cmp eax,ebx
  213. jb @l2
  214. mov eax,ebx
  215. @l2:
  216. shr eax,4
  217. mov minx,eax
  218.  
  219. // maxx:= round(max(x1,max(x2, x3))) shr 4;
  220. mov eax,esi
  221. mov ebx,edi
  222. mov ecx,edx
  223.  
  224. cmp ebx,ecx
  225. ja @l3
  226. mov ebx,ecx
  227. @l3:
  228. cmp eax,ebx
  229. ja @l4
  230. mov eax,ebx
  231. @l4:
  232. shr eax,4
  233. mov maxx,eax
  234.  
  235.  
  236.  
  237. mov esi,y1
  238. mov edi,y2
  239. mov edx,y3
  240.  
  241. // miny:= round(min(y1,min(y2, y3))) shr 4;
  242. mov eax,esi
  243. mov ebx,edi
  244. mov ecx,edx
  245.  
  246. cmp ebx,ecx
  247. jb @l5
  248. mov ebx,ecx
  249. @l5:
  250. cmp eax,ebx
  251. jb @l6
  252. mov eax,ebx
  253. @l6:
  254. shr eax,4
  255. mov miny,eax
  256.  
  257. // maxy:= round(max(y1,max(y2, y3))) shr 4;
  258. mov eax,esi
  259. mov ebx,edi
  260. mov ecx,edx
  261.  
  262. cmp ebx,ecx
  263. ja @l7
  264. mov ebx,ecx
  265. @l7:
  266. cmp eax,ebx
  267. ja @l8
  268. mov eax,ebx
  269. @l8:
  270. shr eax,4
  271. mov maxy,eax
  272.  
  273.  
  274.  
  275. // C1:= DY12 * X1 - DX12 * Y1;
  276. mov eax,DX12
  277. imul eax,esi
  278. mov ebx,DY12
  279. imul ebx,X1
  280. sub ebx,eax
  281. mov C1,ebx
  282. // C2:= DY23 * X2 - DX23 * Y2;
  283. mov eax,DX23
  284. imul eax,edi
  285. mov ebx,DY23
  286. imul ebx,X2
  287. sub ebx,eax
  288. mov C2,ebx
  289. // C3:= DY31 * X3 - DX31 * Y3;
  290. mov eax,DX31
  291. imul eax,edx
  292. mov ebx,DY31
  293. imul ebx,X3
  294. sub ebx,eax
  295. mov C3,ebx
  296.  
  297.  
  298. // if (DY12 < 0) or ((DY12 = 0) and (DX12 > 0)) then inc(C1);
  299. mov eax,DY12
  300. cmp eax,0
  301. jb @l9
  302. mov eax,DY12
  303. cmp eax,0
  304. jne @l10
  305. mov eax,DX12
  306. cmp eax,0
  307. jb @l10
  308. @l9:
  309. inc C1
  310. @l10:
  311.  
  312.  
  313. // if (DY23 < 0) or ((DY23 = 0) and (DX23 > 0)) then inc(C2);
  314. mov eax,DY23
  315. cmp eax,0
  316. jb @l12
  317. mov eax,DY23
  318. cmp eax,0
  319. jne @l11
  320. mov eax,DX23
  321. cmp eax,0
  322. jb @l12
  323. @l11:
  324. inc C2
  325. @l12:
  326.  
  327. // if (DY31 < 0) or ((DY31 = 0) and (DX31 > 0)) then inc(C3);
  328. mov eax,DY31
  329. cmp eax,0
  330. jb @l14
  331. mov eax,DY31
  332. cmp eax,0
  333. jne @l13
  334. mov eax,DX31
  335. cmp eax,0
  336. jb @l14
  337. @l13:
  338. inc C3
  339. @l14:
  340.  
  341.  
  342.  
  343.  
  344.  
  345. // CY1:= C1 + DX12 * (miny shl 4) - DY12 * (minx shl 4);
  346. mov esi,miny
  347. shl esi,4
  348. mov edi,minx
  349. shl edi,4
  350.  
  351. mov eax,DX12
  352. imul eax,esi
  353. mov ebx,DY12
  354. imul ebx,edi
  355. sub eax,ebx
  356. add eax,C1
  357. mov CY1,eax
  358. // CY2:= C2 + DX23 * (miny shl 4) - DY23 * (minx shl 4);
  359. mov eax,DX23
  360. imul eax,esi
  361. mov ebx,DY23
  362. imul ebx,edi
  363. sub eax,ebx
  364. add eax,C2
  365. mov CY2,eax
  366.  
  367. // CY3:= C3 + DX31 * (miny shl 4) - DY31 * (minx shl 4);
  368. mov eax,DX31
  369. imul eax,esi
  370. mov ebx,DY31
  371. imul ebx,edi
  372. sub eax,ebx
  373. add eax,C3
  374. mov CY3,eax
  375.  
  376. // if (c shr 4) = 0 then exit;
  377.  
  378. mov eax,c
  379. shr eax,4
  380. cmp eax,0
  381. jne @ok
  382. jmp @q
  383. @ok:
  384.  
  385. // initialZ:= (((A * -(minx)) shr 4 + ((B * -(miny)) shr 4 -D)) div (C shr 4));
  386.  
  387.  
  388.  
  389. mov eax,minx
  390. neg eax
  391. imul eax,A
  392. shr eax,4
  393.  
  394. mov ebx,miny
  395. neg ebx
  396. imul ebx,B
  397. shr ebx,4
  398. sub ebx,D
  399. add eax,ebx
  400.  
  401. mov ebx,C
  402. shr ebx,4
  403. cdq
  404. idiv ebx
  405.  
  406. mov initialZ,eax
  407.  
  408.  
  409.  
  410. // ddx:= ((-A) div (C shr 4));
  411.  
  412. mov eax,A
  413. neg eax
  414. cdq
  415. idiv ebx
  416. mov ddx,eax
  417.  
  418. // ddy:= ((-B) div (C shr 4));
  419. mov eax,B
  420. neg eax
  421. cdq
  422. idiv ebx
  423. mov ddy,eax
  424.  
  425. // for y:= miny to maxy do begin
  426.  
  427. mov eax,miny
  428. mov y,eax
  429. @YLoop:
  430.  
  431. // CX1:=CY1;
  432. mov eax,CY1
  433. mov CX1,eax
  434. // CX2:=CY2;
  435. mov eax,CY2
  436. mov CX2,eax
  437. //CX3:=CY3;
  438. mov eax,CY3
  439. mov CX3,eax
  440.  
  441. //Z:=initialZ;
  442. mov eax,initialZ
  443. mov Z,eax
  444.  
  445. // for x:=minx to maxx do begin
  446. mov eax,minx
  447. mov x,eax
  448. @XLoop:
  449.  
  450.  
  451. // if (CX1 > 0) and (CX2 > 0) and (CX3 > 0) then begin
  452. mov eax,CX1
  453. cmp eax,0
  454. jle @SkipPixel
  455. mov eax,CX2
  456. cmp eax,0
  457. jle @SkipPixel
  458. mov eax,CX3
  459. cmp eax,0
  460. jle @SkipPixel
  461.  
  462.  
  463. // Z:=Z+ddx;
  464.  
  465. mov edx,z
  466. add edx,ddx
  467. mov z,edx
  468. // tempZ:=z-(zAddValue shl 4);
  469. mov eax,zAddValue
  470. shl eax,4
  471. sub edx,eax
  472. mov esi,edx // tempZ
  473. // if tempZ < getL(zbuffer+(y * xscale + x) shl 2) then begin
  474.  
  475. // PutPixel32(x, y, color, where);
  476.  
  477. mov eax,x
  478. mov edx,y
  479. mov ecx,color
  480.  
  481. imul edx,where.width
  482. add edx,eax
  483. shl edx,2
  484.  
  485. mov edi,edx
  486.  
  487. add edi,zBuffer
  488. mov eax,esi // tempZ
  489. cmp eax,[edi]
  490. jle @SkipPixel
  491.  
  492. mov [edi],eax
  493.  
  494. add edx,where.data
  495. mov [edx],ecx
  496. @SkipPixel:
  497.  
  498. // putL(zbuffer+(y*xscale + x) shl 2,tempZ);
  499. //end;
  500.  
  501. // CX1:=CX1-FDY12;
  502. mov eax,CX1
  503. sub eax,FDY12
  504. mov CX1,eax
  505. // CX2:=CX2-FDY23;
  506. mov eax,CX2
  507. sub eax,FDY23
  508. mov CX2,eax
  509. // CX3:=CX3-FDY31;
  510. mov eax,CX3
  511. sub eax,FDY31
  512. mov CX3,eax
  513.  
  514.  
  515. mov eax,x
  516. inc eax
  517. mov x,eax
  518. cmp eax,maxx
  519. jbe @Xloop
  520.  
  521. // initialZ:=initialZ+ddy;
  522. mov eax,initialZ
  523. add eax,ddy
  524. mov initialZ,eax
  525.  
  526. // CY1:=CY1+FDX12;
  527. mov eax,CY1
  528. add eax,FDX12
  529. mov CY1,eax
  530. // CY2:=CY2+FDX23;
  531. mov eax,CY2
  532. add eax,FDX23
  533. mov CY2,eax
  534. // CY3:=CY3+FDX31;
  535. mov eax,CY3
  536. add eax,FDX31
  537. mov CY3,eax
  538.  
  539. inc y
  540. mov eax,y
  541. cmp eax,maxy
  542. jbe @Yloop
  543. @Q:
  544. {$IFDEF PAS_FPC}end ['EAX','EBX','ECX','EDX','ESI','EDI'];{$ELSE}end;{$ENDIF}
  545. end;
Add Comment
Please, Sign In to add comment