added second 32bit z-buffer for 3d objects only for improve quality for distant objects. 16bit z-buffer is used only now for static z-buffer bitmaps.

This commit is contained in:
Pawel Kolodziejski 2006-05-16 07:28:47 +00:00
parent 317b32e491
commit c842eabf93
8 changed files with 84 additions and 20 deletions

View file

@ -159,6 +159,7 @@ void DriverTinyGL::positionCamera(Vector3d pos, Vector3d interest) {
void DriverTinyGL::clearScreen() { void DriverTinyGL::clearScreen() {
memset(_zb->pbuf, 0, 640 * 480 * 2); memset(_zb->pbuf, 0, 640 * 480 * 2);
memset(_zb->zbuf, 0, 640 * 480 * 2); memset(_zb->zbuf, 0, 640 * 480 * 2);
memset(_zb->zbuf2, 0, 640 * 480 * 4);
} }
void DriverTinyGL::flipBuffer() { void DriverTinyGL::flipBuffer() {

View file

@ -8,3 +8,5 @@ The changes made from the original version of TinyGL 0.4 are:
* Added 't/T' prefix to prevent OpenGl names duplication. * Added 't/T' prefix to prevent OpenGl names duplication.
* Added light shading texture mapping mode. * Added light shading texture mapping mode.
* Removed not needed code. * Removed not needed code.
* Introduced second 32-bit z-buffer for 3d objects only,
and keeped 16-bit only for static z-buffer bitmaps.

View file

@ -52,10 +52,18 @@ ZBuffer *ZB_open(int xsize, int ysize, int mode,
if (zb->zbuf == NULL) if (zb->zbuf == NULL)
goto error; goto error;
if (frame_buffer == NULL) { size = zb->xsize * zb->ysize * sizeof(unsigned long);
zb->zbuf2 = (unsigned long *)gl_malloc(size);
if (zb->zbuf2 == NULL) {
gl_free(zb->zbuf);
goto error;
}
if (frame_buffer == NULL) {
zb->pbuf = (PIXEL *)gl_malloc(zb->ysize * zb->linesize); zb->pbuf = (PIXEL *)gl_malloc(zb->ysize * zb->linesize);
if (zb->pbuf == NULL) { if (zb->pbuf == NULL) {
gl_free(zb->zbuf); gl_free(zb->zbuf);
gl_free(zb->zbuf2);
goto error; goto error;
} }
zb->frame_buffer_allocated = 1; zb->frame_buffer_allocated = 1;
@ -83,6 +91,7 @@ void ZB_close(ZBuffer * zb)
gl_free(zb->pbuf); gl_free(zb->pbuf);
gl_free(zb->zbuf); gl_free(zb->zbuf);
gl_free(zb->zbuf2);
gl_free(zb); gl_free(zb);
} }
@ -102,7 +111,12 @@ void ZB_resize(ZBuffer * zb, void *frame_buffer, int xsize, int ysize)
gl_free(zb->zbuf); gl_free(zb->zbuf);
zb->zbuf = (unsigned short *)gl_malloc(size); zb->zbuf = (unsigned short *)gl_malloc(size);
if (zb->frame_buffer_allocated) size = zb->xsize * zb->ysize * sizeof(unsigned long);
gl_free(zb->zbuf2);
zb->zbuf2 = (unsigned long *)gl_malloc(size);
if (zb->frame_buffer_allocated)
gl_free(zb->pbuf); gl_free(zb->pbuf);
if (frame_buffer == NULL) { if (frame_buffer == NULL) {
@ -330,6 +344,27 @@ void memset_s(void *adr, int val, int count)
*q++ = val; *q++ = val;
} }
void memset_l(void *adr, int val, int count)
{
int i, n, v;
unsigned int *p;
p = (unsigned int *)adr;
v = val;
n = count >> 2;
for (i = 0; i < n; i++) {
p[0] = v;
p[1] = v;
p[2] = v;
p[3] = v;
p += 4;
}
n = count & 3;
for (i = 0; i < n; i++)
*p++ = val;
}
void ZB_clear(ZBuffer * zb, int clear_z, int z, void ZB_clear(ZBuffer * zb, int clear_z, int z,
int clear_color, int r, int g, int b) int clear_color, int r, int g, int b)
{ {
@ -338,7 +373,10 @@ void ZB_clear(ZBuffer * zb, int clear_z, int z,
PIXEL *pp; PIXEL *pp;
if (clear_z) { if (clear_z) {
memset_s(zb->zbuf, z, zb->xsize * zb->ysize); memset_s(zb->zbuf, z, zb->xsize * zb->ysize);
}
if (clear_z) {
memset_l(zb->zbuf, z, zb->xsize * zb->ysize);
} }
if (clear_color) { if (clear_color) {
pp = zb->pbuf; pp = zb->pbuf;

View file

@ -43,6 +43,7 @@ typedef struct {
int mode; int mode;
unsigned short *zbuf; unsigned short *zbuf;
unsigned long *zbuf2;
PIXEL *pbuf; PIXEL *pbuf;
int frame_buffer_allocated; int frame_buffer_allocated;

View file

@ -6,15 +6,17 @@
void ZB_plot(ZBuffer * zb, ZBufferPoint * p) void ZB_plot(ZBuffer * zb, ZBufferPoint * p)
{ {
unsigned short *pz; unsigned short *pz;
unsigned long *pz_2;
PIXEL *pp; PIXEL *pp;
int zz; int zz;
pz = zb->zbuf + (p->y * zb->xsize + p->x); pz = zb->zbuf + (p->y * zb->xsize + p->x);
pz_2 = zb->zbuf2 + (p->y * zb->xsize + p->x);
pp = (PIXEL *) ((char *) zb->pbuf + zb->linesize * p->y + p->x * PSZB); pp = (PIXEL *) ((char *) zb->pbuf + zb->linesize * p->y + p->x * PSZB);
zz = p->z >> ZB_POINT_Z_FRAC_BITS; zz = p->z >> ZB_POINT_Z_FRAC_BITS;
if (ZCMP(zz, *pz)) { if ((ZCMP(zz, *pz)) && (ZCMP(p->z, *pz_2)) ) {
*pp = RGB_TO_PIXEL(p->r, p->g, p->b); *pp = RGB_TO_PIXEL(p->r, p->g, p->b);
*pz = zz; *pz_2 = p->z;
} }
} }

View file

@ -10,6 +10,7 @@
#endif #endif
#ifdef INTERP_Z #ifdef INTERP_Z
register unsigned short *pz; register unsigned short *pz;
register unsigned long *pz_2;
int zinc; int zinc;
register int z, zz; register int z, zz;
#endif #endif
@ -24,6 +25,7 @@
pp = (PIXEL *) ((char *) zb->pbuf + zb->linesize * p1->y + p1->x * PSZB); pp = (PIXEL *) ((char *) zb->pbuf + zb->linesize * p1->y + p1->x * PSZB);
#ifdef INTERP_Z #ifdef INTERP_Z
pz = zb->zbuf + (p1->y * sx + p1->x); pz = zb->zbuf + (p1->y * sx + p1->x);
pz_2 = zb->zbuf2 + (p1->y * sx + p1->x);
z = p1->z; z = p1->z;
#endif #endif
@ -48,9 +50,9 @@
#define PUTPIXEL() \ #define PUTPIXEL() \
{ \ { \
zz=z >> ZB_POINT_Z_FRAC_BITS; \ zz=z >> ZB_POINT_Z_FRAC_BITS; \
if (ZCMP(zz,*pz)) { \ if ((ZCMP(zz,*pz)) && (ZCMP(z,*pz_2))) { \
RGBPIXEL; \ RGBPIXEL; \
*pz=zz; \ *pz_2=z; \
} \ } \
} }
#else /* INTERP_Z */ #else /* INTERP_Z */
@ -73,8 +75,8 @@
PUTPIXEL();\ PUTPIXEL();\
ZZ(z+=zinc);\ ZZ(z+=zinc);\
RGB(r+=rinc;g+=ginc;b+=binc);\ RGB(r+=rinc;g+=ginc;b+=binc);\
if (a>0) { pp=(PIXEL *)((char *)pp + pp_inc_1); ZZ(pz+=(inc_1)); a-=dx; }\ if (a>0) { pp=(PIXEL *)((char *)pp + pp_inc_1); ZZ(pz+=(inc_1)); ZZ(pz_2+=(inc_1)); a-=dx; }\
else { pp=(PIXEL *)((char *)pp + pp_inc_2); ZZ(pz+=(inc_2)); a+=dy; }\ else { pp=(PIXEL *)((char *)pp + pp_inc_2); ZZ(pz+=(inc_2)); ZZ(pz_2+=(inc_2)); a+=dy; }\
} while (--n >= 0); } while (--n >= 0);
/* fin macro */ /* fin macro */

View file

@ -18,9 +18,9 @@ void ZB_fillTriangleFlat(ZBuffer *zb,
#define PUT_PIXEL(_a) \ #define PUT_PIXEL(_a) \
{ \ { \
zz=z >> ZB_POINT_Z_FRAC_BITS; \ zz=z >> ZB_POINT_Z_FRAC_BITS; \
if (ZCMP(zz,pz[_a])) { \ if ((ZCMP(zz,pz[_a])) && (ZCMP(z,pz_2[_a]))) { \
pp[_a]=color; \ pp[_a]=color; \
pz[_a]=zz; \ pz_2[_a]=z; \
} \ } \
z+=dzdx; \ z+=dzdx; \
} }
@ -54,10 +54,10 @@ void ZB_fillTriangleSmooth(ZBuffer *zb,
#define PUT_PIXEL(_a) \ #define PUT_PIXEL(_a) \
{ \ { \
zz=z >> ZB_POINT_Z_FRAC_BITS; \ zz=z >> ZB_POINT_Z_FRAC_BITS; \
if (ZCMP(zz,pz[_a])) { \ if ((ZCMP(zz,pz[_a])) && (ZCMP(z,pz_2[_a]))) { \
tmp=rgb & 0xF81F07E0; \ tmp=rgb & 0xF81F07E0; \
pp[_a]=tmp | (tmp >> 16); \ pp[_a]=tmp | (tmp >> 16); \
pz[_a]=zz; \ pz_2[_a]=z; \
} \ } \
z+=dzdx; \ z+=dzdx; \
rgb=(rgb+drgbdx) & ( ~ 0x00200800); \ rgb=(rgb+drgbdx) & ( ~ 0x00200800); \
@ -66,12 +66,14 @@ void ZB_fillTriangleSmooth(ZBuffer *zb,
#define DRAW_LINE() \ #define DRAW_LINE() \
{ \ { \
register unsigned short *pz; \ register unsigned short *pz; \
register unsigned long *pz_2; \
register PIXEL *pp; \ register PIXEL *pp; \
register unsigned int tmp,z,zz,rgb,drgbdx; \ register unsigned int tmp,z,zz,rgb,drgbdx; \
register int n; \ register int n; \
n=(x2 >> 16) - x1; \ n=(x2 >> 16) - x1; \
pp=pp1+x1; \ pp=pp1+x1; \
pz=pz1+x1; \ pz=pz1+x1; \
pz_2=pz2+x1; \
z=z1; \ z=z1; \
rgb=(r1 << 16) & 0xFFC00000; \ rgb=(r1 << 16) & 0xFFC00000; \
rgb|=(g1 >> 5) & 0x000007FF; \ rgb|=(g1 >> 5) & 0x000007FF; \
@ -83,12 +85,14 @@ void ZB_fillTriangleSmooth(ZBuffer *zb,
PUT_PIXEL(2); \ PUT_PIXEL(2); \
PUT_PIXEL(3); \ PUT_PIXEL(3); \
pz+=4; \ pz+=4; \
pz_2+=4; \
pp+=4; \ pp+=4; \
n-=4; \ n-=4; \
} \ } \
while (n>=0) { \ while (n>=0) { \
PUT_PIXEL(0); \ PUT_PIXEL(0); \
pz+=1; \ pz+=1; \
pz_2+=1; \
pp+=1; \ pp+=1; \
n-=1; \ n-=1; \
} \ } \
@ -118,9 +122,9 @@ void ZB_fillTriangleMapping(ZBuffer *zb,
#define PUT_PIXEL(_a) \ #define PUT_PIXEL(_a) \
{ \ { \
zz=z >> ZB_POINT_Z_FRAC_BITS; \ zz=z >> ZB_POINT_Z_FRAC_BITS; \
if (ZCMP(zz,pz[_a])) { \ if ((ZCMP(zz,pz[_a])) && (ZCMP(z,pz_2[_a]))) { \
pp[_a]=texture[((t & 0x3FC00000) | s) >> 14]; \ pp[_a]=texture[((t & 0x3FC00000) | s) >> 14]; \
pz[_a]=zz; \ pz_2[_a]=z; \
} \ } \
z+=dzdx; \ z+=dzdx; \
s+=dsdx; \ s+=dsdx; \
@ -143,6 +147,7 @@ void ZB_fillTriangleMappingPerspective(ZBuffer *zb,
ZBufferPoint *t,*pr1,*pr2,*l1,*l2; ZBufferPoint *t,*pr1,*pr2,*l1,*l2;
float fdx1, fdx2, fdy1, fdy2, fz, d1, d2; float fdx1, fdx2, fdy1, fdy2, fz, d1, d2;
unsigned short *pz1; unsigned short *pz1;
unsigned long *pz2;
PIXEL *pp1; PIXEL *pp1;
int part,update_left,update_right; int part,update_left,update_right;
@ -245,6 +250,7 @@ void ZB_fillTriangleMappingPerspective(ZBuffer *zb,
pp1 = (PIXEL *) ((char *) zb->pbuf + zb->linesize * p0->y); pp1 = (PIXEL *) ((char *) zb->pbuf + zb->linesize * p0->y);
pz1 = zb->zbuf + p0->y * zb->xsize; pz1 = zb->zbuf + p0->y * zb->xsize;
pz2 = zb->zbuf2 + p0->y * zb->xsize;
{ {
texture=zb->current_texture; texture=zb->current_texture;
@ -350,6 +356,7 @@ void ZB_fillTriangleMappingPerspective(ZBuffer *zb,
{ {
register unsigned short *pz; register unsigned short *pz;
register unsigned long *pz_2;
register PIXEL *pp; register PIXEL *pp;
register unsigned int s,t,z,zz,rgb,drgbdx; register unsigned int s,t,z,zz,rgb,drgbdx;
register int n,dsdx,dtdx; register int n,dsdx,dtdx;
@ -359,6 +366,7 @@ void ZB_fillTriangleMappingPerspective(ZBuffer *zb,
zinv=(float)(1.0 / fz); zinv=(float)(1.0 / fz);
pp=(PIXEL *)((char *)pp1 + x1 * PSZB); pp=(PIXEL *)((char *)pp1 + x1 * PSZB);
pz=pz1+x1; pz=pz1+x1;
pz_2=pz2+x1;
z=z1; z=z1;
sz=sz1; sz=sz1;
tz=tz1; tz=tz1;
@ -381,7 +389,7 @@ void ZB_fillTriangleMappingPerspective(ZBuffer *zb,
for (int _a = 0; _a < 8; _a++) for (int _a = 0; _a < 8; _a++)
{ {
zz=z >> ZB_POINT_Z_FRAC_BITS; zz=z >> ZB_POINT_Z_FRAC_BITS;
if (ZCMP(zz,pz[_a])) { if ((ZCMP(zz,pz[_a])) && (ZCMP(z,pz_2[_a]))) {
tmp=rgb & 0xF81F07E0; tmp=rgb & 0xF81F07E0;
unsigned int light = tmp | (tmp >> 16); unsigned int light = tmp | (tmp >> 16);
PIXEL pixel = *(PIXEL *)((char *)texture+ PIXEL pixel = *(PIXEL *)((char *)texture+
@ -397,7 +405,7 @@ void ZB_fillTriangleMappingPerspective(ZBuffer *zb,
c_b = (c_b * l_b) / 256; c_b = (c_b * l_b) / 256;
pixel = ((c_r & 0xF8) << 8) | ((c_g & 0xFC) << 3) | (c_b >> 3); pixel = ((c_r & 0xF8) << 8) | ((c_g & 0xFC) << 3) | (c_b >> 3);
pp[_a]=pixel; pp[_a]=pixel;
pz[_a]=zz; pz_2[_a]=z;
} }
z+=dzdx; z+=dzdx;
s+=dsdx; s+=dsdx;
@ -406,6 +414,7 @@ void ZB_fillTriangleMappingPerspective(ZBuffer *zb,
} }
pz+=NB_INTERP; pz+=NB_INTERP;
pz_2+=NB_INTERP;
pp=(PIXEL *)((char *)pp + NB_INTERP * PSZB); pp=(PIXEL *)((char *)pp + NB_INTERP * PSZB);
n-=NB_INTERP; n-=NB_INTERP;
sz+=ndszdx; sz+=ndszdx;
@ -423,7 +432,7 @@ void ZB_fillTriangleMappingPerspective(ZBuffer *zb,
while (n>=0) { while (n>=0) {
{ {
zz=z >> ZB_POINT_Z_FRAC_BITS; zz=z >> ZB_POINT_Z_FRAC_BITS;
if (ZCMP(zz,pz[0])) { if ((ZCMP(zz,pz[0])) && (ZCMP(z,pz_2[0]))) {
tmp=rgb & 0xF81F07E0; tmp=rgb & 0xF81F07E0;
unsigned int light = tmp | (tmp >> 16); unsigned int light = tmp | (tmp >> 16);
PIXEL pixel = *(PIXEL *)((char *)texture+ PIXEL pixel = *(PIXEL *)((char *)texture+
@ -439,7 +448,7 @@ void ZB_fillTriangleMappingPerspective(ZBuffer *zb,
c_b = (c_b * l_b) / 256; c_b = (c_b * l_b) / 256;
pixel = ((c_r & 0xF8) << 8) | ((c_g & 0xFC) << 3) | (c_b >> 3); pixel = ((c_r & 0xF8) << 8) | ((c_g & 0xFC) << 3) | (c_b >> 3);
pp[0]=pixel; pp[0]=pixel;
pz[0]=zz; pz_2[0]=z;
} }
z+=dzdx; z+=dzdx;
s+=dsdx; s+=dsdx;
@ -447,6 +456,7 @@ void ZB_fillTriangleMappingPerspective(ZBuffer *zb,
rgb=(rgb+drgbdx) & ( ~ 0x00200800); rgb=(rgb+drgbdx) & ( ~ 0x00200800);
} }
pz+=1; pz+=1;
pz_2+=1;
pp=(PIXEL *)((char *)pp + PSZB); pp=(PIXEL *)((char *)pp + PSZB);
n-=1; n-=1;
} }
@ -485,6 +495,7 @@ void ZB_fillTriangleMappingPerspective(ZBuffer *zb,
/* screen coordinates */ /* screen coordinates */
pp1=(PIXEL *)((char *)pp1 + zb->linesize); pp1=(PIXEL *)((char *)pp1 + zb->linesize);
pz1+=zb->xsize; pz1+=zb->xsize;
pz2+=zb->xsize;
} }
} }
} }

View file

@ -6,6 +6,7 @@
ZBufferPoint *t,*pr1,*pr2,*l1,*l2; ZBufferPoint *t,*pr1,*pr2,*l1,*l2;
float fdx1, fdx2, fdy1, fdy2, fz, d1, d2; float fdx1, fdx2, fdy1, fdy2, fz, d1, d2;
unsigned short *pz1; unsigned short *pz1;
unsigned long *pz2;
PIXEL *pp1; PIXEL *pp1;
int part,update_left,update_right; int part,update_left,update_right;
@ -134,6 +135,7 @@
pp1 = (PIXEL *) ((char *) zb->pbuf + zb->linesize * p0->y); pp1 = (PIXEL *) ((char *) zb->pbuf + zb->linesize * p0->y);
pz1 = zb->zbuf + p0->y * zb->xsize; pz1 = zb->zbuf + p0->y * zb->xsize;
pz2 = zb->zbuf2 + p0->y * zb->xsize;
DRAW_INIT(); DRAW_INIT();
@ -247,6 +249,7 @@
register int n; register int n;
#ifdef INTERP_Z #ifdef INTERP_Z
register unsigned short *pz; register unsigned short *pz;
register unsigned long *pz_2;
register unsigned int z,zz; register unsigned int z,zz;
#endif #endif
#ifdef INTERP_RGB #ifdef INTERP_RGB
@ -263,6 +266,7 @@
pp=(PIXEL *)((char *)pp1 + x1 * PSZB); pp=(PIXEL *)((char *)pp1 + x1 * PSZB);
#ifdef INTERP_Z #ifdef INTERP_Z
pz=pz1+x1; pz=pz1+x1;
pz_2=pz2+x1;
z=z1; z=z1;
#endif #endif
#ifdef INTERP_RGB #ifdef INTERP_RGB
@ -285,6 +289,7 @@
PUT_PIXEL(3); PUT_PIXEL(3);
#ifdef INTERP_Z #ifdef INTERP_Z
pz+=4; pz+=4;
pz_2+=4;
#endif #endif
pp=(PIXEL *)((char *)pp + 4 * PSZB); pp=(PIXEL *)((char *)pp + 4 * PSZB);
n-=4; n-=4;
@ -293,6 +298,7 @@
PUT_PIXEL(0); PUT_PIXEL(0);
#ifdef INTERP_Z #ifdef INTERP_Z
pz+=1; pz+=1;
pz_2+=1;
#endif #endif
pp=(PIXEL *)((char *)pp + PSZB); pp=(PIXEL *)((char *)pp + PSZB);
n-=1; n-=1;
@ -349,6 +355,7 @@
/* screen coordinates */ /* screen coordinates */
pp1=(PIXEL *)((char *)pp1 + zb->linesize); pp1=(PIXEL *)((char *)pp1 + zb->linesize);
pz1+=zb->xsize; pz1+=zb->xsize;
pz2+=zb->xsize;
} }
} }
} }