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