home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 113 / EnigmaAmiga113CD.iso / software / sviluppo / quake_src / r_drawppc.s < prev    next >
Text File  |  2000-06-17  |  26KB  |  924 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. ## r_drawPPC.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.     xrefv    r_lastvertvalid
  28.     xrefv    r_u1
  29.     xrefv    r_v1
  30.     xrefv    r_lzi1
  31.     xrefv    r_ceilv1
  32.     xrefv    r_nearzi
  33.     xrefv    r_nearzionly
  34.     xrefv    r_emitted
  35.     xrefv    r_framecount
  36.     xrefv    r_pedge
  37.     xrefa    r_refdef
  38.     xrefv    r_leftclipped
  39.     xrefv    r_rightclipped
  40.     xrefa    r_leftexit
  41.     xrefa    r_rightexit
  42.     xrefa    r_leftenter
  43.     xrefa    r_rightenter
  44.     xrefv    r_edges
  45.     xrefv    r_outofsurfaces
  46.     xrefv    r_outofedges
  47.     xrefv    r_pcurrentvertbase
  48.     xrefv    r_polycount
  49.     xrefv    r_currentkey
  50.     xrefv    c_faceclip
  51.     xrefa    modelorg
  52.     xrefv    xscale
  53.     xrefv    yscale
  54.     xrefv    xscaleinv
  55.     xrefv    yscaleinv
  56.     xrefv    xcenter
  57.     xrefv    ycenter
  58.     xrefa    vright
  59.     xrefa    vup
  60.     xrefa    vpn
  61.     xrefv    cacheoffset
  62.     xrefv    edge_p
  63.     xrefv    surfaces
  64.     xrefv    surface_p
  65.     xrefv    surf_max
  66.     xrefv    edge_max
  67.     xrefa    newedges
  68.     xrefa    removeedges
  69.     xrefa    view_clipplanes
  70.     xrefv    insubmodel
  71.     xrefv    currententity
  72.     xrefv    makeleftedge
  73.     xrefv    makerightedge
  74.     xrefv    INT2DBL_0
  75.     xrefv    c0
  76.     xrefv    c2
  77.  
  78.  
  79. #
  80. # defines
  81. #
  82.  
  83. .set    FULLY_CLIPPED_CACHED   ,0x80000000
  84. .set    FRAMECOUNT_MASK        ,0x7fffffff
  85.  
  86. .set    REFDEF_FVRECTX_ADJ     ,68
  87. .set    REFDEF_FVRECTY_ADJ     ,72
  88. .set    REFDEF_VRECTX_ADJ_S20  ,76
  89. .set    REFDEF_VRECTXR_ADJ_S20 ,80
  90. .set    REFDEF_FVRECTRIGHT_ADJ ,84
  91. .set    REFDEF_FVRECTBOTTOM_ADJ,88
  92.  
  93. .set    EDGE_U                 ,0
  94. .set    EDGE_U_STEP            ,4
  95. .set    EDGE_PREV              ,8
  96. .set    EDGE_NEXT              ,12
  97. .set    EDGE_SURFS             ,16
  98. .set    EDGE_NEXTREMOVE        ,20
  99. .set    EDGE_NEARZI            ,24
  100. .set    EDGE_OWNER             ,28
  101. .set    EDGE_SIZEOF_EXP        ,5
  102. .set    EDGE_SIZEOF            ,(1<<EDGE_SIZEOF_EXP)
  103.  
  104. .set    CLIP_NORMAL            ,0
  105. .set    CLIP_DIST              ,12
  106. .set    CLIP_NEXT              ,16
  107. .set    CLIP_LEFTEDGE          ,20
  108. .set    CLIP_RIGHTEDGE         ,21
  109. .set    CLIP_RESERVED          ,22
  110. .set    CLIP_SIZEOF            ,24
  111.  
  112. .set    MVERTEX_SIZEOF         ,12
  113.  
  114. .set    MEDGE_V                ,0
  115. .set    MEDGE_CEO              ,4
  116. .set    MEDGE_SIZEOF_EXP       ,3
  117. .set    MEDGE_SIZEOF           ,(1<<MEDGE_SIZEOF_EXP)
  118.  
  119. .set    MSURFACE_VISFRAME      ,0
  120. .set    MSURFACE_DLIGHTFRAME   ,4
  121. .set    MSURFACE_DLIGHTBITS    ,8
  122. .set    MSURFACE_PLANE         ,12
  123. .set    MSURFACE_FLAGS         ,16
  124. .set    MSURFACE_FIRSTEDGE     ,20
  125. .set    MSURFACE_NUMEDGES      ,24
  126. .set    MSURFACE_CACHESPOTS    ,28
  127. .set    MSURFACE_TEXTUREMINS   ,44
  128. .set    MSURFACE_EXTENTS       ,48
  129. .set    MSURFACE_TEXINFO       ,52
  130. .set    MSURFACE_STYLES        ,56
  131. .set    MSURFACE_SAMPLES       ,60
  132. .set    MSURFACE_SIZEOF_EXP    ,6
  133. .set    MSURFACE_SIZEOF        ,(1<<MSURFACE_SIZEOF_EXP)
  134.  
  135. .set    MPLANE_NORMAL          ,0
  136. .set    MPLANE_DIST            ,12
  137. .set    MPLANE_TYPE            ,16
  138. .set    MPLANE_SIGNBITS        ,17
  139. .set    MPLANE_SIZEOF          ,20
  140.  
  141. .set    SURF_NEXT              ,0
  142. .set    SURF_PREV              ,4
  143. .set    SURF_SPANS             ,8
  144. .set    SURF_KEY               ,12
  145. .set    SURF_LAST_U            ,16
  146. .set    SURF_SPANSTATE         ,20
  147. .set    SURF_FLAGS             ,24
  148. .set    SURF_DATA              ,28
  149. .set    SURF_ENTITY            ,32
  150. .set    SURF_NEARZI            ,36
  151. .set    SURF_INSUBMODEL        ,40
  152. .set    SURF_D_ZIORIGIN        ,44
  153. .set    SURF_D_ZISTEPU         ,48
  154. .set    SURF_D_ZISTEPV         ,52
  155. .set    SURF_SIZEOF_EXP        ,6
  156. .set    SURF_SIZEOF            ,(1<<SURF_SIZEOF_EXP)
  157.  
  158. .set    ENTITY_FORCELINK     ,0
  159. .set    ENTITY_UPDATE_TYPE   ,4
  160. .set    ENTITY_BASELINE      ,8
  161. .set    ENTITY_MSGTIME       ,52
  162. .set    ENTITY_MSG_ORIGINS   ,60
  163. .set    ENTITY_ORIGIN        ,84
  164. .set    ENTITY_MSG_ANGLES    ,96
  165. .set    ENTITY_ANGLES        ,120
  166. .set    ENTITY_MODEL         ,132
  167. .set    ENTITY_EFRAG         ,136
  168. .set    ENTITY_FRAME         ,140
  169. .set    ENTITY_SYNCBASE      ,144
  170. .set    ENTITY_COLORMAP      ,148
  171. .set    ENTITY_EFFECTS       ,152
  172. .set    ENTITY_SKINNUM       ,156
  173. .set    ENTITY_VISFRAME      ,160
  174. .set    ENTITY_DLIGHTFRAME   ,164
  175. .set    ENTITY_DLIGHTBITS    ,168
  176. .set    ENTITY_TRIVIAL_ACCEPT,172
  177. .set    ENTITY_TOPNODE       ,176
  178. .set    ENTITY_SIZEOF        ,216
  179.  
  180.  
  181.  
  182.  
  183. ###########################################################################
  184. #
  185. #       void R_EmitEdge (mvertex_t *pv0, mvertex_t *pv1)
  186. #
  187. ###########################################################################
  188.  
  189.     funcdef    R_EmitEdge
  190.  
  191.     init    0,16,0,7
  192.     stfd    f14,fb+0*8(r1)
  193.     stfd    f15,fb+1*8(r1)
  194.     stfd    f16,fb+2*8(r1)
  195.     stfd    f17,fb+3*8(r1)
  196.     stfd    f18,fb+4*8(r1)
  197.     stfd    f19,fb+5*8(r1)
  198.     stfd    f20,fb+6*8(r1)
  199.     ls    f0,c2
  200.     lf      f11,INT2DBL_0           #for int2dbl_setup
  201.     stfd    f11,local(r1)
  202.  
  203.         lxa     r12,r_refdef
  204.         lxa     r6,vright
  205.         lfs     f14,0(r6)
  206.         lfs     f15,4(r6)
  207.         lfs     f16,8(r6)
  208.         lxa     r6,vup
  209.         lfs     f17,0(r6)
  210.         lfs     f18,4(r6)
  211.         lfs     f19,8(r6)
  212.         lxa     r6,vpn
  213.         lfs     f20,0(r6)
  214.         lfs     f12,4(r6)
  215.         lfs     f13,8(r6)
  216.         lxa     r9,modelorg
  217.         ls      f10,cNEAR_CLIP
  218.  
  219. #        if (r_lastvertvalid)
  220. #        {
  221. #                u0 = r_u1;
  222. #                v0 = r_v1;
  223. #                lzi0 = r_lzi1;
  224. #                ceilv0 = r_ceilv1;
  225. #        }
  226.  
  227.         lw      r6,r_lastvertvalid
  228.         mr.     r6,r6
  229.         beq     .EEelse
  230.         ls      f1,r_u1                 #f1 = u0
  231.         ls      f2,r_v1                 #f2 = v0
  232.         ls      f3,r_lzi1               #f3 = lzi0
  233.         lw      r7,r_ceilv1             #r7 = ceilv0
  234.         b       .EEnext
  235.  
  236. #                world = &pv0->position[0];
  237. #
  238. #                VectorSubtract (world, modelorg, local);
  239. #                TransformVector (local, transformed);
  240. #
  241. #                if (transformed[2] < NEAR_CLIP)
  242. #                        transformed[2] = NEAR_CLIP;
  243. #
  244. #                lzi0 = 1.0 / transformed[2];
  245. #
  246. #                scale = xscale * lzi0;
  247. #                u0 = (xcenter + scale*transformed[0]);
  248. #                if (u0 < r_refdef.fvrectx_adj)
  249. #                        u0 = r_refdef.fvrectx_adj;
  250. #                if (u0 > r_refdef.fvrectright_adj)
  251. #                        u0 = r_refdef.fvrectright_adj;
  252. #
  253. #                scale = yscale * lzi0;
  254. #                v0 = (ycenter - scale*transformed[1]);
  255. #                if (v0 < r_refdef.fvrecty_adj)
  256. #                        v0 = r_refdef.fvrecty_adj;
  257. #                if (v0 > r_refdef.fvrectbottom_adj)
  258. #                        v0 = r_refdef.fvrectbottom_adj;
  259. #
  260. #                ceilv0 = (int) ceil(v0);
  261.  
  262. .EEelse:
  263.  
  264. ######  VectorSubtract (inlined)
  265.  
  266.         lfs     f1,0(r3)
  267.         lfs     f7,0(r9)
  268.         fsubs   f1,f1,f7                #f1 = local[0]
  269.         lfs     f2,4(r3)
  270.         lfs     f8,4(r9)
  271.         fsubs   f2,f2,f8                #f2 = local[1]
  272.         lfs     f3,8(r3)
  273.         lfs     f9,8(r9)
  274.         fsubs   f3,f3,f9                #f3 = local[2]
  275.  
  276. ######  TransformVector (inlined)
  277.  
  278.         fmuls   f7,f1,f14
  279.         fmuls   f8,f1,f17
  280.         fmuls   f9,f1,f20
  281.         fmadds  f7,f2,f15,f7
  282.         fmadds  f8,f2,f18,f8
  283.         fmadds  f9,f2,f12,f9
  284.         fmadds  f7,f3,f16,f7            #f7 = transformed[0]
  285.         fmadds  f8,f3,f19,f8            #f8 = transformed[1]
  286.         fmadds  f9,f3,f13,f9            #f9 = transformed[2]
  287.  
  288. ######  end of TransformVector
  289.  
  290.         fsubs   f1,f9,f10
  291.         ls      f2,xscale
  292.         fsel    f9,f1,f9,f10
  293.         ls      f4,yscale
  294.         fres    f3,f9                   #f3 = lzi0
  295.         ls      f5,ycenter
  296.         fmuls   f7,f7,f3
  297.         fmuls   f8,f8,f3
  298.         ls      f6,xcenter
  299.         lfs     f1,REFDEF_FVRECTX_ADJ(r12)
  300.         fmadds  f7,f2,f7,f6
  301.         lfs     f2,REFDEF_FVRECTY_ADJ(r12)
  302.         fnmsubs f8,f4,f8,f5
  303.         fsubs   f5,f7,f1
  304.         fsubs   f4,f8,f2
  305.         fsel    f7,f5,f7,f1
  306.         fsel    f8,f4,f8,f2
  307.         lfs     f1,REFDEF_FVRECTRIGHT_ADJ(r12)
  308.         fsubs   f5,f1,f7
  309.         lfs     f2,REFDEF_FVRECTBOTTOM_ADJ(r12)
  310.         fsubs   f4,f2,f8
  311.         fsel    f1,f5,f7,f1             #f1 = u0
  312.         fsel    f2,f4,f8,f2             #f2 = v0
  313.         mffs    f7
  314.         mtfsfi  cr7,2
  315.         fctiw   f4,f2
  316.         stfd    f4,local+8(r1)
  317.         lwz     r7,local+12(r1)         #r7 = ceilv0
  318.         mtfsf   1,f7
  319. .EEnext:
  320.  
  321. #        world = &pv1->position[0];
  322. #
  323. #// transform and project
  324. #        VectorSubtract (world, modelorg, local);
  325. #        TransformVector (local, transformed);
  326. #
  327. #        if (transformed[2] < NEAR_CLIP)
  328. #                transformed[2] = NEAR_CLIP;
  329. #
  330. #        r_lzi1 = 1.0 / transformed[2];
  331. #
  332. #        scale = xscale * r_lzi1;
  333. #        r_u1 = (xcenter + scale*transformed[0]);
  334. #        if (r_u1 < r_refdef.fvrectx_adj)
  335. #                r_u1 = r_refdef.fvrectx_adj;
  336. #        if (r_u1 > r_refdef.fvrectright_adj)
  337. #                r_u1 = r_refdef.fvrectright_adj;
  338. #
  339. #        scale = yscale * r_lzi1;
  340. #        r_v1 = (ycenter - scale*transformed[1]);
  341. #        if (r_v1 < r_refdef.fvrecty_adj)
  342. #                r_v1 = r_refdef.fvrecty_adj;
  343. #        if (r_v1 > r_refdef.fvrectbottom_adj)
  344. #                r_v1 = r_refdef.fvrectbottom_adj;
  345.  
  346. ######  VectorSubtract (inlined)
  347.  
  348.         lfs     f4,0(r4)
  349.         lfs     f7,0(r9)
  350.         fsubs   f4,f4,f7                #f4 = local[0]
  351.         lfs     f5,4(r4)
  352.         lfs     f8,4(r9)
  353.         fsubs   f5,f5,f8                #f5 = local[1]
  354.         lfs     f6,8(r4)
  355.         lfs     f9,8(r9)
  356.         fsubs   f6,f6,f9                #f6 = local[2]
  357.  
  358. ######  TransformVector (inlined)
  359.  
  360.         fmuls   f7,f4,f14
  361.         fmuls   f8,f4,f17
  362.         fmuls   f9,f4,f20
  363.         fmadds  f7,f5,f15,f7
  364.         fmadds  f8,f5,f18,f8
  365.         fmadds  f9,f5,f12,f9
  366.         fmadds  f7,f6,f16,f7            #f7 = transformed[0]
  367.         fmadds  f8,f6,f19,f8            #f8 = transformed[1]
  368.         fmadds  f9,f6,f13,f9            #f9 = transformed[2]
  369.  
  370. ######  end of TransformVector
  371.  
  372.         fsubs   f5,f9,f10
  373.         fsel    f9,f5,f9,f10
  374.         ls      f6,ycenter
  375.         fres    f4,f9                   #f4 = r_lzi1
  376.         ls      f5,xscale
  377.         fmuls   f7,f7,f4
  378.         ls      f9,xcenter
  379.         fmuls   f8,f8,f4
  380.         ls      f10,yscale
  381.         fmadds  f7,f5,f7,f9
  382.         fnmsubs f8,f10,f8,f6
  383.         lfs     f10,REFDEF_FVRECTX_ADJ(r12)
  384.         fsubs   f5,f7,f10
  385.         lfs     f9,REFDEF_FVRECTY_ADJ(r12)
  386.         ss      f4,r_lzi1
  387.         fsubs   f6,f8,f9
  388.         fsel    f7,f5,f7,f10
  389.         fsel    f8,f6,f8,f9
  390.         lfs     f9,REFDEF_FVRECTRIGHT_ADJ(r12)
  391.         fsubs   f5,f9,f7
  392.         lfs     f10,REFDEF_FVRECTBOTTOM_ADJ(r12)
  393.         fsubs   f6,f10,f8
  394.         fsel    f5,f5,f7,f9             #f5 = r_u1
  395.         fsel    f6,f6,f8,f10            #f6 = r_v1
  396.         ss      f5,r_u1
  397.         mffs    f7
  398.         mtfsfi  cr7,2
  399.         fctiw   f8,f6
  400.         ss      f6,r_v1
  401.         stfd    f8,local+8(r1)
  402.         lwz     r10,local+12(r1)        #r10 = r_ceilv1
  403.         mtfsf   1,f7
  404.  
  405.  
  406. #        if (r_lzi1 > lzi0)
  407. #                lzi0 = r_lzi1;
  408. #
  409. #        if (lzi0 > r_nearzi)    // for mipmap finding
  410. #                r_nearzi = lzi0;
  411. #
  412. #// for right edges, all we want is the effect on 1/z
  413. #        if (r_nearzionly)
  414. #                return;
  415. #
  416. #        r_emitted = 1;
  417. #
  418. #        r_ceilv1 = (int) ceil(r_v1);
  419.  
  420.         fsubs   f8,f3,f4
  421.         fsel    f3,f8,f3,f4
  422.         ls      f8,r_nearzi
  423.         fsubs   f7,f8,f3
  424.         fsel    f8,f7,f8,f3
  425.         ss      f8,r_nearzi
  426.         lw      r11,r_nearzionly
  427.         mr.     r11,r11
  428.         bne     .EEexit1
  429.         sw      r10,r_ceilv1
  430.         li      r12,1
  431.         sw      r12,r_emitted
  432.  
  433. #        if (ceilv0 == r_ceilv1)
  434. #        {
  435. #        // we cache unclipped horizontal edges as fully clipped
  436. #                if (cacheoffset != 0x7FFFFFFF)
  437. #                {
  438. #                        cacheoffset = FULLY_CLIPPED_CACHED |
  439. #                                        (r_framecount & FRAMECOUNT_MASK);
  440. #                }
  441. #
  442. #                return;         // horizontal edge
  443. #        }
  444.  
  445.         cmpw    r10,r7
  446.         bne     .EEcont13
  447.         lw      r12,cacheoffset
  448.         lis     r11,0x7fffffff@h
  449.         ori     r11,r11,0x7fffffff@l
  450.         cmpw    r11,r12
  451.         beq     .EEexit1
  452.         lw      r11,r_framecount
  453.         lis     r4,FRAMECOUNT_MASK@h
  454.         ori     r4,r4,FRAMECOUNT_MASK@l
  455.         and     r11,r11,r4
  456.         lis     r3,FULLY_CLIPPED_CACHED@h
  457.         ori     r3,r3,FULLY_CLIPPED_CACHED@l
  458.         or      r11,r11,r3
  459.         sw      r11,cacheoffset
  460.         b       .EEexit1
  461.  
  462. #        side = ceilv0 > r_ceilv1;
  463. #
  464. #        edge = edge_p++;
  465. #
  466. #        edge->owner = r_pedge;
  467. #
  468. #        edge->nearzi = lzi0;
  469.  
  470. .EEcont13:
  471.         fsubs   f9,f2,f6
  472.         lw      r9,edge_p
  473.         fsubs   f8,f1,f5
  474.         stfs    f3,EDGE_NEARZI(r9)
  475.         addi    r11,r9,EDGE_SIZEOF
  476.         fneg    f7,f8
  477.         sw      r11,edge_p
  478.         lw      r12,r_pedge
  479.         fsel    f8,f9,f8,f7
  480.         stw     r12,EDGE_OWNER(r9)
  481.         fneg    f7,f9
  482.  
  483. #        if (side == 0)
  484. #        {
  485. #        // trailing edge (go from p1 to p2)
  486. #                v = ceilv0;
  487. #                v2 = r_ceilv1 - 1;
  488. #
  489. #                edge->surfs[0] = surface_p - surfaces;
  490. #                edge->surfs[1] = 0;
  491. #
  492. #                u_step = ((r_u1 - u0) / (r_v1 - v0));
  493. #                u = u0 + ((float)v - v0) * u_step;
  494. #        }
  495.  
  496.         cmpw    r7,r10
  497.         fsel    f9,f9,f9,f7
  498.         lw      r5,surface_p
  499.         bgt     .EEelse2
  500.         mr      r11,r7                  #r11 = v = ceilv0
  501.         lw      r6,surfaces
  502.         fmuls   f7,f9,f9
  503.         subf    r5,r6,r5
  504.         subi    r12,r10,1               #r12 = r_ceilv1 - 1
  505.         slwi    r5,r5,10
  506.         frsqrte f7,f7
  507.         lxa     r10,r_refdef
  508.         stw     r5,EDGE_SURFS(r9)
  509.         fnmsubs f4,f7,f9,f0
  510.     int2dbl    f5,r11,r8,local,f11
  511.         fmuls   f7,f7,f4
  512.         li      r4,1
  513.         lwz     r5,REFDEF_VRECTXR_ADJ_S20(r10)
  514.         fnmsubs f4,f7,f9,f0
  515.         fsubs   f5,f5,f2
  516.         lwz     r10,REFDEF_VRECTX_ADJ_S20(r10)
  517.         fmuls   f7,f7,f4
  518.         slwi    r11,r11,2
  519.         fmuls   f8,f7,f8
  520.         slwi    r12,r12,2
  521.         ls      f9,c16times65536
  522.         fmadds  f7,f5,f8,f1             #f7 = u
  523.         b       .EEcont14
  524.  
  525. #        {
  526. #        // leading edge (go from p2 to p1)
  527. #                v2 = ceilv0 - 1;
  528. #                v = r_ceilv1;
  529. #
  530. #                edge->surfs[0] = 0;
  531. #                edge->surfs[1] = surface_p - surfaces;
  532. #
  533. #                u_step = ((u0 - r_u1) / (v0 - r_v1));
  534. #                u = r_u1 + ((float)v - r_v1) * u_step;
  535. #        }
  536.  
  537. .EEelse2:
  538.         fsel    f9,f9,f9,f7
  539.         mr      r11,r10                 #r11 = v = r_ceilv1
  540.         lw      r6,surfaces
  541.         fmuls   f7,f9,f9
  542.         subf    r5,r6,r5
  543.         subi    r12,r7,1                #r12 = ceilv0 - 1
  544.         srawi   r5,r5,6
  545.         frsqrte f7,f7
  546.         clrlwi  r5,r5,16
  547.         stw     r5,EDGE_SURFS(r9)
  548.         fnmsubs f4,f7,f9,f0
  549.         lxa     r10,r_refdef
  550.     int2dbl    f1,r11,r8,local,f11
  551.         fmuls   f7,f7,f4
  552.         li      r4,0
  553.         lwz     r5,REFDEF_VRECTXR_ADJ_S20(r10)
  554.         fnmsubs f4,f7,f9,f0
  555.         fsubs   f1,f1,f6
  556.         lwz     r10,REFDEF_VRECTX_ADJ_S20(r10)
  557.         fmuls   f7,f7,f4
  558.         slwi    r11,r11,2
  559.         fmuls   f8,f7,f8
  560.         slwi    r12,r12,2
  561.         ls      f9,c16times65536
  562.         fmadds  f7,f1,f8,f5             #f7 = u
  563.  
  564. #        edge->u_step = u_step*0x100000;
  565. #        edge->u = u*0x100000 + 0xFFFFF;
  566.  
  567. .EEcont14:
  568.         fmuls   f8,f8,f9
  569.         lis     r3,0xfffff@h
  570.         ori     r3,r3,0xfffff@l
  571.         fctiwz  f1,f8
  572.         stfd    f1,local+8(r1)
  573.         lwz     r0,local+12(r1)
  574.         stw     r0,EDGE_U_STEP(r9)
  575.         fmuls   f7,f7,f9
  576.         fctiwz  f1,f7
  577.         stfd    f1,local+8(r1)
  578.         lwz     r0,local+12(r1)
  579.         add     r6,r0,r3
  580.  
  581. #        if (edge->u < r_refdef.vrect_x_adj_shift20)
  582. #                edge->u = r_refdef.vrect_x_adj_shift20;
  583. #        if (edge->u > r_refdef.vrectright_adj_shift20)
  584. #                edge->u = r_refdef.vrectright_adj_shift20;
  585.  
  586.         cmpw    r6,r10
  587.         bge     .EEcont15
  588.         mr      r6,r10
  589. .EEcont15:
  590.         cmpw    r6,r5
  591.         ble     .EEcont16
  592.         mr      r6,r5
  593.  
  594. #        u_check = edge->u;
  595. #        if (edge->surfs[0])
  596. #                u_check++;      // sort trailers after leaders
  597. #
  598. #        if (!newedges[v] || newedges[v]->u >= u_check)
  599. #        {
  600. #                edge->next = newedges[v];
  601. #                newedges[v] = edge;
  602. #        }
  603. #        else
  604. #        {
  605. #                pcheck = newedges[v];
  606. #                while (pcheck->next && pcheck->next->u < u_check)
  607. #                        pcheck = pcheck->next;
  608. #                edge->next = pcheck->next;
  609. #                pcheck->next = edge;
  610. #        }
  611.  
  612. .EEcont16:
  613.         lxa     r5,newedges
  614.         stw     r6,EDGE_U(r9)
  615.         lxa     r7,removeedges
  616.         add     r6,r6,r4
  617.         lwzx    r3,r5,r11
  618.         mr.     r3,r3
  619.         beq     .EEcont18
  620.         lwz     r4,EDGE_U(r3)
  621.         cmpw    r6,r4
  622.         bgt     .EEloop
  623. .EEcont18:
  624.         stw     r3,EDGE_NEXT(r9)
  625.         stwx    r9,r5,r11
  626.         b       .EEcont21
  627. .EEloop:
  628.         lwz     r5,EDGE_NEXT(r3)
  629.         mr.     r5,r5
  630.         beq     .EEcont20
  631.         mr      r0,r3
  632.         mr      r3,r5
  633.         lwz     r4,EDGE_U(r5)
  634.         cmpw    r6,r4
  635.         bgt     .EEloop
  636.         mr      r3,r0
  637. .EEcont20:
  638.         stw     r5,EDGE_NEXT(r9)
  639.         stw     r9,EDGE_NEXT(r3)
  640.  
  641. #        edge->nextremove = removeedges[v2];
  642. #        removeedges[v2] = edge;
  643.  
  644. .EEcont21:
  645.         lwzx    r3,r7,r12
  646.         stw     r3,EDGE_NEXTREMOVE(r9)
  647.         stwx    r9,r7,r12
  648.  
  649. .EEexit1:
  650.     lfd    f14,fb+0*8(r1)
  651.     lfd    f15,fb+1*8(r1)
  652.     lfd    f16,fb+2*8(r1)
  653.     lfd    f17,fb+3*8(r1)
  654.     lfd    f18,fb+4*8(r1)
  655.     lfd    f19,fb+5*8(r1)
  656.     lfd    f20,fb+6*8(r1)
  657.     exit
  658.  
  659.     funcend    R_EmitEdge
  660.  
  661.  
  662.  
  663.  
  664. ###########################################################################
  665. #
  666. #       void R_ClipEdge (mvertex_t *pv0, mvertex_t *pv1, clipplane_t *clip)
  667. #
  668. ###########################################################################
  669.  
  670.     funcdef    R_ClipEdge
  671.  
  672.     init    0,16,0,0
  673.     la    r6,local(r1)
  674.  
  675.         mr.     r5,r5
  676.         beq     .CEadd
  677.         ls      f10,c0
  678. .CEloop:
  679.  
  680. #       d0 = DotProduct (pv0->position, clip->normal) - clip->dist;
  681. #       d1 = DotProduct (pv1->position, clip->normal) - clip->dist;
  682.  
  683.         lfs     f1,CLIP_NORMAL(r5)
  684.         lfs     f2,CLIP_NORMAL+4(r5)
  685.         lfs     f3,CLIP_NORMAL+8(r5)
  686.         lfs     f9,CLIP_DIST(r5)
  687.         lfs     f4,0(r3)                #f4 = pv0->position[0]
  688.         fmsubs  f7,f4,f1,f9
  689.         lfs     f5,4(r3)                #f5 = pv0->position[1]
  690.         fmadds  f7,f5,f2,f7
  691.         lfs     f6,8(r3)                #f6 = pv0->position[2]
  692.         fmadds  f7,f6,f3,f7             #f7 = d0
  693.         lfs     f8,0(r4)                #f8 = pv1->position[0]
  694.         fmsubs  f1,f8,f1,f9
  695.         lfs     f9,4(r4)                #f9 = pv1->position[1]
  696.         fmadds  f1,f9,f2,f1
  697.         lfs     f2,8(r4)                #f2 = pv1->position[2]
  698.         fmadds  f1,f2,f3,f1             #f1 = d1
  699.  
  700. #                        if (d0 >= 0)
  701. #                        {
  702. #                        // point 0 is unclipped
  703. #                                if (d1 >= 0)
  704. #                                {
  705. #                                // both points are unclipped
  706. #                                        continue;
  707. #                                }
  708.  
  709.         fcmpo   cr0,f7,f10
  710.         blt     .CEless
  711.         fcmpo   cr0,f1,f10
  712.         bge     .CEloopend
  713.  
  714. #                                cacheoffset = 0x7FFFFFFF;
  715. #
  716. #                                f = d0 / (d0 - d1);
  717. #                                clipvert.position[0] = pv0->position[0] +
  718. #                                                f * (pv1->position[0] - pv0->position[0]);
  719. #                                clipvert.position[1] = pv0->position[1] +
  720. #                                                f * (pv1->position[1] - pv0->position[1]);
  721. #                                clipvert.position[2] = pv0->position[2] +
  722. #                                                f * (pv1->position[2] - pv0->position[2]);
  723.  
  724.         lis     r7,0x7fffffff@h
  725.         ori     r7,r7,0x7fffffff@l
  726.         sw      r7,cacheoffset
  727.         fsubs   f3,f7,f1
  728.         fdivs   f3,f7,f3
  729.         fsubs   f8,f8,f4
  730.         fsubs   f9,f9,f5
  731.         fsubs   f2,f2,f6
  732.         fmadds  f8,f8,f3,f4
  733.         stfs    f8,0(r6)
  734.         fmadds  f9,f9,f3,f5
  735.         stfs    f9,4(r6)
  736.         fmadds  f2,f2,f3,f6
  737.         stfs    f2,8(r6)
  738.  
  739. #                                if (clip->leftedge)
  740. #                                {
  741. #                                        r_leftclipped = true;
  742. #                                        r_leftexit = clipvert;
  743. #                                }
  744.  
  745.         lbz     r7,CLIP_LEFTEDGE(r5)
  746.         mr.     r7,r7
  747.         beq     .CEelse
  748.     li    r0,1
  749.     sw    r0,r_leftclipped
  750.         lxa     r11,r_leftexit
  751.         lwz     r7,0(r6)
  752.         stw     r7,0(r11)
  753.         lwz     r8,4(r6)
  754.         stw     r8,4(r11)
  755.         lwz     r9,8(r6)
  756.         stw     r9,8(r11)
  757.         b       .CEcont
  758.  
  759. #                                else if (clip->rightedge)
  760. #                                {
  761. #                                        r_rightclipped = true;
  762. #                                        r_rightexit = clipvert;
  763. #                                }
  764.  
  765. .CEelse:
  766.     li    r0,1
  767.     sw    r0,r_rightclipped
  768.         lxa     r11,r_rightexit
  769.         lwz     r7,0(r6)
  770.         stw     r7,0(r11)
  771.         lwz     r8,4(r6)
  772.         stw     r8,4(r11)
  773.         lwz     r9,8(r6)
  774.         stw     r9,8(r11)
  775.  
  776. #                                R_ClipEdge (pv0, &clipvert, clip->next);
  777. #                                return;
  778.  
  779. .CEcont:
  780.         mr      r4,r6
  781.         lwz     r5,CLIP_NEXT(r5)
  782.         call    R_ClipEdge
  783.         b       .CEexit
  784.  
  785. #                                if (d1 < 0)
  786. #                                {
  787. #                                // both points are clipped
  788. #                                // we do cache fully clipped edges
  789. #                                        if (!r_leftclipped)
  790. #                                                cacheoffset = FULLY_CLIPPED_CACHED |
  791. #                                                                (r_framecount & FRAMECOUNT_MASK);
  792. #                                        return;
  793. #                                }
  794.  
  795. .CEless:
  796.         fcmpo   cr0,f1,f10
  797.         bge     .CEcont2
  798.         lw      r7,r_leftclipped
  799.         mr.     r7,r7
  800.         bne     .CEexit
  801.         lis     r9,FULLY_CLIPPED_CACHED@h
  802.         ori     r9,r9,FULLY_CLIPPED_CACHED@l
  803.         lis     r7,FRAMECOUNT_MASK@h
  804.         ori     r7,r7,FRAMECOUNT_MASK@l
  805.         lw      r8,r_framecount
  806.         and     r8,r8,r7
  807.         or      r8,r8,r9
  808.         sw      r8,cacheoffset
  809.         b       .CEexit
  810.  
  811. #                                r_lastvertvalid = false;
  812. #
  813. #                        // we don't cache partially clipped edges
  814. #                                cacheoffset = 0x7FFFFFFF;
  815. #
  816. #                                f = d0 / (d0 - d1);
  817. #                                clipvert.position[0] = pv0->position[0] +
  818. #                                                f * (pv1->position[0] - pv0->position[0]);
  819. #                                clipvert.position[1] = pv0->position[1] +
  820. #                                                f * (pv1->position[1] - pv0->position[1]);
  821. #                                clipvert.position[2] = pv0->position[2] +
  822. #                                                f * (pv1->position[2] - pv0->position[2]);
  823.  
  824. .CEcont2:
  825.     li    r0,0
  826.         sw    r0,r_lastvertvalid
  827.         lis     r7,0x7fffffff@h
  828.         ori     r7,r7,0x7fffffff@l
  829.         sw      r7,cacheoffset
  830.         fsubs   f3,f7,f1
  831.         fdivs   f3,f7,f3
  832.         fsubs   f8,f8,f4
  833.         fsubs   f9,f9,f5
  834.         fsubs   f2,f2,f6
  835.         fmadds  f8,f8,f3,f4
  836.         stfs    f8,0(r6)
  837.         fmadds  f9,f9,f3,f5
  838.         stfs    f9,4(r6)
  839.         fmadds  f2,f2,f3,f6
  840.         stfs    f2,8(r6)
  841.  
  842. #                                if (clip->leftedge)
  843. #                                {
  844. #                                        r_leftclipped = true;
  845. #                                        r_leftenter = clipvert;
  846. #                                }
  847.  
  848.         lbz     r7,CLIP_LEFTEDGE(r5)
  849.         mr.     r7,r7
  850.         beq     .CEelse2
  851.     li    r0,1
  852.         sw    r0,r_leftclipped
  853.         lxa     r11,r_leftenter
  854.         lwz     r7,0(r6)
  855.         stw     r7,0(r11)
  856.         lwz     r8,4(r6)
  857.         stw     r8,4(r11)
  858.         lwz     r9,8(r6)
  859.         stw     r9,8(r11)
  860.         b       .CEcont3
  861.  
  862. #                                else if (clip->rightedge)
  863. #                                {
  864. #                                        r_rightclipped = true;
  865. #                                        r_rightenter = clipvert;
  866. #                                }
  867.  
  868. .CEelse2:
  869.     li    r0,1
  870.         sw    r0,r_rightclipped
  871.         lxa     r11,r_rightenter
  872.         lwz     r7,0(r6)
  873.         stw     r7,0(r11)
  874.         lwz     r8,4(r6)
  875.         stw     r8,4(r11)
  876.         lwz     r9,8(r6)
  877.         stw     r9,8(r11)
  878.  
  879. #                                R_ClipEdge (&clipvert, pv1, clip->next);
  880. #                                return;
  881.  
  882. .CEcont3:
  883.         mr      r3,r6
  884.         lwz     r5,CLIP_NEXT(r5)
  885.         call    R_ClipEdge
  886.         b       .CEexit
  887.  
  888. #                } while ((clip = clip->next) != NULL);
  889.  
  890. .CEloopend:
  891.         lwz     r5,CLIP_NEXT(r5)
  892.         mr.     r5,r5
  893.         bne     .CEloop
  894.  
  895. #        R_EmitEdge (pv0, pv1);
  896.  
  897. .CEadd:
  898.         call    R_EmitEdge
  899.  
  900. .CEexit:
  901.     exit
  902.  
  903.     funcend    R_ClipEdge
  904.  
  905.  
  906.  
  907.  
  908. .ifdef    WOS
  909.     .tocd
  910. .else
  911.     .data
  912. .endif
  913.  
  914. lab cNEAR_CLIP
  915.     .float    0.01            #must match the def. in r_local.h
  916. lab c16times65536
  917.     .float    1048576.0
  918.