home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 113 / EnigmaAmiga113CD.iso / software / sviluppo / quakeworld_src / client / r_light68k.s < prev    next >
Encoding:
Text File  |  2000-06-17  |  10.0 KB  |  375 lines

  1. * Copyright (C) 1996-1997 Id Software, Inc. 
  2. * This program is free software; you can redistribute it and/or 
  3. * modify it under the terms of the GNU General Public License 
  4. * as published by the Free Software Foundation; either version 2 
  5. * of the License, or (at your option) any later version. 
  6. * This program is distributed in the hope that it will be useful, 
  7. * but WITHOUT ANY WARRANTY; without even the implied warranty of 
  8. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.   
  9. * See the GNU General Public License for more details. 
  10. * You should have received a copy of the GNU General Public License 
  11. * along with this program; if not, write to the Free Software 
  12. * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. 
  13.  
  14. **
  15. ** Quake for AMIGA
  16. ** r_light.c assembler implementations by Frank Wille <frank@phoenix.owl.de>
  17. **
  18.  
  19.         XREF    _cl
  20.         XREF    _d_lightstylevalue
  21.  
  22.         XDEF    _RecursiveLightPoint
  23.  
  24. SURF_DRAWTILED          =       $20
  25. MAXLIGHTMAPS            =       4
  26.  
  27. NODE_CONTENTS           =       0
  28. NODE_VISFRAME           =       4
  29. NODE_MINMAXS            =       8
  30. NODE_PARENT             =       20
  31. NODE_PLANE              =       24
  32. NODE_CHILDREN           =       28
  33. NODE_FIRSTSURFACE       =       36
  34. NODE_NUMSURFACES        =       38
  35.  
  36. MSURFACE_VISFRAME       =       0
  37. MSURFACE_DLIGHTFRAME    =       4
  38. MSURFACE_DLIGHTBITS     =       8
  39. MSURFACE_PLANE          =       12
  40. MSURFACE_FLAGS          =       16
  41. MSURFACE_FIRSTEDGE      =       20
  42. MSURFACE_NUMEDGES       =       24
  43. MSURFACE_CACHESPOTS     =       28
  44. MSURFACE_TEXTUREMINS    =       44
  45. MSURFACE_EXTENTS        =       48
  46. MSURFACE_TEXINFO        =       52
  47. MSURFACE_STYLES         =       56
  48. MSURFACE_SAMPLES        =       60
  49. MSURFACE_SIZEOF_EXP     =       6
  50. MSURFACE_SIZEOF         =       (1<<MSURFACE_SIZEOF_EXP)
  51.  
  52. MPLANE_NORMAL           =       0
  53. MPLANE_DIST             =       12
  54. MPLANE_TYPE             =       16
  55. MPLANE_SIGNBITS         =       17
  56. MPLANE_SIZEOF           =       20
  57.  
  58. MTEXINFO_VECS           =       0
  59. MTEXINFO_MIPADJUST      =       32
  60. MTEXINFO_TEXTURE        =       36
  61. MTEXINFO_FLAGS          =       40
  62. MTEXINFO_SIZEOF         =       44
  63.  
  64. CL_WORLDMODEL           =       469172
  65. MODEL_SURFACES          =       208
  66.  
  67.         fpu
  68.  
  69.  
  70.  
  71.  
  72. ******************************************************************************
  73. *
  74. *       int _RecursiveLightPoint (mnode_t *node, vec3_t start, vec3_t end)
  75. *
  76. ******************************************************************************
  77.  
  78.         cnop    0,4
  79. _RecursiveLightPoint
  80.  
  81. *****   stackframe
  82.  
  83.         rsreset
  84. .intregs        rs.l    1
  85.         rs.l    1
  86. .node           rs.l    1
  87. .start          rs.l    1
  88. .end            rs.l    1
  89.  
  90.  
  91.         move.l  a2,-(sp)
  92.         move.l  .node(sp),a0
  93.         move.l  .start(sp),a1
  94.         move.l  .end(sp),a2
  95.         bsr     DoRecursion
  96.         move.l  (sp)+,a2
  97.         rts
  98.  
  99. DoRecursion
  100.         movem.l d2-d7/a2-a6,-(sp)
  101.         fmovem.x        fp2-fp7,-(sp)
  102.         lea     -12(sp),sp
  103.         move.l  sp,a6
  104.  
  105. *        if (node->contents < 0)
  106. *                return -1;              // didn't hit anything
  107.  
  108.         moveq   #-1,d0
  109.         tst.l   NODE_CONTENTS(a0)       ;if (node->contents < 0)
  110.         blt.w   .end                    ;return -1
  111.  
  112. *        plane = node->plane;
  113. *        front = DotProduct (start, plane->normal) - plane->dist;
  114. *        back = DotProduct (end, plane->normal) - plane->dist;
  115. *        side = front < 0;
  116. *
  117. *        if ( (back < 0) == side)
  118. *                return RecursiveLightPoint (node->children[side], start, end);
  119.  
  120.         move.l  a1,a5
  121.         move.l  a2,a4
  122.         move.l  NODE_PLANE(a0),a3       ;plane = node->plane
  123.         fmove.s MPLANE_DIST(a3),fp0
  124.         fmove.s (a3)+,fp7
  125.         fmove.s (a3)+,fp2
  126.         fmove.s (a3)+,fp3
  127.         move.l  a0,a3
  128.         fmove.s (a1)+,fp4
  129.         fmul    fp7,fp4
  130.         fmove.s (a1)+,fp5
  131.         fmul    fp2,fp5
  132.         fadd    fp5,fp4
  133.         fmove.s (a1)+,fp6
  134.         fmul    fp3,fp6
  135.         fadd    fp6,fp4
  136.         fsub    fp0,fp4                 ;fp4 = front
  137.         fmul.s  (a2)+,fp7
  138.         fmul.s  (a2)+,fp2
  139.         fadd    fp7,fp2
  140.         fmul.s  (a2)+,fp3
  141.         fadd    fp3,fp2
  142.         fsub    fp0,fp2                 ;fp2 = back
  143.         moveq   #1,d2                   ;side = front < 0
  144.         ftst    fp4
  145.         fbolt.b .cont
  146.         moveq   #0,d2
  147. .cont
  148.         moveq   #1,d3                   ;d3 = back < 0
  149.         ftst    fp2
  150.         fbolt.b .cont2
  151.         moveq   #0,d3
  152. .cont2
  153.         move.l  d2,d7
  154.         cmp.l   d2,d3                   ;if (back < 0) == side
  155.         bne.b   .cont3
  156.         move.l  NODE_CHILDREN(a3,d2.l*4),a0
  157.         move.l  a5,a1
  158.         move.l  a4,a2
  159.         bsr     DoRecursion
  160.         bra.w   .end
  161.  
  162. *        frac = front / (front-back);
  163. *        mid[0] = start[0] + (end[0] - start[0])*frac;
  164. *        mid[1] = start[1] + (end[1] - start[1])*frac;
  165. *        mid[2] = start[2] + (end[2] - start[2])*frac;
  166.  
  167. .cont3
  168.         fsub    fp4,fp2
  169.         fdiv    fp2,fp4
  170.         fneg    fp4                     ;frac = front / (front-back)
  171.  
  172.         fmove.s (a5)+,fp0
  173.         fmove.s (a4)+,fp7
  174.         fsub    fp0,fp7
  175.         fmul    fp4,fp7
  176.         fadd    fp0,fp7
  177.         fmove.s fp7,(a6)+               ;fp7 = mid[0]
  178.         fmove.s (a5)+,fp0
  179.         fmove.s (a4)+,fp2
  180.         fsub    fp0,fp2
  181.         fmul    fp4,fp2
  182.         fadd    fp0,fp2
  183.         fmove.s fp2,(a6)+               ;fp2 = mid[1]
  184.         fmove.s (a5)+,fp0
  185.         fmove.s (a4)+,fp3
  186.         fsub    fp0,fp3
  187.         fmul    fp4,fp3
  188.         fadd    fp0,fp3
  189.         fmove.s fp3,(a6)+               ;fp3 = mid[2]
  190.         lea     -12(a6),a6
  191.         lea     -12(a5),a5
  192.         lea     -12(a4),a4
  193.  
  194. *        r = RecursiveLightPoint (node->children[side], start, mid);
  195. *        if (r >= 0)
  196. *                return r;               // hit something
  197. *
  198. *        if ( (back < 0) == side )
  199. *                return -1;              // didn't hit anuthing
  200.  
  201.         move.l  NODE_CHILDREN(a3,d2.l*4),a0
  202.         move.l  a5,a1
  203.         move.l  a6,a2
  204.         bsr     DoRecursion
  205.         tst.l   d0                      ;if (r >= 0)
  206.         bge.w   .end                    ;return r
  207.         moveq   #-1,d0
  208.         cmp.l   d2,d3                   ;if ((back < 0) == side)
  209.         beq.w   .end                    ;return -1
  210.  
  211. *        surf = cl.worldmodel->surfaces + node->firstsurface;
  212. *        for (i=0 ; i<node->numsurfaces ; i++, surf++)
  213.  
  214.         move.l  _cl+CL_WORLDMODEL,a0    ;surf = cl.worldmodel + ...
  215.         move.l  MODEL_SURFACES(a0),a0
  216.         moveq   #0,d0
  217.         move    NODE_FIRSTSURFACE(a3),d0
  218.         asl.l   #MSURFACE_SIZEOF_EXP,d0
  219.         add.l   d0,a0
  220.  
  221.         move    NODE_NUMSURFACES(a3),d6 ;node->numsurfaces
  222.         subq    #1,d6
  223.         bmi.w   .skip
  224.         lea     _d_lightstylevalue,a1
  225.  
  226. *                if (surf->flags & SURF_DRAWTILED)
  227. *                        continue;       // no lightmaps
  228. *
  229. *                tex = surf->texinfo;
  230.  
  231. .loop
  232.         move.l  MSURFACE_FLAGS(a0),d0   ;if (surf->flags & SURF...)
  233.         and.l   #SURF_DRAWTILED,d0
  234.         bne.w   .loopend                ;continue
  235.         move.l  MSURFACE_TEXINFO(a0),a5 ;tex = surf->texinfo
  236.  
  237. *                s = DotProduct (mid, tex->vecs[0]) + tex->vecs[0][3];
  238. *                t = DotProduct (mid, tex->vecs[1]) + tex->vecs[1][3];;
  239.  
  240.         fmove.s (a5)+,fp4
  241.         fmove.s (a5)+,fp5
  242.         fmove.s (a5)+,fp6
  243.         fmul    fp7,fp4
  244.         fmul    fp2,fp5
  245.         fadd    fp5,fp4
  246.         fmul    fp3,fp6
  247.         fadd    fp6,fp4
  248.         fadd.s  (a5)+,fp4               ;d4 = s
  249.         fmove.l fp4,d4
  250.  
  251.  
  252.         fmove.s (a5)+,fp0
  253.         fmove.s (a5)+,fp5
  254.         fmove.s (a5)+,fp6
  255.         fmul    fp7,fp0
  256.         fmul    fp2,fp5
  257.         fadd    fp5,fp0
  258.         fmul    fp3,fp6
  259.         fadd    fp6,fp0
  260.         fadd.s  (a5)+,fp0
  261.         fmove.l fp0,d1                  ;d1 = t
  262.  
  263. *                if (s < surf->texturemins[0] ||
  264. *                t < surf->texturemins[1])
  265. *                        continue;
  266. *
  267. *                ds = s - surf->texturemins[0];
  268. *                dt = t - surf->texturemins[1];
  269.  
  270.         move    MSURFACE_TEXTUREMINS(a0),d2
  271.         ext.l   d2
  272.         move    MSURFACE_TEXTUREMINS+2(a0),d3
  273.         ext.l   d3
  274.         sub.l   d2,d4                   ;d4 = ds
  275.         bmi.b   .loopend
  276.         sub.l   d3,d1                   ;d1 = dt
  277.         bmi.b   .loopend
  278.  
  279. *                if ( ds > surf->extents[0] || dt > surf->extents[1] )
  280. *                        continue;
  281. *
  282. *                if (!surf->samples)
  283. *                        return 0;
  284. *
  285. *                ds >>= 4;
  286. *                dt >>= 4;
  287.  
  288.         move    MSURFACE_EXTENTS(a0),d2
  289.         ext.l   d2                      ;d2 = surf->extents[0]
  290.         cmp.l   d2,d4
  291.         bgt.b   .loopend
  292.         move    MSURFACE_EXTENTS+2(a0),d3
  293.         ext.l   d3                      ;d3 = surf->extents[1]
  294.         cmp.l   d3,d1
  295.         bgt.b   .loopend
  296.         moveq   #0,d0                   ;if (!surf->samples)
  297.         move.l  MSURFACE_SAMPLES(a0),d5 ;return 0
  298.         beq.w   .end
  299.         asr.l   #4,d4                   ;ds >>= 4
  300.         asr.l   #4,d1                   ;dt >>= 4
  301.  
  302. *                lightmap = surf->samples;
  303. *                r = 0;
  304. *                if (lightmap)
  305. *                {
  306. *
  307. *                        lightmap += dt * ((surf->extents[0]>>4)+1) + ds;
  308.  
  309.         move.l  d5,a2                   ;lightmap -> surf->samples
  310.         moveq   #0,d5                   ;r = 0
  311.         asr.l   #4,d2
  312.         asr.l   #4,d3
  313.         addq.l  #1,d2                   ;d2 = (surf->extents[0]>>4)+1
  314.         addq.l  #1,d3                   ;d3 = (surf->extents[1]>>4)+1
  315.  
  316.         muls.l  d2,d1
  317.         add.l   d4,d1
  318.         add.l   d1,a2                   ;lightmap += dt * ...
  319.  
  320. *                        for (maps = 0 ; maps < MAXLIGHTMAPS && surf->styles[maps] != 255 ;
  321. *                                        maps++)
  322. *                        {
  323. *                                scale = d_lightstylevalue[surf->styles[maps]];
  324. *                                r += *lightmap * scale;
  325. *                                lightmap += ((surf->extents[0]>>4)+1) *
  326. *                                                ((surf->extents[1]>>4)+1);
  327. *                        }
  328. *
  329. *                        r >>= 8;
  330. *                }
  331. *                return r;
  332.  
  333.         lea     MSURFACE_STYLES(a0),a5
  334.         muls.l  d2,d3
  335.         moveq   #MAXLIGHTMAPS-1,d0
  336.         moveq   #0,d1
  337. .loop2
  338.         move.b  (a5)+,d1                ;surf->styles[map]
  339.         cmp.b   #$ff,d1
  340.         beq.b   .leave
  341.         move.l  0(a1,d1.l*4),d2         ;scale = ...
  342.         move.b  (a2),d1
  343.         mulu.l  d1,d2
  344.         add.l   d2,d5                   ;r += *lightmap * scale
  345.         add.l   d3,a2                   ;lightmap += (...)
  346.         dbra    d0,.loop2
  347. .leave
  348.         asr.l   #8,d5                   ;r >>= 8
  349.         move.l  d5,d0                   ;return r
  350.         bra.b   .end
  351. .loopend
  352.         lea     MSURFACE_SIZEOF(a0),a0
  353.         dbra    d6,.loop
  354.  
  355. *        return RecursiveLightPoint (node->children[!side], mid, end);
  356.  
  357. .skip
  358.         eori.l  #1,d7
  359.         move.l  NODE_CHILDREN(a3,d7.l*4),a0
  360.         move.l  a6,a1
  361.         move.l  a4,a2
  362.         bsr     DoRecursion
  363. .end
  364.         lea     12(sp),sp
  365.         fmovem.x        (sp)+,fp2-fp7
  366.         movem.l (sp)+,d2-d7/a2-a6
  367.         rts
  368.  
  369.