home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 113 / EnigmaAmiga113CD.iso / software / sviluppo / glquake_src / gl_rlightppc.p < prev    next >
Encoding:
Text File  |  2000-02-20  |  8.5 KB  |  358 lines

  1. ;
  2. ; Copyright (C) 1996-1997 Id Software, Inc.
  3. ;
  4. ; This program is free software; you can redistribute it and/or
  5. ; modify it under the terms of the GNU General Public License
  6. ; as published by the Free Software Foundation; either version 2
  7. ; of the License, or (at your option) any later version.
  8. ;
  9. ; This program is distributed in the hope that it will be useful,
  10. ; but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  12. ;
  13. ; See the GNU General Public License for more details.
  14. ;
  15. ; You should have received a copy of the GNU General Public License
  16. ; along with this program; if not, write to the Free Software
  17. ; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  18. ;
  19.  
  20. ;#
  21. ;# Quake for AMIGA
  22. ;#
  23. ;# r_lightPPC.s
  24. ;#
  25. ;# Define WOS for PowerOpen ABI, otherwise SVR4-ABI is used.
  26. ;#
  27.  
  28. ; include        "macrosPPC.i"
  29.  
  30. ;
  31. ; external references
  32. ;
  33.  
  34.     xref    cl
  35.     xref    d_lightstylevalue
  36.  
  37. ;
  38. ; defines
  39. ;
  40.  
  41. SURF_DRAWTILED      = 32
  42. MAXLIGHTMAPS        = 4
  43.  
  44. NODE_CONTENTS       = 0
  45. NODE_VISFRAME       = 4
  46. NODE_MINMAXS        = 8
  47. NODE_PARENT         = 20
  48. NODE_PLANE          = 24
  49. NODE_CHILDREN       = 28
  50. NODE_FIRSTSURFACE   = 36
  51. NODE_NUMSURFACES    = 38
  52.  
  53. MSURFACE_VISFRAME   = 0
  54. MSURFACE_DLIGHTFRAME= 4
  55. MSURFACE_DLIGHTBITS = 8
  56. MSURFACE_PLANE      = 12
  57. MSURFACE_FLAGS      = 16
  58. MSURFACE_FIRSTEDGE  = 20
  59. MSURFACE_NUMEDGES   = 24
  60. MSURFACE_CACHESPOTS = 28
  61. MSURFACE_TEXTUREMINS= 44
  62. MSURFACE_EXTENTS    = 48
  63. MSURFACE_TEXINFO    = 52
  64. MSURFACE_STYLES     = 56
  65. MSURFACE_SAMPLES    = 60
  66. MSURFACE_SIZEOF_EXP = 6
  67. MSURFACE_SIZEOF     = (1<<MSURFACE_SIZEOF_EXP)
  68.  
  69. MPLANE_NORMAL       = 0
  70. MPLANE_DIST         = 12
  71. MPLANE_TYPE         = 16
  72. MPLANE_SIGNBITS     = 17
  73. MPLANE_SIZEOF       = 20
  74.  
  75. MTEXINFO_VECS       = 0
  76. MTEXINFO_MIPADJUST  = 32
  77. MTEXINFO_TEXTURE    = 36
  78. MTEXINFO_FLAGS      = 40
  79. MTEXINFO_SIZEOF     = 44
  80.  
  81. CL_WORLDMODEL       = 2692
  82. MODEL_SURFACES      = 176
  83.  
  84.  
  85.  
  86.  
  87.  
  88. ;##########################################################################
  89. ;
  90. ;       int RecursiveLightPoint (mnode_t *node, vec3_t start, vec3_t end)
  91. ;
  92. ;##########################################################################
  93.  
  94.   section "RecursiveLightPoint",code
  95.  
  96. RecursiveLightPoint:
  97.  
  98. ;    init    0,24,6,3
  99.     stmw    r26,gb(r1)
  100.     stfd    f14,fb+0*8(r1)
  101.     stfd    f15,fb+1*8(r1)
  102.     stfd    f16,fb+2*8(r1)
  103.  
  104.     ls      f13,0.0
  105.     mr      r31,r3
  106.     mr      r30,r4
  107.     mr      r29,r5
  108.     la    r28,local+8(r1)
  109.  
  110. ;        if (node->contents < 0)
  111. ;                return -1;              // didn't hit anything
  112.  
  113.     li      r3,-1
  114.     lwz     r0,NODE_CONTENTS(r31)
  115.     mr.     r0,r0
  116.     blt      end
  117.  
  118. ;        plane = node->plane;
  119. ;        front = DotProduct (start, plane->normal) - plane->dist;
  120. ;        back = DotProduct (end, plane->normal) - plane->dist;
  121. ;        side = front < 0;
  122. ;
  123. ;        if ( (back < 0) == side)
  124. ;                return RecursiveLightPoint (node->children[side], start, end);
  125.  
  126.     lwz     r7,NODE_PLANE(r31)
  127.     lfs     f7,MPLANE_DIST(r7)
  128.     lfs     f1,0(r7)
  129.     lfs     f4,0(r30)               ;f4 = start[0]
  130.     fmsubs  f8,f1,f4,f7
  131.     lfs     f2,4(r7)
  132.     lfs     f5,4(r30)               ;f5 = start[1]
  133.     fmadds  f8,f2,f5,f8
  134.     lfs     f3,8(r7)
  135.     lfs     f6,8(r30)               ;f6 = start[2]
  136.     fmadds  f8,f3,f6,f8             ;f8 = front
  137.     lfs     f9,0(r29)               ;f9 = end[0]
  138.     fmsubs  f12,f1,f9,f7
  139.     lfs     f10,4(r29)              ;f10 = end[1]
  140.     fmadds  f12,f2,f10,f12
  141.     lfs     f11,8(r29)              ;f11 = end[2]
  142.     fmadds  f12,f3,f11,f12          ;f12 = back
  143.     li      r27,1                   ;side = front < 0
  144.     fcmpo   cr0,f8,f13
  145.     blt      cont
  146.     li      r27,0
  147. cont:
  148.     li      r26,1                   ;f9 = back < 0
  149.     fcmpo   cr0,f12,f13
  150.     blt      cont2
  151.     li      r26,0
  152. cont2:
  153.     cmpw    r26,r27
  154.     bne      cont3
  155.     slwi    r8,r27,2
  156.     addi    r8,r8,NODE_CHILDREN
  157.     lwzx    r3,r31,r8
  158.     mr      r4,r30
  159.     mr      r5,r29
  160.     call    RecursiveLightPoint
  161.     b        end
  162.  
  163. ;        frac = front / (front-back);
  164. ;        mid[0] = start[0] + (end[0] - start[0])*frac;
  165. ;        mid[1] = start[1] + (end[1] - start[1])*frac;
  166. ;        mid[2] = start[2] + (end[2] - start[2])*frac;
  167.  
  168. cont3:
  169.     fsubs   f1,f8,f12
  170.     fdivs   f1,f8,f1                ;f1 = frac
  171.     fsubs   f9,f9,f4
  172.     fsubs   f10,f10,f5
  173.     fsubs   f11,f11,f6
  174.     fmadds  f14,f9,f1,f4
  175.     stfs    f14,0(r28)              ;f14 = mid[0]
  176.     fmadds  f15,f10,f1,f5
  177.     stfs    f15,4(r28)              ;f15 = mid[1]
  178.     fmadds  f16,f11,f1,f6
  179.     stfs    f16,8(r28)              ;f16 = mid[2]
  180.  
  181. ;        r = RecursiveLightPoint (node->children[side], start, mid);
  182. ;        if (r >= 0)
  183. ;                return r;               // hit something
  184. ;
  185. ;        if ( (back < 0) == side )
  186. ;                return -1;              // didn't hit anuthing
  187.  
  188.     slwi    r8,r27,2
  189.     addi    r8,r8,NODE_CHILDREN
  190.     lwzx    r3,r31,r8
  191.     mr      r4,r30
  192.     mr      r5,r28
  193.     call    RecursiveLightPoint
  194.     mr.     r3,r3
  195.     bge      end
  196.     li      r3,-1
  197.     cmpw    r26,r27
  198.     beq      end
  199.  
  200. ;        surf = cl.worldmodel->surfaces + node->firstsurface;
  201. ;        for (i=0 ; i<node->numsurfaces ; i++, surf++)
  202.  
  203.     lxa     r6,cl
  204.     lwz     r12,CL_WORLDMODEL(r6)
  205.     lwz     r12,MODEL_SURFACES(r12)
  206.     lhz     r4,NODE_FIRSTSURFACE(r31)
  207.     slwi    r4,r4,MSURFACE_SIZEOF_EXP
  208.     add     r12,r12,r4
  209.  
  210.     lhz     r5,NODE_NUMSURFACES(r31)
  211.     mr.     r5,r5
  212.     beq      skip
  213.     lxa     r6,d_lightstylevalue
  214.  
  215. ;                if (surf->flags & SURF_DRAWTILED)
  216. ;                        continue;       // no lightmaps
  217. ;
  218. ;                tex = surf->texinfo;
  219.  
  220. loop:
  221.     lwz     r0,MSURFACE_FLAGS(r12)
  222.     andi.   r0,r0,SURF_DRAWTILED
  223.     bne      loopend
  224.     lwz     r7,MSURFACE_TEXINFO(r12)
  225.  
  226. ;                s = DotProduct (mid, tex->vecs[0]) + tex->vecs[0][3];
  227. ;                t = DotProduct (mid, tex->vecs[1]) + tex->vecs[1][3];;
  228.  
  229.     lfs     f4,12(r7)
  230.     lfs     f1,0(r7)
  231.     fmadds  f1,f1,f14,f4
  232.     lfs     f2,4(r7)
  233.     fmadds  f1,f2,f15,f1
  234.     lfs     f3,8(r7)
  235.     fmadds  f1,f3,f16,f1
  236.     fctiwz  f0,f1
  237.     stfd    f0,local(r1)
  238.     lwz     r8,local+4(r1)          ;r8 = s
  239.  
  240.     lfs     f8,12+16(r7)
  241.     lfs     f5,0+16(r7)
  242.     fmadds  f5,f5,f14,f8
  243.     lfs     f6,4+16(r7)
  244.     fmadds  f5,f6,f15,f5
  245.     lfs     f7,8+16(r7)
  246.     fmadds  f5,f7,f16,f5
  247.     fctiwz  f0,f5
  248.     stfd    f0,local(r1)
  249.     lwz     r9,local+4(r1)          ;r9 = t
  250.  
  251. ;                if (s < surf->texturemins[0] ||
  252. ;                t < surf->texturemins[1])
  253. ;                        continue;
  254. ;
  255. ;                ds = s - surf->texturemins[0];
  256. ;                dt = t - surf->texturemins[1];
  257.  
  258.     lha     r10,MSURFACE_TEXTUREMINS(r12)
  259.     subf.   r8,r10,r8
  260.     lha     r11,MSURFACE_TEXTUREMINS+2(r12)
  261.     blt      loopend
  262.     subf.   r9,r11,r9
  263.     blt      loopend
  264.  
  265. ;                if ( ds > surf->extents[0] || dt > surf->extents[1] )
  266. ;                        continue;
  267. ;
  268. ;                if (!surf->samples)
  269. ;                        return 0;
  270. ;
  271. ;                ds >>= 4;
  272. ;                dt >>= 4;
  273.  
  274.     lha     r10,MSURFACE_EXTENTS(r12)
  275.     cmpw    r8,r10
  276.     bgt      loopend
  277.     lha     r11,MSURFACE_EXTENTS+2(r12)
  278.     cmpw    r9,r11
  279.     bgt      loopend
  280.     lwz     r3,MSURFACE_SAMPLES(r12) ;lightmap = surf->samples
  281.     mr.     r3,r3
  282.     beq      end
  283.     srawi   r8,r8,4                 ;ds >>= 4
  284.     srawi   r9,r9,4                 ;dt >>= 4
  285.  
  286. ;                lightmap = surf->samples;
  287. ;                r = 0;
  288. ;                if (lightmap)
  289. ;                {
  290. ;
  291. ;                        lightmap += dt * ((surf->extents[0]>>4)+1) + ds;
  292.  
  293.     li      r4,0                    ;r4 = r = 0
  294.     srawi   r10,r10,4
  295.     srawi   r11,r11,4
  296.     addi    r10,r10,1
  297.     addi    r11,r11,1
  298.     mullw   r9,r9,r10
  299.     add     r9,r9,r8
  300.     add     r3,r3,r9                ;lightmap +=
  301.  
  302. ;                        for (maps = 0 ; maps < MAXLIGHTMAPS && surf->styles[maps] != 255 ;
  303. ;                                        maps++)
  304. ;                        {
  305. ;                                scale = d_lightstylevalue[surf->styles[maps]];
  306. ;                                r += *lightmap * scale;
  307. ;                                lightmap += ((surf->extents[0]>>4)+1) *
  308. ;                                                ((surf->extents[1]>>4)+1);
  309. ;                        }
  310. ;
  311. ;                        r >>= 8;
  312. ;                }
  313. ;                return r;
  314.  
  315.     li      r0,MAXLIGHTMAPS
  316.     la      r7,MSURFACE_STYLES(r12)
  317.     mullw   r10,r10,r11
  318.     subi    r7,r7,1
  319.     mtctr   r0
  320. loop2:
  321.     lbzu    r0,1(r7)
  322.     cmpwi   r0,0xff
  323.     beq      leave
  324.     slwi    r0,r0,2
  325.     lwzx    r11,r6,r0
  326.     lbz     r0,0(r3)
  327.     mullw   r11,r11,r0
  328.     add     r4,r4,r11
  329.     add     r3,r3,r10
  330.     bdnz     loop2
  331. leave:
  332.     srawi   r4,r4,8
  333.     mr      r3,r4
  334.     b        end
  335. loopend:
  336.     subic.  r5,r5,1
  337.     la      r12,MSURFACE_SIZEOF(r12)
  338.     bne      loop
  339.  
  340. ;        return RecursiveLightPoint (node->children[!side], mid, end);
  341.  
  342. skip:
  343.     xori    r27,r27,1
  344.     slwi    r8,r27,2
  345.     addi    r8,r8,NODE_CHILDREN
  346.     lwzx    r3,r31,r8
  347.     mr      r4,r28
  348.     mr      r5,r29
  349.     call    RecursiveLightPoint
  350. end:
  351.     lfd    f14,fb+0*8(r1)
  352.     lfd    f15,fb+1*8(r1)
  353.     lfd    f16,fb+2*8(r1)
  354.     lmw    r26,gb(r1)
  355.     exit
  356.  
  357. ;    funcend    RecursiveLightPoint
  358.