home *** CD-ROM | disk | FTP | other *** search
/ Amiga ACS 1998 #6 / amigaacscoverdisc1998-061998.iso / games / descent / source / texmap / quad.c < prev    next >
Text File  |  1998-06-08  |  2KB  |  86 lines

  1. /*
  2. THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
  3. SOFTWARE CORPORATION ("PARALLAX").  PARALLAX, IN DISTRIBUTING THE CODE TO
  4. END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
  5. ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
  6. IN USING, DISPLAYING,  AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
  7. SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
  8. FREE PURPOSES.  IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
  9. CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES.  THE END-USER UNDERSTANDS
  10. AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.  
  11. COPYRIGHT 1993-1998 PARALLAX SOFTWARE CORPORATION.  ALL RIGHTS RESERVED.
  12. */
  13. void c_tmap_scanline_per()
  14. {
  15.     ubyte *dest;
  16.     uint c;
  17.     int x;
  18.     fix u,v,z,l,dudx, dvdx, dzdx, dldx;
  19.  
  20.     u = fx_u;
  21.     v = fx_v*64;
  22.     z = fx_z;
  23.     dudx = fx_du_dx; 
  24.     dvdx = fx_dv_dx*64; 
  25.     dzdx = fx_dz_dx;
  26.  
  27.     l = fx_l>>8;
  28.     dldx = fx_dl_dx>>8;
  29.     dest = (ubyte *)(write_buffer + fx_xleft + (bytes_per_row * fx_y)  );
  30.  
  31.  
  32.     {
  33.         fix u0 = fx_u;
  34.         fix u2 = fx_u + fx_du_dx*(fx_xright-fx_xleft+1);
  35.         fix v0 = fx_v;
  36.         fix v2 = fx_v + fx_dv_dx*(fx_xright-fx_xleft+1);
  37.         fix w0 = fx_z;
  38.         fix w2 = fx_z + fx_dz_dx*(fx_xright-fx_xleft+1);
  39.         fix u1 = fixdiv((u0+u2),(w0+w2));
  40.         fix v1 = fixdiv((v0+v2),(w0+w2));
  41.         fix a0, a1, a2, b0, b1, b2, dudx1, dvdx1;
  42.         int dx = fx_xright-fx_xleft+1;
  43.         u0 = fixdiv( u0, w0 );
  44.         v0 = fixdiv( v0, w0 );
  45.         u2 = fixdiv( u2, w2 );
  46.         v2 = fixdiv( v2, w2 );
  47.         a0 = u0;                                    b0 = v0;
  48.         a1 = (-3*u0+4*u1-u2)/dx;            b1 = (-3*v0+4*v1-v2)/dx;
  49.         a2 = (2*(u0-2*u1+u2))/(dx*dx);            b2 = (2*(v0-2*v1+v2))/(dx*dx);
  50.         dudx = a1 + a2;
  51.         dvdx = b1 + b2;
  52.         dudx1 = 2*a2;
  53.         dvdx1 = 2*b2;
  54.         u = u0;
  55.         v = v0;
  56.  
  57.  
  58.         if (!Transparency_on)    {
  59.             for (x= fx_xright-fx_xleft+1 ; x > 0; --x ) {
  60.                 *dest++ = gr_fade_table[ (l&(0xff00)) + (uint)pixptr[  (f2i(v)&63)*64 + (f2i(u)&63) ] ];
  61.                 l += dldx;
  62.                 u += dudx;
  63.                 v += dvdx;
  64.                 dudx += dudx1;
  65.                 dvdx += dvdx1;
  66.                 //z += dzdx;
  67.             }
  68.         } else {
  69.             for (x= fx_xright-fx_xleft+1 ; x > 0; --x ) {
  70.                 c = (uint)pixptr[  (f2i(v)&63)*64 + (f2i(u)&63) ];
  71.                 if ( c!=255)
  72.                     *dest = gr_fade_table[ (l&(0xff00)) + c ];
  73.                 dest++;
  74.                 l += dldx;
  75.                 u += dudx;
  76.                 v += dvdx;
  77.                 dudx += dudx1;
  78.                 dvdx += dvdx1;
  79.                 //z += dzdx;
  80.             }
  81.         }
  82.     }
  83. }
  84.  
  85. 
  86.