home *** CD-ROM | disk | FTP | other *** search
/ Dream 57 / Amiga_Dream_57.iso / Amiga / Programmation / c / QuakeC / qtools0.2-src.lha / src / libqdisplay / draw-opti8.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-08-11  |  4.5 KB  |  182 lines

  1. #ifdef    USE_ZBUFFER
  2. #define    inc()        { u += du; v += dv; w += dw; }
  3. #define    fill(pel, z) { *pBuffer++ = (pel); *zBuffer++ = (unsigned short int)(z); }
  4. #else
  5. #define    inc()        { u += du; v += dv; }
  6. #define    fill(pel, z) { *pBuffer++ = (pel); }
  7. #endif
  8.  
  9. #ifdef    USE_ZBUFFER
  10. unsigned char *draw_affine8(int n, unsigned char *pBuffer, unsigned short int *zBuffer, int u, int v, int w, int du, int dv, int dw)
  11. #else
  12. unsigned char *draw_affine8(int n, unsigned char *pBuffer, int u, int v, int du, int dv)
  13. #endif
  14. {
  15.   if (textureType == WALL_TYPE) {
  16.     while (n--) {
  17.       int iu = u >> 16;
  18.       int iv = ((v >> (16 - MAX_LOGY)) & MAX_MASKX) + textureRow;
  19.  
  20. #ifdef CALCULATE_PIXELDRAW
  21.       pixelDraw++;
  22.       if (*pBuffer)
  23.     pixelOverdraw++;
  24. #endif
  25.  
  26.       fill(texture.indexed[multMuls[iv] + iu], w);
  27.       inc();
  28.     }
  29.   }
  30.   else if (textureType == SKY_TYPE) {
  31.     /* TODO: skies */
  32.     while (n--) {
  33.       int iu;
  34.       int iv;
  35.       unsigned char pel, sum;
  36.  
  37. #ifdef CALCULATE_PIXELDRAW
  38.       pixelDraw++;
  39.       if (*pBuffer)
  40.     pixelOverdraw++;
  41. #endif
  42.  
  43.       iu = ((u >> 8) + skyMovementX1) & 0x00007F00;
  44.       iv = ((v >> 16) + skyMovementY1) & 0x0000007F;
  45.       sum = texture.indexed[iu + iv + 0x80];
  46.       iu = ((u >> 8) + skyMovementX2) & 0x00007F00;
  47.       iv = ((v >> 16) + skyMovementY2) & 0x0000007F;
  48.       if ((pel = texture.indexed[iu + iv]))
  49.     sum = pel;
  50.  
  51.       fill(sum, 0xFFFF);
  52.       inc();
  53.     }
  54.   }
  55.   else {
  56.     while (n--) {
  57. #ifndef    FAST_WARP
  58.       int iv = ((v + (swim_v[((u >> textureShift2) & 0xff)] >> textureMip)) >> 16) & textureMask2;
  59.       int iu = ((u + (swim_u[((v >> textureShift2) & 0xff)] >> textureMip)) >> textureShift1) & textureMask1;
  60.  
  61. #else
  62.       int iv = ((v + swim_v[(u >> 16)]) >> 16) & textureMask2;
  63.       int iu = ((u + swim_u[(v >> 16)]) >> textureShift1) & textureMask1;
  64.  
  65. #endif
  66.  
  67.       fill(pretransp(texture.indexed[iu + iv], *pBuffer), w);
  68.       inc();
  69.     }
  70.   }
  71.   return pBuffer;
  72. }
  73.  
  74. /* given a span (x0,y)..(x1,y), draw a perspective-correct span for it */
  75. /*
  76.  * the zbuffer is interesting for dynamic model-draw etc.
  77.  * the buffers values (1/z) are all under 0, we can try to
  78.  * store them as 16bit-wide-fraction
  79.  *
  80.  * while(n--) {
  81.  *   *zbuf++ = (unsigned short int)(w); / we need only the lower part /
  82.  *   w += dw;
  83.  * }
  84.  *
  85.  */
  86. void draw_spans8(int y, int ey)
  87. {
  88.   float prew = tmap[6] + y * tmap[8];
  89.   float prev = tmap[3] + y * tmap[5];
  90.   float preu = tmap[0] + y * tmap[2];
  91.  
  92.   for (; y < ey; y++) {
  93.     int sx = scan[y][0];
  94.     int len = scan[y][1] - sx;
  95.  
  96.     if (len > 0) {
  97.       float w0;
  98.       float v0;
  99.       float u0;
  100.  
  101. #ifdef    USE_ZBUFFER
  102.       int w, dw;                        /* 1/zbuffer */
  103.  
  104. #endif
  105.       int v, dv;
  106.       int u, du;
  107.       int slen;
  108.  
  109.       unsigned char *pBuffer = (unsigned char *)localDim.frameBuffer + multRows[y] + sx;
  110.  
  111. #ifdef    USE_ZBUFFER
  112.       unsigned short int *zBuffer = localDim.zBuffer + multRows[y] + sx;
  113.  
  114. #endif
  115.  
  116.       /* compute (u,v) at left end */
  117.       w0 = 1 / (prew + sx * tmap[7]);                /* 1/zbuffer */
  118.       v0 = (prev + sx * tmap[4]) * w0;
  119.       u0 = (preu + sx * tmap[1]) * w0;
  120.  
  121. #ifdef    USE_ZBUFFER
  122.       w = FLOAT_TO_FIX(w0);                    /* 1/zbuffer */
  123. #endif
  124.       v = FLOAT_TO_FIX(v0);
  125.       u = FLOAT_TO_FIX(u0);
  126.  
  127.       for (slen = len >> SUBDIV_SHIFT; slen > 0; slen--) {
  128.     sx += SUBDIV;
  129.     w0 = 1 / (prew + sx * tmap[7]);
  130.     v0 = (prev + sx * tmap[4]) * w0;
  131.     u0 = (preu + sx * tmap[1]) * w0;
  132.  
  133. #ifdef    USE_ZBUFFER
  134.     dw = (FLOAT_TO_FIX(w0) - w) >> SUBDIV_SHIFT;        /* 1/zbuffer */
  135. #endif
  136.     dv = (FLOAT_TO_FIX(v0) - v) >> SUBDIV_SHIFT;
  137.     du = (FLOAT_TO_FIX(u0) - u) >> SUBDIV_SHIFT;
  138.  
  139. #ifdef    USE_ZBUFFER
  140.     pBuffer = draw_affine8(SUBDIV, pBuffer, zBuffer, u, v, w, du, dv, dw);
  141.     zBuffer += SUBDIV;
  142. #else
  143.     pBuffer = draw_affine8(SUBDIV, pBuffer, u, v, du, dv);
  144. #endif
  145.  
  146. #ifdef    USE_ZBUFFER
  147.     w = FLOAT_TO_FIX(w0);                    /* 1/zbuffer */
  148. #endif
  149.     v = FLOAT_TO_FIX(v0);
  150.     u = FLOAT_TO_FIX(u0);
  151.       }
  152.  
  153.       if ((slen = (len & SUBDIV_MASK) - 1)) {            /* a) do not calc if only draw 1 pixel */
  154.     float w1;
  155.     float v1;
  156.     float u1;
  157.  
  158.     sx += slen;
  159.     w1 = 1 / (prew + sx * tmap[7]);
  160.     v1 = (prev + sx * tmap[4]) * w1;
  161.     u1 = (preu + sx * tmap[1]) * w1;
  162.  
  163. #ifdef    USE_ZBUFFER
  164.     dw = FLOAT_TO_FIX((w1 - w0) / slen);            /* 1/zbuffer */
  165. #endif
  166.     dv = FLOAT_TO_FIX((v1 - v0) / slen);
  167.     du = FLOAT_TO_FIX((u1 - u0) / slen);
  168.       }
  169.       /* a) but draw that pixel surely */
  170. #ifdef    USE_ZBUFFER
  171.       draw_affine8(slen + 1, pBuffer, zBuffer, u, v, w, du, dv, dw);    /* for the last pixel the du and dv are thrown away */
  172. #else
  173.       draw_affine8(slen + 1, pBuffer, u, v, du, dv);        /* for the last pixel the du and dv are thrown away */
  174. #endif
  175.     }
  176.  
  177.     prew += tmap[8];
  178.     prev += tmap[5];
  179.     preu += tmap[2];
  180.   }
  181. }
  182.