ref: 5e84e3b1d87b1224a6aab1ea590edebd6a8dc025
dir: /src/ztriangle.c/
#include <stdlib.h>
#include "../include/zbuffer.h"
#if TGL_FEATURE_RENDER_BITS == 32
#elif TGL_FEATURE_RENDER_BITS == 16
#else
#error "USE 32 BIT MODE!!!"
#endif
#if TGL_FEATURE_POLYGON_STIPPLE
#define THE_X (((GLushort)(pp-pp1)))
#define XSTIP(_a) ((THE_X+_a)& TGL_POLYGON_STIPPLE_MASK_X)
#define YSTIP (the_y & TGL_POLYGON_STIPPLE_MASK_Y)
//NOTES Divide by 8 to get the byte Get the actual bit
#define STIPBIT(_a) (zb->stipplepattern[(XSTIP(_a) | (YSTIP<<TGL_POLYGON_STIPPLE_POW2_WIDTH))>>3] & (1<<(XSTIP(_a) & 7)))
#define STIPTEST(_a) !(zb->dostipple && !STIPBIT(_a))
#define ZCMP(z,zpix,_a) ((z) >= (zpix) && STIPTEST(_a))
#else
#define ZCMP(z,zpix,_a) ((z) >= (zpix))
#endif
void ZB_fillTriangleFlat(ZBuffer *zb,
ZBufferPoint *p0,ZBufferPoint *p1,ZBufferPoint *p2)
{
PIXEL color;
#define INTERP_Z
#define DRAW_INIT() \
{ \
color=RGB_TO_PIXEL(p2->r,p2->g,p2->b); \
}
#define PUT_PIXEL(_a) \
{ \
zz=z >> ZB_POINT_Z_FRAC_BITS; \
if (ZCMP(zz,pz[_a],_a)) { \
pp[_a]=color; \
pz[_a]=zz; \
} \
z+=dzdx; \
}
#include "ztriangle.h"
}
/*
* Smooth filled triangle.
* The code below is very tricky :)
*/
void ZB_fillTriangleSmooth(ZBuffer *zb,
ZBufferPoint *p0,ZBufferPoint *p1,ZBufferPoint *p2)
{
#if TGL_FEATURE_RENDER_BITS == 16
// GLint _drgbdx;
#endif
//GLuint color;
#define INTERP_Z
#define INTERP_RGB
#define SAR_RND_TO_ZERO(v,n) (v / (1<<n))
#if TGL_FEATURE_RENDER_BITS == 32
#define DRAW_INIT() \
{ \
\
}
#define PUT_PIXEL(_a) \
{ \
zz=z >> ZB_POINT_Z_FRAC_BITS; \
if (ZCMP(zz,pz[_a],_a)) { \
pp[_a] = RGB_TO_PIXEL(or1, og1, ob1);\
pz[_a]=zz; \
}\
z+=dzdx; \
og1+=dgdx; \
or1+=drdx; \
ob1+=dbdx; \
}
//END OF 32 bit mode
#elif TGL_FEATURE_RENDER_BITS == 16
/*
#define DRAW_INIT() \
{ \
_drgbdx=(SAR_RND_TO_ZERO(drdx, 6) << 22) & 0xFFC00000; \
_drgbdx|=SAR_RND_TO_ZERO(dgdx,5) & 0x000007FF; \
_drgbdx|=(SAR_RND_TO_ZERO(dbdx,7) << 12) & 0x001FF000; \
}
*/
#define DRAW_INIT() \
{ \
\
}
/*#define PUT_PIXEL(_a) \
{ \
zz=z >> ZB_POINT_Z_FRAC_BITS; \
if (ZCMP(zz,pz[_a],_a)) { \
tmp=rgb&0xF81F07E0; \
pp[_a] = tmp | (tmp >> 16);\
pz[_a]=zz; \
}\
z+=dzdx; \
rgb=(rgb+drgbdx) & ( ~ 0x00200800);\
}
*/
#define PUT_PIXEL(_a) \
{ \
zz=z >> ZB_POINT_Z_FRAC_BITS; \
if (ZCMP(zz,pz[_a],_a)) { \
pp[_a] = RGB_TO_PIXEL(or1, og1, ob1);\
pz[_a]=zz; \
}\
z+=dzdx; \
og1+=dgdx; \
or1+=drdx; \
ob1+=dbdx; \
}
/*
#define DRAW_LINE() \
{ \
register GLushort *pz; \
register PIXEL *pp; \
register GLuint tmp,z,zz,rgb,drgbdx; \
register GLint n; \
n=(x2 >> 16) - x1; \
pp=pp1+x1; \
pz=pz1+x1; \
z=z1; \
rgb=(r1 << 16) & 0xFFC00000; \
rgb|=(g1 >> 5) & 0x000007FF; \
rgb|=(b1 << 5) & 0x001FF000; \
drgbdx=_drgbdx; \
while (n>=3) { \
PUT_PIXEL(0); \
PUT_PIXEL(1); \
PUT_PIXEL(2); \
PUT_PIXEL(3); \
pz+=4; \
pp+=4; \
n-=4; \
} \
while (n>=0) { \
PUT_PIXEL(0); \
pz+=1; \
pp+=1; \
n-=1; \
} \
}
*/
#endif
//^ End of 16 bit mode stuff
#include "ztriangle.h"
} //EOF smooth fill triangle
void ZB_setTexture(ZBuffer *zb,PIXEL *texture)
{
zb->current_texture=texture;
}
//Ignore this it is never used
void ZB_fillTriangleMapping(ZBuffer *zb,
ZBufferPoint *p0,ZBufferPoint *p1,ZBufferPoint *p2)
{
PIXEL *texture;
#define INTERP_Z
#define INTERP_ST
#define DRAW_INIT() \
{ \
texture=zb->current_texture; \
}
#define PUT_PIXEL(_a) \
{ \
zz=z >> ZB_POINT_Z_FRAC_BITS; \
if (ZCMP(zz,pz[_a],_a)) { \
pp[_a]=texture[((t & 0x3FC00000) | s) >> 14]; \
pz[_a]=zz; \
} \
z+=dzdx; \
s+=dsdx; \
t+=dtdx; \
}
#include "ztriangle.h"
}
/*
* Texture mapping with perspective correction.
* We use the gradient method to make less divisions.
* TODO: pipeline the division
*/
#if 1 //IF 1
void ZB_fillTriangleMappingPerspective(ZBuffer *zb,
ZBufferPoint *p0,ZBufferPoint *p1,ZBufferPoint *p2)
{
PIXEL *texture;
GLfloat fdzdx,fndzdx,ndszdx,ndtzdx;
#define INTERP_Z
#define INTERP_STZ
#define NB_INTERP 8
#define DRAW_INIT() \
{ \
texture=zb->current_texture;\
fdzdx=(GLfloat)dzdx;\
fndzdx=NB_INTERP * fdzdx;\
ndszdx=NB_INTERP * dszdx;\
ndtzdx=NB_INTERP * dtzdx;\
}
#define PUT_PIXEL(_a) \
{ \
zz=z >> ZB_POINT_Z_FRAC_BITS; \
if (ZCMP(zz,pz[_a],_a)) { \
pp[_a]=*(PIXEL *)((GLbyte *)texture+ \
(((t & 0x3FC00000) | (s & 0x003FC000)) >> (17 - PSZSH)));\
pz[_a]=zz; \
} \
z+=dzdx; \
s+=dsdx; \
t+=dtdx; \
}
#define DRAW_LINE() \
{ \
register GLushort *pz; \
register PIXEL *pp; \
register GLuint s,t,z,zz; \
register GLint n,dsdx,dtdx; \
GLfloat sz,tz,fz,zinv; \
n=(x2>>16)-x1; \
fz=(GLfloat)z1;\
zinv=1.0 / fz;\
pp=(PIXEL *)((GLbyte *)pp1 + x1 * PSZB); \
pz=pz1+x1; \
z=z1; \
sz=sz1;\
tz=tz1;\
while (n>=(NB_INTERP-1)) { \
{\
GLfloat ss,tt;\
ss=(sz * zinv);\
tt=(tz * zinv);\
s=(GLint) ss;\
t=(GLint) tt;\
dsdx= (GLint)( (dszdx - ss*fdzdx)*zinv );\
dtdx= (GLint)( (dtzdx - tt*fdzdx)*zinv );\
fz+=fndzdx;\
zinv=1.0 / fz;\
}\
PUT_PIXEL(0);/*the_x++;*/ \
PUT_PIXEL(1);/*the_x++;*/ \
PUT_PIXEL(2);/*the_x++;*/ \
PUT_PIXEL(3);/*the_x++;*/ \
PUT_PIXEL(4);/*the_x++;*/ \
PUT_PIXEL(5);/*the_x++;*/ \
PUT_PIXEL(6);/*the_x++;*/ \
PUT_PIXEL(7);/*the_x-=7;*/ \
pz+=NB_INTERP; \
pp=(PIXEL *)((GLbyte *)pp + NB_INTERP * PSZB);/*the_x+=NB_INTERP * PSZB;*/\
n-=NB_INTERP; \
sz+=ndszdx;\
tz+=ndtzdx;\
} \
{\
GLfloat ss,tt;\
ss=(sz * zinv);\
tt=(tz * zinv);\
s=(GLint) ss;\
t=(GLint) tt;\
dsdx= (GLint)( (dszdx - ss*fdzdx)*zinv );\
dtdx= (GLint)( (dtzdx - tt*fdzdx)*zinv );\
}\
while (n>=0) { \
PUT_PIXEL(0);/*the_x += PSZB;*/ \
pz+=1; \
pp=(PIXEL *)((GLbyte *)pp + PSZB);\
n-=1; \
} \
}
#include "ztriangle.h"
}
#endif //if 1
#if 0
/* slow but exact version (only there for reference, incorrect for 24
bits) */
void ZB_fillTriangleMappingPerspective(ZBuffer *zb,
ZBufferPoint *p0,ZBufferPoint *p1,ZBufferPoint *p2)
{
PIXEL *texture;
#define INTERP_Z
#define INTERP_STZ
#define DRAW_INIT() \
{ \
texture=zb->current_texture; \
}
#define PUT_PIXEL(_a) \
{ \
GLfloat zinv; \
GLint s,t; \
zz=z >> ZB_POINT_Z_FRAC_BITS; \
if (ZCMP(zz,pz[_a],_a)) { \
zinv= 1.0 / (GLfloat) z; \
s= (GLint) (sz * zinv); \
t= (GLint) (tz * zinv); \
pp[_a]=texture[((t & 0x3FC00000) | s) >> 14]; \
pz[_a]=zz; \
} \
z+=dzdx; \
sz+=dszdx; \
tz+=dtzdx; \
}
#include "ztriangle.h"
}
#endif