home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 113 / EnigmaAmiga113CD.iso / software / sviluppo / quake_src / d_edge68k.s < prev    next >
Text File  |  2000-06-17  |  25KB  |  994 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. ** d_edge.c assembler implementations by Frank Wille <frank@phoenix.owl.de>
  17. **
  18.  
  19.         XREF    _vright
  20.         XREF    _vup
  21.         XREF    _vpn
  22.         XREF    _xscaleinv
  23.         XREF    _yscaleinv
  24.         XREF    _xcenter
  25.         XREF    _ycenter
  26.         XREF    _d_zistepu
  27.         XREF    _d_zistepv
  28.         XREF    _d_ziorigin
  29.         XREF    _d_sdivzstepu
  30.         XREF    _d_tdivzstepu
  31.         XREF    _d_sdivzstepv
  32.         XREF    _d_tdivzstepv
  33.         XREF    _d_sdivzorigin
  34.         XREF    _d_tdivzorigin
  35.         XREF    _sadjust
  36.         XREF    _tadjust
  37.         XREF    _bbextents
  38.         XREF    _bbextentt
  39.         XREF    _transformed_modelorg
  40.         XREF    _miplevel
  41.         XREF    _cl_entities
  42.         XREF    _currententity
  43.         XREF    _r_drawflat
  44.         XREF    _surfaces
  45.         XREF    _surface_p
  46.         XREF    _r_drawnpolycount
  47.         XREF    _r_skymade
  48.         XREF    _r_clearcolor
  49.         XREF    _cacheblock
  50.         XREF    _cachewidth
  51.         XREF    _r_origin
  52.         XREF    _base_vpn
  53.         XREF    _base_vup
  54.         XREF    _base_vright
  55.         XREF    _base_modelorg
  56.         XREF    _d_drawspans
  57.         XREF    _scale_for_mip
  58.         XREF    _d_scalemip
  59.         XREF    _d_minmip
  60.         XREF    _modelorg
  61.         XREF    _screenedge
  62.         XREF    _view_clipplanes
  63.  
  64.         XREF    _D_DrawSolidSurface
  65.         XREF    _D_DrawZSpans
  66.         XREF    _R_MakeSky
  67.         XREF    _D_DrawSkyScans8
  68.         XREF    _D_DrawZSpans
  69.         XREF    _Turbulent8
  70.         XREF    _R_RotateBmodel
  71.         XREF    _D_CacheSurface
  72.  
  73.         XDEF    _D_CalcGradients
  74.         XDEF    _D_DrawSurfaces
  75.  
  76. SURF_DRAWSKY            =       4
  77. SURF_DRAWTURB           =       $10
  78. SURF_DRAWBACKGROUND     =       $40
  79.  
  80. MSURFACE_VISFRAME       =       0
  81. MSURFACE_DLIGHTFRAME    =       4
  82. MSURFACE_DLIGHTBITS     =       8
  83. MSURFACE_PLANE          =       12
  84. MSURFACE_FLAGS          =       16
  85. MSURFACE_FIRSTEDGE      =       20
  86. MSURFACE_NUMEDGES       =       24
  87. MSURFACE_CACHESPOTS     =       28
  88. MSURFACE_TEXTUREMINS    =       44
  89. MSURFACE_EXTENTS        =       48
  90. MSURFACE_TEXINFO        =       52
  91. MSURFACE_STYLES         =       56
  92. MSURFACE_SAMPLES        =       60
  93. MSURFACE_SIZEOF_EXP     =       6
  94. MSURFACE_SIZEOF         =       (1<<MSURFACE_SIZEOF_EXP)
  95.  
  96. SURF_NEXT               =       0
  97. SURF_PREV               =       4
  98. SURF_SPANS              =       8
  99. SURF_KEY                =       12
  100. SURF_LAST_U             =       16
  101. SURF_SPANSTATE          =       20
  102. SURF_FLAGS              =       24
  103. SURF_DATA               =       28
  104. SURF_ENTITY             =       32
  105. SURF_NEARZI             =       36
  106. SURF_INSUBMODEL         =       40
  107. SURF_D_ZIORIGIN         =       44
  108. SURF_D_ZISTEPU          =       48
  109. SURF_D_ZISTEPV          =       52
  110. SURF_SIZEOF_EXP         =       6
  111. SURF_SIZEOF             =       (1<<SURF_SIZEOF_EXP)
  112.  
  113. MPLANE_NORMAL           =       0
  114. MPLANE_DIST             =       12
  115. MPLANE_TYPE             =       16
  116. MPLANE_SIGNBITS         =       17
  117. MPLANE_SIZEOF           =       20
  118.  
  119. MTEXINFO_VECS           =       0
  120. MTEXINFO_MIPADJUST      =       32
  121. MTEXINFO_TEXTURE        =       36
  122. MTEXINFO_FLAGS          =       40
  123. MTEXINFO_SIZEOF         =       44
  124.  
  125. CLIP_NORMAL             =       0
  126. CLIP_DIST               =       12
  127. CLIP_NEXT               =       16
  128. CLIP_LEFTEDGE           =       20
  129. CLIP_RIGHTEDGE          =       21
  130. CLIP_RESERVED           =       22
  131. CLIP_SIZEOF             =       24
  132.  
  133. SURFCACHE_DATA          =       48
  134. SURFCACHE_WIDTH         =       32
  135.  
  136. TEXTURE_OFFSETS         =       44
  137.  
  138. ENTITY_ORIGIN           =       84
  139.  
  140. CVAR_VALUE              =       16
  141.  
  142.         fpu
  143.  
  144.  
  145.  
  146.  
  147. ******************************************************************************
  148. *
  149. *       void _D_CalcGradients (msurface_t *pface)
  150. *
  151. ******************************************************************************
  152.  
  153.         cnop    0,4
  154. _D_CalcGradients
  155.  
  156. *****   stackframe
  157.  
  158.         rsreset
  159. .fpuregs        rs.x    6
  160. .intregs        rs.l    4
  161.         rs.l    1
  162. .pface          rs.l    1
  163.  
  164.  
  165.         movem.l d2/d3/a2/a3,-(sp)
  166.         fmovem.x        fp2-fp7,-(sp)
  167.         move.l  .pface(sp),a0
  168.         move.l  MSURFACE_TEXINFO(a0),a2
  169.         lea     16(a2),a3
  170.         lea     _vright,a1
  171.         fmove.s (a1)+,fp0
  172.         fmove.s (a1)+,fp1
  173.         fmove.s (a1)+,fp2
  174.         fmove.s (a2)+,fp3
  175.         fmul    fp0,fp3
  176.         fmove.s (a2)+,fp4
  177.         fmul    fp1,fp4
  178.         fadd    fp4,fp3
  179.         fmove.s (a2)+,fp4
  180.         fmul    fp2,fp4
  181.         fadd    fp4,fp3                 ;fp3 = p_saxis[0]
  182.         fmove.s (a3)+,fp4
  183.         fmul    fp0,fp4
  184.         fmove.s (a3)+,fp5
  185.         fmul    fp1,fp5
  186.         fadd    fp5,fp4
  187.         fmove.s (a3)+,fp5
  188.         fmul    fp2,fp5
  189.         fadd    fp5,fp4                 ;fp4 = p_taxis[0]
  190.         sub     #12,a2
  191.         sub     #12,a3
  192.         lea     _vup,a1
  193.         fmove.s (a1)+,fp0
  194.         fmove.s (a1)+,fp1
  195.         fmove.s (a1)+,fp2
  196.         fmove.s (a2)+,fp5
  197.         fmul    fp0,fp5
  198.         fmove.s (a2)+,fp6
  199.         fmul    fp1,fp6
  200.         fadd    fp6,fp5
  201.         fmove.s (a2)+,fp6
  202.         fmul    fp2,fp6
  203.         fadd    fp6,fp5                 ;fp5 = p_saxis[1]
  204.         fmove.s (a3)+,fp6
  205.         fmul    fp0,fp6
  206.         fmove.s (a3)+,fp7
  207.         fmul    fp1,fp7
  208.         fadd    fp7,fp6
  209.         fmove.s (a3)+,fp7
  210.         fmul    fp2,fp7
  211.         fadd    fp7,fp6                 ;fp6 = p_taxis[1]
  212.         sub     #12,a2
  213.         sub     #12,a3
  214.  
  215.         moveq   #1,d0
  216.         move.l  _miplevel,d1            ;d1 = miplevel
  217.         asl.l   d1,d0
  218.         fmove.l d0,fp1
  219.         fmove.s #1,fp0
  220.         fdiv    fp1,fp0                 ;fp0 = mipscale
  221.         fmove.s fp0,-(sp)
  222.  
  223.         fmove.s _xscaleinv,fp1
  224.         fmul    fp0,fp1                 ;fp1 = t = xscaleinv * mipscale
  225.         fmove   fp3,fp2
  226.         fmul    fp1,fp2                 ;fp2 = d_sdivzstepu
  227.         fmove.s fp2,_d_sdivzstepu
  228.         fmul    fp4,fp1                 ;fp1 = d_tdivzstepu
  229.         fmove.s fp1,_d_tdivzstepu
  230.         fmove.s _xcenter,fp7
  231.         fmul    fp7,fp2
  232.         fmul    fp7,fp1
  233.  
  234.         fmove.s _yscaleinv,fp7
  235.         fmul    fp0,fp7                 ;fp7 = t = yscaleinv * mipscale
  236.         fmove   fp5,fp0
  237.         fmul    fp7,fp0                 ;fp0 = d_sdivzstepv
  238.         fneg    fp0
  239.         fmove.s fp0,_d_sdivzstepv
  240.         fmul.s  _ycenter,fp0
  241.         fmul    fp6,fp7                 ;fp7 = d_tdivzstepv
  242.         fneg    fp7
  243.         fmove.s fp7,_d_tdivzstepv
  244.         fmul.s  _ycenter,fp7
  245.  
  246.         fadd    fp0,fp2
  247.         fadd    fp1,fp7
  248.  
  249.         lea     _vpn,a1
  250.         fmove.s (a2)+,fp0
  251.         fmul.s  (a1),fp0
  252.         fmove.s (a2)+,fp1
  253.         fmul.s  4(a1),fp1
  254.         fadd    fp1,fp0
  255.         fmove.s (a2)+,fp1
  256.         fmul.s  8(a1),fp1
  257.         fadd    fp1,fp0
  258.         fmove   fp0,fp1                 ;fp0 = p_saxis[2]
  259.         fmul.s  (sp),fp1                ;mipscale * p_saxis[2]
  260.         fsub    fp2,fp1                 ;- fp2
  261.         fmove.s fp1,_d_sdivzorigin
  262.  
  263.         fmove.s (a3)+,fp1
  264.         fmul.s  (a1)+,fp1
  265.         fmove.s (a3)+,fp2
  266.         fmul.s  (a1)+,fp2
  267.         fadd    fp2,fp1
  268.         fmove.s (a3)+,fp2
  269.         fmul.s  (a1)+,fp2
  270.         fadd    fp2,fp1
  271.         fmove   fp1,fp2                 ;fp1 = p_taxis[2]
  272.         fmul.s  (sp),fp2                ;mipscale * p_taxis[2]
  273.         fsub    fp7,fp2                 ;- fp7
  274.         fmove.s fp2,_d_tdivzorigin
  275.  
  276.         lea     _transformed_modelorg,a1
  277.         fmove.s (a1)+,fp7
  278.         fmul    fp7,fp3
  279.         fmove.s (a1)+,fp2
  280.         fmul    fp2,fp5
  281.         fadd    fp5,fp3
  282.         fmove.s (a1)+,fp5
  283.         fmul    fp5,fp0
  284.         fadd    fp0,fp3
  285.         fmul    fp7,fp4
  286.         fmul    fp2,fp6
  287.         fadd    fp6,fp4
  288.         fmul    fp5,fp1
  289.         fadd    fp1,fp4
  290.  
  291.         fmove.s (sp)+,fp7               ;fp7 = mipscale
  292.         fmul    fp7,fp3
  293.         fmul    fp7,fp4
  294.         fmove.s #65536,fp0
  295.         fmove.s #0.5,fp1
  296.         fmul    fp0,fp7
  297.         move.l  MSURFACE_TEXINFO(a0),a1
  298.  
  299.         fmul    fp0,fp3
  300.         fadd    fp1,fp3
  301.         fmove.l fp3,d0
  302.         fmove.s 12(a1),fp2
  303.         fmul    fp7,fp2
  304.         fmove.l fp2,d2
  305.         move    MSURFACE_TEXTUREMINS(a0),d3
  306.         swap    d3
  307.         clr     d3
  308.         asr.l   d1,d3
  309.         sub.l   d2,d3
  310.         sub.l   d3,d0
  311.         move.l  d0,_sadjust
  312.  
  313.         fmul    fp0,fp4
  314.         fadd    fp1,fp4
  315.         fmove.l fp4,d0
  316.         fmove.s 12+16(a1),fp2
  317.         fmul    fp7,fp2
  318.         fmove.l fp2,d2
  319.         move    MSURFACE_TEXTUREMINS+2(a0),d3
  320.         swap    d3
  321.         clr     d3
  322.         asr.l   d1,d3
  323.         sub.l   d2,d3
  324.         sub.l   d3,d0
  325.         move.l  d0,_tadjust
  326.  
  327.         move    MSURFACE_EXTENTS(a0),d0
  328.         swap    d0
  329.         clr     d0
  330.         asr.l   d1,d0
  331.         subq.l  #1,d0
  332.         move.l  d0,_bbextents
  333.         move    MSURFACE_EXTENTS+2(a0),d0
  334.         swap    d0
  335.         clr     d0
  336.         asr.l   d1,d0
  337.         subq.l  #1,d0
  338.         move.l  d0,_bbextentt
  339.  
  340.         fmovem.x        (sp)+,fp2-fp7
  341.         movem.l (sp)+,d2/d3/a2/a3
  342.         rts
  343.  
  344.  
  345.  
  346.  
  347.  
  348.  
  349.  
  350.  
  351.  
  352. ******************************************************************************
  353. *
  354. *       void _D_DrawSurfaces (void)
  355. *
  356. ******************************************************************************
  357.  
  358.         cnop    0,4
  359. _D_DrawSurfaces
  360.  
  361.  
  362.         movem.l d2/a2-a4,-(sp)
  363.         fmovem.x        fp2-fp7,-(sp)
  364.  
  365. *        currententity = &cl_entities[0];
  366. *        TransformVector (modelorg, transformed_modelorg);
  367. *        VectorCopy (transformed_modelorg, world_transformed_modelorg);
  368.  
  369.         move.l  #_cl_entities,_currententity
  370.  
  371. ******  TransformVector (inlined)
  372.  
  373.         lea     _modelorg,a0
  374.         lea     _transformed_modelorg,a1
  375.         fmove.s (a0)+,fp0
  376.         fmove.s (a0)+,fp1
  377.         fmove.s (a0)+,fp2
  378.         lea     _vright,a2
  379.         fmove.s (a2)+,fp3
  380.         fmul    fp0,fp3
  381.         fmove.s (a2)+,fp4
  382.         fmul    fp1,fp4
  383.         fadd    fp4,fp3
  384.         fmove.s (a2)+,fp4
  385.         fmul    fp2,fp4
  386.         fadd    fp4,fp3
  387.         fmove.s fp3,(a1)+               ;fp3 = world_tr... [0]
  388.         lea     _vup,a2
  389.         fmove.s (a2)+,fp4
  390.         fmul    fp0,fp4
  391.         fmove.s (a2)+,fp5
  392.         fmul    fp1,fp5
  393.         fadd    fp5,fp4
  394.         fmove.s (a2)+,fp5
  395.         fmul    fp2,fp5
  396.         fadd    fp5,fp4
  397.         fmove.s fp4,(a1)+               ;fp4 = world_tr... [1]
  398.         lea     _vpn,a2
  399.         fmove.s (a2)+,fp5
  400.         fmul    fp0,fp5
  401.         fmove.s (a2)+,fp6
  402.         fmul    fp1,fp6
  403.         fadd    fp6,fp5
  404.         fmove.s (a2)+,fp6
  405.         fmul    fp2,fp6
  406.         fadd    fp6,fp5
  407.         fmove.s fp5,(a1)+               ;fp5 = world_tr... [2]
  408.  
  409. ******  end of TransformVector
  410.  
  411. *        if (r_drawflat.value)
  412. *        {
  413. *                for (s = &surfaces[1] ; s<surface_p ; s++)
  414.  
  415.         fmove.s _r_drawflat+CVAR_VALUE,fp0
  416.         ftst    fp0
  417.         fbeq    .notflat
  418.         move.l  _surfaces,a2
  419.         lea     SURF_SIZEOF(a2),a2
  420.         move.l  _surface_p,d2
  421. .loop
  422.         cmp.l   d2,a2
  423.         bge.w   .end
  424.  
  425. *                        if (!s->spans)
  426. *                                continue;
  427.  
  428.         tst.l   SURF_SPANS(a2)
  429.         beq.b   .next
  430.  
  431. *                        d_zistepu = s->d_zistepu;
  432. *                        d_zistepv = s->d_zistepv;
  433. *                        d_ziorigin = s->d_ziorigin;
  434. *
  435. *                        D_DrawSolidSurface (s, (long)s->data & 0xFF);
  436. *                        D_DrawZSpans (s->spans);
  437.  
  438.         move.l  SURF_D_ZISTEPU(a2),_d_zistepu
  439.         move.l  SURF_D_ZISTEPV(a2),_d_zistepv
  440.         move.l  SURF_D_ZIORIGIN(a2),_d_ziorigin
  441.         move.l  SURF_DATA(a2),d0
  442.         and.l   #$ff,d0
  443.         move.l  d0,-(sp)
  444.         move.l  a2,-(sp)
  445.         jsr     _D_DrawSolidSurface
  446.         addq    #8,sp
  447.         move.l  SURF_SPANS(a2),-(sp)
  448.         jsr     _D_DrawZSpans
  449.         addq    #4,sp
  450. .next
  451.         lea     SURF_SIZEOF(a2),a2
  452.         bra.b   .loop
  453. .notflat
  454.         move.l  _surfaces,a2
  455.         lea     SURF_SIZEOF(a2),a2
  456.         move.l  _surface_p,d2
  457.  
  458. *                for (s = &surfaces[1] ; s<surface_p ; s++)
  459. *                {
  460. *                        if (!s->spans)
  461. *                                continue;
  462.  
  463. .loop2
  464.         cmp.l   d2,a2
  465.         bge.w   .end
  466.         tst.l   SURF_SPANS(a2)
  467.         beq.b   .next2
  468.  
  469. *                        r_drawnpolycount++;
  470. *
  471. *                        d_zistepu = s->d_zistepu;
  472. *                        d_zistepv = s->d_zistepv;
  473. *                        d_ziorigin = s->d_ziorigin;
  474.  
  475.         addq.l  #1,_r_drawnpolycount
  476.         move.l  SURF_D_ZISTEPU(a2),_d_zistepu
  477.         move.l  SURF_D_ZISTEPV(a2),_d_zistepv
  478.         move.l  SURF_D_ZIORIGIN(a2),_d_ziorigin
  479.  
  480. *                        if (s->flags & SURF_DRAWSKY)
  481. *                        {
  482. *                                if (!r_skymade)
  483. *                                {
  484. *                                        R_MakeSky ();
  485. *                                }
  486. *
  487. *                                D_DrawSkyScans8 (s->spans);
  488. *                                D_DrawZSpans (s->spans);
  489. *                        }
  490.  
  491.         move.l  SURF_FLAGS(a2),d0
  492.         move.l  d0,d1
  493.         and.l   #SURF_DRAWSKY,d1
  494.         beq.b   .nosky
  495.         tst.l   _r_skymade
  496.         bne.b   .skymade
  497.         jsr     _R_MakeSky
  498. .skymade
  499.         move.l  SURF_SPANS(a2),-(sp)
  500.         jsr     _D_DrawSkyScans8
  501.         jsr     _D_DrawZSpans
  502.         addq    #4,sp
  503.         bra.w   .next2
  504.  
  505. *                        else if (s->flags & SURF_DRAWBACKGROUND)
  506. *                        {
  507. *                        // set up a gradient for the background surface that places it
  508. *                        // effectively at infinity distance from the viewpoint
  509. *                                d_zistepu = 0;
  510. *                                d_zistepv = 0;
  511. *                                d_ziorigin = -0.9;
  512. *
  513. *                                D_DrawSolidSurface (s, (int)r_clearcolor.value & 0xFF);
  514. *                                D_DrawZSpans (s->spans);
  515. *                        }
  516.  
  517. .nosky
  518.         move.l  d0,d1
  519.         and.l   #SURF_DRAWBACKGROUND,d1
  520.         beq.b   .nobackground
  521.         fmove.s #0,fp0
  522.         fmove.s fp0,_d_zistepu
  523.         fmove.s fp0,_d_zistepv
  524.         fmove.s #-0.9,fp0
  525.         fmove.s fp0,_d_ziorigin
  526.         fmove.s _r_clearcolor+CVAR_VALUE,fp0
  527.         fmove.l fp0,d0
  528.         and.l   #$ff,d0
  529.         move.l  d0,-(sp)
  530.         move.l  a2,-(sp)
  531.         jsr     _D_DrawSolidSurface
  532.         addq    #8,sp
  533.         move.l  SURF_SPANS(a2),-(sp)
  534.         jsr     _D_DrawZSpans
  535.         addq    #4,sp
  536.         bra.w   .next2
  537.  
  538. *                        else if (s->flags & SURF_DRAWTURB)
  539. *                        {
  540. *                                pface = s->data;
  541. *                                miplevel = 0;
  542. *                                cacheblock = (pixel_t *)
  543. *                                                ((byte *)pface->texinfo->texture +
  544. *                                                pface->texinfo->texture->offsets[0]);
  545. *                                cachewidth = 64;
  546.  
  547. .nobackground
  548.         move.l  d0,d1
  549.         and.l   #SURF_DRAWTURB,d1
  550.         beq.w   .noturb
  551.         move.l  SURF_DATA(a2),a3
  552.         clr.l   _miplevel
  553.         move.l  MSURFACE_TEXINFO(a3),a0
  554.         move.l  MTEXINFO_TEXTURE(a0),a0
  555.         add.l   TEXTURE_OFFSETS(a0),a0
  556.         move.l  a0,_cacheblock
  557.         move.l  #64,_cachewidth
  558.  
  559. *                                if (s->insubmodel)
  560. *                                {
  561. *                                // FIXME: we don't want to do all this for every polygon!
  562. *                                // TODO: store once at start of frame
  563. *                                        currententity = s->entity;      //FIXME: make this passed in to
  564. *                                                                                                // R_RotateBmodel ()
  565. *                                        VectorSubtract (r_origin, currententity->origin,
  566. *                                                        local_modelorg);
  567. *                                        TransformVector (local_modelorg, transformed_modelorg);
  568. *
  569. *                                        R_RotateBmodel ();      // FIXME: don't mess with the frustum,
  570. *                                                                                // make entity passed in
  571. *                                }
  572.  
  573.         tst.l   SURF_INSUBMODEL(a2)
  574.         beq.b   .nosub
  575.         move.l  SURF_ENTITY(a2),a0
  576.         move.l  a0,_currententity
  577.         lea     ENTITY_ORIGIN(a0),a0
  578.  
  579. ******  VectorSubtract (inlined)
  580.  
  581.         lea     _r_origin,a1
  582.         lea     _transformed_modelorg,a4
  583.         fmove.s (a1)+,fp0
  584.         fsub.s  (a0)+,fp0
  585.         fmove.s (a1)+,fp1
  586.         fsub.s  (a0)+,fp1
  587.         fmove.s (a1)+,fp2
  588.         fsub.s  (a0)+,fp2
  589.  
  590. ******  end of VectorSubtract (inlined)
  591.  
  592. ******  TransformVector (inlined)
  593.  
  594.         lea     _vright,a0
  595.         fmove.s (a0)+,fp6
  596.         fmul    fp0,fp6
  597.         fmove.s (a0)+,fp7
  598.         fmul    fp1,fp7
  599.         fadd    fp7,fp6
  600.         fmove.s (a0)+,fp7
  601.         fmul    fp2,fp7
  602.         fadd    fp7,fp6
  603.         fmove.s fp6,(a4)+
  604.         lea     _vup,a0
  605.         fmove.s (a0)+,fp6
  606.         fmul    fp0,fp6
  607.         fmove.s (a0)+,fp7
  608.         fmul    fp1,fp7
  609.         fadd    fp7,fp6
  610.         fmove.s (a0)+,fp7
  611.         fmul    fp2,fp7
  612.         fadd    fp7,fp6
  613.         fmove.s fp6,(a4)+
  614.         lea     _vpn,a0
  615.         fmul.s  (a0)+,fp0
  616.         fmul.s  (a0)+,fp1
  617.         fadd    fp1,fp0
  618.         fmul.s  (a0)+,fp2
  619.         fadd    fp2,fp0
  620.         fmove.s fp0,(a4)+
  621.         lea     -12(a4),a4
  622.  
  623. ****** end of TransformVector
  624.  
  625.         jsr     _R_RotateBmodel
  626.  
  627. *                                D_CalcGradients (pface);
  628. *                                Turbulent8 (s->spans);
  629. *                                D_DrawZSpans (s->spans);
  630.  
  631. .nosub
  632.         move.l  a3,-(sp)
  633.         jsr     _D_CalcGradients
  634.         addq    #4,sp
  635.         move.l  SURF_SPANS(a2),-(sp)
  636.         jsr     _Turbulent8
  637.         jsr     _D_DrawZSpans
  638.         addq    #4,sp
  639.  
  640. *                                if (s->insubmodel)
  641. *                                {
  642. *                                //
  643. *                                // restore the old drawing state
  644. *                                // FIXME: we don't want to do this every time!
  645. *                                // TODO: speed up
  646. *                                //
  647. *                                        currententity = &cl_entities[0];
  648. *                                        VectorCopy (world_transformed_modelorg,
  649. *                                                                transformed_modelorg);
  650. *                                        VectorCopy (base_vpn, vpn);
  651. *                                        VectorCopy (base_vup, vup);
  652. *                                        VectorCopy (base_vright, vright);
  653. *                                        VectorCopy (base_modelorg, modelorg);
  654. *                                        R_TransformFrustum ();
  655. *                                }
  656.  
  657.         tst.l   SURF_INSUBMODEL(a2)
  658.         beq.w   .next2
  659.         move.l  #_cl_entities,_currententity
  660.         fmove.s fp3,(a4)+
  661.         fmove.s fp4,(a4)+
  662.         fmove.s fp5,(a4)+
  663.         lea     _base_vpn,a0
  664.         lea     _vpn,a1
  665.         move.l  (a0)+,(a1)+
  666.         move.l  (a0)+,(a1)+
  667.         move.l  (a0)+,(a1)+
  668.         lea     _base_vup,a0
  669.         lea     _vup,a1
  670.         move.l  (a0)+,(a1)+
  671.         move.l  (a0)+,(a1)+
  672.         move.l  (a0)+,(a1)+
  673.         lea     _base_vright,a0
  674.         lea     _vright,a1
  675.         move.l  (a0)+,(a1)+
  676.         move.l  (a0)+,(a1)+
  677.         move.l  (a0)+,(a1)+
  678.         lea    _base_modelorg,a0
  679.         lea    _modelorg,a1
  680.         move.l  (a0)+,(a1)+
  681.         move.l  (a0)+,(a1)+
  682.         move.l  (a0)+,(a1)+
  683.         fmove.s fp3,-(sp)
  684.         fmove.s fp4,-(sp)
  685.         fmove.s fp5,-(sp)
  686.  
  687. ****** R_TransformFrustum (inlined)
  688.  
  689.         moveq   #4-1,d0
  690.         lea     _screenedge,a0
  691.         lea     _view_clipplanes,a1
  692.         lea     _modelorg,a4
  693.         fmove.s (a4)+,fp7
  694. .loop3
  695.         fmove.s (a0)+,fp1
  696.         fneg    fp1
  697.         fmove.s (a0)+,fp2
  698.         fmove.s (a0)+,fp0
  699.         lea     _vright,a3
  700.         fmove.s (a3)+,fp3
  701.         fmove.s (a3)+,fp4
  702.         fmove.s (a3)+,fp5
  703.         fmul    fp1,fp3
  704.         fmul    fp1,fp4
  705.         fmul    fp1,fp5
  706.         lea     _vup,a3
  707.         fmove.s (a3)+,fp6
  708.         fmul    fp2,fp6
  709.         fadd    fp6,fp3
  710.         fmove.s (a3)+,fp6
  711.         fmul    fp2,fp6
  712.         fadd    fp6,fp4
  713.         fmove.s (a3)+,fp6
  714.         fmul    fp2,fp6
  715.         fadd    fp6,fp5
  716.         lea     _vpn,a3
  717.         fmove.s (a3)+,fp6
  718.         fmul    fp0,fp6
  719.         fadd    fp6,fp3
  720.         fmove.s fp3,(a1)+
  721.         fmove.s (a3)+,fp6
  722.         fmul    fp0,fp6
  723.         fadd    fp6,fp4
  724.         fmove.s fp4,(a1)+
  725.         fmove.s (a3)+,fp6
  726.         fmul    fp0,fp6
  727.         fadd    fp6,fp5
  728.         fmove.s fp5,(a1)+
  729.  
  730.         fmul    fp7,fp3
  731.         fmul.s  (a4),fp4
  732.         fadd    fp4,fp3
  733.         fmul.s  4(a4),fp5
  734.         fadd    fp5,fp3
  735.         fmove.s fp3,(a1)+
  736.         lea     CLIP_SIZEOF-16(a1),a1
  737.         lea     MPLANE_SIZEOF-12(a0),a0
  738.         dbra    d0,.loop3
  739.  
  740. ******  end of R_TransformFrustum
  741.  
  742.         fmove.s (sp)+,fp5
  743.         fmove.s (sp)+,fp4
  744.         fmove.s (sp)+,fp3
  745.         bra.w   .next2
  746. .noturb
  747.  
  748. *                                if (s->insubmodel)
  749. *                                {
  750. *                                // FIXME: we don't want to do all this for every polygon!
  751. *                                // TODO: store once at start of frame
  752. *                                        currententity = s->entity;      //FIXME: make this passed in to
  753. *                                                                                                // R_RotateBmodel ()
  754. *                                        VectorSubtract (r_origin, currententity->origin, local_modelorg);
  755. *                                        TransformVector (local_modelorg, transformed_modelorg);
  756. *
  757. *                                        R_RotateBmodel ();      // FIXME: don't mess with the frustum,
  758. *                                                                                // make entity passed in
  759. *                                }
  760.  
  761.         tst.l   SURF_INSUBMODEL(a2)
  762.         beq.b   .nosub2
  763.         move.l  SURF_ENTITY(a2),a0
  764.         move.l  a0,_currententity
  765.         lea     ENTITY_ORIGIN(a0),a0
  766.  
  767. ****** VectorSubtract (inlined)
  768.  
  769.         lea     _r_origin,a1
  770.         lea     _transformed_modelorg,a4
  771.         fmove.s (a1)+,fp0
  772.         fsub.s  (a0)+,fp0
  773.         fmove.s (a1)+,fp1
  774.         fsub.s  (a0)+,fp1
  775.         fmove.s (a1)+,fp2
  776.         fsub.s  (a0)+,fp2
  777.  
  778. ****** end of VectorSubtract
  779.  
  780. ****** TransformVector (inlined)
  781.  
  782.         lea     _vright,a0
  783.         fmove.s (a0)+,fp6
  784.         fmul    fp0,fp6
  785.         fmove.s (a0)+,fp7
  786.         fmul    fp1,fp7
  787.         fadd    fp7,fp6
  788.         fmove.s (a0)+,fp7
  789.         fmul    fp2,fp7
  790.         fadd    fp7,fp6
  791.         fmove.s fp6,(a4)+
  792.         lea     _vup,a0
  793.         fmove.s (a0)+,fp6
  794.         fmul    fp0,fp6
  795.         fmove.s (a0)+,fp7
  796.         fmul    fp1,fp7
  797.         fadd    fp7,fp6
  798.         fmove.s (a0)+,fp7
  799.         fmul    fp2,fp7
  800.         fadd    fp7,fp6
  801.         fmove.s fp6,(a4)+
  802.         lea     _vpn,a0
  803.         fmul.s  (a0)+,fp0
  804.         fmul.s  (a0)+,fp1
  805.         fadd    fp1,fp0
  806.         fmul.s  (a0)+,fp2
  807.         fadd    fp2,fp0
  808.         fmove.s fp0,(a4)+
  809.         lea     -12(a4),a4
  810.  
  811. ******  end of TransformVector
  812.  
  813.         jsr     _R_RotateBmodel
  814. .nosub2
  815.  
  816. *                                pface = s->data;
  817. *                                miplevel = D_MipLevelForScale (s->nearzi * scale_for_mip
  818. *                                * pface->texinfo->mipadjust);
  819. *
  820. *                        // FIXME: make this passed in to D_CacheSurface
  821. *                                pcurrentcache = D_CacheSurface (pface, miplevel);
  822. *
  823. *                                cacheblock = (pixel_t *)pcurrentcache->data;
  824. *                                cachewidth = pcurrentcache->width;
  825.  
  826.         move.l  SURF_DATA(a2),a3
  827.         fmove.s SURF_NEARZI(a2),fp0
  828.         fmul.s  _scale_for_mip,fp0
  829.         move.l  MSURFACE_TEXINFO(a3),a0
  830.         fmul.s  MTEXINFO_MIPADJUST(a0),fp0
  831.  
  832. ******  D_MipLevelForScale (inlined)
  833.         lea     _d_scalemip,a1
  834.         moveq   #0,d0
  835.         fcmp.s  (a1),fp0
  836.         fboge.b .found
  837.         moveq   #1,d0
  838.         fcmp.s  4(a1),fp0
  839.         fboge.b .found
  840.         moveq   #2,d0
  841.         fcmp.s  8(a1),fp0
  842.         fboge.b .found
  843.         moveq   #3,d0
  844.         move.l  _d_minmip,d1
  845.         cmp.l   d1,d0
  846.         bge.b   .found
  847.         move.l  d1,d0
  848. .found
  849. ******  end of D_MipLevelForScale
  850.  
  851.         move.l  d0,_miplevel
  852.         move.l  d0,-(sp)
  853.         move.l  a3,-(sp)
  854.         jsr     _D_CacheSurface
  855.         addq    #8,sp
  856.         move.l  d0,a0
  857.         lea     SURFCACHE_DATA(a0),a1
  858.         move.l  a1,_cacheblock
  859.         move.l  SURFCACHE_WIDTH(a0),_cachewidth
  860.  
  861. *                                D_CalcGradients (pface);
  862. *
  863. *                                (*d_drawspans) (s->spans);
  864. *
  865. *                                D_DrawZSpans (s->spans);
  866.  
  867.         move.l  a3,-(sp)
  868.         jsr     _D_CalcGradients
  869.         addq    #4,sp
  870.         move.l  SURF_SPANS(a2),-(sp)
  871.         move.l  _d_drawspans,a0
  872.         jsr     (a0)
  873.         jsr     _D_DrawZSpans
  874.         addq    #4,sp
  875.  
  876. *                                if (s->insubmodel)
  877. *                                {
  878. *                                //
  879. *                                // restore the old drawing state
  880. *                                // FIXME: we don't want to do this every time!
  881. *                                // TODO: speed up
  882. *                                //
  883. *                                        currententity = &cl_entities[0];
  884. *                                        VectorCopy (world_transformed_modelorg,
  885. *                                                                transformed_modelorg);
  886. *                                        VectorCopy (base_vpn, vpn);
  887. *                                        VectorCopy (base_vup, vup);
  888. *                                        VectorCopy (base_vright, vright);
  889. *                                        VectorCopy (base_modelorg, modelorg);
  890. *                                        R_TransformFrustum ();
  891. *                                }
  892.  
  893.         tst.l   SURF_INSUBMODEL(a2)
  894.         beq.w   .next2
  895.         move.l  #_cl_entities,_currententity
  896.         fmove.s fp3,(a4)+
  897.         fmove.s fp4,(a4)+
  898.         fmove.s fp5,(a4)+
  899.         lea     _base_vpn,a0
  900.         lea     _vpn,a1
  901.         move.l  (a0)+,(a1)+
  902.         move.l  (a0)+,(a1)+
  903.         move.l  (a0)+,(a1)+
  904.         lea     _base_vup,a0
  905.         lea     _vup,a1
  906.         move.l  (a0)+,(a1)+
  907.         move.l  (a0)+,(a1)+
  908.         move.l  (a0)+,(a1)+
  909.         lea     _base_vright,a0
  910.         lea     _vright,a1
  911.         move.l  (a0)+,(a1)+
  912.         move.l  (a0)+,(a1)+
  913.         move.l  (a0)+,(a1)+
  914.         lea    _base_modelorg,a0
  915.         lea    _modelorg,a1
  916.         move.l  (a0)+,(a1)+
  917.         move.l  (a0)+,(a1)+
  918.         move.l  (a0)+,(a1)+
  919.         fmove.s fp3,-(sp)
  920.         fmove.s fp4,-(sp)
  921.         fmove.s fp5,-(sp)
  922.  
  923. ****** R_TransformFrustum (inlined)
  924.  
  925.         moveq   #4-1,d0
  926.         lea     _screenedge,a0
  927.         lea     _view_clipplanes,a1
  928.         lea     _modelorg,a4
  929.         fmove.s (a4)+,fp7
  930. .loop4
  931.         fmove.s (a0)+,fp1
  932.         fneg    fp1
  933.         fmove.s (a0)+,fp2
  934.         fmove.s (a0)+,fp0
  935.         lea     _vright,a3
  936.         fmove.s (a3)+,fp3
  937.         fmove.s (a3)+,fp4
  938.         fmove.s (a3)+,fp5
  939.         fmul    fp1,fp3
  940.         fmul    fp1,fp4
  941.         fmul    fp1,fp5
  942.         lea     _vup,a3
  943.         fmove.s (a3)+,fp6
  944.         fmul    fp2,fp6
  945.         fadd    fp6,fp3
  946.         fmove.s (a3)+,fp6
  947.         fmul    fp2,fp6
  948.         fadd    fp6,fp4
  949.         fmove.s (a3)+,fp6
  950.         fmul    fp2,fp6
  951.         fadd    fp6,fp5
  952.         lea     _vpn,a3
  953.         fmove.s (a3)+,fp6
  954.         fmul    fp0,fp6
  955.         fadd    fp6,fp3
  956.         fmove.s fp3,(a1)+
  957.         fmove.s (a3)+,fp6
  958.         fmul    fp0,fp6
  959.         fadd    fp6,fp4
  960.         fmove.s fp4,(a1)+
  961.         fmove.s (a3)+,fp6
  962.         fmul    fp0,fp6
  963.         fadd    fp6,fp5
  964.         fmove.s fp5,(a1)+
  965.  
  966.         fmul    fp7,fp3
  967.         fmul.s  (a4),fp4
  968.         fadd    fp4,fp3
  969.         fmul.s  4(a4),fp5
  970.         fadd    fp5,fp3
  971.         fmove.s fp3,(a1)+
  972.         lea     CLIP_SIZEOF-16(a1),a1
  973.         lea     MPLANE_SIZEOF-12(a0),a0
  974.         dbra    d0,.loop4
  975.  
  976. ******  end of R_TransformFrustum
  977.  
  978.         fmove.s (sp)+,fp5
  979.         fmove.s (sp)+,fp4
  980.         fmove.s (sp)+,fp3
  981. .next2
  982.         lea     SURF_SIZEOF(a2),a2
  983.         bra.w   .loop2
  984. .end
  985.         fmovem.x        (sp)+,fp2-fp7
  986.         movem.l (sp)+,d2/a2-a4
  987.         rts
  988.