home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 113 / EnigmaAmiga113CD.iso / software / sviluppo / quake_src / d_polysetppc.s < prev    next >
Encoding:
Text File  |  2000-06-17  |  37.2 KB  |  1,502 lines

  1. # Copyright (C) 1996-1997 Id Software, Inc. 
  2. # This program is free software; you can redistribute it and/or 
  3. # modify it under the terms of the GNU General Public License 
  4. # as published by the Free Software Foundation; either version 2 
  5. # of the License, or (at your option) any later version. 
  6. # This program is distributed in the hope that it will be useful, 
  7. # but WITHOUT ANY WARRANTY; without even the implied warranty of 
  8. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.   
  9. # See the GNU General Public License for more details. 
  10. # You should have received a copy of the GNU General Public License 
  11. # along with this program; if not, write to the Free Software 
  12. # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. 
  13.  
  14. ##
  15. ## Quake for AMIGA
  16. ##
  17. ## d_polysetPPC.s
  18. ##
  19. ## Define WOS for PowerOpen ABI, otherwise SVR4-ABI is used.
  20. ##
  21.  
  22. .include        "macrosPPC.i"
  23.  
  24. #
  25. # external references
  26. #
  27.  
  28.     xrefv    acolormap
  29.     xrefv    d_aspancount
  30.     xrefv    errorterm
  31.     xrefv    erroradjustup
  32.     xrefv    erroradjustdown
  33.     xrefv    d_countextrastep
  34.     xrefv    ubasestep
  35.     xrefa    r_affinetridesc
  36.     xrefv    a_ststepxwhole
  37.     xrefv    a_sstepxfrac
  38.     xrefv    a_tstepxfrac
  39.     xrefv    r_lstepx
  40.     xrefv    r_lstepy
  41.     xrefv    r_sstepx
  42.     xrefv    r_sstepy
  43.     xrefv    r_tstepx
  44.     xrefv    r_tstepy
  45.     xrefv    r_zistepx
  46.     xrefv    r_zistepy
  47.     xrefa    zspantable
  48.     xrefa    skintable
  49.     xrefa    r_p0
  50.     xrefa    r_p1
  51.     xrefa    r_p2
  52.     xrefv    d_xdenom
  53.     xrefv    d_pcolormap
  54.     xrefa    d_scantable
  55.     xrefv    d_viewbuffer
  56.     xrefv    d_pedgespanpackage
  57.     xrefv    d_pdest
  58.     xrefv    d_pz
  59.     xrefv    d_aspancount
  60.     xrefv    d_ptex
  61.     xrefv    d_sfrac
  62.     xrefv    d_tfrac
  63.     xrefv    d_light
  64.     xrefv    d_zi
  65.     xrefv    d_pdestextrastep
  66.     xrefv    d_pzextrastep
  67.     xrefv    d_countextrastep
  68.     xrefv    d_ptexextrastep
  69.     xrefv    d_sfracextrastep
  70.     xrefv    d_tfracextrastep
  71.     xrefv    d_lightextrastep
  72.     xrefv    d_ziextrastep
  73.     xrefv    d_pdestbasestep
  74.     xrefv    d_pzbasestep
  75.     xrefv    d_ptexbasestep
  76.     xrefv    d_sfracbasestep
  77.     xrefv    d_tfracbasestep
  78.     xrefv    d_lightbasestep
  79.     xrefv    d_zibasestep
  80.     xrefv    d_zwidth
  81.     xrefv    d_pzbuffer
  82.     xrefv    a_spans
  83.     xrefv    pedgetable
  84.     xrefa    edgetables
  85.     xrefv    screenwidth
  86.     xrefv    INT2DBL_0
  87.     xrefv    c2
  88.  
  89.     xrefv    FloorDivMod
  90.     xrefv    D_RasterizeAliasPolySmooth
  91.  
  92.  
  93. #
  94. # defines
  95. #
  96.  
  97. .set    ALIAS_ONSEAM      ,32        #must match the def. in r_shared.h
  98.  
  99. .set    PSPANP_PDEST      ,0
  100. .set    PSPANP_PZ         ,4
  101. .set    PSPANP_COUNT      ,8
  102. .set    PSPANP_PTEX       ,12
  103. .set    PSPANP_SFRAC      ,16
  104. .set    PSPANP_TFRAC      ,20
  105. .set    PSPANP_LIGHT      ,24
  106. .set    PSPANP_ZI         ,28
  107. .set    PSPANP_SIZEOF     ,32
  108. .set    PSPANP_SIZEOF_EXP ,5
  109.  
  110. .set    R_PSKIN           ,0
  111. .set    R_PSKINDESC       ,4
  112. .set    R_SKINWIDTH       ,8
  113. .set    R_SKINHEIGHT      ,12
  114. .set    R_PTRIANGLES      ,16
  115. .set    R_PFINALVERTS     ,20
  116. .set    R_NUMTRIANGLES    ,24
  117. .set    R_DRAWTYPE        ,28
  118. .set    R_SEAMFIXUP16     ,32
  119. .set    R_SIZEOF          ,36
  120.  
  121. .set    PTEMP_QUOTIENT    ,0
  122. .set    PTEMP_REMAINDER   ,4
  123.  
  124. .set    ETAB_ISFLATTOP    ,0
  125. .set    ETAB_NUMLEFTEDGES ,4
  126. .set    ETAB_PLEV0        ,8
  127. .set    ETAB_PLEV1        ,12
  128. .set    ETAB_PLEV2        ,16
  129. .set    ETAB_NUMRIGHTEDGES,20
  130. .set    ETAB_PREV0        ,24
  131. .set    ETAB_PREV1        ,28
  132. .set    ETAB_PREV2        ,32
  133. .set    ETAB_SIZEOF       ,36
  134.  
  135. .set    MT_FACESFRONT     ,0
  136. .set    MT_VERTINDEX      ,4
  137. .set    MT_SIZEOF         ,16
  138.  
  139. .set    FV_V              ,0
  140. .set    FV_FLAGS          ,24
  141. .set    FV_RESERVED       ,28
  142. .set    FV_SIZEOF         ,32
  143. .set    FV_SIZEOF_EXP     ,5
  144.  
  145. .set    EDGETABLE_SIZEOF  ,36
  146.  
  147.  
  148.  
  149.  
  150.  
  151. ###########################################################################
  152. #
  153. #       void D_PolysetDrawSpans8 (spanpackage_t *pspanpackage)
  154. #
  155. #       standard scan drawing function for alias models
  156. #
  157. ###########################################################################
  158.  
  159.     funcdef    D_PolysetDrawSpans8
  160.  
  161.     init    0,0,12,0
  162.     stmw    r20,gb(r1)
  163.  
  164.     lw      r4,d_aspancount
  165.     lw      r5,errorterm
  166.     lw      r6,erroradjustup
  167.     lw      r7,erroradjustdown
  168.     lw      r8,d_countextrastep
  169.     lw      r9,ubasestep
  170.     lw      r10,acolormap
  171.     lw      r11,r_zistepx
  172.     lw      r12,a_ststepxwhole
  173.     lw      r31,a_sstepxfrac
  174.     lw      r30,a_tstepxfrac
  175.     lw      r29,r_lstepx
  176.     lxa     r28,r_affinetridesc
  177.     lwz     r28,R_SKINWIDTH(r28)
  178.  
  179. .ds8loop:
  180.  
  181. #                lcount = d_aspancount - pspanpackage->count;
  182. #
  183. #                errorterm += erroradjustup;
  184. #                if (errorterm >= 0)
  185. #                {
  186. #                        d_aspancount += d_countextrastep;
  187. #                        errorterm -= erroradjustdown;
  188. #                }
  189. #                else
  190. #                {
  191. #                        d_aspancount += ubasestep;
  192. #                }
  193.  
  194.     lwz     r0,PSPANP_COUNT(r3)
  195.     subf    r0,r0,r4
  196.     add.    r5,r5,r6
  197.     blt     .ds8else
  198.     add     r4,r4,r8
  199.     subf    r5,r7,r5
  200.     b       .ds8next
  201. .ds8else:
  202.     add     r4,r4,r9
  203. .ds8next:
  204.     mr.     r0,r0
  205.     beq     .ds8loopend
  206.     mtctr   r0
  207.  
  208. #                        lpdest = pspanpackage->pdest;
  209. #                        lptex = pspanpackage->ptex;
  210. #                        lpz = pspanpackage->pz;
  211. #                        lsfrac = pspanpackage->sfrac;
  212. #                        ltfrac = pspanpackage->tfrac;
  213. #                        llight = pspanpackage->light;
  214. #                        lzi = pspanpackage->zi;
  215.  
  216.     lwz     r27,PSPANP_PDEST(r3)
  217.     lwz     r26,PSPANP_PZ(r3)
  218.     lwz     r25,PSPANP_PTEX(r3)
  219.     lwz     r24,PSPANP_SFRAC(r3)
  220.     lwz     r23,PSPANP_TFRAC(r3)
  221.     lwz     r22,PSPANP_LIGHT(r3)
  222.     lwz     r21,PSPANP_ZI(r3)
  223.  
  224. ###### main drawing loop
  225.  
  226. ###### r21 = lzi
  227. ###### r22 = llight
  228. ###### r24 = lsfrac
  229. ###### r11 = r_zistepx
  230. ###### r23 = ltfrac
  231. ###### r30 = a_tstepxfrac
  232. ###### r28 = r_affinetridesc.skinwidth
  233. ###### r27 -> lpdest
  234. ###### r26 -> lpz
  235. ###### r25 -> lptex
  236. ###### r10 -> acolormap
  237. ###### r31 = a_sstepxfrac
  238. ###### r12 = a_ststepxwhole
  239. ###### r29 = r_lstepx
  240.  
  241. #                        do
  242. #                        {
  243. #                                if ((lzi >> 16) >= *lpz)
  244. #                                {
  245. #                                        *lpdest = ((byte *)acolormap)[*lptex + (llight & 0xFF00)];
  246. #                                        *lpz = lzi >> 16;
  247. #                                }
  248. #                                lpdest++;
  249. #                                lzi += r_zistepx;
  250. #                                lpz++;
  251. #                                llight += r_lstepx;
  252. #                                lptex += a_ststepxwhole;
  253. #                                lsfrac += a_sstepxfrac;
  254. #                                lptex += lsfrac >> 16;
  255. #                                lsfrac &= 0xFFFF;
  256. #                                ltfrac += a_tstepxfrac;
  257. #                                if (ltfrac & 0x10000)
  258. #                                {
  259. #                                        lptex += r_affinetridesc.skinwidth;
  260. #                                        ltfrac &= 0xFFFF;
  261. #                                }
  262. #                        } while (--lcount);
  263.  
  264. .ds8loop2:
  265.     srwi    r0,r21,16
  266.     lhz     r20,0(r26)
  267.     cmpw    r0,r20
  268.     blt     .ds8cont
  269.     lbz     r20,0(r25)
  270.     rlwimi  r20,r22,0,16,23
  271.     lbzx    r20,r10,r20
  272.     stb     r20,0(r27)
  273.     sth     r0,0(r26)
  274. .ds8cont:
  275.     add     r24,r24,r31
  276.     addi    r26,r26,2
  277.     addi    r27,r27,1
  278.     srwi    r0,r24,16
  279.     add     r21,r21,r11
  280.     add     r22,r22,r29
  281.     add     r25,r25,r12
  282.     add     r23,r23,r30
  283.     clrlwi  r24,r24,16
  284.     add     r25,r25,r0
  285.     andis.  r0,r23,1
  286.     beq     .ds8cont2
  287.     add     r25,r25,r28
  288.     clrlwi  r23,r23,16
  289. .ds8cont2:
  290.     bdnz    .ds8loop2
  291. .ds8loopend:
  292.  
  293. #                pspanpackage++;
  294. #        } while (pspanpackage->count != -999999);
  295.  
  296.     la      r3,PSPANP_SIZEOF(r3)
  297.     lwz     r0,PSPANP_COUNT(r3)
  298.     lis     r20,-999999@h
  299.     ori     r20,r20,-999999@l
  300.     cmpw    r20,r0
  301.     bne     .ds8loop
  302.  
  303.     lmw    r20,gb(r1)
  304.     exit
  305.  
  306.     funcend    D_PolysetDrawSpans8
  307.  
  308.  
  309.  
  310.  
  311. ###########################################################################
  312. #
  313. #       void D_PolysetRecursiveTriangle (int *lp1, int *lp2, int *lp3)
  314. #
  315. ###########################################################################
  316.  
  317.     funcdef    D_PolysetRecursiveTriangle
  318.  
  319.     init    0,0,3,0
  320.     stw    r24,gb+0*4(r1)
  321.     stw    r25,gb+1*4(r1)
  322.     stw    r26,gb+2*4(r1)
  323.     lxa     r6,zspantable
  324.     lw      r7,d_viewbuffer
  325.     lxa     r26,skintable
  326.     lw      r25,d_pcolormap
  327.     lxa     r24,d_scantable
  328.     bl    DoRecursion
  329.     lwz    r24,gb+0*4(r1)
  330.     lwz    r25,gb+1*4(r1)
  331.     lwz    r26,gb+2*4(r1)
  332.     exit
  333.  
  334.  
  335. DoRecursion:
  336.     init    0,24,5,0
  337.     stmw    r27,gb(r1)
  338.  
  339.     mr      r31,r3
  340.     mr      r30,r4
  341.     mr      r29,r5
  342.     la    r28,local(r1)
  343.  
  344. #        d = lp2[0] - lp1[0];
  345. #        if (d < -1 || d > 1)
  346. #                goto split;
  347. #        d = lp2[1] - lp1[1];
  348. #        if (d < -1 || d > 1)
  349. #                goto split;
  350. #
  351. #        d = lp3[0] - lp2[0];
  352. #        if (d < -1 || d > 1)
  353. #                goto split2;
  354. #        d = lp3[1] - lp2[1];
  355. #        if (d < -1 || d > 1)
  356. #                goto split2;
  357. #
  358. #        d = lp1[0] - lp3[0];
  359. #        if (d < -1 || d > 1)
  360. #                goto split3;
  361. #        d = lp1[1] - lp3[1];
  362. #        if (d < -1 || d > 1)
  363.  
  364.     lwz     r9,0(r30)
  365.     lwz     r10,0(r31)
  366.     lwz     r11,1*4(r30)
  367.     lwz     r12,1*4(r31)
  368.     subf    r3,r10,r9
  369.     addi    r3,r3,1
  370.     cmplwi  r3,2
  371.     bgt     .rtsplit
  372.     subf    r4,r12,r11
  373.     addi    r4,r4,1
  374.     cmplwi  r4,2
  375.     bgt     .rtsplit
  376.     lwz     r3,0(r29)
  377.     subf    r5,r9,r3
  378.     addi    r5,r5,1
  379.     cmplwi  r5,2
  380.     bgt     .rtsplit2
  381.     lwz     r4,1*4(r29)
  382.     subf    r5,r11,r4
  383.     addi    r5,r5,1
  384.     cmplwi  r5,2
  385.     bgt     .rtsplit2
  386.     subf    r5,r10,r3
  387.     addi    r5,r5,1
  388.     cmplwi  r5,2
  389.     bgt     .rtsplit3
  390.     subf    r5,r12,r4
  391.     addi    r5,r5,1
  392.     cmplwi  r5,2
  393.     ble     .rtexit
  394.  
  395. #split3:
  396. #                temp = lp1;
  397. #                lp1 = lp3;
  398. #                lp3 = lp2;
  399. #                lp2 = temp;
  400. #
  401. #                goto split;
  402. #
  403. #split2:
  404. #        temp = lp1;
  405. #        lp1 = lp2;
  406. #        lp2 = lp3;
  407. #        lp3 = temp;
  408.  
  409. .rtsplit3:
  410.     mr      r0,r29
  411.     mr      r29,r30
  412.     mr      r30,r31
  413.     mr      r31,r0
  414.     lwz     r9,0(r30)
  415.     lwz     r10,0(r31)
  416.     lwz     r11,1*4(r30)
  417.     lwz     r12,1*4(r31)
  418.     b       .rtsplit
  419. .rtsplit2:
  420.     mr      r0,r31
  421.     mr      r31,r30
  422.     mr      r30,r29
  423.     mr      r29,r0
  424.     lwz     r9,0(r30)
  425.     lwz     r10,0(r31)
  426.     lwz     r11,1*4(r30)
  427.     lwz     r12,1*4(r31)
  428. .rtsplit:
  429.  
  430. #        new[0] = (lp1[0] + lp2[0]) >> 1;
  431. #        new[1] = (lp1[1] + lp2[1]) >> 1;
  432. #        new[2] = (lp1[2] + lp2[2]) >> 1;
  433. #        new[3] = (lp1[3] + lp2[3]) >> 1;
  434. #        new[5] = (lp1[5] + lp2[5]) >> 1;
  435.  
  436.     add     r3,r9,r10
  437.     srawi   r3,r3,1                 #r3 = new[0]
  438.     stw     r3,0(r28)
  439.     add     r4,r11,r12
  440.     srawi   r4,r4,1                 #r4 = new[1]
  441.     stw     r4,4(r28)
  442.     lwz     r5,2*4(r31)
  443.     lwz     r0,2*4(r30)
  444.     add     r5,r5,r0
  445.     srawi   r5,r5,1                 #r5 = new[2]
  446.     stw     r5,8(r28)
  447.     lwz     r8,3*4(r31)
  448.     lwz     r0,3*4(r30)
  449.     add     r8,r8,r0
  450.     srawi   r8,r8,1                 #r8 = new[3]
  451.     stw     r8,12(r28)
  452.     lwz     r27,5*4(r31)
  453.     lwz     r0,5*4(r30)
  454.     add     r27,r27,r0
  455.     srawi   r27,r27,1               #r27 = new[5]
  456.     stw     r27,20(r28)
  457.  
  458. #        if (lp2[1] > lp1[1])
  459. #                goto nodraw;
  460. #        if ((lp2[1] == lp1[1]) && (lp2[0] < lp1[0]))
  461. #                goto nodraw;
  462.  
  463.  
  464.     cmpw    r11,r12
  465.     bgt     .rtnodraw
  466.     bne     .rtdraw
  467.     cmpw    r9,r10
  468.     blt     .rtnodraw
  469. .rtdraw:
  470.     srwi    r27,r27,16              #r27 = z = new[5]>>16
  471.  
  472. #        z = new[5]>>16;
  473. #        zbuf = zspantable[new[1]] + new[0];
  474. #        if (z >= *zbuf)
  475. #        {
  476. #                int             pix;
  477. #
  478. #                *zbuf = z;
  479. #                pix = d_pcolormap[skintable[new[3]>>16][new[2]>>16]];
  480. #                d_viewbuffer[d_scantable[new[1]] + new[0]] = pix;
  481. #        }
  482.  
  483.     slwi    r0,r4,2
  484.     lwzx    r9,r6,r0
  485.     add     r10,r3,r3
  486.     lhzx    r11,r9,r10
  487.     cmpw    r27,r11
  488.     blt     .rtnodraw
  489.     sthx    r27,r9,r10
  490.     srawi   r5,r5,16
  491.     srawi   r8,r8,16
  492.     slwi    r8,r8,2
  493.     lwzx    r12,r26,r8
  494.     lbzx    r9,r12,r5
  495.     lbzx    r10,r25,r9
  496.     lwzx    r11,r24,r0
  497.     add     r11,r11,r3
  498.     stbx    r10,r7,r11
  499. .rtnodraw:
  500.  
  501. #// recursively continue
  502. #        D_PolysetRecursiveTriangle (lp3, lp1, new);
  503. #        D_PolysetRecursiveTriangle (lp3, new, lp2);
  504.  
  505.     mr      r3,r29
  506.     mr      r4,r31
  507.     mr      r5,r28
  508.     bl      DoRecursion
  509.     mr      r3,r29
  510.     mr      r4,r28
  511.     mr      r5,r30
  512.     bl      DoRecursion
  513.  
  514. .rtexit:
  515.     lmw    r27,gb(r1)
  516.     exit
  517.  
  518.     funcend    D_PolysetRecursiveTriangle
  519.  
  520.  
  521.  
  522.  
  523. ###########################################################################
  524. #
  525. #       void D_PolysetSetUpForLineScan (fixed8_t startvertu,
  526. #               fixed8_t startvertv, fixed8_t endvertu, fixed8_t endvertv)
  527. #
  528. #       Parameters are transferred in registers d0-d3
  529. #
  530. ###########################################################################
  531.  
  532.     funcdef    D_PolysetSetUpForLineScan
  533.  
  534. #        errorterm = -1;
  535. #
  536. #        tm = endvertu - startvertu;
  537. #        tn = endvertv - startvertv;
  538.  
  539.     li    r0,-1
  540.     sw    r0,errorterm
  541.     subf    r5,r3,r5
  542.     subf    r6,r4,r6
  543.     addi    r5,r5,15
  544.     addi    r6,r6,15
  545.  
  546. #        if (((tm <= 16) && (tm >= -15)) &&
  547. #                ((tn <= 16) && (tn >= -15)))
  548. #        {
  549. #                ptemp = &adivtab[((tm+15) << 5) + (tn+15)];
  550. #                ubasestep = ptemp->quotient;
  551. #                erroradjustup = ptemp->remainder;
  552. #                erroradjustdown = tn;
  553. #        }
  554.  
  555.     cmplwi  r5,31
  556.     bgt     .sflselse
  557.     cmplwi  r6,31
  558.     bgt     .sflselse
  559.     lxa     r8,adivtab
  560.     slwi    r5,r5,5
  561.     add     r5,r5,r6
  562.     slwi    r5,r5,3
  563.     add     r8,r8,r5
  564.     lwz     r3,PTEMP_QUOTIENT(r8)
  565.     sw      r3,ubasestep
  566.     lwz     r4,PTEMP_REMAINDER(r8)
  567.     sw      r4,erroradjustup
  568.     subi    r6,r6,15
  569.     sw      r6,erroradjustdown
  570.     b       .sflsexit
  571.  
  572. #        {
  573. #                dm = (double)tm;
  574. #                dn = (double)tn;
  575. #
  576. #                FloorDivMod (dm, dn, &ubasestep, &erroradjustup);
  577. #
  578. #                erroradjustdown = dn;
  579. #        }
  580.  
  581. .sflselse:
  582.     subi    r5,r5,15
  583.     subi    r6,r6,15
  584.     sw      r6,erroradjustdown
  585.     mr.     r5,r5
  586.     divw    r7,r5,r6
  587.     mullw   r8,r7,r6
  588.     subf    r8,r8,r5
  589.     bge     .sflscont
  590.     subi    r7,r7,1
  591.     add     r8,r8,r6
  592. .sflscont:
  593.     sw      r7,ubasestep
  594.     sw      r8,erroradjustup
  595. .sflsexit:
  596.     blr
  597.  
  598.     funcend    D_PolysetSetUpForLineScan
  599.  
  600.  
  601.  
  602.  
  603. ###########################################################################
  604. #
  605. #       void D_PolysetCalcGradients (int skinwidth)
  606. #
  607. ###########################################################################
  608.  
  609.     funcdef    D_PolysetCalcGradients
  610.  
  611. #        p00_minus_p20 = r_p0[0] - r_p2[0];
  612. #        p01_minus_p21 = r_p0[1] - r_p2[1];
  613. #        p10_minus_p20 = r_p1[0] - r_p2[0];
  614. #        p11_minus_p21 = r_p1[1] - r_p2[1];
  615. #
  616. #        xstepdenominv = 1.0 / (float)d_xdenom;
  617. #
  618. #        ystepdenominv = -xstepdenominv;
  619.  
  620.     stwu    r1,-64(r1)
  621.     lw      r11,d_xdenom
  622.     ls      f9,c2
  623.     lf      f1,INT2DBL_0            #for int2dbl_setup, r12=tmp
  624.     stfd    f1,32(r1)
  625.     lxa     r4,r_p2
  626.     lxa     r5,r_p1
  627.     lxa     r6,r_p0
  628.     int2dbl    f6,r11,r12,32,f1
  629.     lwz     r7,0(r6)
  630.     lwz     r8,1*4(r6)
  631.     fneg    f6,f6
  632.     lwz     r9,0(r4)
  633.     subf    r7,r9,r7
  634.     fmuls   f7,f6,f6
  635.     int2dbl    f2,r7,r12,32,f1        #f2 = p00_minus_p20
  636.     frsqrte f7,f7
  637.     lwz     r10,1*4(r4)
  638.     subf    r8,r10,r8
  639.     fnmsubs f8,f7,f6,f9
  640.     int2dbl f3,r8,r12,32,f1        #f3 = p01_minus_p21
  641.     fmuls   f7,f7,f8
  642.     lwz     r7,0(r5)
  643.     subf    r7,r9,r7
  644.     fnmsubs f8,f7,f6,f9
  645.     int2dbl f4,r7,r12,32,f1        #f4 = p10_minus_p20
  646.     fmuls   f7,f7,f8
  647.     lwz     r8,1*4(r5)
  648.     subf    r8,r10,r8
  649.     fneg    f6,f7
  650.     int2dbl f5,r8,r12,32,f1        #f5 = p11_minus_p21
  651.     fmuls   f3,f3,f6
  652.     fmuls   f5,f5,f6
  653.     fmuls   f2,f2,f7
  654.     fmuls   f4,f4,f7
  655.  
  656. #        t0 = r_p0[4] - r_p2[4];
  657. #        t1 = r_p1[4] - r_p2[4];
  658. #        r_lstepx = (int)
  659. #                        ceil((t1 * p01_minus_p21 - t0 * p11_minus_p21) * xstepdenominv);
  660. #        r_lstepy = (int)
  661. #                        ceil((t1 * p00_minus_p20 - t0 * p10_minus_p20) * ystepdenominv);
  662.  
  663.     mffs    f8
  664.     mtfsfi  cr7,2
  665.     lwz     r7,4*4(r4)
  666.     lwz     r8,4*4(r6)
  667.     subf    r9,r7,r8
  668.     int2dbl f9,r9,r12,32,f1        #f9 = t0
  669.     lwz     r8,4*4(r5)
  670.     subf    r9,r7,r8
  671.     int2dbl f10,r9,r12,32,f1    #f10 = t1
  672.     fmuls   f11,f9,f5
  673.     fmuls   f12,f9,f4
  674.     fmsubs  f11,f10,f3,f11
  675.     fctiw   f0,f11            #@@@ ab hier ein bißchen optimiert
  676.     stfd    f0,40(r1)
  677.     fmsubs  f12,f10,f2,f12
  678.     lwz     r7,44(r1)
  679.     fctiw   f13,f12
  680.     stfd    f13,48(r1)
  681.     mtfsf   1,f8
  682.     lwz     r8,52(r1)
  683.     sw      r7,r_lstepx
  684.     sw      r8,r_lstepy
  685.  
  686. #        t0 = r_p0[2] - r_p2[2];
  687. #        t1 = r_p1[2] - r_p2[2];
  688. #        r_sstepx = (int)((t1 * p01_minus_p21 - t0 * p11_minus_p21) *
  689. #                        xstepdenominv);
  690. #        r_sstepy = (int)((t1 * p00_minus_p20 - t0* p10_minus_p20) *
  691. #                        ystepdenominv);
  692.  
  693.     lwz     r7,2*4(r4)
  694.     lwz     r8,2*4(r6)
  695.     subf    r9,r7,r8
  696.     int2dbl f9,r9,r12,32,f1        #f9 = t0
  697.     lwz     r8,2*4(r5)
  698.     subf    r9,r7,r8
  699.     int2dbl f10,r9,r12,32,f1    #f10 = t1
  700.     fmuls   f11,f9,f5
  701.     fmuls   f12,f9,f4
  702.     fmsubs  f11,f10,f3,f11
  703.     fctiwz  f0,f11            #@@@ ab hier ein bißchen optimiert
  704.     stfd    f0,40(r1)
  705.     fmsubs  f12,f10,f2,f12
  706.     lwz     r10,44(r1)
  707.     fctiwz  f13,f12
  708.     stfd    f13,48(r1)
  709.     lwz     r8,52(r1)
  710.     sw      r10,r_sstepx
  711.     sw      r8,r_sstepy
  712.  
  713. #        t0 = r_p0[3] - r_p2[3];
  714. #        t1 = r_p1[3] - r_p2[3];
  715. #        r_tstepx = (int)((t1 * p01_minus_p21 - t0 * p11_minus_p21) *
  716. #                        xstepdenominv);
  717. #        r_tstepy = (int)((t1 * p00_minus_p20 - t0 * p10_minus_p20) *
  718. #                        ystepdenominv);
  719.  
  720.     lwz     r7,3*4(r4)
  721.     lwz     r8,3*4(r6)
  722.     subf    r9,r7,r8
  723.     int2dbl f9,r9,r12,32,f1        #f9 = t0
  724.     lwz     r8,3*4(r5)
  725.     subf    r9,r7,r8
  726.     int2dbl f10,r9,r12,32,f1    #f10 = t1
  727.     fmuls   f11,f9,f5
  728.     fmuls   f12,f9,f4
  729.     fmsubs  f11,f10,f3,f11
  730.     fctiwz  f0,f11            #@@@ ab hier ein bißchen optimiert
  731.     stfd    f0,40(r1)
  732.     fmsubs  f12,f10,f2,f12
  733.     lwz     r11,44(r1)
  734.     fctiwz  f13,f12
  735.     stfd    f13,48(r1)
  736.     lwz     r8,52(r1)
  737.     sw      r11,r_tstepx
  738.     sw      r8,r_tstepy
  739.  
  740. #        t0 = r_p0[5] - r_p2[5];
  741. #        t1 = r_p1[5] - r_p2[5];
  742. #        r_zistepx = (int)((t1 * p01_minus_p21 - t0 * p11_minus_p21) *
  743. #                        xstepdenominv);
  744. #        r_zistepy = (int)((t1 * p00_minus_p20 - t0 * p10_minus_p20) *
  745. #                        ystepdenominv);
  746.  
  747.     lwz     r7,5*4(r4)
  748.     lwz     r8,5*4(r6)
  749.     subf    r9,r7,r8
  750.     int2dbl f9,r9,r12,32,f1        #f9 = t0
  751.     lwz     r8,5*4(r5)
  752.     subf    r9,r7,r8
  753.     int2dbl f10,r9,r12,32,f1    #f10 = t1
  754.     fmuls   f11,f9,f5
  755.     fmuls   f12,f9,f4
  756.     fmsubs  f11,f10,f3,f11
  757.     fctiwz  f0,f11            #@@@ ab hier ein bißchen optimiert
  758.     stfd    f0,40(r1)
  759.     fmsubs  f12,f10,f2,f12
  760.     lwz     r7,44(r1)
  761.     fctiwz  f13,f12
  762.     stfd    f13,48(r1)
  763.     lwz     r8,52(r1)
  764.     sw      r7,r_zistepx
  765.     sw      r8,r_zistepy
  766.  
  767. #        a_sstepxfrac = r_sstepx & 0xFFFF;
  768. #        a_tstepxfrac = r_tstepx & 0xFFFF;
  769. #        a_ststepxwhole = skinwidth * (r_tstepx >> 16) + (r_sstepx >> 16);
  770.  
  771.     andi.   r4,r10,0xffff
  772.     srawi   r6,r10,16
  773.     sw      r4,a_sstepxfrac
  774.     andi.   r5,r11,0xffff
  775.     srawi   r7,r11,16
  776.     sw      r5,a_tstepxfrac
  777.     mullw   r7,r7,r3
  778.     add     r7,r7,r6
  779.     sw      r7,a_ststepxwhole
  780.     addi    r1,r1,64
  781.     blr
  782.  
  783.     funcend    D_PolysetCalcGradients
  784.  
  785.  
  786.  
  787.  
  788. ###########################################################################
  789. #
  790. #       void D_PolysetScanLeftEdge (int height)
  791. #
  792. ###########################################################################
  793.  
  794.     funcdef    D_PolysetScanLeftEdge
  795.  
  796. .ifdef    WOS
  797.     init    0,0,19,0
  798.     stmw    r13,gb(r1)
  799. .else
  800. # r14 is used and save internally, r13 may be used as small data pointer
  801.     init    0,0,17,0
  802.     stmw    r15,gb(r1)
  803. .endif
  804.  
  805.     mtctr   r3
  806.     lw      r3,d_pedgespanpackage
  807.     subi    r3,r3,4
  808.     lw      r4,d_pdest
  809.     lw      r5,d_pz
  810.     lw      r6,d_aspancount
  811.     lw      r7,d_ptex
  812.     lw      r8,d_sfrac
  813.     lw      r9,d_tfrac
  814.     lw      r10,d_light
  815.     lw      r11,d_zi
  816.     lxa     r12,r_affinetridesc
  817.     lwz     r12,R_SKINWIDTH(r12)
  818.     lw      r31,errorterm
  819.     lw      r30,erroradjustup
  820.     lw      r29,erroradjustdown
  821.     lw      r28,d_pdestextrastep
  822.     lw      r27,d_pzextrastep
  823.     add     r27,r27,r27
  824.     lw      r26,d_countextrastep
  825.     lw      r25,d_ptexextrastep
  826.     lw      r24,d_sfracextrastep
  827.     lw      r23,d_tfracextrastep
  828.     lw      r22,d_lightextrastep
  829.     lw      r21,d_ziextrastep
  830.     lw      r20,d_pdestbasestep
  831.     lw      r19,d_pzbasestep
  832.     add     r19,r19,r19
  833.     lw      r18,ubasestep
  834.     lw      r17,d_ptexbasestep
  835.     lw      r16,d_sfracbasestep
  836.     lw      r15,d_tfracbasestep
  837. .ifdef    WOS
  838.     lw      r14,d_lightbasestep
  839.     lw      r13,d_zibasestep
  840. .endif
  841.  
  842. .sleloop:
  843.  
  844. #                d_pedgespanpackage->pdest = d_pdest;
  845. #                d_pedgespanpackage->pz = d_pz;
  846. #                d_pedgespanpackage->count = d_aspancount;
  847. #                d_pedgespanpackage->ptex = d_ptex;
  848. #
  849. #                d_pedgespanpackage->sfrac = d_sfrac;
  850. #                d_pedgespanpackage->tfrac = d_tfrac;
  851. #
  852. #                d_pedgespanpackage->light = d_light;
  853. #                d_pedgespanpackage->zi = d_zi;
  854. #
  855. #                d_pedgespanpackage++;
  856. #
  857. #                errorterm += erroradjustup;
  858. #                if (errorterm >= 0)
  859.  
  860.     stwu    r4,4(r3)
  861.     add.    r31,r31,r30
  862.     stwu    r5,4(r3)
  863.     stwu    r6,4(r3)
  864.     stwu    r7,4(r3)
  865.     stwu    r8,4(r3)
  866.     stwu    r9,4(r3)
  867.     stwu    r10,4(r3)
  868.     stwu    r11,4(r3)
  869.     blt     .sleelse
  870.  
  871. #                        d_pdest += d_pdestextrastep;
  872. #                        d_pz += d_pzextrastep;
  873. #                        d_aspancount += d_countextrastep;
  874. #                        d_ptex += d_ptexextrastep;
  875. #                        d_sfrac += d_sfracextrastep;
  876. #                        d_ptex += d_sfrac >> 16;
  877. #
  878. #                        d_sfrac &= 0xFFFF;
  879. #                        d_tfrac += d_tfracextrastep;
  880. #                        if (d_tfrac & 0x10000)
  881. #                        {
  882. #                                d_ptex += r_affinetridesc.skinwidth;
  883. #                                d_tfrac &= 0xFFFF;
  884. #                        }
  885. #                        d_light += d_lightextrastep;
  886. #                        d_zi += d_ziextrastep;
  887. #                        errorterm -= erroradjustdown;
  888.  
  889.     add     r8,r8,r24
  890.     add     r4,r4,r28
  891.     add     r5,r5,r27
  892.     add     r10,r10,r22
  893.     add     r11,r11,r21
  894.     add     r7,r7,r25
  895.     srawi   r0,r8,16
  896.     add     r6,r6,r26
  897.     add     r9,r9,r23
  898.     add     r7,r7,r0
  899.     andi.   r8,r8,0xffff
  900.     andis.  r0,r9,1
  901.     subf    r31,r29,r31
  902.     beq     .slenext
  903.     add     r7,r7,r12
  904.     andi.   r9,r9,0xffff
  905.     b       .slenext
  906. .sleelse:
  907.  
  908. #                        d_pdest += d_pdestbasestep;
  909. #                        d_pz += d_pzbasestep;
  910. #                        d_aspancount += ubasestep;
  911. #                        d_ptex += d_ptexbasestep;
  912. #                        d_sfrac += d_sfracbasestep;
  913. #                        d_ptex += d_sfrac >> 16;
  914. #                        d_sfrac &= 0xFFFF;
  915. #                        d_tfrac += d_tfracbasestep;
  916. #                        if (d_tfrac & 0x10000)
  917. #                        {
  918. #                                d_ptex += r_affinetridesc.skinwidth;
  919. #                                d_tfrac &= 0xFFFF;
  920. #                        }
  921. #                        d_light += d_lightbasestep;
  922. #                        d_zi += d_zibasestep;
  923.  
  924. .ifdef    WOS
  925.     add     r8,r8,r16
  926.     add     r4,r4,r20
  927.     add     r5,r5,r19
  928.     add     r10,r10,r14
  929.     add     r11,r11,r13
  930.     add     r7,r7,r17
  931. .else
  932.     lw      r0,d_lightbasestep
  933.     add     r8,r8,r16
  934.     add     r4,r4,r20
  935.     add     r10,r10,r0
  936.     lw      r0,d_zibasestep
  937.     add     r5,r5,r19
  938.     add     r7,r7,r17
  939.     add     r11,r11,r0
  940. .endif
  941.     srawi   r0,r8,16
  942.     add     r6,r6,r18
  943.     add     r9,r9,r15
  944.     add     r7,r7,r0
  945.     andi.   r8,r8,0xffff
  946.     andis.  r0,r9,1
  947.     beq     .slenext
  948.     add     r7,r7,r12
  949.     andi.   r9,r9,0xffff
  950. .slenext:
  951.     bdnz    .sleloop
  952.     addi    r3,r3,4
  953.     sw      r3,d_pedgespanpackage
  954.  
  955. .ifdef    WOS
  956.     lmw     r13,gb(r1)
  957. .else
  958.     lmw     r15,gb(r1)
  959. .endif
  960.     exit
  961.  
  962.     funcend    D_PolysetScanLeftEdge
  963.  
  964.  
  965.  
  966.  
  967. ###########################################################################
  968. #
  969. #       void D_DrawNonSubdiv (void)
  970. #
  971. ###########################################################################
  972.  
  973.     funcdef    D_DrawNonSubdiv
  974.  
  975.     init    0,0,9,0
  976.     stmw    r23,gb(r1)
  977.  
  978. #        pfv = r_affinetridesc.pfinalverts;
  979. #        ptri = r_affinetridesc.ptriangles;
  980. #        lnumtriangles = r_affinetridesc.numtriangles;
  981.  
  982.     lxa     r29,r_affinetridesc
  983.     lwz     r31,R_PFINALVERTS(r29)
  984.     lwz     r30,R_PTRIANGLES(r29)
  985.     lwz     r23,R_NUMTRIANGLES(r29)
  986.     lwz     r29,R_SEAMFIXUP16(r29)
  987.     lxa     r27,r_p0
  988.     lxa     r26,r_p1
  989.     lxa     r25,r_p2
  990.     lxa     r24,edgetables
  991. .nsloop:
  992.  
  993. #                index0 = pfv + ptri->vertindex[0];
  994. #                index1 = pfv + ptri->vertindex[1];
  995. #                index2 = pfv + ptri->vertindex[2];
  996. #
  997. #                d_xdenom = (index0->v[1]-index1->v[1]) *
  998. #                                (index0->v[0]-index2->v[0]) -
  999. #                                (index0->v[0]-index1->v[0])*(index0->v[1]-index2->v[1]);
  1000.  
  1001.     lwz     r6,MT_VERTINDEX+0*4(r30)
  1002.     slwi    r6,r6,FV_SIZEOF_EXP
  1003.     add     r7,r31,r6               #r7 = index0
  1004.     lwz     r6,MT_VERTINDEX+1*4(r30)
  1005.     slwi    r6,r6,FV_SIZEOF_EXP
  1006.     add     r8,r31,r6               #r8 = index1
  1007.     lwz     r6,MT_VERTINDEX+2*4(r30)
  1008.     slwi    r6,r6,FV_SIZEOF_EXP
  1009.     add     r9,r31,r6               #r9 = index2
  1010.     lwz     r3,0(r7)                #r3 = index0->v[0]
  1011.     lwz     r4,4(r7)                #r4 = index0->v[1]
  1012.     lwz     r5,0(r8)                #r5 = index1->v[0]
  1013.     lwz     r6,4(r8)                #r6 = index1->v[1]
  1014.     lwz     r10,0(r9)               #r10 = index2->v[0]
  1015.     lwz     r11,4(r9)               #r11 = index2->v[1]
  1016.     subf    r12,r10,r3
  1017.     subf    r0,r6,r4
  1018.     mullw   r12,r12,r0
  1019.     subf    r0,r5,r3
  1020.     subf    r28,r11,r4
  1021.     mullw   r28,r28,r0
  1022.  
  1023. #                if (d_xdenom >= 0)
  1024. #                {
  1025. #                        continue;
  1026. #                }
  1027.  
  1028.     subf.   r12,r28,r12
  1029.     bge     .nsnext
  1030.     sw      r12,d_xdenom
  1031.  
  1032. #                r_p0[0] = index0->v[0];         // u
  1033. #                r_p0[1] = index0->v[1];         // v
  1034. #                r_p0[2] = index0->v[2];         // s
  1035. #                r_p0[3] = index0->v[3];         // t
  1036. #                r_p0[4] = index0->v[4];         // light
  1037. #                r_p0[5] = index0->v[5];         // iz
  1038. #
  1039. #                r_p1[0] = index1->v[0];
  1040. #                r_p1[1] = index1->v[1];
  1041. #                r_p1[2] = index1->v[2];
  1042. #                r_p1[3] = index1->v[3];
  1043. #                r_p1[4] = index1->v[4];
  1044. #                r_p1[5] = index1->v[5];
  1045. #
  1046. #                r_p2[0] = index2->v[0];
  1047. #                r_p2[1] = index2->v[1];
  1048. #                r_p2[2] = index2->v[2];
  1049. #                r_p2[3] = index2->v[3];
  1050. #                r_p2[4] = index2->v[4];
  1051. #                r_p2[5] = index2->v[5];
  1052.  
  1053.     stw     r3,0(r27)
  1054.     stw     r4,4(r27)
  1055.     lwz     r12,12(r7)
  1056.     stw     r12,12(r27)
  1057.     lwz     r0,16(r7)
  1058.     stw     r0,16(r27)
  1059.     lwz     r12,20(r7)
  1060.     stw     r12,20(r27)
  1061.     stw     r5,0(r26)
  1062.     stw     r6,4(r26)
  1063.     lwz     r12,12(r8)
  1064.     stw     r12,12(r26)
  1065.     lwz     r0,16(r8)
  1066.     stw     r0,16(r26)
  1067.     lwz     r12,20(r8)
  1068.     stw     r12,20(r26)
  1069.     stw     r10,0(r25)
  1070.     stw     r11,4(r25)
  1071.     lwz     r3,MT_FACESFRONT(r30)
  1072.     lwz     r12,12(r9)
  1073.     stw     r12,12(r25)
  1074.     lwz     r0,16(r9)
  1075.     stw     r0,16(r25)
  1076.     lwz     r12,20(r9)
  1077.     stw     r12,20(r25)
  1078.  
  1079.     lwz     r5,8(r7)
  1080.     lwz     r12,8(r8)
  1081.     lwz     r10,8(r9)
  1082.  
  1083. #                if (!ptri->facesfront)
  1084. #                {
  1085. #                        if (index0->flags & ALIAS_ONSEAM)
  1086. #                                r_p0[2] += r_affinetridesc.seamfixupX16;
  1087. #                        if (index1->flags & ALIAS_ONSEAM)
  1088. #                                r_p1[2] += r_affinetridesc.seamfixupX16;
  1089. #                        if (index2->flags & ALIAS_ONSEAM)
  1090. #                                r_p2[2] += r_affinetridesc.seamfixupX16;
  1091. #                }
  1092.  
  1093.     mr.     r3,r3
  1094.     bne     .nscont
  1095.     lwz     r0,FV_FLAGS(r7)
  1096.     andi.   r0,r0,ALIAS_ONSEAM
  1097.     beq     .ns1
  1098.     add     r5,r5,r29
  1099. .ns1:
  1100.     lwz     r0,FV_FLAGS(r8)
  1101.     andi.   r0,r0,ALIAS_ONSEAM
  1102.     beq     .ns2
  1103.     add     r12,r12,r29
  1104. .ns2:
  1105.     lwz     r0,FV_FLAGS(r9)
  1106.     andi.   r0,r0,ALIAS_ONSEAM
  1107.     beq     .nscont
  1108.     add     r10,r10,r29
  1109. .nscont:
  1110.     stw     r5,8(r27)
  1111.     stw     r12,8(r26)
  1112.     stw     r10,8(r25)
  1113.  
  1114. ######  D_PolysetSetEdgeTable (inlined)
  1115.  
  1116.     cmpw    r4,r6
  1117.     blt     .nslt1
  1118.     beq     .nseq1
  1119. .nsgt1:
  1120.     li      r3,EDGETABLE_SIZEOF
  1121.     cmpw    cr1,r4,r11
  1122.     beq     cr1,.nseq2
  1123.     cmpw    r6,r11
  1124.     beq     .nseq3
  1125.     ble     cr1,.nsskip
  1126.     addi    r3,r3,2*EDGETABLE_SIZEOF
  1127. .nsskip:
  1128.     ble     .nsskip2
  1129.     addi    r3,r3,4*EDGETABLE_SIZEOF
  1130. .nsskip2:
  1131.     add     r3,r3,r24
  1132.     sw      r3,pedgetable
  1133.     b       .nsdone
  1134. .nseq2:
  1135.     addi    r3,r24,8*EDGETABLE_SIZEOF
  1136.     sw      r3,pedgetable
  1137.     b       .nsdone
  1138. .nseq3:
  1139.     addi    r3,r24,10*EDGETABLE_SIZEOF
  1140.     sw      r3,pedgetable
  1141.     b       .nsdone
  1142. .nseq1:
  1143.     cmpw    r4,r11
  1144.     bge     .nsge
  1145.     addi    r3,r24,2*EDGETABLE_SIZEOF
  1146.     sw      r3,pedgetable
  1147.     b       .nsdone
  1148. .nsge:
  1149.     addi    r3,r24,5*EDGETABLE_SIZEOF
  1150.     sw      r3,pedgetable
  1151.     b       .nsdone
  1152. .nslt1:
  1153.     li      r3,0
  1154.     cmpw    cr1,r4,r11
  1155.     beq     cr1,.nseq4
  1156.     cmpw    r6,r11
  1157.     beq     .nseq5
  1158.     ble     cr1,.nsskip3
  1159.     addi    r3,r3,2*EDGETABLE_SIZEOF
  1160. .nsskip3:
  1161.     ble     .nsskip4
  1162.     addi    r3,r3,4*EDGETABLE_SIZEOF
  1163. .nsskip4:
  1164.     add     r3,r3,r24
  1165.     sw      r3,pedgetable
  1166.     b       .nsdone
  1167. .nseq4:
  1168.     addi    r3,r24,9*EDGETABLE_SIZEOF
  1169.     sw      r3,pedgetable
  1170.     b       .nsdone
  1171. .nseq5:
  1172.     addi    r3,r24,11*EDGETABLE_SIZEOF
  1173.     sw      r3,pedgetable
  1174. .nsdone:
  1175.  
  1176. ######  end of D_PolysetSetEdgeTable
  1177.  
  1178.     call    D_RasterizeAliasPolySmooth
  1179. .nsnext:
  1180.     subic.  r23,r23,1
  1181.     la      r30,MT_SIZEOF(r30)
  1182.     bne     .nsloop
  1183.  
  1184.     lmw    r23,gb(r1)
  1185.     exit
  1186.  
  1187.     funcend    D_DrawNonSubdiv
  1188.  
  1189.  
  1190.  
  1191.  
  1192. ###########################################################################
  1193. #
  1194. #       void D_DrawSubdiv (void)
  1195. #
  1196. ###########################################################################
  1197.  
  1198.     funcdef    D_DrawSubdiv
  1199.  
  1200.     init    0,0,11,0
  1201.     stmw    r21,gb(r1)
  1202.  
  1203. #        pfv = r_affinetridesc.pfinalverts;
  1204. #        ptri = r_affinetridesc.ptriangles;
  1205. #        lnumtriangles = r_affinetridesc.numtriangles;
  1206.  
  1207.     lxa     r29,r_affinetridesc
  1208.     lwz     r31,R_PFINALVERTS(r29)
  1209.     lwz     r30,R_PTRIANGLES(r29)
  1210.     lwz     r21,R_NUMTRIANGLES(r29)
  1211.     lwz     r29,R_SEAMFIXUP16(r29)
  1212.     lw      r25,acolormap
  1213. .sdloop:
  1214.  
  1215. #                index0 = pfv + ptri->vertindex[0];
  1216. #                index1 = pfv + ptri->vertindex[1];
  1217. #                index2 = pfv + ptri->vertindex[2];
  1218. #
  1219. #               if (((index0->v[1]-index1->v[1]) *
  1220. #                                (index0->v[0]-index2->v[0]) -
  1221. #                                (index0->v[0]-index1->v[0])*(index0->v[1]-index2->v[1]);
  1222.  
  1223.     lwz     r6,MT_VERTINDEX+0*4(r30)
  1224.     slwi    r6,r6,FV_SIZEOF_EXP
  1225.     add     r28,r31,r6              #r28 = index0
  1226.     lwz     r6,MT_VERTINDEX+1*4(r30)
  1227.     slwi    r6,r6,FV_SIZEOF_EXP
  1228.     add     r27,r31,r6              #r27 = index1
  1229.     lwz     r6,MT_VERTINDEX+2*4(r30)
  1230.     slwi    r6,r6,FV_SIZEOF_EXP
  1231.     add     r26,r31,r6              #r26 = index2
  1232.     lwz     r3,0(r28)               #r3 = index0->v[0]
  1233.     lwz     r4,4(r28)               #r4 = index0->v[1]
  1234.     lwz     r5,0(r27)               #r5 = index1->v[0]
  1235.     lwz     r6,4(r27)               #r6 = index1->v[1]
  1236.     lwz     r10,0(r26)              #r10 = index2->v[0]
  1237.     lwz     r11,4(r26)              #r11 = index2->v[1]
  1238.     subf    r12,r10,r3
  1239.     subf    r0,r6,r4
  1240.     mullw   r12,r12,r0
  1241.     subf    r0,r5,r3
  1242.     subf    r7,r11,r4
  1243.     mullw   r7,r7,r0
  1244.     subf.   r12,r7,r12
  1245.     bge     .sdnext
  1246.     lwz     r3,MT_FACESFRONT(r30)
  1247.     lwz     r8,16(r28)
  1248.     andi.   r8,r8,0xff00
  1249.     add     r9,r25,r8
  1250.     sw      r9,d_pcolormap
  1251.     mr.     r3,r3
  1252.     beq     .sdelse
  1253.     mr      r3,r28
  1254.     mr      r4,r27
  1255.     mr      r5,r26
  1256.     call    D_PolysetRecursiveTriangle
  1257.     b       .sdnext
  1258. .sdelse:
  1259.     lwz     r24,8(r28)              #s0
  1260.     lwz     r23,8(r27)              #s1
  1261.     lwz     r22,8(r26)              #s2
  1262.     lwz     r0,FV_FLAGS(r28)
  1263.     andi.   r0,r0,ALIAS_ONSEAM
  1264.     beq     .sd1
  1265.     add     r5,r24,r29
  1266.     stw     r5,8(r28)
  1267. .sd1:
  1268.     lwz     r0,FV_FLAGS(r27)
  1269.     andi.   r0,r0,ALIAS_ONSEAM
  1270.     beq     .sd2
  1271.     add     r5,r23,r29
  1272.     stw     r5,8(r27)
  1273. .sd2:
  1274.     lwz     r0,FV_FLAGS(r26)
  1275.     andi.   r0,r0,ALIAS_ONSEAM
  1276.     beq     .sdcont
  1277.     add     r5,r22,r29
  1278.     stw     r5,8(r26)
  1279. .sdcont:
  1280.     mr      r3,r28
  1281.     mr      r4,r27
  1282.     mr      r5,r26
  1283.     call    D_PolysetRecursiveTriangle
  1284.     stw     r24,8(r28)
  1285.     stw     r23,8(r27)
  1286.     stw     r22,8(r26)
  1287. .sdnext:
  1288.     subic.  r21,r21,1
  1289.     la      r30,MT_SIZEOF(r30)
  1290.     bne     .sdloop
  1291.  
  1292.     lmw    r21,gb(r1)
  1293.     exit
  1294.  
  1295.     funcend    D_DrawSubdiv
  1296.  
  1297.  
  1298.  
  1299.  
  1300. .ifdef    WOS
  1301.     .tocd
  1302. @__adivtab:
  1303.     .long    _adivtab
  1304. .endif
  1305.     .data
  1306.  
  1307. lab adivtab
  1308.     .long    1,0,1,-1,1,-2,1,-3,1,-4,1
  1309.     .long    -5,1,-6,1,-7,2,-1,2,-3,3,0
  1310.     .long    3,-3,5,0,7,-1,15,0,0,0,-15
  1311.     .long    0,-8,1,-5,0,-4,1,-3,0,-3,3
  1312.     .long    -3,6,-2,1,-2,3,-2,5,-2,7,-2
  1313.     .long    9,-2,11,-2,13,-1,0,-1,1,0,-14
  1314.     .long    1,0,1,-1,1,-2,1,-3,1,-4,1
  1315.     .long    -5,1,-6,2,0,2,-2,2,-4,3,-2
  1316.     .long    4,-2,7,0,14,0,0,0,-14,0,-7
  1317.     .long    0,-5,1,-4,2,-3,1,-3,4,-2,0
  1318.     .long    -2,2,-2,4,-2,6,-2,8,-2,10,-2
  1319.     .long    12,-1,0,-1,1,-1,2,0,-13,0,-13
  1320.     .long    1,0,1,-1,1,-2,1,-3,1,-4,1
  1321.     .long    -5,1,-6,2,-1,2,-3,3,-1,4,-1
  1322.     .long    6,-1,13,0,0,0,-13,0,-7,1,-5
  1323.     .long    2,-4,3,-3,2,-3,5,-2,1,-2,3
  1324.     .long    -2,5,-2,7,-2,9,-2,11,-1,0,-1
  1325.     .long    1,-1,2,-1,3,0,-12,0,-12,0,-12
  1326.     .long    1,0,1,-1,1,-2,1,-3,1,-4,1
  1327.     .long    -5,2,0,2,-2,3,0,4,0,6,0
  1328.     .long    12,0,0,0,-12,0,-6,0,-4,0,-3
  1329.     .long    0,-3,3,-2,0,-2,2,-2,4,-2,6
  1330.     .long    -2,8,-2,10,-1,0,-1,1,-1,2,-1
  1331.     .long    3,-1,4,0,-11,0,-11,0,-11,0,-11
  1332.     .long    1,0,1,-1,1,-2,1,-3,1,-4,1
  1333.     .long    -5,2,-1,2,-3,3,-2,5,-1,11,0
  1334.     .long    0,0,-11,0,-6,1,-4,1,-3,1,-3
  1335.     .long    4,-2,1,-2,3,-2,5,-2,7,-2,9
  1336.     .long    -1,0,-1,1,-1,2,-1,3,-1,4,-1
  1337.     .long    5,0,-10,0,-10,0,-10,0,-10,0,-10
  1338.     .long    1,0,1,-1,1,-2,1,-3,1,-4,2
  1339.     .long    0,2,-2,3,-1,5,0,10,0,0,0
  1340.     .long    -10,0,-5,0,-4,2,-3,2,-2,0,-2
  1341.     .long    2,-2,4,-2,6,-2,8,-1,0,-1,1
  1342.     .long    -1,2,-1,3,-1,4,-1,5,-1,6,0
  1343.     .long    -9,0,-9,0,-9,0,-9,0,-9,0,-9
  1344.     .long    1,0,1,-1,1,-2,1,-3,1,-4,2
  1345.     .long    -1,3,0,4,-1,9,0,0,0,-9,0
  1346.     .long    -5,1,-3,0,-3,3,-2,1,-2,3,-2
  1347.     .long    5,-2,7,-1,0,-1,1,-1,2,-1,3
  1348.     .long    -1,4,-1,5,-1,6,-1,7,0,-8,0
  1349.     .long    -8,0,-8,0,-8,0,-8,0,-8,0,-8
  1350.     .long    1,0,1,-1,1,-2,1,-3,2,0,2
  1351.     .long    -2,4,0,8,0,0,0,-8,0,-4,0
  1352.     .long    -3,1,-2,0,-2,2,-2,4,-2,6,-1
  1353.     .long    0,-1,1,-1,2,-1,3,-1,4,-1,5
  1354.     .long    -1,6,-1,7,-1,8,0,-7,0,-7,0
  1355.     .long    -7,0,-7,0,-7,0,-7,0,-7,0,-7
  1356.     .long    1,0,1,-1,1,-2,1,-3,2,-1,3
  1357.     .long    -1,7,0,0,0,-7,0,-4,1,-3,2
  1358.     .long    -2,1,-2,3,-2,5,-1,0,-1,1,-1
  1359.     .long    2,-1,3,-1,4,-1,5,-1,6,-1,7
  1360.     .long    -1,8,-1,9,0,-6,0,-6,0,-6,0
  1361.     .long    -6,0,-6,0,-6,0,-6,0,-6,0,-6
  1362.     .long    1,0,1,-1,1,-2,2,0,3,0,6
  1363.     .long    0,0,0,-6,0,-3,0,-2,0,-2,2
  1364.     .long    -2,4,-1,0,-1,1,-1,2,-1,3,-1
  1365.     .long    4,-1,5,-1,6,-1,7,-1,8,-1,9
  1366.     .long    -1,10,0,-5,0,-5,0,-5,0,-5,0
  1367.     .long    -5,0,-5,0,-5,0,-5,0,-5,0,-5
  1368.     .long    1,0,1,-1,1,-2,2,-1,5,0,0
  1369.     .long    0,-5,0,-3,1,-2,1,-2,3,-1,0
  1370.     .long    -1,1,-1,2,-1,3,-1,4,-1,5,-1
  1371.     .long    6,-1,7,-1,8,-1,9,-1,10,-1,11
  1372.     .long    0,-4,0,-4,0,-4,0,-4,0,-4,0
  1373.     .long    -4,0,-4,0,-4,0,-4,0,-4,0,-4
  1374.     .long    1,0,1,-1,2,0,4,0,0,0,-4
  1375.     .long    0,-2,0,-2,2,-1,0,-1,1,-1,2
  1376.     .long    -1,3,-1,4,-1,5,-1,6,-1,7,-1
  1377.     .long    8,-1,9,-1,10,-1,11,-1,12,0,-3
  1378.     .long    0,-3,0,-3,0,-3,0,-3,0,-3,0
  1379.     .long    -3,0,-3,0,-3,0,-3,0,-3,0,-3
  1380.     .long    1,0,1,-1,3,0,0,0,-3,0,-2
  1381.     .long    1,-1,0,-1,1,-1,2,-1,3,-1,4
  1382.     .long    -1,5,-1,6,-1,7,-1,8,-1,9,-1
  1383.     .long    10,-1,11,-1,12,-1,13,0,-2,0,-2
  1384.     .long    0,-2,0,-2,0,-2,0,-2,0,-2,0
  1385.     .long    -2,0,-2,0,-2,0,-2,0,-2,0,-2
  1386.     .long    1,0,2,0,0,0,-2,0,-1,0,-1
  1387.     .long    1,-1,2,-1,3,-1,4,-1,5,-1,6
  1388.     .long    -1,7,-1,8,-1,9,-1,10,-1,11,-1
  1389.     .long    12,-1,13,-1,14,0,-1,0,-1,0,-1
  1390.     .long    0,-1,0,-1,0,-1,0,-1,0,-1,0
  1391.     .long    -1,0,-1,0,-1,0,-1,0,-1,0,-1
  1392.     .long    1,0,0,0,-1,0,-1,1,-1,2,-1
  1393.     .long    3,-1,4,-1,5,-1,6,-1,7,-1,8
  1394.     .long    -1,9,-1,10,-1,11,-1,12,-1,13,-1
  1395.     .long    14,-1,15,0,0,0,0,0,0,0,0
  1396.     .long    0,0,0,0,0,0,0,0,0,0,0
  1397.     .long    0,0,0,0,0,0,0,0,0,0,0
  1398.     .long    0,0,0,0,0,0,0,0,0,0,0
  1399.     .long    0,0,0,0,0,0,0,0,0,0,0
  1400.     .long    0,0,0,0,0,0,0,0,0,0,0
  1401.     .long    0,-1,-14,-1,-13,-1,-12,-1,-11,-1,-10
  1402.     .long    -1,-9,-1,-8,-1,-7,-1,-6,-1,-5,-1
  1403.     .long    -4,-1,-3,-1,-2,-1,-1,-1,0,0,0
  1404.     .long    1,0,0,1,0,1,0,1,0,1,0
  1405.     .long    1,0,1,0,1,0,1,0,1,0,1
  1406.     .long    0,1,0,1,0,1,0,1,0,1,-1
  1407.     .long    -13,-1,-12,-1,-11,-1,-10,-1,-9,-1,-8
  1408.     .long    -1,-7,-1,-6,-1,-5,-1,-4,-1,-3,-1
  1409.     .long    -2,-1,-1,-1,0,-2,0,0,0,2,0
  1410.     .long    1,0,0,2,0,2,0,2,0,2,0
  1411.     .long    2,0,2,0,2,0,2,0,2,0,2
  1412.     .long    0,2,0,2,0,2,0,2,-1,-12,-1
  1413.     .long    -11,-1,-10,-1,-9,-1,-8,-1,-7,-1,-6
  1414.     .long    -1,-5,-1,-4,-1,-3,-1,-2,-1,-1,-1
  1415.     .long    0,-2,-1,-3,0,0,0,3,0,1,1
  1416.     .long    1,0,0,3,0,3,0,3,0,3,0
  1417.     .long    3,0,3,0,3,0,3,0,3,0,3
  1418.     .long    0,3,0,3,0,3,-1,-11,-1,-10,-1
  1419.     .long    -9,-1,-8,-1,-7,-1,-6,-1,-5,-1,-4
  1420.     .long    -1,-3,-1,-2,-1,-1,-1,0,-2,-2,-2
  1421.     .long    0,-4,0,0,0,4,0,2,0,1,1
  1422.     .long    1,0,0,4,0,4,0,4,0,4,0
  1423.     .long    4,0,4,0,4,0,4,0,4,0,4
  1424.     .long    0,4,0,4,-1,-10,-1,-9,-1,-8,-1
  1425.     .long    -7,-1,-6,-1,-5,-1,-4,-1,-3,-1,-2
  1426.     .long    -1,-1,-1,0,-2,-3,-2,-1,-3,-1,-5
  1427.     .long    0,0,0,5,0,2,1,1,2,1,1
  1428.     .long    1,0,0,5,0,5,0,5,0,5,0
  1429.     .long    5,0,5,0,5,0,5,0,5,0,5
  1430.     .long    0,5,-1,-9,-1,-8,-1,-7,-1,-6,-1
  1431.     .long    -5,-1,-4,-1,-3,-1,-2,-1,-1,-1,0
  1432.     .long    -2,-4,-2,-2,-2,0,-3,0,-6,0,0
  1433.     .long    0,6,0,3,0,2,0,1,2,1,1
  1434.     .long    1,0,0,6,0,6,0,6,0,6,0
  1435.     .long    6,0,6,0,6,0,6,0,6,0,6
  1436.     .long    -1,-8,-1,-7,-1,-6,-1,-5,-1,-4,-1
  1437.     .long    -3,-1,-2,-1,-1,-1,0,-2,-5,-2,-3
  1438.     .long    -2,-1,-3,-2,-4,-1,-7,0,0,0,7
  1439.     .long    0,3,1,2,1,1,3,1,2,1,1
  1440.     .long    1,0,0,7,0,7,0,7,0,7,0
  1441.     .long    7,0,7,0,7,0,7,0,7,-1,-7
  1442.     .long    -1,-6,-1,-5,-1,-4,-1,-3,-1,-2,-1
  1443.     .long    -1,-1,0,-2,-6,-2,-4,-2,-2,-2,0
  1444.     .long    -3,-1,-4,0,-8,0,0,0,8,0,4
  1445.     .long    0,2,2,2,0,1,3,1,2,1,1
  1446.     .long    1,0,0,8,0,8,0,8,0,8,0
  1447.     .long    8,0,8,0,8,0,8,-1,-6,-1,-5
  1448.     .long    -1,-4,-1,-3,-1,-2,-1,-1,-1,0,-2
  1449.     .long    -7,-2,-5,-2,-3,-2,-1,-3,-3,-3,0
  1450.     .long    -5,-1,-9,0,0,0,9,0,4,1,3
  1451.     .long    0,2,1,1,4,1,3,1,2,1,1
  1452.     .long    1,0,0,9,0,9,0,9,0,9,0
  1453.     .long    9,0,9,0,9,-1,-5,-1,-4,-1,-3
  1454.     .long    -1,-2,-1,-1,-1,0,-2,-8,-2,-6,-2
  1455.     .long    -4,-2,-2,-2,0,-3,-2,-4,-2,-5,0
  1456.     .long    -10,0,0,0,10,0,5,0,3,1,2
  1457.     .long    2,2,0,1,4,1,3,1,2,1,1
  1458.     .long    1,0,0,10,0,10,0,10,0,10,0
  1459.     .long    10,0,10,-1,-4,-1,-3,-1,-2,-1,-1
  1460.     .long    -1,0,-2,-9,-2,-7,-2,-5,-2,-3,-2
  1461.     .long    -1,-3,-4,-3,-1,-4,-1,-6,-1,-11,0
  1462.     .long    0,0,11,0,5,1,3,2,2,3,2
  1463.     .long    1,1,5,1,4,1,3,1,2,1,1
  1464.     .long    1,0,0,11,0,11,0,11,0,11,0
  1465.     .long    11,-1,-3,-1,-2,-1,-1,-1,0,-2,-10
  1466.     .long    -2,-8,-2,-6,-2,-4,-2,-2,-2,0,-3
  1467.     .long    -3,-3,0,-4,0,-6,0,-12,0,0,0
  1468.     .long    12,0,6,0,4,0,3,0,2,2,2
  1469.     .long    0,1,5,1,4,1,3,1,2,1,1
  1470.     .long    1,0,0,12,0,12,0,12,0,12,-1
  1471.     .long    -2,-1,-1,-1,0,-2,-11,-2,-9,-2,-7
  1472.     .long    -2,-5,-2,-3,-2,-1,-3,-5,-3,-2,-4
  1473.     .long    -3,-5,-2,-7,-1,-13,0,0,0,13,0
  1474.     .long    6,1,4,1,3,1,2,3,2,1,1
  1475.     .long    6,1,5,1,4,1,3,1,2,1,1
  1476.     .long    1,0,0,13,0,13,0,13,-1,-1,-1
  1477.     .long    0,-2,-12,-2,-10,-2,-8,-2,-6,-2,-4
  1478.     .long    -2,-2,-2,0,-3,-4,-3,-1,-4,-2,-5
  1479.     .long    -1,-7,0,-14,0,0,0,14,0,7,0
  1480.     .long    4,2,3,2,2,4,2,2,2,0,1
  1481.     .long    6,1,5,1,4,1,3,1,2,1,1
  1482.     .long    1,0,0,14,0,14,-1,0,-2,-13,-2
  1483.     .long    -11,-2,-9,-2,-7,-2,-5,-2,-3,-2,-1
  1484.     .long    -3,-6,-3,-3,-3,0,-4,-1,-5,0,-8
  1485.     .long    -1,-15,0,0,0,15,0,7,1,5,0
  1486.     .long    3,3,3,0,2,3,2,1,1,7,1
  1487.     .long    6,1,5,1,4,1,3,1,2,1,1
  1488.     .long    1,0,0,15,-2,-14,-2,-12,-2,-10,-2
  1489.     .long    -8,-2,-6,-2,-4,-2,-2,-2,0,-3,-5
  1490.     .long    -3,-2,-4,-4,-4,0,-6,-2,-8,0,-16
  1491.     .long    0,0,0,16,0,8,0,5,1,4,0
  1492.     .long    3,1,2,4,2,2,2,0,1,7,1
  1493.     .long    6,1,5,1,4,1,3,1,2,1,1
  1494.     .long    1,0
  1495.  
  1496.