// tgl_triangle_texmap.cpp void ZB_fillTriangleMappingPerspective(ZBuffer *zb, ZBufferPoint *p0, ZBufferPoint *p1, ZBufferPoint *p2) { PIXEL *texture; float fdzdx,fndzdx,ndszdx,ndtzdx; unsigned short sh1 = zb->shift[0]; unsigned short sh2 = zb->shift[1]; unsigned int mask = zb->uvmask; #define INTERP_Z #define INTERP_STZ #define NB_INTERP 8 #define DRAW_INIT() \ { \ texture = zb->current_texture;\ fdzdx = (float)dzdx;\ fndzdx = NB_INTERP * fdzdx;\ ndszdx = NB_INTERP * dszdx;\ ndtzdx = NB_INTERP * dtzdx;\ } #if TGL_FEATURE_RENDER_BITS == 24 #define PUT_PIXEL(_a) \ { \ unsigned char *ptr;\ zz = z >> ZB_POINT_Z_FRAC_BITS; \ if ( ZCMP(zz,pz[_a]) ) \ { \ ptr = texture + ((((t & mask)<> sh2) * 3;\ pp[3 * _a] = ptr[0];\ pp[3 * _a + 1] = ptr[1];\ pp[3 * _a + 2] = ptr[2];\ pz[_a] = zz; \ } \ z += dzdx; \ s += dsdx; \ t += dtdx; \ } #else #define PUT_PIXEL(_a) \ { \ zz = z >> ZB_POINT_Z_FRAC_BITS; \ if ( ZCMP(zz,pz[_a]) ) \ { \ pp[_a] = *(PIXEL *)((char *)texture+ \ (( ((t & mask)<> sh2)); \ pz[_a] = zz; \ } \ z += dzdx; \ s += dsdx; \ t += dtdx; \ } #endif #define DRAW_LINE() \ { \ register unsigned short *pz; \ register PIXEL *pp; \ register unsigned int s,t,z,zz; \ register int n,dsdx,dtdx; \ float sz,tz,fz,zinv; \ n=(x2>>16)-x1; \ fz=(float)z1;\ zinv=1.f / fz;\ pp=(PIXEL *)((char *)pp1 + x1 * PSZB); \ pz=pz1+x1; \ z=z1; \ sz=sz1;\ tz=tz1;\ while (n>=(NB_INTERP-1)) { \ {\ float ss,tt;\ ss=(sz * zinv);\ tt=(tz * zinv);\ s=(int) ss;\ t=(int) tt;\ dsdx= (int)( (dszdx - ss*fdzdx)*zinv );\ dtdx= (int)( (dtzdx - tt*fdzdx)*zinv );\ fz+=fndzdx;\ zinv=1.f / fz;\ }\ PUT_PIXEL(0); \ PUT_PIXEL(1); \ PUT_PIXEL(2); \ PUT_PIXEL(3); \ PUT_PIXEL(4); \ PUT_PIXEL(5); \ PUT_PIXEL(6); \ PUT_PIXEL(7); \ pz+=NB_INTERP; \ pp=(PIXEL *)((char *)pp + NB_INTERP * PSZB);\ n-=NB_INTERP; \ sz+=ndszdx;\ tz+=ndtzdx;\ } \ {\ float ss,tt;\ ss=(sz * zinv);\ tt=(tz * zinv);\ s=(int) ss;\ t=(int) tt;\ dsdx= (int)( (dszdx - ss*fdzdx)*zinv );\ dtdx= (int)( (dtzdx - tt*fdzdx)*zinv );\ }\ while (n>=0) { \ PUT_PIXEL(0); \ pz+=1; \ pp=(PIXEL *)((char *)pp + PSZB);\ n-=1; \ } \ } #include "tgl_triangle_inc.h" }