version 1.3 | | version 1.4 |
---|
| | |
* Routines to draw the texture mapped scanlines. | | * Routines to draw the texture mapped scanlines. |
* | | * |
* $Log$ | | * $Log$ |
| | * Revision 1.4 1999/10/18 00:31:01 donut |
| | * more alpha fixes from Falk Hueffner |
| | * |
* Revision 1.3 1999/10/14 04:48:21 donut | | * Revision 1.3 1999/10/14 04:48:21 donut |
* alpha fixes, and gl_font args | | * alpha fixes, and gl_font args |
* | | * |
| | |
} | | } |
#endif | | #endif |
| | |
| | #ifdef FP_TMAP |
| | void c_tmap_scanline_per_nolight() |
| | { |
| | ubyte *dest; |
| | uint c; |
| | int x, j; |
| | double u, v, z, dudx, dvdx, dzdx, rec_z; |
| | u_int64_t destlong; |
| | |
| | u = f2db(fx_u); |
| | v = f2db(fx_v) * 64.0; |
| | z = f2db(fx_z); |
| | dudx = f2db(fx_du_dx); |
| | dvdx = f2db(fx_dv_dx) * 64.0; |
| | dzdx = f2db(fx_dz_dx); |
| | |
| | rec_z = 1.0 / z; |
| | |
| | dest = (ubyte *) (write_buffer + fx_xleft + (bytes_per_row * fx_y)); |
| | |
| | x = fx_xright - fx_xleft + 1; |
| | if (!Transparency_on) { |
| | if (x >= 8) { |
| | if ((j = (size_t) dest & 7) != 0) { |
| | j = 8 - j; |
| | |
| | while (j > 0) { |
| | *dest++ = |
| | (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + |
| | (((int) (u * rec_z)) & 63)]; |
| | u += dudx; |
| | v += dvdx; |
| | z += dzdx; |
| | rec_z = 1.0 / z; |
| | x--; |
| | j--; |
| | } |
| | } |
| | |
| | while (j >= 8) { |
| | destlong = |
| | (u_int64_t) pixptr[(((int) (v * rec_z)) & (64 * 63)) + |
| | (((int) (u * rec_z)) & 63)]; |
| | u += dudx; |
| | v += dvdx; |
| | z += dzdx; |
| | rec_z = 1.0 / z; |
| | destlong |= |
| | (u_int64_t) pixptr[(((int) (v * rec_z)) & (64 * 63)) + |
| | (((int) (u * rec_z)) & 63)] << 8; |
| | u += dudx; |
| | v += dvdx; |
| | z += dzdx; |
| | rec_z = 1.0 / z; |
| | destlong |= |
| | (u_int64_t) pixptr[(((int) (v * rec_z)) & (64 * 63)) + |
| | (((int) (u * rec_z)) & 63)] << 16; |
| | u += dudx; |
| | v += dvdx; |
| | z += dzdx; |
| | rec_z = 1.0 / z; |
| | destlong |= |
| | (u_int64_t) pixptr[(((int) (v * rec_z)) & (64 * 63)) + |
| | (((int) (u * rec_z)) & 63)] << 24; |
| | u += dudx; |
| | v += dvdx; |
| | z += dzdx; |
| | rec_z = 1.0 / z; |
| | destlong |= |
| | (u_int64_t) pixptr[(((int) (v * rec_z)) & (64 * 63)) + |
| | (((int) (u * rec_z)) & 63)] << 32; |
| | u += dudx; |
| | v += dvdx; |
| | z += dzdx; |
| | rec_z = 1.0 / z; |
| | destlong |= |
| | (u_int64_t) pixptr[(((int) (v * rec_z)) & (64 * 63)) + |
| | (((int) (u * rec_z)) & 63)] << 40; |
| | u += dudx; |
| | v += dvdx; |
| | z += dzdx; |
| | rec_z = 1.0 / z; |
| | destlong |= |
| | (u_int64_t) pixptr[(((int) (v * rec_z)) & (64 * 63)) + |
| | (((int) (u * rec_z)) & 63)] << 48; |
| | u += dudx; |
| | v += dvdx; |
| | z += dzdx; |
| | rec_z = 1.0 / z; |
| | destlong |= |
| | (u_int64_t) pixptr[(((int) (v * rec_z)) & (64 * 63)) + |
| | (((int) (u * rec_z)) & 63)] << 56; |
| | u += dudx; |
| | v += dvdx; |
| | z += dzdx; |
| | rec_z = 1.0 / z; |
| | |
| | *((u_int64_t *) dest) = destlong; |
| | dest += 8; |
| | x -= 8; |
| | j -= 8; |
| | } |
| | } |
| | while (x-- > 0) { |
| | *dest++ = |
| | (u_int64_t) pixptr[(((int) (v * rec_z)) & (64 * 63)) + |
| | (((int) (u * rec_z)) & 63)]; |
| | u += dudx; |
| | v += dvdx; |
| | z += dzdx; |
| | rec_z = 1.0 / z; |
| | } |
| | } else { |
| | x = fx_xright - fx_xleft + 1; |
| | |
| | if (x >= 8) { |
| | if ((j = (size_t) dest & 7) != 0) { |
| | j = 8 - j; |
| | |
| | while (j > 0) { |
| | c = |
| | (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + |
| | (((int) (u * rec_z)) & 63)]; |
| | if (c != 255) |
| | *dest = c; |
| | dest++; |
| | u += dudx; |
| | v += dvdx; |
| | z += dzdx; |
| | rec_z = 1.0 / z; |
| | x--; |
| | j--; |
| | } |
| | } |
| | |
| | j = x; |
| | while (j >= 8) { |
| | destlong = *((u_int64_t *) dest); |
| | c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + |
| | (((int) (u * rec_z)) & 63)]; |
| | if (c != 255) { |
| | destlong &= ~(u_int64_t)0xFF; |
| | destlong |= (u_int64_t) c; |
| | } |
| | u += dudx; |
| | v += dvdx; |
| | z += dzdx; |
| | rec_z = 1.0 / z; |
| | c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + |
| | (((int) (u * rec_z)) & 63)]; |
| | if (c != 255) { |
| | destlong &= ~((u_int64_t)0xFF << 8); |
| | destlong |= (u_int64_t) c << 8; |
| | } |
| | u += dudx; |
| | v += dvdx; |
| | z += dzdx; |
| | rec_z = 1.0 / z; |
| | c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + |
| | (((int) (u * rec_z)) & 63)]; |
| | if (c != 255) { |
| | destlong &= ~((u_int64_t)0xFF << 16); |
| | destlong |= (u_int64_t) c << 16; |
| | } |
| | u += dudx; |
| | v += dvdx; |
| | z += dzdx; |
| | rec_z = 1.0 / z; |
| | c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + |
| | (((int) (u * rec_z)) & 63)]; |
| | if (c != 255) { |
| | destlong &= ~((u_int64_t)0xFF << 24); |
| | destlong |= (u_int64_t) c << 24; |
| | } |
| | u += dudx; |
| | v += dvdx; |
| | z += dzdx; |
| | rec_z = 1.0 / z; |
| | c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + |
| | (((int) (u * rec_z)) & 63)]; |
| | if (c != 255) { |
| | destlong &= ~((u_int64_t)0xFF << 32); |
| | destlong |= (u_int64_t) c << 32; |
| | } |
| | u += dudx; |
| | v += dvdx; |
| | z += dzdx; |
| | rec_z = 1.0 / z; |
| | c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + |
| | (((int) (u * rec_z)) & 63)]; |
| | if (c != 255) { |
| | destlong &= ~((u_int64_t)0xFF << 40); |
| | destlong |= (u_int64_t) c << 40; |
| | } |
| | u += dudx; |
| | v += dvdx; |
| | z += dzdx; |
| | rec_z = 1.0 / z; |
| | c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + |
| | (((int) (u * rec_z)) & 63)]; |
| | if (c != 255) { |
| | destlong &= ~((u_int64_t)0xFF << 48); |
| | destlong |= (u_int64_t) c << 48; |
| | } |
| | u += dudx; |
| | v += dvdx; |
| | z += dzdx; |
| | rec_z = 1.0 / z; |
| | c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + |
| | (((int) (u * rec_z)) & 63)]; |
| | if (c != 255) { |
| | destlong &= ~((u_int64_t)0xFF << 56); |
| | destlong |= (u_int64_t) c << 56; |
| | } |
| | u += dudx; |
| | v += dvdx; |
| | z += dzdx; |
| | rec_z = 1.0 / z; |
| | |
| | *((u_int64_t *) dest) = destlong; |
| | dest += 8; |
| | x -= 8; |
| | j -= 8; |
| | } |
| | } |
| | while (x-- > 0) { |
| | c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + |
| | (((int) (u * rec_z)) & 63)]; |
| | if (c != 255) |
| | *dest = c; |
| | dest++; |
| | u += dudx; |
| | v += dvdx; |
| | z += dzdx; |
| | rec_z = 1.0 / z; |
| | } |
| | } |
| | } |
| | #else |
void c_tmap_scanline_per_nolight() | | void c_tmap_scanline_per_nolight() |
{ | | { |
ubyte *dest; | | ubyte *dest; |
| | |
} | | } |
} | | } |
} | | } |
| | #endif |
| | |
#if 1 | | #ifdef FP_TMAP |
| | void c_tmap_scanline_per() |
| | { |
| | ubyte *dest; |
| | uint c; |
| | int x, j; |
| | double u, v, z, l, dudx, dvdx, dzdx, dldx, rec_z; |
| | u_int64_t destlong; |
| | |
| | u = f2db(fx_u); |
| | v = f2db(fx_v) * 64.0; |
| | z = f2db(fx_z); |
| | l = f2db(fx_l); |
| | dudx = f2db(fx_du_dx); |
| | dvdx = f2db(fx_dv_dx) * 64.0; |
| | dzdx = f2db(fx_dz_dx); |
| | dldx = f2db(fx_dl_dx); |
| | |
| | rec_z = 1.0 / z; // gcc 2.95.2 is won't do this optimization itself |
| | |
| | dest = (ubyte *) (write_buffer + fx_xleft + (bytes_per_row * fx_y)); |
| | x = fx_xright - fx_xleft + 1; |
| | |
| | if (!Transparency_on) { |
| | if (x >= 8) { |
| | if ((j = (size_t) dest & 7) != 0) { |
| | j = 8 - j; |
| | |
| | while (j > 0) { |
| | *dest++ = |
| | gr_fade_table[((int) fabs(l)) * 256 + |
| | (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + |
| | (((int) (u * rec_z)) & 63)]]; |
| | l += dldx; |
| | u += dudx; |
| | v += dvdx; |
| | z += dzdx; |
| | rec_z = 1.0 / z; |
| | x--; |
| | j--; |
| | } |
| | } |
| | |
| | j = x; |
| | while (j >= 8) { |
| | destlong = |
| | (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 + |
| | (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + |
| | (((int) (u * rec_z)) & 63)]]; |
| | l += dldx; |
| | u += dudx; |
| | v += dvdx; |
| | z += dzdx; |
| | rec_z = 1.0 / z; |
| | destlong |= |
| | (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 + |
| | (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + |
| | (((int) (u * rec_z)) & 63)]] << 8; |
| | l += dldx; |
| | u += dudx; |
| | v += dvdx; |
| | z += dzdx; |
| | rec_z = 1.0 / z; |
| | destlong |= |
| | (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 + |
| | (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + |
| | (((int) (u * rec_z)) & 63)]] << 16; |
| | l += dldx; |
| | u += dudx; |
| | v += dvdx; |
| | z += dzdx; |
| | rec_z = 1.0 / z; |
| | destlong |= |
| | (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 + |
| | (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + |
| | (((int) (u * rec_z)) & 63)]] << 24; |
| | l += dldx; |
| | u += dudx; |
| | v += dvdx; |
| | z += dzdx; |
| | rec_z = 1.0 / z; |
| | destlong |= |
| | (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 + |
| | (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + |
| | (((int) (u * rec_z)) & 63)]] << 32; |
| | l += dldx; |
| | u += dudx; |
| | v += dvdx; |
| | z += dzdx; |
| | rec_z = 1.0 / z; |
| | destlong |= |
| | (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 + |
| | (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + |
| | (((int) (u * rec_z)) & 63)]] << 40; |
| | l += dldx; |
| | u += dudx; |
| | v += dvdx; |
| | z += dzdx; |
| | rec_z = 1.0 / z; |
| | destlong |= |
| | (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 + |
| | (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + |
| | (((int) (u * rec_z)) & 63)]] << 48; |
| | l += dldx; |
| | u += dudx; |
| | v += dvdx; |
| | z += dzdx; |
| | rec_z = 1.0 / z; |
| | destlong |= |
| | (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 + |
| | (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + |
| | (((int) (u * rec_z)) & 63)]] << 56; |
| | l += dldx; |
| | u += dudx; |
| | v += dvdx; |
| | z += dzdx; |
| | rec_z = 1.0 / z; |
| | |
| | *((u_int64_t *) dest) = destlong; |
| | dest += 8; |
| | x -= 8; |
| | j -= 8; |
| | } |
| | } |
| | while (x-- > 0) { |
| | *dest++ = |
| | gr_fade_table[((int) fabs(l)) * 256 + |
| | (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + (((int) (u * rec_z)) & 63)]]; |
| | l += dldx; |
| | u += dudx; |
| | v += dvdx; |
| | z += dzdx; |
| | rec_z = 1.0 / z; |
| | } |
| | } else { |
| | if (x >= 8) { |
| | if ((j = (size_t) dest & 7) != 0) { |
| | j = 8 - j; |
| | |
| | while (j > 0) { |
| | c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + (((int) (u * rec_z)) & 63)]; |
| | if (c != 255) |
| | *dest = gr_fade_table[((int) fabs(l)) * 256 + c]; |
| | dest++; |
| | l += dldx; |
| | u += dudx; |
| | v += dvdx; |
| | z += dzdx; |
| | rec_z = 1.0 / z; |
| | x--; |
| | j--; |
| | } |
| | } |
| | |
| | j = x; |
| | while (j >= 8) { |
| | destlong = *((u_int64_t *) dest); |
| | c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + (((int) (u * rec_z)) & 63)]; |
| | if (c != 255) { |
| | destlong &= ~(u_int64_t)0xFF; |
| | destlong |= (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 + c]; |
| | } |
| | l += dldx; |
| | u += dudx; |
| | v += dvdx; |
| | z += dzdx; |
| | rec_z = 1.0 / z; |
| | c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + (((int) (u * rec_z)) & 63)]; |
| | if (c != 255) { |
| | destlong &= ~((u_int64_t)0xFF << 8); |
| | destlong |= (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 + c] << 8; |
| | } |
| | l += dldx; |
| | u += dudx; |
| | v += dvdx; |
| | z += dzdx; |
| | rec_z = 1.0 / z; |
| | c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + (((int) (u * rec_z)) & 63)]; |
| | if (c != 255) { |
| | destlong &= ~((u_int64_t)0xFF << 16); |
| | destlong |= (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 + c] << 16; |
| | } |
| | l += dldx; |
| | u += dudx; |
| | v += dvdx; |
| | z += dzdx; |
| | rec_z = 1.0 / z; |
| | c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + (((int) (u * rec_z)) & 63)]; |
| | if (c != 255) { |
| | destlong &= ~((u_int64_t)0xFF << 24); |
| | destlong |= (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 + c] << 24; |
| | } |
| | l += dldx; |
| | u += dudx; |
| | v += dvdx; |
| | z += dzdx; |
| | rec_z = 1.0 / z; |
| | c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + (((int) (u * rec_z)) & 63)]; |
| | if (c != 255) { |
| | destlong &= ~((u_int64_t)0xFF << 32); |
| | destlong |= (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 + c] << 32; |
| | } |
| | l += dldx; |
| | u += dudx; |
| | v += dvdx; |
| | z += dzdx; |
| | rec_z = 1.0 / z; |
| | c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + (((int) (u * rec_z)) & 63)]; |
| | if (c != 255) { |
| | destlong &= ~((u_int64_t)0xFF << 40); |
| | destlong |= (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 + c] << 40; |
| | } |
| | l += dldx; |
| | u += dudx; |
| | v += dvdx; |
| | z += dzdx; |
| | rec_z = 1.0 / z; |
| | c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + (((int) (u * rec_z)) & 63)]; |
| | if (c != 255) { |
| | destlong &= ~((u_int64_t)0xFF << 48); |
| | destlong |= (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 + c] << 48; |
| | } |
| | l += dldx; |
| | u += dudx; |
| | v += dvdx; |
| | z += dzdx; |
| | rec_z = 1.0 / z; |
| | c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + (((int) (u * rec_z)) & 63)]; |
| | if (c != 255) { |
| | destlong &= ~((u_int64_t)0xFF << 56); |
| | destlong |= (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 + c] << 56; |
| | } |
| | l += dldx; |
| | u += dudx; |
| | v += dvdx; |
| | z += dzdx; |
| | rec_z = 1.0 / z; |
| | |
| | *((u_int64_t *) dest) = destlong; |
| | dest += 8; |
| | x -= 8; |
| | j -= 8; |
| | } |
| | } |
| | while (x-- > 0) { |
| | c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + (((int) (u * rec_z)) & 63)]; |
| | if (c != 255) |
| | *dest = gr_fade_table[((int) fabs(l)) * 256 + c]; |
| | dest++; |
| | l += dldx; |
| | u += dudx; |
| | v += dvdx; |
| | z += dzdx; |
| | rec_z = 1.0 / z; |
| | } |
| | } |
| | } |
| | |
| | #elif 1 |
| | // note the unrolling loop is broken. It is never called, and uses big endian. -- FH |
void c_tmap_scanline_per() | | void c_tmap_scanline_per() |
{ | | { |
ubyte *dest; | | ubyte *dest; |