home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 113 / EnigmaAmiga113CD.iso / software / sviluppo / quakeworld_src / client / r_bsp68k.s < prev    next >
Encoding:
Text File  |  2000-06-17  |  20.8 KB  |  765 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. ** r_bsp.c assembler implementations by Frank Wille <frank@phoenix.owl.de>
  17. **
  18.  
  19.         XREF    _r_visframecount
  20.         XREF    _r_framecount
  21.         XREF    _r_currentkey
  22.         XREF    _r_drawpolys
  23.         XREF    _r_worldpolysbacktofront
  24.         XREF    _pbtofpolys
  25.         XREF    _numbtofpolys
  26.         XREF    _pfrustum_indexes
  27.         XREF    _modelorg
  28.         XREF    _vpn
  29.         XREF    _vright
  30.         XREF    _vup
  31.         XREF    _cl
  32.         XREF    _view_clipplanes
  33.         XREF    _currententity
  34.         XREF    _screenedge
  35.         XREF    _entity_rotation
  36.  
  37.         XREF    _R_StoreEfrags
  38.         XREF    _R_RenderPoly
  39.         XREF    _R_RenderFace
  40.  
  41.         XDEF    _R_RotateBmodel
  42.         XDEF    _R_RecursiveWorldNode
  43.  
  44.  
  45.  
  46. CONTENTS_SOLID          =       -2              ;bspfile.h
  47. PLANE_X                 =       0
  48. PLANE_Y                 =       1
  49. PLANE_Z                 =       2
  50. SURF_PLANEBACK          =       2
  51. BACKFACE_EPSILON        equ.s   0.01            ;r_local.h
  52. MAX_BTOFPOLYS           =       5000
  53. PITCH                   =       0
  54. YAW                     =       1
  55. ROLL                    =       2
  56.  
  57. CLIP_NORMAL             =       0
  58. CLIP_DIST               =       12
  59. CLIP_NEXT               =       16
  60. CLIP_LEFTEDGE           =       20
  61. CLIP_RIGHTEDGE          =       21
  62. CLIP_RESERVED           =       22
  63. CLIP_SIZEOF             =       24
  64.  
  65. NODE_CONTENTS           =       0
  66. NODE_VISFRAME           =       4
  67. NODE_MINMAXS            =       8
  68. NODE_PARENT             =       20
  69. NODE_PLANE              =       24
  70. NODE_CHILDREN           =       28
  71. NODE_FIRSTSURFACE       =       36
  72. NODE_NUMSURFACES        =       38
  73.  
  74. LEAF_CONTENTS           =       0
  75. LEAF_VISFRAME           =       4
  76. LEAF_MINMAXS            =       8
  77. LEAF_PARENT             =       20
  78. LEAF_COMPRESSED_VIS     =       24
  79. LEAF_EFRAGS             =       28
  80. LEAF_FIRSTMARKSURFACE   =       32
  81. LEAF_NUMMARKSURFACES    =       36
  82. LEAF_KEY                =       40
  83.  
  84. MSURFACE_VISFRAME       =       0
  85. MSURFACE_DLIGHTFRAME    =       4
  86. MSURFACE_DLIGHTBITS     =       8
  87. MSURFACE_PLANE          =       12
  88. MSURFACE_FLAGS          =       16
  89. MSURFACE_FIRSTEDGE      =       20
  90. MSURFACE_NUMEDGES       =       24
  91. MSURFACE_CACHESPOTS     =       28
  92. MSURFACE_TEXTUREMINS    =       44
  93. MSURFACE_EXTENTS        =       48
  94. MSURFACE_TEXINFO        =       52
  95. MSURFACE_STYLES         =       56
  96. MSURFACE_SAMPLES        =       60
  97. MSURFACE_SIZEOF_EXP     =       6
  98. MSURFACE_SIZEOF         =       (1<<MSURFACE_SIZEOF_EXP)
  99.  
  100. MPLANE_NORMAL           =       0
  101. MPLANE_DIST             =       12
  102. MPLANE_TYPE             =       16
  103. MPLANE_SIGNBITS         =       17
  104. MPLANE_SIZEOF           =       20
  105.  
  106. ENTITY_KEYNUM        =    0
  107. ENTITY_ORIGIN        =    4
  108. ENTITY_ANGLES        =    16
  109. ENTITY_MODEL        =    28
  110. ENTITY_FRAME        =    32
  111. ENTITY_COLORMAP        =    36
  112. ENTITY_SKINNUM        =    40
  113. ENTITY_SCOREBOARD    =    44
  114. ENTITY_SYNCBASE        =    48
  115. ENTITY_EFRAG        =    52
  116. ENTITY_VISFRAME        =    56
  117. ENTITY_DLIGHTFRAME    =    60
  118. ENTITY_DLIGHTBITS    =    64
  119. ENTITY_TRIVIAL_ACCEPT    =    68
  120. ENTITY_TOPNODE        =    72
  121. ENTITY_SIZEOF           =       76
  122.  
  123. BTOFPOLY_CLIPFLAGS      =       0
  124. BTOFPOLY_PSURF          =       4
  125.  
  126. CL_WORLDMODEL           =       469172
  127. MODEL_SURFACES          =       208
  128.  
  129.  
  130.  
  131.  
  132.  
  133.  
  134.  
  135. ******************************************************************************
  136. *
  137. *       void _R_RotateBmodel (void)
  138. *
  139. ******************************************************************************
  140.  
  141.         cnop    0,4
  142. _R_RotateBmodel
  143.  
  144.         movem.l a2/a3,-(sp)
  145.         fmovem.x        fp2-fp7,-(sp)
  146.         lea     -9*4(sp),sp
  147.         move.l  sp,a2                   ;a2 -> temp2
  148.         lea     _entity_rotation,a3
  149.         move.l  _currententity,a0
  150.         lea     sincostab,a1
  151.         fmove.s #8,fp7
  152.         fmove.s ENTITY_ANGLES+YAW*4(a0),fp0
  153.         fmul    fp7,fp0
  154.         fmove.l fp0,d0                  ;d0 = angle
  155.         fmove.s 0(a1,d0.l*8),fp0
  156.         fmove.s 4(a1,d0.l*8),fp1
  157.         fmove.s ENTITY_ANGLES+PITCH*4(a0),fp2
  158.         fmul    fp7,fp2
  159.         fmove.l fp2,d0                  ;d0 = angle
  160.         fmove.s 0(a1,d0.l*8),fp2
  161.         fmove.s 4(a1,d0.l*8),fp3
  162.         fmove   fp3,fp5
  163.         fmul    fp1,fp5
  164.         fmove.s fp5,(a3)
  165.         fmove   fp3,fp4
  166.         fmul    fp0,fp4
  167.         fmove.s fp4,4(a2)
  168.         fneg    fp2
  169.         fmove.s fp2,8(a2)
  170.         fneg    fp2
  171.         fneg    fp0
  172.         fmove.s fp0,12(a3)
  173.         fneg    fp0
  174.         fmove   fp1,fp5
  175.         fmove   fp2,fp4
  176.         fmul    fp1,fp4
  177.         fmove.s fp4,24(a3)
  178.         fmove   fp2,fp4
  179.         fmul    fp0,fp4
  180.         fmove.s fp4,28(a2)
  181.         fmove.s fp3,32(a2)
  182.         fmove.s ENTITY_ANGLES+ROLL*4(a0),fp6
  183.         fmul    fp7,fp6
  184.         fmove.l fp6,d0                  ;d0 = angle
  185.         fmove.s 0(a1,d0.l*8),fp6
  186.         fmove.s 4(a1,d0.l*8),fp7
  187.         fmove.s 4(a2),fp0
  188.         fmove.s 8(a2),fp1
  189.         fmove   fp0,fp2
  190.         fmul    fp7,fp2
  191.         fmove   fp1,fp3
  192.         fmul    fp6,fp3
  193.         fsub    fp3,fp2
  194.         fmove.s fp2,4(a3)
  195.         fmul    fp6,fp0
  196.         fmul    fp7,fp1
  197.         fadd    fp1,fp0
  198.         fmove.s fp0,8(a3)
  199.         fmove   fp5,fp0
  200.         fmul    fp7,fp0
  201.         fmove.s fp0,16(a3)
  202.         fmul    fp6,fp5
  203.         fmove.s fp5,20(a3)
  204.         fmove.s 28(a2),fp0
  205.         fmove.s 32(a2),fp1
  206.         fmove   fp0,fp2
  207.         fmul    fp7,fp2
  208.         fmove   fp1,fp3
  209.         fmul    fp6,fp3
  210.         fsub    fp3,fp2
  211.         fmove.s fp2,28(a3)
  212.         fmul    fp6,fp0
  213.         fmul    fp7,fp1
  214.         fadd    fp1,fp0
  215.         fmove.s fp0,32(a3)
  216.  
  217.         fmove.s (a3)+,fp0
  218.         fmove.s (a3)+,fp1
  219.         fmove.s (a3)+,fp2
  220.  
  221. *        R_EntityRotate (modelorg);
  222. *        R_EntityRotate (vpn);
  223. *        R_EntityRotate (vright);
  224. *        R_EntityRotate (vup);
  225.  
  226.         lea     _modelorg,a0
  227.         bsr     EntityRotate
  228.         lea     -(36-12)(a3),a3
  229.         lea     _vpn,a0
  230.         bsr     EntityRotate
  231.         lea     -(36-12)(a3),a3
  232.         lea     _vright,a0
  233.         bsr     EntityRotate
  234.         lea     -(36-12)(a3),a3
  235.         lea     _vup,a0
  236.         bsr     EntityRotate
  237.  
  238. ****** R_TransformFrustum (inlined)
  239.  
  240.         moveq   #4-1,d0
  241.         lea     _screenedge,a0
  242.         lea     _view_clipplanes,a1
  243.         lea     _modelorg,a3
  244.         fmove.s (a3)+,fp7
  245. .loop
  246.         fmove.s (a0)+,fp1
  247.         fneg    fp1
  248.         fmove.s (a0)+,fp2
  249.         fmove.s (a0)+,fp0
  250.         lea     _vright,a2
  251.         fmove.s (a2)+,fp3
  252.         fmove.s (a2)+,fp4
  253.         fmove.s (a2)+,fp5
  254.         fmul    fp1,fp3
  255.         fmul    fp1,fp4
  256.         fmul    fp1,fp5
  257.         lea     _vup,a2
  258.         fmove.s (a2)+,fp6
  259.         fmul    fp2,fp6
  260.         fadd    fp6,fp3
  261.         fmove.s (a2)+,fp6
  262.         fmul    fp2,fp6
  263.         fadd    fp6,fp4
  264.         fmove.s (a2)+,fp6
  265.         fmul    fp2,fp6
  266.         fadd    fp6,fp5
  267.         lea     _vpn,a2
  268.         fmove.s (a2)+,fp6
  269.         fmul    fp0,fp6
  270.         fadd    fp6,fp3
  271.         fmove.s fp3,(a1)+
  272.         fmove.s (a2)+,fp6
  273.         fmul    fp0,fp6
  274.         fadd    fp6,fp4
  275.         fmove.s fp4,(a1)+
  276.         fmove.s (a2)+,fp6
  277.         fmul    fp0,fp6
  278.         fadd    fp6,fp5
  279.         fmove.s fp5,(a1)+
  280.  
  281.         fmul    fp7,fp3
  282.         fmul.s  (a3),fp4
  283.         fadd    fp4,fp3
  284.         fmul.s  4(a3),fp5
  285.         fadd    fp5,fp3
  286.         fmove.s fp3,(a1)+
  287.         lea     CLIP_SIZEOF-16(a1),a1
  288.         lea     MPLANE_SIZEOF-12(a0),a0
  289.         dbra    d0,.loop
  290.  
  291. ******  end of R_TransformFrustum
  292.  
  293.         lea     9*4(sp),sp
  294.         fmovem.x        (sp)+,fp2-fp7
  295.         movem.l (sp)+,a2/a3
  296.         rts
  297.  
  298. ******  EntityRotate (inlined)
  299.  
  300. EntityRotate
  301.         fmove.s (a0)+,fp3
  302.         fmove.s (a0)+,fp4
  303.         fmove.s (a0)+,fp5
  304.         lea     -12(a0),a0
  305.         fmove   fp3,fp6
  306.         fmul    fp0,fp6
  307.         fmove   fp4,fp7
  308.         fmul    fp1,fp7
  309.         fadd    fp7,fp6
  310.         fmove   fp5,fp7
  311.         fmul    fp2,fp7
  312.         fadd    fp7,fp6
  313.         fmove.s fp6,(a0)+
  314.         fmove.s (a3)+,fp6
  315.         fmul    fp3,fp6
  316.         fmove.s (a3)+,fp7
  317.         fmul    fp4,fp7
  318.         fadd    fp7,fp6
  319.         fmove.s (a3)+,fp7
  320.         fmul    fp5,fp7
  321.         fadd    fp7,fp6
  322.         fmove.s fp6,(a0)+
  323.         fmove.s (a3)+,fp6
  324.         fmul    fp3,fp6
  325.         fmove.s (a3)+,fp7
  326.         fmul    fp4,fp7
  327.         fadd    fp7,fp6
  328.         fmove.s (a3)+,fp7
  329.         fmul    fp5,fp7
  330.         fadd    fp7,fp6
  331.         fmove.s fp6,(a0)+
  332.         rts
  333.  
  334. ******  end of EntityRotate
  335.  
  336.  
  337.  
  338.  
  339.  
  340.  
  341. ******************************************************************************
  342. *
  343. *       void _R_RecursiveWorldNode (mnode_t *node, int clipflags)
  344. *
  345. ******************************************************************************
  346.  
  347.         cnop    0,4
  348. _R_RecursiveWorldNode
  349.  
  350.         rsreset
  351.         rs.l    1
  352. .node           rs.l    1
  353. .clipflags      rs.l    1
  354.  
  355.         move.l  .node(sp),a0
  356.         move.l  .clipflags(sp),d0
  357.         bsr     DoRecursion
  358.         rts
  359.  
  360. DoRecursion
  361.         movem.l d2-d5/a2/a3,-(sp)
  362.         fmovem.x        fp2-fp6,-(sp)
  363.         move.l  d0,d2
  364.         move.l  a0,a2
  365.  
  366. *        if (node->contents == CONTENTS_SOLID)
  367. *                return;         // solid
  368. *
  369. *        if (node->visframe != r_visframecount)
  370. *                return;
  371.  
  372.         cmp.l   #CONTENTS_SOLID,NODE_CONTENTS(a2)
  373.         beq.w   .end
  374.         move.l  NODE_VISFRAME(a2),d0
  375.         cmp.l   _r_visframecount,d0
  376.         bne.w   .end
  377.  
  378. *        if (clipflags)
  379. *        {
  380. *                for (i=0 ; i<4 ; i++)
  381.  
  382.         tst.l   d2
  383.         beq.b   .noclip
  384.         move.l  d2,d1
  385.         moveq   #4-1,d0
  386.         lea     _pfrustum_indexes,a0
  387.         lea     _view_clipplanes,a1
  388.         moveq   #0,d4
  389.  
  390. *                        if (! (clipflags & (1<<i)) )
  391. *                                continue;       // don't need to clip against it
  392.  
  393. .loop
  394.         lsr.b   #1,d1                   ; if (! (clipflags & (1<<i))
  395.         bcc.b   .next
  396.  
  397. *                        pindex = pfrustum_indexes[i];
  398. *
  399. *                        rejectpt[0] = (float)node->minmaxs[pindex[0]];
  400. *                        rejectpt[1] = (float)node->minmaxs[pindex[1]];
  401. *                        rejectpt[2] = (float)node->minmaxs[pindex[2]];
  402. *
  403. *                        d = DotProduct (rejectpt, view_clipplanes[i].normal);
  404. *                        d -= view_clipplanes[i].dist;
  405. *
  406. *                        if (d <= 0)
  407. *                                return;
  408.  
  409.         fmove.s (a1)+,fp3
  410.         fmove.s (a1)+,fp4
  411.         fmove.s (a1)+,fp5
  412.         fmove.s (a1)+,fp6
  413.         lea     -16(a1),a1
  414.         move.l  (a0),a3
  415.         move.l  (a3)+,d3
  416.         fmove.w NODE_MINMAXS(a2,d3.l*2),fp0 ;rejectpt[0] = ...
  417.         move.l  (a3)+,d3
  418.         fmove.w NODE_MINMAXS(a2,d3.l*2),fp1 ;rejectpt[1] = ...
  419.         move.l  (a3)+,d3
  420.         fmove.w NODE_MINMAXS(a2,d3.l*2),fp2 ;rejectpt[2] = ...
  421.         fmul    fp3,fp0
  422.         fmul    fp4,fp1
  423.         fmul    fp5,fp2
  424.         fadd    fp1,fp0
  425.         fadd    fp2,fp0                 ;d = DotProduct(...)
  426.         fsub    fp6,fp0                 ;d -= view_clipplanes[1].dist
  427.         ftst    fp0                     ;if (d <= 0)
  428.         fbole.w .end                    ;return
  429.  
  430. *                        acceptpt[0] = (float)node->minmaxs[pindex[3+0]];
  431. *                        acceptpt[1] = (float)node->minmaxs[pindex[3+1]];
  432. *                        acceptpt[2] = (float)node->minmaxs[pindex[3+2]];
  433. *
  434. *                        d = DotProduct (acceptpt, view_clipplanes[i].normal);
  435. *                        d -= view_clipplanes[i].dist;
  436. *
  437. *                        if (d >= 0)
  438. *                                clipflags &= ~(1<<i);   // node is entirely on screen
  439.  
  440.         move.l  (a3)+,d3
  441.         fmove.w NODE_MINMAXS(a2,d3.l*2),fp0 ;acceptpt[0] = ...
  442.         move.l  (a3)+,d3
  443.         fmove.w NODE_MINMAXS(a2,d3.l*2),fp1 ;acceptpt[1] = ...
  444.         move.l  (a3)+,d3
  445.         fmove.w NODE_MINMAXS(a2,d3.l*2),fp2 ;acceptpt[2] = ...
  446.         fmul    fp3,fp0
  447.         fmul    fp4,fp1
  448.         fmul    fp5,fp2
  449.         fadd    fp1,fp0
  450.         fadd    fp2,fp0                 ;d = DotProduct(...)
  451.         fsub    fp6,fp0                 ;d -= view_clipplanes[1].dist
  452.         ftst    fp0                     ;if (d >= 0)
  453.         fbolt.b .next
  454.         bclr    d4,d2                   ;clipflags &= ~(1<<i)
  455. .next
  456.         addq    #1,d4
  457.         lea     CLIP_SIZEOF(a1),a1
  458.         addq.l  #4,a0
  459.         dbra    d0,.loop
  460.  
  461. *        if (node->contents < 0)
  462.  
  463. .noclip
  464.         tst.l   NODE_CONTENTS(a2)
  465.         bge.b   .else
  466.  
  467. *                pleaf = (mleaf_t *)node;
  468. *
  469. *                mark = pleaf->firstmarksurface;
  470. *                c = pleaf->nummarksurfaces;
  471. *
  472. *                if (c)
  473. *                {
  474. *                        do
  475. *                        {
  476. *                                (*mark)->visframe = r_framecount;
  477. *                                mark++;
  478. *                        } while (--c);
  479. *                }
  480.  
  481.         move.l  LEAF_FIRSTMARKSURFACE(a2),a3 ;mark = pleaf->first...
  482.         move.l  LEAF_NUMMARKSURFACES(a2),d0  ;c = pleaf->nummark...
  483.         subq    #1,d0                   ;if (c)
  484.         bmi.b   .cont
  485.         move.l  _r_framecount,d1
  486. .loop2
  487.         move.l  (a3)+,a0                ;(*mark)->visframe = r_framecount
  488.         move.l  d1,MSURFACE_VISFRAME(a0)
  489.         dbra    d0,.loop2
  490.  
  491. *                if (pleaf->efrags)
  492. *                {
  493. *                        R_StoreEfrags (&pleaf->efrags);
  494. *                }
  495. *
  496. *                pleaf->key = r_currentkey;
  497. *                r_currentkey++;         // all bmodels in a leaf share the same key
  498.  
  499. .cont
  500.         tst.l   LEAF_EFRAGS(a2)         ;if (pleaf->efrags)
  501.         beq.b   .cont2
  502.         pea     LEAF_EFRAGS(a2)
  503.         jsr     _R_StoreEfrags          ;R_StoreEfrags (...)
  504.         addq    #4,sp
  505. .cont2
  506.         move.l  _r_currentkey,LEAF_KEY(a2)
  507.         addq.l  #1,_r_currentkey        ;r_currentkey++
  508.         bra.w   .end
  509.  
  510. *                plane = node->plane;
  511. *
  512. *                switch (plane->type)
  513. *                {
  514. *                case PLANE_X:
  515. *                        dot = modelorg[0] - plane->dist;
  516. *                        break;
  517. *                case PLANE_Y:
  518. *                        dot = modelorg[1] - plane->dist;
  519. *                        break;
  520. *                case PLANE_Z:
  521. *                        dot = modelorg[2] - plane->dist;
  522. *                        break;
  523. *                default:
  524. *                        dot = DotProduct (modelorg, plane->normal) - plane->dist;
  525. *                        break;
  526.  
  527. .else
  528.         move.l  NODE_PLANE(a2),a0       ;plane = node->plane
  529.         lea     _modelorg,a1
  530.         move.b  MPLANE_TYPE(a0),d0      ;switch (plane->type)
  531.         fmove.s MPLANE_DIST(a0),fp0
  532.         cmp.b   #PLANE_X,d0             ;case PLANE_X
  533.         beq.b   .x
  534.         cmp.b   #PLANE_Y,d0             ;case PLANE_Y
  535.         beq.b   .y
  536.         cmp.b   #PLANE_Z,d0             ;case PLANE_Z
  537.         beq.b   .z
  538. .def
  539.         fmove.s (a1)+,fp1               ;dot = DotProduct(...)
  540.         fmove.s (a1)+,fp2
  541.         fmove.s (a1)+,fp3
  542.         fmul.s  (a0)+,fp1
  543.         fmul.s  (a0)+,fp2
  544.         fmul.s  (a0)+,fp3
  545.         fadd    fp1,fp2
  546.         fadd    fp3,fp2
  547.         fsub    fp0,fp2
  548.         bra.b   .cont3
  549. .x
  550.         fmove.s (a1),fp2                ;dot = modelorg[0] - plane->dist
  551.         fsub    fp0,fp2
  552.         bra.b   .cont3
  553. .y
  554.         fmove.s 4(a1),fp2               ;dot = modelorg[1] - plane->dist
  555.         fsub    fp0,fp2
  556.         bra.b   .cont3
  557. .z
  558.         fmove.s 8(a1),fp2               ;dot = modelorg[2] - plane->dist
  559.         fsub    fp0,fp2
  560.  
  561. *                if (dot >= 0)
  562. *                        side = 0;
  563. *                else
  564. *                        side = 1;
  565.  
  566.  
  567. .cont3
  568.         ftst    fp2                     ;if (dot >= 0)
  569.         fbolt.b .lt
  570.         moveq   #0,d3                   ;side = 0
  571.         bra.b   .ge
  572. .lt
  573.         moveq   #1,d3                   ;side = 1
  574. .ge
  575.  
  576. *                R_RecursiveWorldNode (node->children[side], clipflags);
  577.  
  578.         move.l  d2,d0
  579.         move.l  NODE_CHILDREN(a2,d3.l*4),a0
  580.         bsr     DoRecursion
  581.         move.l  _r_framecount,d5
  582.  
  583. *                c = node->numsurfaces;
  584. *
  585. *                if (c)
  586.  
  587.         move    NODE_NUMSURFACES(a2),d4 ;c = node->numsurfaces
  588.         subq    #1,d4                   ;if (c)
  589.         bmi.w   .skip
  590.  
  591. *                        surf = cl.worldmodel->surfaces + node->firstsurface;
  592. *
  593. *                        if (dot < -BACKFACE_EPSILON)
  594. *                        {
  595.  
  596.         move.l  _cl+CL_WORLDMODEL,a0    ;surf = cl.worldmodel + ...
  597.         move.l  MODEL_SURFACES(a0),a3
  598.         moveq   #0,d0
  599.         move    NODE_FIRSTSURFACE(a2),d0
  600.         asl.l   #MSURFACE_SIZEOF_EXP,d0
  601.         add.l   d0,a3
  602.         fcmp.s  #-BACKFACE_EPSILON,fp2   ;if (dot < -BACKFACE_EPSILON)
  603.         fboge.b .else2
  604.  
  605. *                                        if ((surf->flags & SURF_PLANEBACK) &&
  606. *                                                (surf->visframe == r_framecount))
  607. *                                        {
  608. *                                                if (r_drawpolys)
  609. *                                                {
  610. *                                                        if (r_worldpolysbacktofront)
  611. *                                                        {
  612. *                                                                if (numbtofpolys < MAX_BTOFPOLYS)
  613. *                                                                {
  614. *                                                                        pbtofpolys[numbtofpolys].clipflags =
  615. *                                                                                        clipflags;
  616. *                                                                        pbtofpolys[numbtofpolys].psurf = surf;
  617. *                                                                        numbtofpolys++;
  618. *                                                                }
  619. *                                                        }
  620. *                                                        else
  621. *                                                        {
  622. *                                                                R_RenderPoly (surf, clipflags);
  623. *                                                        }
  624. *                                                }
  625. *                                                else
  626. *                                                {
  627. *                                                        R_RenderFace (surf, clipflags);
  628. *                                                }
  629. *                                        }
  630.  
  631. .loop3
  632.         move.l  MSURFACE_FLAGS(a3),d0   ;if ((surf->flags & SURF_PLANEBACK) &&
  633.         and.l   #SURF_PLANEBACK,d0
  634.         beq.b   .next2
  635.         cmp.l   MSURFACE_VISFRAME(a3),d5 ;(surf->visframe == r_framecount))
  636.         bne.b   .next2
  637.         tst.l   _r_drawpolys            ;if (r_drawpolys)
  638.         beq.b   .nopoly
  639.         tst.l   _r_worldpolysbacktofront ;if (r_worldpolysbacktofront)
  640.         beq.b   .renderpoly
  641.         move.l  _numbtofpolys,d0
  642.         cmp.l   #MAX_BTOFPOLYS,d0
  643.         bge.b   .next2
  644.         move.l  _pbtofpolys,a1
  645.         move.l  d2,BTOFPOLY_CLIPFLAGS(a1,d0.l*8)
  646.         move.l  a3,BTOFPOLY_PSURF(a1,d0.l*8)
  647.         addq.l  #1,_numbtofpolys
  648.         bra.b   .next2
  649. .renderpoly
  650.         move.l  d2,-(sp)
  651.         move.l  a3,-(sp)
  652.         jsr     _R_RenderPoly
  653.         addq    #8,sp
  654.         bra.b   .next2
  655. .nopoly
  656.         move.l  d2,-(sp)
  657.         move.l  a3,-(sp)
  658.         jsr     _R_RenderFace
  659.         addq    #8,sp
  660. .next2
  661.  
  662. *                                        surf++;
  663. *                                } while (--c);
  664.  
  665.         lea     MSURFACE_SIZEOF(a3),a3
  666.         dbra    d4,.loop3
  667.         bra.b   .else3
  668. .else2
  669.  
  670. *                        else if (dot > BACKFACE_EPSILON)
  671. *                        {
  672.  
  673.         fcmp.s  #BACKFACE_EPSILON,fp2
  674.         fbole.b .else3
  675.  
  676. *                                        if (!(surf->flags & SURF_PLANEBACK) &&
  677. *                                                (surf->visframe == r_framecount))
  678. *                                        {
  679. *                                                if (r_drawpolys)
  680. *                                                {
  681. *                                                        if (r_worldpolysbacktofront)
  682. *                                                        {
  683. *                                                                if (numbtofpolys < MAX_BTOFPOLYS)
  684. *                                                                {
  685. *                                                                        pbtofpolys[numbtofpolys].clipflags =
  686. *                                                                                        clipflags;
  687. *                                                                        pbtofpolys[numbtofpolys].psurf = surf;
  688. *                                                                        numbtofpolys++;
  689. *                                                                }
  690. *                                                        }
  691. *                                                        else
  692. *                                                        {
  693. *                                                                R_RenderPoly (surf, clipflags);
  694. *                                                        }
  695. *                                                }
  696. *                                                else
  697. *                                                {
  698. *                                                        R_RenderFace (surf, clipflags);
  699. *                                                }
  700. *                                        }
  701.  
  702. .loop4
  703.         move.l  MSURFACE_FLAGS(a3),d0
  704.         and.l   #SURF_PLANEBACK,d0
  705.         bne.b   .next3
  706.         cmp.l   MSURFACE_VISFRAME(a3),d5
  707.         bne.b   .next3
  708.         tst.l   _r_drawpolys
  709.         beq.b   .nopoly2
  710.         tst.l   _r_worldpolysbacktofront
  711.         beq.b   .renderpoly2
  712.         move.l  _numbtofpolys,d0
  713.         cmp.l   #MAX_BTOFPOLYS,d0
  714.         bge.b   .next3
  715.         move.l  _pbtofpolys,a1
  716.         move.l  d2,BTOFPOLY_CLIPFLAGS(a1,d0.l*8)
  717.         move.l  a3,BTOFPOLY_PSURF(a1,d0.l*8)
  718.         addq.l  #1,_numbtofpolys
  719.         bra.b   .next3
  720. .renderpoly2
  721.         move.l  d2,-(sp)
  722.         move.l  a3,-(sp)
  723.         jsr     _R_RenderPoly
  724.         addq    #8,sp
  725.         bra.b   .next3
  726. .nopoly2
  727.         move.l  d2,-(sp)
  728.         move.l  a3,-(sp)
  729.         jsr     _R_RenderFace
  730.         addq    #8,sp
  731. .next3
  732.  
  733. *                                        surf++;
  734. *                                } while (--c);
  735.  
  736.         lea     MSURFACE_SIZEOF(a3),a3
  737.         dbra    d4,.loop4
  738. .else3
  739.  
  740. *                        r_currentkey++;
  741.  
  742.         addq.l  #1,_r_currentkey
  743. .skip
  744.  
  745. *                R_RecursiveWorldNode (node->children[!side], clipflags);
  746.  
  747.         move.l  d2,d0
  748.         eori.l  #1,d3
  749.         move.l  NODE_CHILDREN(a2,d3.l*4),a0
  750.         bsr     DoRecursion
  751. .end
  752.         fmovem.x        (sp)+,fp2-fp6
  753.         movem.l (sp)+,d2-d5/a2/a3
  754.         rts
  755.  
  756.  
  757. sincostab       incbin  "sincos.bin"
  758.  
  759.