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