1;
2; d_polysa.asm
3; x86 assembly-language polygon model drawing code
4; this file uses NASM syntax.
5; $Id: d_polysa.asm,v 1.8 2008-03-20 14:07:51 sezero Exp $
6;
7; Copyright (C) 1996-1997  Id Software, Inc.
8; Copyright (C) 1997-1998  Raven Software Corp.
9;
10; This program is free software; you can redistribute it and/or
11; modify it under the terms of the GNU General Public License
12; as published by the Free Software Foundation; either version 2
13; of the License, or (at your option) any later version.
14;
15; This program is distributed in the hope that it will be useful,
16; but WITHOUT ANY WARRANTY; without even the implied warranty of
17; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18;
19; See the GNU General Public License for more details.
20;
21; You should have received a copy of the GNU General Public License
22; along with this program; if not, write to:
23; Free Software Foundation, Inc.
24; 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
25;
26
27%include "asm_nasm.inc"
28%include "d_polysa.inc"
29
30; underscore prefix handling
31; for C-shared symbols:
32%ifmacro _sym_prefix
33; C-shared externs:
34 _sym_prefix d_viewbuffer
35 _sym_prefix d_scantable
36 _sym_prefix r_refdef
37 _sym_prefix a_sstepxfrac
38 _sym_prefix r_affinetridesc
39 _sym_prefix acolormap
40 _sym_prefix d_pcolormap
41 _sym_prefix d_sfrac
42 _sym_prefix d_ptex
43 _sym_prefix d_pedgespanpackage
44 _sym_prefix d_tfrac
45 _sym_prefix d_light
46 _sym_prefix d_zi
47 _sym_prefix d_pdest
48 _sym_prefix d_pz
49 _sym_prefix d_aspancount
50 _sym_prefix erroradjustup
51 _sym_prefix erroradjustdown
52 _sym_prefix errorterm
53 _sym_prefix d_xdenom
54 _sym_prefix r_p0
55 _sym_prefix r_p1
56 _sym_prefix r_p2
57 _sym_prefix a_tstepxfrac
58 _sym_prefix a_ststepxwhole
59 _sym_prefix zspantable
60 _sym_prefix skintable
61 _sym_prefix d_countextrastep
62 _sym_prefix ubasestep
63 _sym_prefix a_spans
64 _sym_prefix d_pdestextrastep
65 _sym_prefix d_pzextrastep
66 _sym_prefix d_sfracextrastep
67 _sym_prefix d_ptexextrastep
68 _sym_prefix d_tfracextrastep
69 _sym_prefix d_lightextrastep
70 _sym_prefix d_ziextrastep
71 _sym_prefix d_pdestbasestep
72 _sym_prefix d_pzbasestep
73 _sym_prefix d_sfracbasestep
74 _sym_prefix d_ptexbasestep
75 _sym_prefix d_tfracbasestep
76 _sym_prefix d_lightbasestep
77 _sym_prefix d_zibasestep
78 _sym_prefix r_lstepx
79 _sym_prefix r_lstepy
80 _sym_prefix r_sstepx
81 _sym_prefix r_sstepy
82 _sym_prefix r_tstepx
83 _sym_prefix r_tstepy
84 _sym_prefix r_zistepx
85 _sym_prefix r_zistepy
86 _sym_prefix D_PolysetSetEdgeTable
87 _sym_prefix D_RasterizeAliasPolySmooth
88; C-shared globals:
89 _sym_prefix D_PolysetCalcGradients
90 _sym_prefix D_PolysetRecursiveTriangle
91 _sym_prefix D_PolysetAff8Start
92 _sym_prefix D_PolysetDrawSpans8
93 _sym_prefix D_PolysetAff8End
94 _sym_prefix D_Aff8Patch
95 _sym_prefix D_PolysetDraw
96 _sym_prefix D_PolysetScanLeftEdge
97 _sym_prefix D_PolysetDrawFinalVerts
98 _sym_prefix D_DrawNonSubdiv
99%endif	; _sym_prefix
100
101; externs from C code
102 extern d_viewbuffer
103 extern d_scantable
104 extern r_refdef
105 extern a_sstepxfrac
106 extern r_affinetridesc
107 extern acolormap
108 extern d_pcolormap
109 extern d_sfrac
110 extern d_ptex
111 extern d_pedgespanpackage
112 extern d_tfrac
113 extern d_light
114 extern d_zi
115 extern d_pdest
116 extern d_pz
117 extern d_aspancount
118 extern erroradjustup
119 extern erroradjustdown
120 extern errorterm
121 extern d_xdenom
122 extern r_p0
123 extern r_p1
124 extern r_p2
125 extern a_tstepxfrac
126 extern a_ststepxwhole
127 extern zspantable
128 extern skintable
129 extern d_countextrastep
130 extern ubasestep
131 extern a_spans
132 extern d_pdestextrastep
133 extern d_pzextrastep
134 extern d_sfracextrastep
135 extern d_ptexextrastep
136 extern d_tfracextrastep
137 extern d_lightextrastep
138 extern d_ziextrastep
139 extern d_pdestbasestep
140 extern d_pzbasestep
141 extern d_sfracbasestep
142 extern d_ptexbasestep
143 extern d_tfracbasestep
144 extern d_lightbasestep
145 extern d_zibasestep
146 extern r_lstepx
147 extern r_lstepy
148 extern r_sstepx
149 extern r_sstepy
150 extern r_tstepx
151 extern r_tstepy
152 extern r_zistepx
153 extern r_zistepy
154 extern D_PolysetSetEdgeTable
155 extern D_RasterizeAliasPolySmooth
156
157; externs from ASM-only code
158 extern float_point5
159 extern float_1
160 extern float_minus_1
161 extern float_0
162 extern advancetable
163 extern sstep
164 extern tstep
165 extern ceil_cw
166 extern single_cw
167
168
169SEGMENT .data
170
171 ALIGN 4
172
173p10_minus_p20 dd 0
174p01_minus_p21 dd 0
175temp0 dd 0
176temp1 dd 0
177Ltemp dd 0
178aff8entryvec_table dd LDraw8, LDraw7, LDraw6, LDraw5
179 dd LDraw4, LDraw3, LDraw2, LDraw1
180lzistepx dd 0
181
182SEGMENT .text
183
184;;;;;;;;;;;;;;;;;;;;;;;;
185; D_PolysetCalcGradients
186;;;;;;;;;;;;;;;;;;;;;;;;
187
188 global D_PolysetCalcGradients
189D_PolysetCalcGradients:
190 fild dword [r_p0+0]
191 fild dword [r_p2+0]
192 fild dword [r_p0+4]
193 fild dword [r_p2+4]
194 fild dword [r_p1+0]
195 fild dword [r_p1+4]
196 fxch st3
197 fsub st0,st2
198 fxch st1
199 fsub st0,st4
200 fxch st5
201 fsubrp st4,st0
202 fxch st2
203 fsubrp st1,st0
204 fxch st1
205 fld dword [d_xdenom]
206 fxch st4
207 fstp dword [p10_minus_p20]
208 fstp dword [p01_minus_p21]
209 fxch st2
210 fild dword [r_p2+16]
211 fild dword [r_p0+16]
212 fild dword [r_p1+16]
213 fxch st2
214 fld st0
215 fsubp st2,st0
216 fsubp st2,st0
217 fld st0
218 fmul st0,st5
219 fxch st2
220 fld st0
221 fmul dword [p01_minus_p21]
222 fxch st2
223 fmul dword [p10_minus_p20]
224 fxch st1
225 fmul st0,st5
226 fxch st2
227 fsubrp st3,st0
228 fsubp st1,st0
229 fld st2
230 fmul dword [float_minus_1]
231 fxch st2
232 fmul st0,st3
233 fxch st1
234 fmul st0,st2
235 fldcw word [ceil_cw]
236 fistp dword [r_lstepy]
237 fistp dword [r_lstepx]
238 fldcw word [single_cw]
239 fild dword [r_p2+8]
240 fild dword [r_p0+8]
241 fild dword [r_p1+8]
242 fxch st2
243 fld st0
244 fsubp st2,st0
245 fsubp st2,st0
246 fld st0
247 fmul st0,st6
248 fxch st2
249 fld st0
250 fmul dword [p01_minus_p21]
251 fxch st2
252 fmul dword [p10_minus_p20]
253 fxch st1
254 fmul st0,st6
255 fxch st2
256 fsubrp st3,st0
257 fsubp st1,st0
258 fmul st0,st2
259 fxch st1
260 fmul st0,st3
261 fxch st1
262 fistp dword [r_sstepy]
263 fistp dword [r_sstepx]
264 fild dword [r_p2+12]
265 fild dword [r_p0+12]
266 fild dword [r_p1+12]
267 fxch st2
268 fld st0
269 fsubp st2,st0
270 fsubp st2,st0
271 fld st0
272 fmul st0,st6
273 fxch st2
274 fld st0
275 fmul dword [p01_minus_p21]
276 fxch st2
277 fmul dword [p10_minus_p20]
278 fxch st1
279 fmul st0,st6
280 fxch st2
281 fsubrp st3,st0
282 fsubp st1,st0
283 fmul st0,st2
284 fxch st1
285 fmul st0,st3
286 fxch st1
287 fistp dword [r_tstepy]
288 fistp dword [r_tstepx]
289 fild dword [r_p2+20]
290 fild dword [r_p0+20]
291 fild dword [r_p1+20]
292 fxch st2
293 fld st0
294 fsubp st2,st0
295 fsubp st2,st0
296 fld st0
297 fmulp st6,st0
298 fxch st1
299 fld st0
300 fmul dword [p01_minus_p21]
301 fxch st2
302 fmul dword [p10_minus_p20]
303 fxch st1
304 fmulp st5,st0
305 fxch st5
306 fsubp st1,st0
307 fxch st3
308 fsubrp st4,st0
309 fxch st1
310 fmulp st2,st0
311 fmulp st2,st0
312 fistp dword [r_zistepx]
313 fistp dword [r_zistepy]
314 mov eax, dword [r_sstepx]
315 mov edx, dword [r_tstepx]
316 shl eax,16
317 shl edx,16
318 mov dword [a_sstepxfrac],eax
319 mov dword [a_tstepxfrac],edx
320 mov ecx, dword [r_sstepx]
321 mov eax, dword [r_tstepx]
322 sar ecx,16
323 sar eax,16
324 imul dword [4+0+esp]
325 add eax,ecx
326 mov dword [a_ststepxwhole],eax
327 ret
328
329
330;;;;;;;;;;;;;;;;;;;;;;;;
331; D_PolysetRecursiveTriangle
332;;;;;;;;;;;;;;;;;;;;;;;;
333
334 global D_PolysetRecursiveTriangle
335D_PolysetRecursiveTriangle:
336 push ebp
337 push esi
338 push edi
339 push ebx
340 mov esi, dword [8+16+esp]
341 mov ebx, dword [4+16+esp]
342 mov edi, dword [12+16+esp]
343 mov eax, dword [0+esi]
344 mov edx, dword [0+ebx]
345 mov ebp, dword [4+esi]
346 sub eax,edx
347 mov ecx, dword [4+ebx]
348 sub ebp,ecx
349 inc eax
350 cmp eax,2
351 ja LSplit
352 mov eax, dword [0+edi]
353 inc ebp
354 cmp ebp,2
355 ja LSplit
356 mov edx, dword [0+esi]
357 mov ebp, dword [4+edi]
358 sub eax,edx
359 mov ecx, dword [4+esi]
360 sub ebp,ecx
361 inc eax
362 cmp eax,2
363 ja LSplit2
364 mov eax, dword [0+ebx]
365 inc ebp
366 cmp ebp,2
367 ja LSplit2
368 mov edx, dword [0+edi]
369 mov ebp, dword [4+ebx]
370 sub eax,edx
371 mov ecx, dword [4+edi]
372 sub ebp,ecx
373 inc eax
374 inc ebp
375 mov edx,ebx
376 cmp eax,2
377 ja LSplit3
378 cmp ebp,2
379 jna near LDone
380LSplit3:
381 mov ebx,edi
382 mov edi,esi
383 mov esi,edx
384 jmp LSplit
385LSplit2:
386 mov eax,ebx
387 mov ebx,esi
388 mov esi,edi
389 mov edi,eax
390LSplit:
391 sub esp,24
392 mov eax, dword [8+ebx]
393 mov edx, dword [8+esi]
394 mov ecx, dword [12+ebx]
395 add eax,edx
396 mov edx, dword [12+esi]
397 sar eax,1
398 add ecx,edx
399 mov dword [8+esp],eax
400 mov eax, dword [20+ebx]
401 sar ecx,1
402 mov edx, dword [20+esi]
403 mov dword [12+esp],ecx
404 add eax,edx
405 mov ecx, dword [0+ebx]
406 mov edx, dword [0+esi]
407 sar eax,1
408 add edx,ecx
409 mov dword [20+esp],eax
410 mov eax, dword [4+ebx]
411 sar edx,1
412 mov ebp, dword [4+esi]
413 mov dword [0+esp],edx
414 add ebp,eax
415 sar ebp,1
416 mov dword [4+esp],ebp
417 cmp dword [4+esi],eax
418 jg LNoDraw
419 mov edx, dword [0+esi]
420 jnz LDraw
421 cmp edx,ecx
422 jl LNoDraw
423LDraw:
424 mov edx, dword [20+esp]
425 mov ecx, dword [4+esp]
426 sar edx,16
427 mov ebp, dword [0+esp]
428 mov eax, dword [zspantable+ecx*4]
429 cmp dx, word [eax+ebp*2]
430 jnge LNoDraw
431 mov word [eax+ebp*2],dx
432 mov eax, dword [12+esp]
433 sar eax,16
434 mov edx, dword [8+esp]
435 sar edx,16
436 sub ecx,ecx
437 mov eax, dword [skintable+eax*4]
438 mov ebp, dword [4+esp]
439 mov cl, byte [eax+edx]
440 mov edx, dword [d_pcolormap]
441 mov dl, byte [edx+ecx]
442 mov ecx, dword [0+esp]
443 mov eax, dword [d_scantable+ebp*4]
444 add ecx,eax
445 mov eax, dword [d_viewbuffer]
446 mov byte [eax+ecx*1],dl
447LNoDraw:
448 push esp
449 push ebx
450 push edi
451 call D_PolysetRecursiveTriangle	; call near D_PolysetRecursiveTriangle
452 mov ebx,esp
453 push esi
454 push ebx
455 push edi
456 call D_PolysetRecursiveTriangle	; call near D_PolysetRecursiveTriangle
457 add esp,24
458LDone:
459 pop ebx
460 pop edi
461 pop esi
462 pop ebp
463 ret 12
464
465
466;;;;;;;;;;;;;;;;;;;;;;;;
467; D_PolysetAff8Start
468;;;;;;;;;;;;;;;;;;;;;;;;
469 global D_PolysetAff8Start
470D_PolysetAff8Start:
471
472;;;;;;;;;;;;;;;;;;;;;;;;
473; D_PolysetDrawSpans8
474;;;;;;;;;;;;;;;;;;;;;;;;
475
476 global D_PolysetDrawSpans8
477D_PolysetDrawSpans8:
478 push esi
479 push ebx
480 mov esi, dword [4+8+esp]
481 mov ecx, dword [r_zistepx]
482 push ebp
483 push edi
484 ror ecx,16
485 mov edx, dword [8+esi]
486 mov dword [lzistepx],ecx
487LSpanLoop:
488 mov eax, dword [d_aspancount]
489 sub eax,edx
490 mov edx, dword [erroradjustup]
491 mov ebx, dword [errorterm]
492 add ebx,edx
493 js LNoTurnover
494 mov edx, dword [erroradjustdown]
495 mov edi, dword [d_countextrastep]
496 sub ebx,edx
497 mov ebp, dword [d_aspancount]
498 mov dword [errorterm],ebx
499 add ebp,edi
500 mov dword [d_aspancount],ebp
501 jmp LRightEdgeStepped
502LNoTurnover:
503 mov edi, dword [d_aspancount]
504 mov edx, dword [ubasestep]
505 mov dword [errorterm],ebx
506 add edi,edx
507 mov dword [d_aspancount],edi
508LRightEdgeStepped:
509 cmp eax,1
510 jl near LNextSpan
511 jz near LExactlyOneLong
512 mov ecx, dword [a_ststepxwhole]
513 mov edx, dword [r_affinetridesc+8]
514 mov dword [advancetable+4],ecx
515 add ecx,edx
516 mov dword [advancetable],ecx
517 mov ecx, dword [a_tstepxfrac]
518 mov cx, word [r_lstepx]
519 mov edx,eax
520 mov dword [tstep],ecx
521 add edx,7
522 shr edx,3
523 mov ebx, dword [16+esi]
524 mov bx,dx
525 mov ecx, dword [4+esi]
526 neg eax
527 mov edi, dword [0+esi]
528 and eax,7
529 sub edi,eax
530 sub ecx,eax
531 sub ecx,eax
532 mov edx, dword [20+esi]
533 mov dx, word [24+esi]
534 mov ebp, dword [28+esi]
535 ror ebp,16
536 push esi
537 mov esi, dword [12+esi]
538 jmp dword[aff8entryvec_table+eax*4]
539LDrawLoop:
540LDraw8:
541 cmp bp, word [ecx]
542 jl Lp1
543 xor eax,eax
544 mov ah,dh
545 mov al, byte [esi]
546 mov word [ecx],bp
547 mov al, byte [12345678h+eax]
548LPatch8:
549 mov byte [edi],al
550Lp1:
551 add edx, dword [tstep]
552 sbb eax,eax
553 add ebp, dword [lzistepx]
554 adc ebp,0
555 add ebx, dword [a_sstepxfrac]
556 adc esi, dword [advancetable+4+eax*4]
557LDraw7:
558 cmp bp, word [2+ecx]
559 jl Lp2
560 xor eax,eax
561 mov ah,dh
562 mov al, byte [esi]
563 mov word [2+ecx],bp
564 mov al, byte [12345678h+eax]
565LPatch7:
566 mov byte [1+edi],al
567Lp2:
568 add edx, dword [tstep]
569 sbb eax,eax
570 add ebp, dword [lzistepx]
571 adc ebp,0
572 add ebx, dword [a_sstepxfrac]
573 adc esi, dword [advancetable+4+eax*4]
574LDraw6:
575 cmp bp, word [4+ecx]
576 jl Lp3
577 xor eax,eax
578 mov ah,dh
579 mov al, byte [esi]
580 mov word [4+ecx],bp
581 mov al, byte [12345678h+eax]
582LPatch6:
583 mov byte [2+edi],al
584Lp3:
585 add edx, dword [tstep]
586 sbb eax,eax
587 add ebp, dword [lzistepx]
588 adc ebp,0
589 add ebx, dword [a_sstepxfrac]
590 adc esi, dword [advancetable+4+eax*4]
591LDraw5:
592 cmp bp, word [6+ecx]
593 jl Lp4
594 xor eax,eax
595 mov ah,dh
596 mov al, byte [esi]
597 mov word [6+ecx],bp
598 mov al, byte [12345678h+eax]
599LPatch5:
600 mov byte [3+edi],al
601Lp4:
602 add edx, dword [tstep]
603 sbb eax,eax
604 add ebp, dword [lzistepx]
605 adc ebp,0
606 add ebx, dword [a_sstepxfrac]
607 adc esi, dword [advancetable+4+eax*4]
608LDraw4:
609 cmp bp, word [8+ecx]
610 jl Lp5
611 xor eax,eax
612 mov ah,dh
613 mov al, byte [esi]
614 mov word [8+ecx],bp
615 mov al, byte [12345678h+eax]
616LPatch4:
617 mov byte [4+edi],al
618Lp5:
619 add edx, dword [tstep]
620 sbb eax,eax
621 add ebp, dword [lzistepx]
622 adc ebp,0
623 add ebx, dword [a_sstepxfrac]
624 adc esi, dword [advancetable+4+eax*4]
625LDraw3:
626 cmp bp, word [10+ecx]
627 jl Lp6
628 xor eax,eax
629 mov ah,dh
630 mov al, byte [esi]
631 mov word [10+ecx],bp
632 mov al, byte [12345678h+eax]
633LPatch3:
634 mov byte [5+edi],al
635Lp6:
636 add edx, dword [tstep]
637 sbb eax,eax
638 add ebp, dword [lzistepx]
639 adc ebp,0
640 add ebx, dword [a_sstepxfrac]
641 adc esi, dword [advancetable+4+eax*4]
642LDraw2:
643 cmp bp, word [12+ecx]
644 jl Lp7
645 xor eax,eax
646 mov ah,dh
647 mov al, byte [esi]
648 mov word [12+ecx],bp
649 mov al, byte [12345678h+eax]
650LPatch2:
651 mov byte [6+edi],al
652Lp7:
653 add edx, dword [tstep]
654 sbb eax,eax
655 add ebp, dword [lzistepx]
656 adc ebp,0
657 add ebx, dword [a_sstepxfrac]
658 adc esi, dword [advancetable+4+eax*4]
659LDraw1:
660 cmp bp, word [14+ecx]
661 jl Lp8
662 xor eax,eax
663 mov ah,dh
664 mov al, byte [esi]
665 mov word [14+ecx],bp
666 mov al, byte [12345678h+eax]
667LPatch1:
668 mov byte [7+edi],al
669Lp8:
670 add edx, dword [tstep]
671 sbb eax,eax
672 add ebp, dword [lzistepx]
673 adc ebp,0
674 add ebx, dword [a_sstepxfrac]
675 adc esi, dword [advancetable+4+eax*4]
676 add edi,8
677 add ecx,16
678 dec bx
679 jnz near LDrawLoop
680 pop esi
681LNextSpan:
682 add esi,32
683LNextSpanESISet:
684 mov edx, dword [8+esi]
685 cmp edx,offset -999999
686 jnz near LSpanLoop
687 pop edi
688 pop ebp
689 pop ebx
690 pop esi
691 ret
692LExactlyOneLong:
693 mov ecx, dword [4+esi]
694 mov ebp, dword [28+esi]
695 ror ebp,16
696 mov ebx, dword [12+esi]
697 cmp bp, word [ecx]
698 jl LNextSpan
699 xor eax,eax
700 mov edi, dword [0+esi]
701 mov ah, byte [24+1+esi]
702 add esi,32
703 mov al, byte [ebx]
704 mov word [ecx],bp
705 mov al, byte [12345678h+eax]
706LPatch9:
707 mov byte [edi],al
708 jmp LNextSpanESISet
709
710
711;;;;;;;;;;;;;;;;;;;;;;;;
712; D_PolysetAff8End
713;;;;;;;;;;;;;;;;;;;;;;;;
714 global D_PolysetAff8End
715D_PolysetAff8End:
716
717;;;;;;;;;;;;;;;;;;;;;;;;
718; D_Aff8Patch
719;;;;;;;;;;;;;;;;;;;;;;;;
720 global D_Aff8Patch
721D_Aff8Patch:
722 mov eax, dword [4+esp]
723 mov dword [LPatch1-4],eax
724 mov dword [LPatch2-4],eax
725 mov dword [LPatch3-4],eax
726 mov dword [LPatch4-4],eax
727 mov dword [LPatch5-4],eax
728 mov dword [LPatch6-4],eax
729 mov dword [LPatch7-4],eax
730 mov dword [LPatch8-4],eax
731 mov dword [LPatch9-4],eax
732 ret
733
734;;;;;;;;;;;;;;;;;;;;;;;;
735; D_PolysetDraw
736;;;;;;;;;;;;;;;;;;;;;;;;
737
738 global D_PolysetDraw
739D_PolysetDraw:
740 sub esp,offset SPAN_SIZE
741 mov eax,esp
742 add eax,32 - 1
743 and eax,offset ~(32 - 1)
744 mov dword [a_spans],eax
745 mov eax, dword [r_affinetridesc+28]
746 test eax,eax
747 jz near D_DrawNonSubdiv
748;push ebp
749;mov ebp, dword [r_affinetridesc+24]
750 push esi
751;shl ebp,4
752 push ebx
753 mov ebx, dword [r_affinetridesc+16]
754 push edi
755 mov edi, dword [r_affinetridesc+20]
756Llooptop:
757 xor ecx,ecx
758 xor esi,esi
759 mov cx,word[4+0+ebx]
760 mov si,word[4+2+ebx]
761 xor edx,edx
762 mov dx,word[4+4+ebx]
763 shl ecx,5
764 add ecx,edi
765 shl esi,5
766 shl edx,5
767 add esi,edi
768 add edx,edi
769 fild dword [0+4+ecx]
770 fild dword [0+4+esi]
771 fild dword [0+0+ecx]
772 fild dword [0+0+edx]
773 fxch st2
774 fsubr st0,st3
775 fild dword [0+0+esi]
776 fxch st2
777 fsubr st3,st0
778 fild dword [0+4+edx]
779 fxch st1
780 fsubrp st3,st0
781 fxch st1
782 fmulp st3,st0
783 fsubp st3,st0
784 mov eax, dword [0+16+ecx]
785 and eax,0FF00h
786 fmulp st2,st0
787 add eax, dword [acolormap]
788 fsubrp st1,st0
789 mov dword [d_pcolormap],eax
790 fstp dword [Ltemp]
791 mov eax, dword [Ltemp]
792 sub eax,080000001h
793 jc Lskip
794 mov eax, dword [0+ebx]
795 test eax,eax
796 jz Lfacesback
797 push edx
798 push esi
799 push ecx
800 call D_PolysetRecursiveTriangle	; call near D_PolysetRecursiveTriangle
801;sub ebp,16
802;jnz Llooptop
803 jmp Ldone2
804Lfacesback:
805 mov eax, dword [0+8+ecx]
806 push eax
807 mov eax, dword [0+8+esi]
808 push eax
809 mov eax, dword [0+8+edx]
810 push eax
811 push ecx
812 push edx
813 mov eax, dword [r_affinetridesc+32]
814 test dword [24+ecx],00020h
815 jz Lp11
816 add dword [0+8+ecx],eax
817Lp11:
818 test dword [24+esi],00020h
819 jz Lp12
820 add dword [0+8+esi],eax
821Lp12:
822 test dword [24+edx],00020h
823 jz Lp13
824 add dword [0+8+edx],eax
825Lp13:
826 push edx
827 push esi
828 push ecx
829 call D_PolysetRecursiveTriangle	; call near D_PolysetRecursiveTriangle
830 pop edx
831 pop ecx
832 pop eax
833 mov dword [0+8+edx],eax
834 pop eax
835 mov dword [0+8+esi],eax
836 pop eax
837 mov dword [0+8+ecx],eax
838Lskip:
839;sub ebp,16
840;jnz Llooptop
841Ldone2:
842 pop edi
843 pop ebx
844 pop esi
845;pop ebp
846 add esp,offset SPAN_SIZE
847 ret
848
849
850;;;;;;;;;;;;;;;;;;;;;;;;
851; D_PolysetScanLeftEdge
852;;;;;;;;;;;;;;;;;;;;;;;;
853
854 global D_PolysetScanLeftEdge
855D_PolysetScanLeftEdge:
856 push ebp
857 push esi
858 push edi
859 push ebx
860 mov eax, dword [4+16+esp]
861 mov ecx, dword [d_sfrac]
862 and eax,0FFFFh
863 mov ebx, dword [d_ptex]
864 or ecx,eax
865 mov esi, dword [d_pedgespanpackage]
866 mov edx, dword [d_tfrac]
867 mov edi, dword [d_light]
868 mov ebp, dword [d_zi]
869LScanLoop:
870 mov dword [12+esi],ebx
871 mov eax, dword [d_pdest]
872 mov dword [0+esi],eax
873 mov eax, dword [d_pz]
874 mov dword [4+esi],eax
875 mov eax, dword [d_aspancount]
876 mov dword [8+esi],eax
877 mov dword [24+esi],edi
878 mov dword [28+esi],ebp
879 mov dword [16+esi],ecx
880 mov dword [20+esi],edx
881 mov al, byte [32+esi]
882 add esi,32
883 mov eax, dword [erroradjustup]
884 mov dword [d_pedgespanpackage],esi
885 mov esi, dword [errorterm]
886 add esi,eax
887 mov eax, dword [d_pdest]
888 js near LNoLeftEdgeTurnover
889 sub esi, dword [erroradjustdown]
890 add eax, dword [d_pdestextrastep]
891 mov dword [errorterm],esi
892 mov dword [d_pdest],eax
893 mov eax, dword [d_pz]
894 mov esi, dword [d_aspancount]
895 add eax, dword [d_pzextrastep]
896 add ecx, dword [d_sfracextrastep]
897 adc ebx, dword [d_ptexextrastep]
898 add esi, dword [d_countextrastep]
899 mov dword [d_pz],eax
900 mov eax, dword [d_tfracextrastep]
901 mov dword [d_aspancount],esi
902 add edx,eax
903 jnc LSkip1
904 add ebx, dword [r_affinetridesc+8]
905LSkip1:
906 add edi, dword [d_lightextrastep]
907 add ebp, dword [d_ziextrastep]
908 mov esi, dword [d_pedgespanpackage]
909 dec ecx
910 test ecx,0FFFFh
911 jnz near LScanLoop
912 pop ebx
913 pop edi
914 pop esi
915 pop ebp
916 ret
917LNoLeftEdgeTurnover:
918 mov dword [errorterm],esi
919 add eax, dword [d_pdestbasestep]
920 mov dword [d_pdest],eax
921 mov eax, dword [d_pz]
922 mov esi, dword [d_aspancount]
923 add eax, dword [d_pzbasestep]
924 add ecx, dword [d_sfracbasestep]
925 adc ebx, dword [d_ptexbasestep]
926 add esi, dword [ubasestep]
927 mov dword [d_pz],eax
928 mov dword [d_aspancount],esi
929 mov esi, dword [d_tfracbasestep]
930 add edx,esi
931 jnc LSkip2
932 add ebx, dword [r_affinetridesc+8]
933LSkip2:
934 add edi, dword [d_lightbasestep]
935 add ebp, dword [d_zibasestep]
936 mov esi, dword [d_pedgespanpackage]
937 dec ecx
938 test ecx,0FFFFh
939 jnz near LScanLoop
940 pop ebx
941 pop edi
942 pop esi
943 pop ebp
944 ret
945
946
947;;;;;;;;;;;;;;;;;;;;;;;;
948; D_PolysetDrawFinalVerts
949;;;;;;;;;;;;;;;;;;;;;;;;
950
951L_PDFVert:
952 push esi
953 push edi
954 mov eax, dword [0+0+ebx]
955 mov edx, dword [r_refdef+40]
956 cmp eax,edx
957 jge LNextVert
958 mov esi, dword [0+4+ebx]
959 mov edx, dword [r_refdef+44]
960 cmp esi,edx
961 jge LNextVert
962 mov edi, dword [zspantable+esi*4]
963 mov edx, dword [0+20+ebx]
964 shr edx,16
965 cmp dx, word [edi+eax*2]
966 jl LNextVert
967 mov word [edi+eax*2],dx
968 mov edi, dword [0+12+ebx]
969 shr edi,16
970 mov edi, dword [skintable+edi*4]
971 mov edx, dword [0+8+ebx]
972 shr edx,16
973 mov dl, byte [edi+edx]
974 mov edi, dword [0+16+ebx]
975 and edi,0FF00h
976 and edx,000FFh
977 add edi,edx
978 mov edx, dword [acolormap]
979 mov dl, byte [edx+edi*1]
980 mov edi, dword [d_scantable+esi*4]
981 mov esi, dword [d_viewbuffer]
982 add edi,eax
983 mov byte [esi+edi],dl
984LNextVert:
985 pop edi
986 pop esi
987 ret
988
989 global D_PolysetDrawFinalVerts
990D_PolysetDrawFinalVerts:
991 push ebp
992 push ebx
993 mov ebx,dword[4+8+esp]	;pv1
994 call L_PDFVert
995 mov ebx,dword[8+8+esp]	;pv2
996 call L_PDFVert
997 mov ebx,dword[12+8+esp];pv3
998 call L_PDFVert
999 pop ebx
1000 pop ebp
1001 ret
1002
1003
1004;;;;;;;;;;;;;;;;;;;;;;;;
1005; D_DrawNonSubdiv
1006;;;;;;;;;;;;;;;;;;;;;;;;
1007
1008 global D_DrawNonSubdiv
1009D_DrawNonSubdiv:
1010;push ebp
1011;mov ebp, dword [r_affinetridesc+24]	;lnumtriangles
1012 push ebx
1013;shl ebp,4
1014 push esi
1015 mov esi, dword [r_affinetridesc+16] ;ptri
1016 push edi
1017LNDLoop:
1018 mov edi, dword [r_affinetridesc+20] ;pfv
1019 xor ecx,ecx;	//clear i1
1020 xor edx,edx;	//clear i2
1021 mov cx, word[4+0+esi] ;ptri->vertindex[0]
1022 xor ebx,ebx;	//clear i3
1023 mov dx, word[4+2+esi] ;ptri->vertindex[1]
1024 shl ecx,5
1025 mov bx, word[4+4+esi] ;ptri->vertindex[2]
1026 shl edx,5
1027 add ecx,edi
1028 shl ebx,5
1029 add edx,edi
1030 add ebx,edi
1031 mov eax, dword [0+4+ecx]
1032 mov esi, dword [0+0+ecx]
1033 sub eax, dword [0+4+edx]
1034 sub esi, dword [0+0+ebx]
1035 imul eax,esi
1036 mov esi, dword [0+0+ecx]
1037 mov edi, dword [0+4+ecx]
1038 sub esi, dword [0+0+edx]
1039 sub edi, dword [0+4+ebx]
1040 imul edi,esi
1041 sub eax,edi
1042 jns near LNextTri
1043 mov dword [d_xdenom],eax
1044 fild dword [d_xdenom]
1045 mov eax, dword [0+0+ecx]
1046 mov esi, dword [0+4+ecx]
1047 mov dword [r_p0+0],eax
1048 mov dword [r_p0+4],esi
1049 mov eax, dword [0+8+ecx]
1050 mov esi, dword [0+12+ecx]
1051 mov dword [r_p0+8],eax
1052 mov dword [r_p0+12],esi
1053 mov eax, dword [0+16+ecx]
1054 mov esi, dword [0+20+ecx]
1055 mov dword [r_p0+16],eax
1056 mov dword [r_p0+20],esi
1057 fdivr dword [float_1]
1058 mov eax, dword [0+0+edx]
1059 mov esi, dword [0+4+edx]
1060 mov dword [r_p1+0],eax
1061 mov dword [r_p1+4],esi
1062 mov eax, dword [0+8+edx]
1063 mov esi, dword [0+12+edx]
1064 mov dword [r_p1+8],eax
1065 mov dword [r_p1+12],esi
1066 mov eax, dword [0+16+edx]
1067 mov esi, dword [0+20+edx]
1068 mov dword [r_p1+16],eax
1069 mov dword [r_p1+20],esi
1070 mov eax, dword [0+0+ebx]
1071 mov esi, dword [0+4+ebx]
1072 mov dword [r_p2+0],eax
1073 mov dword [r_p2+4],esi
1074 mov eax, dword [0+8+ebx]
1075 mov esi, dword [0+12+ebx]
1076 mov dword [r_p2+8],eax
1077 mov dword [r_p2+12],esi
1078 mov eax, dword [0+16+ebx]
1079 mov esi, dword [0+20+ebx]
1080 mov dword [r_p2+16],eax
1081 mov edi, dword [r_affinetridesc+16]
1082 mov dword [r_p2+20],esi
1083 mov eax, dword [0+edi]
1084 test eax,eax
1085 jnz LFacesFront
1086 mov eax, dword [24+ecx]
1087 mov esi, dword [24+edx]
1088 mov edi, dword [24+ebx]
1089 test eax,00020h
1090 mov eax, dword [r_affinetridesc+32]
1091 jz LOnseamDone0
1092 add dword [r_p0+8],eax
1093LOnseamDone0:
1094 test esi,00020h
1095 jz LOnseamDone1
1096 add dword [r_p1+8],eax
1097LOnseamDone1:
1098 test edi,00020h
1099 jz LOnseamDone2
1100 add dword [r_p2+8],eax
1101LOnseamDone2:
1102LFacesFront:
1103 fstp dword [d_xdenom]
1104 call D_PolysetSetEdgeTable		; call near D_PolysetSetEdgeTable
1105 call D_RasterizeAliasPolySmooth	; call near D_RasterizeAliasPolySmooth
1106LNextTri:
1107 mov esi, dword [r_affinetridesc+16]
1108;sub ebp,16
1109;jnz LNDLoop
1110 pop edi
1111 pop esi
1112 pop ebx
1113;pop ebp
1114 add esp,offset SPAN_SIZE
1115 ret
1116
1117