home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 113 / EnigmaAmiga113CD.iso / software / sviluppo / quakeworld_src / client / d_edgeppc.s < prev    next >
Encoding:
Text File  |  2000-06-17  |  21.8 KB  |  986 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_edgePPC.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.     xrefa    vright
  29.     xrefa    vup
  30.     xrefa    vpn
  31.     xrefv    xscaleinv
  32.     xrefv    yscaleinv
  33.     xrefv    xcenter
  34.     xrefv    ycenter
  35.     xrefv    d_zistepu
  36.     xrefv    d_zistepv
  37.     xrefv    d_ziorigin
  38.     xrefv    d_sdivzstepu
  39.     xrefv    d_tdivzstepu
  40.     xrefv    d_sdivzstepv
  41.     xrefv    d_tdivzstepv
  42.     xrefv    d_sdivzorigin
  43.     xrefv    d_tdivzorigin
  44.     xrefv    sadjust
  45.     xrefv    tadjust
  46.     xrefv    bbextents
  47.     xrefv    bbextentt
  48.     xrefa    transformed_modelorg
  49.     xrefv    miplevel
  50.     xrefa    r_worldentity
  51.     xrefv    currententity
  52.     xrefa    r_drawflat
  53.     xrefv    surfaces
  54.     xrefv    surface_p
  55.     xrefv    r_drawnpolycount
  56.     xrefv    r_skymade
  57.     xrefa    r_clearcolor
  58.     xrefv    cacheblock
  59.     xrefv    cachewidth
  60.     xrefa    r_origin
  61.     xrefa    base_vpn
  62.     xrefa    base_vup
  63.     xrefa    base_vright
  64.     xrefa    base_modelorg
  65.     xrefv    d_drawspans
  66.     xrefv    scale_for_mip
  67.     xrefa    d_scalemip
  68.     xrefv    d_minmip
  69.     xrefa    modelorg
  70.     xrefa    screenedge
  71.     xrefa    view_clipplanes
  72.  
  73.     xrefv    D_DrawSolidSurface
  74.     xrefv    D_DrawZSpans
  75.     xrefv    R_MakeSky
  76.     xrefv    D_DrawSkyScans8
  77.     xrefv    D_DrawZSpans
  78.     xrefv    Turbulent8
  79.     xrefv    R_RotateBmodel
  80.     xrefv    D_CacheSurface
  81.  
  82.     xrefv    c0
  83.     xrefv    c0_5
  84.     xrefv    c65536
  85.  
  86.  
  87. #
  88. # defines
  89. #
  90.  
  91. .set    SURF_DRAWSKY        ,4
  92. .set    SURF_DRAWTURB       ,0x10
  93. .set    SURF_DRAWBACKGROUND ,0x40
  94.  
  95. .set    MSURFACE_VISFRAME   ,0
  96. .set    MSURFACE_DLIGHTFRAME,4
  97. .set    MSURFACE_DLIGHTBITS ,8
  98. .set    MSURFACE_PLANE      ,12
  99. .set    MSURFACE_FLAGS      ,16
  100. .set    MSURFACE_FIRSTEDGE  ,20
  101. .set    MSURFACE_NUMEDGES   ,24
  102. .set    MSURFACE_CACHESPOTS ,28
  103. .set    MSURFACE_TEXTUREMINS,44
  104. .set    MSURFACE_EXTENTS    ,48
  105. .set    MSURFACE_TEXINFO    ,52
  106. .set    MSURFACE_STYLES     ,56
  107. .set    MSURFACE_SAMPLES    ,60
  108. .set    MSURFACE_SIZEOF_EXP ,6
  109. .set    MSURFACE_SIZEOF     ,(1<<MSURFACE_SIZEOF_EXP)
  110.  
  111. .set    SURF_NEXT           ,0
  112. .set    SURF_PREV           ,4
  113. .set    SURF_SPANS          ,8
  114. .set    SURF_KEY            ,12
  115. .set    SURF_LAST_U         ,16
  116. .set    SURF_SPANSTATE      ,20
  117. .set    SURF_FLAGS          ,24
  118. .set    SURF_DATA           ,28
  119. .set    SURF_ENTITY         ,32
  120. .set    SURF_NEARZI         ,36
  121. .set    SURF_INSUBMODEL     ,40
  122. .set    SURF_D_ZIORIGIN     ,44
  123. .set    SURF_D_ZISTEPU      ,48
  124. .set    SURF_D_ZISTEPV      ,52
  125. .set    SURF_SIZEOF_EXP     ,6
  126. .set    SURF_SIZEOF         ,(1<<SURF_SIZEOF_EXP)
  127.  
  128. .set    MPLANE_NORMAL       ,0
  129. .set    MPLANE_DIST         ,12
  130. .set    MPLANE_TYPE         ,16
  131. .set    MPLANE_SIGNBITS     ,17
  132. .set    MPLANE_SIZEOF       ,20
  133.  
  134. .set    MTEXINFO_VECS       ,0
  135. .set    MTEXINFO_MIPADJUST  ,32
  136. .set    MTEXINFO_TEXTURE    ,36
  137. .set    MTEXINFO_FLAGS      ,40
  138. .set    MTEXINFO_SIZEOF     ,44
  139.  
  140. .set    CLIP_NORMAL         ,0
  141. .set    CLIP_DIST           ,12
  142. .set    CLIP_NEXT           ,16
  143. .set    CLIP_LEFTEDGE       ,20
  144. .set    CLIP_RIGHTEDGE      ,21
  145. .set    CLIP_RESERVED       ,22
  146. .set    CLIP_SIZEOF         ,24
  147.  
  148. .set    SURFCACHE_DATA      ,48
  149. .set    SURFCACHE_WIDTH     ,32
  150.  
  151. .set    TEXTURE_OFFSETS     ,44
  152.  
  153. .set    ENTITY_ORIGIN       ,4
  154.  
  155. .set    CVAR_VALUE          ,16
  156.  
  157.  
  158.  
  159.  
  160.  
  161. ###########################################################################
  162. #
  163. #       void _D_CalcGradients (msurface_t *pface)
  164. #
  165. ###########################################################################
  166.  
  167.     funcdef    D_CalcGradients
  168.  
  169.     init    0,24,0,9
  170.     stfd    f14,fb+0*8(r1)
  171.     stfd    f15,fb+1*8(r1)
  172.     stfd    f16,fb+2*8(r1)
  173.     stfd    f17,fb+3*8(r1)
  174.     stfd    f18,fb+4*8(r1)
  175.     stfd    f19,fb+5*8(r1)
  176.     stfd    f20,fb+6*8(r1)
  177.     stfd    f22,fb+8*8(r1)
  178.  
  179.     lwz     r4,MSURFACE_TEXINFO(r3)
  180.     la      r5,16(r4)
  181.     lxa     r6,vright
  182.     lxa     r7,vup
  183.     lxa     r8,vpn
  184.     lfs     f1,0(r6)
  185.     lfs     f10,0(r4)
  186.     fmuls   f0,f10,f1
  187.     lfs     f2,4(r6)
  188.     lfs     f11,4(r4)
  189.     fmadds  f0,f11,f2,f0
  190.     lfs     f3,8(r6)
  191.     lfs     f12,8(r4)
  192.     fmadds  f0,f12,f3,f0            #f0 = p_saxis[0]
  193.     lfs     f4,0(r7)
  194.     fmuls   f13,f10,f4
  195.     lfs     f5,4(r7)
  196.     fmadds  f13,f11,f5,f13
  197.     lfs     f6,8(r7)
  198.     fmadds  f13,f12,f6,f13          #f13 = p_saxis[1]
  199.     lfs     f7,0(r8)
  200.     fmuls   f14,f10,f7
  201.     lfs     f8,4(r8)
  202.     fmadds  f14,f11,f8,f14
  203.     lfs     f9,8(r8)
  204.     fmadds  f14,f12,f9,f14          #f14 = p_saxis[2]
  205.  
  206.     lfs     f15,0(r5)
  207.     fmuls   f18,f15,f1
  208.     lw      r9,miplevel
  209.     fmuls   f19,f15,f4
  210.     slwi    r0,r9,23
  211.     fmuls   f20,f15,f7
  212.     lfs     f16,4(r5)
  213.     fmadds  f18,f16,f2,f18
  214.     lis     r11,0x3f800000@h
  215.     ori     r11,r11,0x3f800000@l
  216.     fmadds  f19,f16,f5,f19
  217.     subf    r0,r0,r11
  218.     fmadds  f20,f16,f8,f20
  219.     lfs     f17,8(r5)
  220.     fmadds  f18,f17,f3,f18          #f18 = p_taxis[0]
  221.     stw     r0,local(r1)
  222.     fmadds  f19,f17,f6,f19          #f19 = p_taxis[1]
  223.     lfs     f22,local(r1)           #f22 = mipscale
  224.     fmadds  f20,f17,f9,f20          #f20 = p_taxis[2]
  225.  
  226.     ls      f1,xscaleinv
  227.     ls      f5,yscaleinv
  228.     fmuls   f1,f1,f22
  229.     fmuls   f5,f5,f22
  230.     fmuls   f2,f1,f0
  231.     fmuls   f6,f5,f13
  232.     ss      f2,d_sdivzstepu
  233.     fneg    f6,f6
  234.     ss      f6,d_sdivzstepv
  235.     fmuls   f3,f1,f18
  236.     fmuls   f7,f5,f19
  237.     ss      f3,d_tdivzstepu
  238.     fneg    f7,f7
  239.     ss      f7,d_tdivzstepv
  240.     ls      f4,xcenter
  241.     ls      f8,ycenter
  242.     fmuls   f2,f2,f4
  243.     lxa     r11,transformed_modelorg
  244.     fmadds  f6,f6,f8,f2
  245.     fmuls   f3,f3,f4
  246.     fmadds  f7,f7,f8,f3
  247.     fmsubs  f2,f14,f22,f6
  248.     ss      f2,d_sdivzorigin
  249.     fmsubs  f3,f20,f22,f7
  250.     ss      f3,d_tdivzorigin
  251.  
  252.     lfs     f1,0(r11)
  253.     lfs     f2,4(r11)
  254.     lfs     f3,8(r11)
  255.  
  256.     fmuls   f4,f1,f0
  257.     fmuls   f5,f1,f18
  258.     ls      f6,c65536
  259.     fmadds  f4,f2,f13,f4
  260.     fmadds  f5,f2,f19,f5
  261.     fmadds  f4,f3,f14,f4
  262.     fmadds  f5,f3,f20,f5
  263.     ls      f7,c0_5
  264.     fmuls   f4,f4,f22
  265.     fmuls   f5,f5,f22
  266.  
  267.     fmuls   f22,f22,f6
  268.     lwz     r8,MSURFACE_TEXTUREMINS(r3)
  269.  
  270.     fmadds  f4,f6,f4,f7
  271.     fmadds  f5,f6,f5,f7
  272.     fctiwz  f0,f4
  273.     fctiwz  f2,f5
  274.     stfd    f0,local(r1)
  275.     stfd    f2,local+8(r1)
  276.     lwz     r6,local+4(r1)
  277.     lwz     r12,local+12(r1)
  278.     lfs     f8,12(r4)
  279.     lfs     f3,12(r5)
  280.     fmuls   f8,f8,f22
  281.     fmuls   f3,f3,f22
  282.     fctiwz  f0,f8
  283.     fctiwz  f2,f3
  284.     stfd    f0,local(r1)
  285.     stfd    f2,local+8(r1)
  286.     lwz     r7,local+4(r1)
  287.     lwz     r4,local+12(r1)
  288.     clrrwi  r11,r8,16
  289.     slwi    r5,r8,16
  290.     sraw    r11,r11,r9
  291.     sraw    r5,r5,r9
  292.     subf    r11,r7,r11
  293.     subf    r5,r4,r5
  294.     subf    r6,r11,r6
  295.     subf    r12,r5,r12
  296.     sw      r6,sadjust
  297.     sw      r12,tadjust
  298.  
  299.     lwz     r8,MSURFACE_EXTENTS(r3)
  300.     clrrwi  r6,r8,16
  301.     slwi    r5,r8,16
  302.     sraw    r6,r6,r9
  303.     sraw    r5,r5,r9
  304.     subi    r6,r6,1
  305.     subi    r5,r5,1
  306.     sw      r6,bbextents
  307.     sw      r5,bbextentt
  308.  
  309.     lfd    f14,fb+0*8(r1)
  310.     lfd    f15,fb+1*8(r1)
  311.     lfd    f16,fb+2*8(r1)
  312.     lfd    f17,fb+3*8(r1)
  313.     lfd    f18,fb+4*8(r1)
  314.     lfd    f19,fb+5*8(r1)
  315.     lfd    f20,fb+6*8(r1)
  316.     lfd    f22,fb+8*8(r1)
  317.     exit
  318.  
  319.     funcend    D_CalcGradients
  320.  
  321.  
  322.  
  323.  
  324. ###########################################################################
  325. #
  326. #       void _D_DrawSurfaces (void)
  327. #
  328. ###########################################################################
  329.  
  330.     funcdef    D_DrawSurfaces
  331.  
  332. .ifdef    WOS
  333.     init    0,8,18,9
  334.     stmw    r14,gb(r1)
  335. .else
  336.     init    0,8,17,9
  337.     stmw    r15,gb(r1)
  338. .endif
  339.     stfd    f14,fb+0*8(r1)
  340.     stfd    f15,fb+1*8(r1)
  341.     stfd    f16,fb+2*8(r1)
  342.     stfd    f17,fb+3*8(r1)
  343.     stfd    f18,fb+4*8(r1)
  344.     stfd    f19,fb+5*8(r1)
  345.     stfd    f20,fb+6*8(r1)
  346.     stfd    f21,fb+7*8(r1)
  347.     stfd    f22,fb+8*8(r1)
  348.  
  349. #        currententity = &r_worldentity;
  350.     lxa     r12,r_worldentity
  351.     ls      f17,c0
  352.     ls      f18,cM0_9
  353.     sw      r12,currententity
  354.  
  355.     lxa     r31,modelorg
  356.     lxa     r30,transformed_modelorg
  357.     lxa     r29,vright
  358.     lxa     r28,vup
  359.     lxa     r27,vpn
  360.     lxa     r24,r_origin
  361.     lxa     r23,base_vright
  362.     lxa     r22,base_vup
  363.     lxa     r21,base_vpn
  364.     lxa     r19,screenedge
  365.     lxa     r18,d_scalemip
  366.     lw      r17,d_minmip
  367.     lw      r15,d_drawspans
  368.     subi    r19,r19,4
  369.     lxa     r20,view_clipplanes
  370.     subi    r20,r20,4
  371.  
  372. #        TransformVector (modelorg, transformed_modelorg);
  373. #        VectorCopy (transformed_modelorg, world_transformed_modelorg);
  374.  
  375. ######  TransformVector (inlined)
  376.  
  377.     lfs     f1,0(r31)
  378.     lfs     f4,0(r29)
  379.     fmuls   f0,f1,f4
  380.     lfs     f2,4(r31)
  381.     lfs     f5,4(r29)
  382.     fmadds  f0,f2,f5,f0
  383.     lfs     f3,8(r31)
  384.     lfs     f6,8(r29)
  385.     fmadds  f14,f3,f6,f0
  386.     stfs    f14,0(r30)              #f14 = world_transformed[0]
  387.     lfs     f4,0(r28)
  388.     fmuls   f7,f1,f4
  389.     lfs     f5,4(r28)
  390.     fmadds  f7,f2,f5,f7
  391.     lfs     f6,8(r28)
  392.     fmadds  f15,f3,f6,f7
  393.     stfs    f15,4(r30)              #f15 = world_transformed[1]
  394.     lfs     f4,0(r27)
  395.     fmuls   f8,f1,f4
  396.     lfs     f5,4(r27)
  397.     fmadds  f8,f2,f5,f8
  398.     lfs     f6,8(r27)
  399.     fmadds  f16,f3,f6,f8
  400.     stfs    f16,8(r30)              #f16 = world_transformed[2]
  401.  
  402. ######  end of TransformVector
  403.  
  404. #        if (r_drawflat.value)
  405. #        {
  406. #                for (s = &surfaces[1] ; s<surface_p ; s++)
  407.  
  408.     lxa     r3,r_drawflat
  409.     lfs     f0,CVAR_VALUE(r3)
  410.     fcmpo   cr0,f0,f17
  411.     beq     .dsnotflat
  412.     lw      r26,surfaces
  413.     la      r26,SURF_SIZEOF(r26)
  414.     lw      r25,surface_p
  415. .dsloop:
  416.     cmpw    r26,r25
  417.     bge     .dsend
  418.  
  419. #     if (!s->spans)
  420. #             continue;
  421.  
  422.     lwz     r0,SURF_SPANS(r26)
  423.     mr.     r0,r0
  424.     beq     .dsnext
  425.  
  426. #       d_zistepu = s->d_zistepu;
  427. #       d_zistepv = s->d_zistepv;
  428. #       d_ziorigin = s->d_ziorigin;
  429. #
  430. #       D_DrawSolidSurface (s, (long)s->data & 0xFF);
  431. #       D_DrawZSpans (s->spans);
  432.  
  433.     lwz     r3,SURF_D_ZISTEPU(r26)
  434.     sw      r3,d_zistepu
  435.     lwz     r3,SURF_D_ZISTEPV(r26)
  436.     sw      r3,d_zistepv
  437.     lwz     r3,SURF_D_ZIORIGIN(r26)
  438.     sw      r3,d_ziorigin
  439.     lwz     r4,SURF_DATA(r26)
  440.     andi.   r4,r4,0xff
  441.     mr      r3,r26
  442.     call    D_DrawSolidSurface
  443.     lwz     r3,SURF_SPANS(r26)
  444.     call    D_DrawZSpans
  445. .dsnext:
  446.     la      r26,SURF_SIZEOF(r26)
  447.     b       .dsloop
  448.  
  449. .dsnotflat:
  450.     lw      r26,surfaces
  451.     la      r26,SURF_SIZEOF(r26)
  452.     lw      r25,surface_p
  453.  
  454. #         for (s = &surfaces[1] ; s<surface_p ; s++)
  455. #         {
  456. #                 if (!s->spans)
  457. #                         continue;
  458.  
  459. .dsloop2:
  460.     cmpw    r26,r25
  461.     bge     .dsend
  462.     lwz     r0,SURF_SPANS(r26)
  463.     mr.     r0,r0
  464.     beq     .dsnext2
  465.  
  466. #     r_drawnpolycount++;
  467. #
  468. #     d_zistepu = s->d_zistepu;
  469. #     d_zistepv = s->d_zistepv;
  470. #     d_ziorigin = s->d_ziorigin;
  471.  
  472.     lw      r3,r_drawnpolycount
  473.     addi    r3,r3,1
  474.     sw      r3,r_drawnpolycount
  475.     lwz     r3,SURF_D_ZISTEPU(r26)
  476.     sw      r3,d_zistepu
  477.     lwz     r3,SURF_D_ZISTEPV(r26)
  478.     sw      r3,d_zistepv
  479.     lwz     r3,SURF_D_ZIORIGIN(r26)
  480.     sw      r3,d_ziorigin
  481.  
  482. #     if (s->flags & SURF_DRAWSKY)
  483. #     {
  484. #             if (!r_skymade)
  485. #             {
  486. #                     R_MakeSky ();
  487. #             }
  488. #
  489. #             D_DrawSkyScans8 (s->spans);
  490. #             D_DrawZSpans (s->spans);
  491. #     }
  492.  
  493.     lwz     r5,SURF_FLAGS(r26)
  494.     andi.   r0,r5,SURF_DRAWSKY
  495.     beq     .dsnosky
  496.     lw      r3,r_skymade
  497.     mr.     r3,r3
  498.     bne     .dsskymade
  499.     call    R_MakeSky
  500. .dsskymade:
  501.     lwz     r3,SURF_SPANS(r26)
  502.     call    D_DrawSkyScans8
  503.     lwz     r3,SURF_SPANS(r26)
  504.     call    D_DrawZSpans
  505.     b       .dsnext2
  506.  
  507. #   else if (s->flags & SURF_DRAWBACKGROUND)
  508. #   {
  509. #   // set up a gradient for the background surface that places it
  510. #   // effectively at infinity distance from the viewpoint
  511. #           d_zistepu = 0;
  512. #           d_zistepv = 0;
  513. #           d_ziorigin = -0.9;
  514. #
  515. #           D_DrawSolidSurface (s, (int)r_clearcolor.value & 0xFF);
  516. #           D_DrawZSpans (s->spans);
  517. #   }
  518.  
  519. .dsnosky:
  520.     andi.   r0,r5,SURF_DRAWBACKGROUND
  521.     beq     .dsnobackground
  522.     ss      f17,d_zistepu
  523.     ss      f17,d_zistepv
  524.     ss      f18,d_ziorigin
  525.     lxa     r3,r_clearcolor
  526.     lfs     f0,CVAR_VALUE(r3)
  527.     fctiwz  f0,f0
  528.     stfd    f0,local(r1)
  529.     lwz     r4,local+4(r1)
  530.     andi.   r4,r4,0xff
  531.     mr      r3,r26
  532.     call    D_DrawSolidSurface
  533.     lwz     r3,SURF_SPANS(r26)
  534.     call    D_DrawZSpans
  535.     b       .dsnext2
  536.  
  537. #   else if (s->flags & SURF_DRAWTURB)
  538. #   {
  539. #           pface = s->data;
  540. #           miplevel = 0;
  541. #           cacheblock = (pixel_t *)
  542. #                           ((byte *)pface->texinfo->texture +
  543. #                           pface->texinfo->texture->offsets[0]);
  544. #           cachewidth = 64;
  545.  
  546. .dsnobackground:
  547.     andi.   r0,r5,SURF_DRAWTURB
  548.     beq     .dsnoturb
  549. .ifdef    WOS
  550.     lwz     r14,SURF_DATA(r26)
  551.     li    r0,0
  552.     sw    r0,miplevel
  553.     lwz     r7,MSURFACE_TEXINFO(r14)
  554. .else
  555.     lwz     r7,SURF_DATA(r26)
  556.     li    r0,0
  557.     sw    r0,miplevel
  558.     lwz     r7,MSURFACE_TEXINFO(r7)
  559. .endif
  560.     lwz     r7,MTEXINFO_TEXTURE(r7)
  561.     lwz     r0,TEXTURE_OFFSETS(r7)
  562.     add     r7,r7,r0
  563.     sw      r7,cacheblock
  564.     li    r0,64
  565.     sw    r0,cachewidth
  566.  
  567. #      if (s->insubmodel)
  568. #      {
  569. #      // FIXME: we don't want to do all this for every polygon!
  570. #      // TODO: store once at start of frame
  571. #              currententity = s->entity;      //FIXME: make this passed in to
  572. #                                                                      // R_RotateBmodel ()
  573. #              VectorSubtract (r_origin, currententity->origin,
  574. #                              local_modelorg);
  575. #              TransformVector (local_modelorg, transformed_modelorg);
  576. #
  577. #              R_RotateBmodel ();      // FIXME: don't mess with the frustum,
  578. #                                                      // make entity passed in
  579. #      }
  580.  
  581.     lwz     r0,SURF_INSUBMODEL(r26)
  582.     mr.     r0,r0
  583.     beq     .dsnosub
  584.     lwz     r3,SURF_ENTITY(r26)
  585.     sw      r3,currententity
  586.     la      r3,ENTITY_ORIGIN(r3)
  587.  
  588. ######  VectorSubtract (inlined)
  589.  
  590.     lfs     f1,0(r24)
  591.     lfs     f5,0(r3)
  592.     fsubs   f1,f1,f5
  593.     lfs     f2,4(r24)
  594.     lfs     f6,4(r3)
  595.     fsubs   f2,f2,f6
  596.     lfs     f3,8(r24)
  597.     lfs     f7,8(r3)
  598.     fsubs   f3,f3,f7
  599.  
  600. ######  end of VectorSubtract (inlined)
  601.  
  602. ######  TransformVector (inlined)
  603.  
  604.     lfs     f4,0(r29)
  605.     fmuls   f7,f4,f1
  606.     lfs     f5,4(r29)
  607.     fmadds  f7,f5,f2,f7
  608.     lfs     f6,8(r29)
  609.     fmadds  f7,f6,f3,f7
  610.     stfs    f7,0(r30)
  611.     lfs     f4,0(r28)
  612.     fmuls   f7,f4,f1
  613.     lfs     f5,4(r28)
  614.     fmadds  f7,f5,f2,f7
  615.     lfs     f6,8(r28)
  616.     fmadds  f7,f6,f3,f7
  617.     stfs    f7,4(r30)
  618.     lfs     f4,0(r27)
  619.     fmuls   f7,f4,f1
  620.     lfs     f5,4(r27)
  621.     fmadds  f7,f5,f2,f7
  622.     lfs     f6,8(r27)
  623.     fmadds  f7,f6,f3,f7
  624.     stfs    f7,8(r30)
  625.  
  626. ###### end of TransformVector
  627.  
  628.     call    R_RotateBmodel
  629.  
  630. #              D_CalcGradients (pface);
  631. #              Turbulent8 (s->spans);
  632. #              D_DrawZSpans (s->spans);
  633.  
  634. .dsnosub:
  635. .ifdef    WOS
  636.     mr      r3,r14
  637. .else
  638.     lwz     r3,SURF_DATA(r26)
  639. .endif
  640.     call    D_CalcGradients
  641.     lwz     r3,SURF_SPANS(r26)
  642.     call    Turbulent8
  643.     lwz     r3,SURF_SPANS(r26)
  644.     call    D_DrawZSpans
  645.  
  646. #          if (s->insubmodel)
  647. #          {
  648. #          //
  649. #          // restore the old drawing state
  650. #          // FIXME: we don't want to do this every time!
  651. #          // TODO: speed up
  652. #          //
  653. #                  currententity = &r_worldentity;
  654. #                  VectorCopy (world_transformed_modelorg,
  655. #                                          transformed_modelorg);
  656. #                  VectorCopy (base_vpn, vpn);
  657. #                  VectorCopy (base_vup, vup);
  658. #                  VectorCopy (base_vright, vright);
  659. #                  VectorCopy (base_modelorg, modelorg);
  660. #                  R_TransformFrustum ();
  661. #          }
  662.  
  663.     lwz     r0,SURF_INSUBMODEL(r26)
  664.     mr.     r0,r0
  665.     beq     .dsnext2
  666.     lxa     r12,r_worldentity
  667.     sw      r12,currententity
  668.  
  669.     stfs    f14,0(r30)
  670.     stfs    f15,4(r30)
  671.     stfs    f16,8(r30)
  672.     lxa    r11,base_modelorg
  673.     lfs     f0,0(r23)
  674.     stfs    f0,0(r29)               #f0 = vright[0]
  675.     lfs     f1,0(r22)
  676.     stfs    f1,0(r28)               #f1 = vup[0]
  677.     lfs     f2,0(r21)
  678.     stfs    f2,0(r27)               #f2 = vpn[0]
  679.     lfs    f9,0(r11)
  680.     stfs    f9,0(r31)
  681.     lfs     f3,4(r23)
  682.     stfs    f3,4(r29)               #f3 = vright[1]
  683.     lfs     f4,4(r22)
  684.     stfs    f4,4(r28)               #f4 = vup[1]
  685.     lfs     f5,4(r21)
  686.     stfs    f5,4(r27)               #f5 = vpn[1]
  687.     lfs    f9,4(r11)
  688.     stfs    f9,4(r31)
  689.     lfs     f6,8(r23)
  690.     stfs    f6,8(r29)               #f6 = vright[2]
  691.     lfs     f7,8(r22)
  692.     stfs    f7,8(r28)               #f7 = vup[2]
  693.     lfs     f8,8(r21)
  694.     stfs    f8,8(r27)               #f8 = vpn[2]
  695.     lfs    f9,8(r11)
  696.     stfs    f9,8(r31)
  697.  
  698. ###### R_TransformFrustum (inlined)
  699.  
  700.     li      r0,4
  701.     mtctr   r0
  702.     lfs     f20,0(r31)
  703.     lfs     f21,4(r31)
  704.     lfs     f22,8(r31)
  705. .dsloop3:
  706.     lfsu    f9,4(r19)
  707.     lfsu    f10,4(r19)
  708.     lfsu    f11,4(r19)
  709.     fmuls   f12,f1,f10
  710.     fmuls   f13,f4,f10
  711.     fmuls   f19,f7,f10
  712.     fmadds  f12,f2,f11,f12
  713.     fmadds  f13,f5,f11,f13
  714.     fmadds  f19,f8,f11,f19
  715.     fnmsubs f12,f0,f9,f12
  716.     stfsu   f12,4(r20)
  717.     fmuls   f12,f12,f20
  718.     fnmsubs f13,f3,f9,f13
  719.     stfsu   f13,4(r20)
  720.     fmadds  f12,f13,f21,f12
  721.     fnmsubs f19,f6,f9,f19
  722.     stfsu   f19,4(r20)
  723.     fmadds  f12,f19,f22,f12
  724.     la      r19,MPLANE_SIZEOF-12(r19)
  725.     stfsu   f12,4(r20)
  726.     la      r20,CLIP_SIZEOF-16(r20)
  727.     bdnz    .dsloop3
  728.     la      r19,-4*MPLANE_SIZEOF(r19)
  729.     la      r20,-4*CLIP_SIZEOF(r20)
  730.  
  731. ######  end of R_TransformFrustum
  732.  
  733.     b       .dsnext2
  734. .dsnoturb:
  735.  
  736. #          if (s->insubmodel)
  737. #          {
  738. #          // FIXME: we don't want to do all this for every polygon!
  739. #          // TODO: store once at start of frame
  740. #                  currententity = s->entity;      //FIXME: make this passed in to
  741. #                                                                          // R_RotateBmodel ()
  742. #                  VectorSubtract (r_origin, currententity->origin, local_modelorg);
  743. #                  TransformVector (local_modelorg, transformed_modelorg);
  744. #
  745. #                  R_RotateBmodel ();      // FIXME: don't mess with the frustum,
  746. #                                                          // make entity passed in
  747. #          }
  748.  
  749.     lwz     r0,SURF_INSUBMODEL(r26)
  750.     mr.     r0,r0
  751.     beq     .dsnosub2
  752.     lwz     r3,SURF_ENTITY(r26)
  753.     sw      r3,currententity
  754.     la      r3,ENTITY_ORIGIN(r3)
  755.  
  756. ###### VectorSubtract (inlined)
  757.  
  758.     lfs     f1,0(r24)
  759.     lfs     f5,0(r3)
  760.     fsubs   f1,f1,f5
  761.     lfs     f2,4(r24)
  762.     lfs     f6,4(r3)
  763.     fsubs   f2,f2,f6
  764.     lfs     f3,8(r24)
  765.     lfs     f7,8(r3)
  766.     fsubs   f3,f3,f7
  767.  
  768. ###### end of VectorSubtract
  769.  
  770. ###### TransformVector (inlined)
  771.  
  772.     lfs     f4,0(r29)
  773.     fmuls   f7,f4,f1
  774.     lfs     f5,4(r29)
  775.     fmadds  f7,f5,f2,f7
  776.     lfs     f6,8(r29)
  777.     fmadds  f7,f6,f3,f7
  778.     stfs    f7,0(r30)
  779.     lfs     f4,0(r28)
  780.     fmuls   f7,f4,f1
  781.     lfs     f5,4(r28)
  782.     fmadds  f7,f5,f2,f7
  783.     lfs     f6,8(r28)
  784.     fmadds  f7,f6,f3,f7
  785.     stfs    f7,4(r30)
  786.     lfs     f4,0(r27)
  787.     fmuls   f7,f4,f1
  788.     lfs     f5,4(r27)
  789.     fmadds  f7,f5,f2,f7
  790.     lfs     f6,8(r27)
  791.     fmadds  f7,f6,f3,f7
  792.     stfs    f7,8(r30)
  793.  
  794. ######  end of TransformVector
  795.  
  796.     call    R_RotateBmodel
  797. .dsnosub2:
  798.  
  799. #                                pface = s->data;
  800. #                                miplevel = D_MipLevelForScale (s->nearzi * scale_for_mip
  801. #                                # pface->texinfo->mipadjust);
  802. #
  803. #                        // FIXME: make this passed in to D_CacheSurface
  804. #                                pcurrentcache = D_CacheSurface (pface, miplevel);
  805. #
  806. #                                cacheblock = (pixel_t *)pcurrentcache->data;
  807. #                                cachewidth = pcurrentcache->width;
  808.  
  809.     lwz     r16,SURF_DATA(r26)
  810.     lfs     f0,SURF_NEARZI(r26)
  811.     ls      f1,scale_for_mip
  812.     fmuls   f0,f0,f1
  813.     lwz     r3,MSURFACE_TEXINFO(r16)
  814.     lfs     f1,MTEXINFO_MIPADJUST(r3)
  815.     fmuls   f0,f0,f1
  816.  
  817. ######  D_MipLevelForScale (inlined)
  818.     li      r4,0
  819.     lfs     f1,0(r18)
  820.     fcmpo   cr0,f0,f1
  821.     bge     .dsfound
  822.     li      r4,1
  823.     lfs     f1,4(r18)
  824.     fcmpo   cr0,f0,f1
  825.     bge     .dsfound
  826.     li      r4,2
  827.     lfs     f1,8(r18)
  828.     fcmpo   cr0,f0,f1
  829.     bge     .dsfound
  830.     li      r4,3
  831.     cmpw    r4,r17
  832.     bge     .dsfound
  833.     mr      r4,r17
  834. .dsfound:
  835. ######  end of D_MipLevelForScale
  836.  
  837.     sw      r4,miplevel
  838.     mr      r3,r16
  839.     call    D_CacheSurface
  840.     la      r4,SURFCACHE_DATA(r3)
  841.     sw      r4,cacheblock
  842.     lwz     r3,SURFCACHE_WIDTH(r3)
  843.     sw      r3,cachewidth
  844.  
  845. #                                D_CalcGradients (pface);
  846. #
  847. #                                (*d_drawspans) (s->spans);
  848. #
  849. #                                D_DrawZSpans (s->spans);
  850.  
  851.     mr      r3,r16
  852.     call    D_CalcGradients
  853.     lwz     r3,SURF_SPANS(r26)
  854.     mtlr    r15
  855.     blrl
  856.     lwz     r3,SURF_SPANS(r26)
  857.     call    D_DrawZSpans
  858.  
  859. #          if (s->insubmodel)
  860. #          {
  861. #          //
  862. #          // restore the old drawing state
  863. #          // FIXME: we don't want to do this every time!
  864. #          // TODO: speed up
  865. #          //
  866. #                  VectorCopy (world_transformed_modelorg,
  867. #                                          transformed_modelorg);
  868. #                  VectorCopy (base_vpn, vpn);
  869. #                  VectorCopy (base_vup, vup);
  870. #                  VectorCopy (base_vright, vright);
  871. #                  VectorCopy (base_modelorg, modelorg);
  872. #                  R_TransformFrustum ();
  873. #                  currententity = &r_worldentity;
  874. #          }
  875.  
  876.     lwz     r0,SURF_INSUBMODEL(r16)
  877.     mr.     r0,r0
  878.     beq     .dsnext2
  879.  
  880.     stfs    f14,0(r30)
  881.     stfs    f15,4(r30)
  882.     stfs    f16,8(r30)
  883.     lxa    r11,base_modelorg
  884.     lfs     f0,0(r23)
  885.     stfs    f0,0(r29)               #f0 = vright[0]
  886.     lfs     f1,0(r22)
  887.     stfs    f1,0(r28)               #f1 = vup[0]
  888.     lfs     f2,0(r21)
  889.     stfs    f2,0(r27)               #f2 = vpn[0]
  890.     lfs    f9,0(r11)
  891.     stfs    f9,0(r31)
  892.     lfs     f3,4(r23)
  893.     stfs    f3,4(r29)               #f3 = vright[1]
  894.     lfs     f4,4(r22)
  895.     stfs    f4,4(r28)               #f4 = vup[1]
  896.     lfs     f5,4(r21)
  897.     stfs    f5,4(r27)               #f5 = vpn[1]
  898.     lfs    f9,4(r11)
  899.     stfs    f9,4(r31)
  900.     lfs     f6,8(r23)
  901.     stfs    f6,8(r29)               #f6 = vright[2]
  902.     lfs     f7,8(r22)
  903.     stfs    f7,8(r28)               #f7 = vup[2]
  904.     lfs     f8,8(r21)
  905.     stfs    f8,8(r27)               #f8 = vpn[2]
  906.     lfs    f9,8(r11)
  907.     stfs    f9,8(r31)
  908.  
  909. ###### R_TransformFrustum (inlined)
  910.  
  911.     li      r0,4
  912.     mtctr   r0
  913.     lfs     f20,0(r31)
  914.     lfs     f21,4(r31)
  915.     lfs     f22,8(r31)
  916. .dsloop4:
  917.     lfsu    f9,4(r19)
  918.     lfsu    f10,4(r19)
  919.     lfsu    f11,4(r19)
  920.     fmuls   f12,f1,f10
  921.     fmuls   f13,f4,f10
  922.     fmuls   f19,f7,f10
  923.     fmadds  f12,f2,f11,f12
  924.     fmadds  f13,f5,f11,f13
  925.     fmadds  f19,f8,f11,f19
  926.     fnmsubs f12,f0,f9,f12
  927.     stfsu   f12,4(r20)
  928.     fmuls   f12,f12,f20
  929.     fnmsubs f13,f3,f9,f13
  930.     stfsu   f13,4(r20)
  931.     fmadds  f12,f13,f21,f12
  932.     fnmsubs f19,f6,f9,f19
  933.     stfsu   f19,4(r20)
  934.     fmadds  f12,f19,f22,f12
  935.     la      r19,MPLANE_SIZEOF-12(r19)
  936.     stfsu   f12,4(r20)
  937.     la      r20,CLIP_SIZEOF-16(r20)
  938.     bdnz    .dsloop4
  939.     lxa     r12,r_worldentity
  940.     la      r19,-4*MPLANE_SIZEOF(r19)
  941.     la      r20,-4*CLIP_SIZEOF(r20)
  942.  
  943. ######  end of R_TransformFrustum
  944.  
  945.     sw      r12,currententity
  946. .dsnext2:
  947.     la      r26,SURF_SIZEOF(r26)
  948.     b       .dsloop2
  949.  
  950. .dsend:
  951.     lfd    f14,fb+0*8(r1)
  952.     lfd    f15,fb+1*8(r1)
  953.     lfd    f16,fb+2*8(r1)
  954.     lfd    f17,fb+3*8(r1)
  955.     lfd    f18,fb+4*8(r1)
  956.     lfd    f19,fb+5*8(r1)
  957.     lfd    f20,fb+6*8(r1)
  958.     lfd    f21,fb+7*8(r1)
  959.     lfd    f22,fb+8*8(r1)
  960. .ifdef    WOS
  961.     lmw    r14,gb(r1)
  962. .else
  963.     lmw    r15,gb(r1)
  964. .endif
  965.     exit
  966.  
  967.     funcend    D_DrawSurfaces
  968.  
  969.  
  970.  
  971.  
  972. .ifdef    WOS
  973.     .tocd
  974. .else
  975.     .data
  976. .endif
  977.  
  978. lab cM0_9
  979.     .float    -0.9
  980.