[Scummvm-cvs-logs] SF.net SVN: scummvm: [22483] residual/trunk
aquadran at users.sourceforge.net
aquadran at users.sourceforge.net
Tue May 16 00:43:33 CEST 2006
Revision: 22483
Author: aquadran
Date: 2006-05-16 00:28:47 -0700 (Tue, 16 May 2006)
ViewCVS: http://svn.sourceforge.net/scummvm/?rev=22483&view=rev
Log Message:
-----------
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.
Modified Paths:
--------------
residual/trunk/driver_tinygl.cpp
residual/trunk/tinygl/README.residual
residual/trunk/tinygl/zbuffer.cpp
residual/trunk/tinygl/zbuffer.h
residual/trunk/tinygl/zline.cpp
residual/trunk/tinygl/zline.h
residual/trunk/tinygl/ztriangle.cpp
residual/trunk/tinygl/ztriangle.h
Modified: residual/trunk/driver_tinygl.cpp
===================================================================
--- residual/trunk/driver_tinygl.cpp 2006-05-15 17:31:48 UTC (rev 22482)
+++ residual/trunk/driver_tinygl.cpp 2006-05-16 07:28:47 UTC (rev 22483)
@@ -159,6 +159,7 @@
void DriverTinyGL::clearScreen() {
memset(_zb->pbuf, 0, 640 * 480 * 2);
memset(_zb->zbuf, 0, 640 * 480 * 2);
+ memset(_zb->zbuf2, 0, 640 * 480 * 4);
}
void DriverTinyGL::flipBuffer() {
Modified: residual/trunk/tinygl/README.residual
===================================================================
--- residual/trunk/tinygl/README.residual 2006-05-15 17:31:48 UTC (rev 22482)
+++ residual/trunk/tinygl/README.residual 2006-05-16 07:28:47 UTC (rev 22483)
@@ -8,3 +8,5 @@
* Added 't/T' prefix to prevent OpenGl names duplication.
* Added light shading texture mapping mode.
* Removed not needed code.
+* Introduced second 32-bit z-buffer for 3d objects only,
+ and keeped 16-bit only for static z-buffer bitmaps.
Modified: residual/trunk/tinygl/zbuffer.cpp
===================================================================
--- residual/trunk/tinygl/zbuffer.cpp 2006-05-15 17:31:48 UTC (rev 22482)
+++ residual/trunk/tinygl/zbuffer.cpp 2006-05-16 07:28:47 UTC (rev 22483)
@@ -52,10 +52,18 @@
if (zb->zbuf == NULL)
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);
if (zb->pbuf == NULL) {
gl_free(zb->zbuf);
+ gl_free(zb->zbuf2);
goto error;
}
zb->frame_buffer_allocated = 1;
@@ -83,6 +91,7 @@
gl_free(zb->pbuf);
gl_free(zb->zbuf);
+ gl_free(zb->zbuf2);
gl_free(zb);
}
@@ -102,7 +111,12 @@
gl_free(zb->zbuf);
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);
if (frame_buffer == NULL) {
@@ -330,6 +344,27 @@
*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,
int clear_color, int r, int g, int b)
{
@@ -338,8 +373,11 @@
PIXEL *pp;
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) {
pp = zb->pbuf;
for (y = 0; y < zb->ysize; y++) {
Modified: residual/trunk/tinygl/zbuffer.h
===================================================================
--- residual/trunk/tinygl/zbuffer.h 2006-05-15 17:31:48 UTC (rev 22482)
+++ residual/trunk/tinygl/zbuffer.h 2006-05-16 07:28:47 UTC (rev 22483)
@@ -43,6 +43,7 @@
int mode;
unsigned short *zbuf;
+ unsigned long *zbuf2;
PIXEL *pbuf;
int frame_buffer_allocated;
Modified: residual/trunk/tinygl/zline.cpp
===================================================================
--- residual/trunk/tinygl/zline.cpp 2006-05-15 17:31:48 UTC (rev 22482)
+++ residual/trunk/tinygl/zline.cpp 2006-05-16 07:28:47 UTC (rev 22483)
@@ -6,15 +6,17 @@
void ZB_plot(ZBuffer * zb, ZBufferPoint * p)
{
unsigned short *pz;
+ unsigned long *pz_2;
PIXEL *pp;
int zz;
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);
zz = p->z >> ZB_POINT_Z_FRAC_BITS;
- if (ZCMP(zz, *pz)) {
- *pp = RGB_TO_PIXEL(p->r, p->g, p->b);
- *pz = zz;
+ if ((ZCMP(zz, *pz)) && (ZCMP(p->z, *pz_2)) ) {
+ *pp = RGB_TO_PIXEL(p->r, p->g, p->b);
+ *pz_2 = p->z;
}
}
Modified: residual/trunk/tinygl/zline.h
===================================================================
--- residual/trunk/tinygl/zline.h 2006-05-15 17:31:48 UTC (rev 22482)
+++ residual/trunk/tinygl/zline.h 2006-05-16 07:28:47 UTC (rev 22483)
@@ -10,6 +10,7 @@
#endif
#ifdef INTERP_Z
register unsigned short *pz;
+ register unsigned long *pz_2;
int zinc;
register int z, zz;
#endif
@@ -24,6 +25,7 @@
pp = (PIXEL *) ((char *) zb->pbuf + zb->linesize * p1->y + p1->x * PSZB);
#ifdef INTERP_Z
pz = zb->zbuf + (p1->y * sx + p1->x);
+ pz_2 = zb->zbuf2 + (p1->y * sx + p1->x);
z = p1->z;
#endif
@@ -48,9 +50,9 @@
#define PUTPIXEL() \
{ \
zz=z >> ZB_POINT_Z_FRAC_BITS; \
- if (ZCMP(zz,*pz)) { \
+ if ((ZCMP(zz,*pz)) && (ZCMP(z,*pz_2))) { \
RGBPIXEL; \
- *pz=zz; \
+ *pz_2=z; \
} \
}
#else /* INTERP_Z */
@@ -73,8 +75,8 @@
PUTPIXEL();\
ZZ(z+=zinc);\
RGB(r+=rinc;g+=ginc;b+=binc);\
- if (a>0) { pp=(PIXEL *)((char *)pp + pp_inc_1); ZZ(pz+=(inc_1)); a-=dx; }\
- else { pp=(PIXEL *)((char *)pp + pp_inc_2); ZZ(pz+=(inc_2)); a+=dy; }\
+ 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)); ZZ(pz_2+=(inc_2)); a+=dy; }\
} while (--n >= 0);
/* fin macro */
Modified: residual/trunk/tinygl/ztriangle.cpp
===================================================================
--- residual/trunk/tinygl/ztriangle.cpp 2006-05-15 17:31:48 UTC (rev 22482)
+++ residual/trunk/tinygl/ztriangle.cpp 2006-05-16 07:28:47 UTC (rev 22483)
@@ -18,9 +18,9 @@
#define PUT_PIXEL(_a) \
{ \
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; \
- pz[_a]=zz; \
+ pz_2[_a]=z; \
} \
z+=dzdx; \
}
@@ -54,10 +54,10 @@
#define PUT_PIXEL(_a) \
{ \
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; \
pp[_a]=tmp | (tmp >> 16); \
- pz[_a]=zz; \
+ pz_2[_a]=z; \
} \
z+=dzdx; \
rgb=(rgb+drgbdx) & ( ~ 0x00200800); \
@@ -66,12 +66,14 @@
#define DRAW_LINE() \
{ \
register unsigned short *pz; \
+ register unsigned long *pz_2; \
register PIXEL *pp; \
register unsigned int tmp,z,zz,rgb,drgbdx; \
register int n; \
n=(x2 >> 16) - x1; \
pp=pp1+x1; \
pz=pz1+x1; \
+ pz_2=pz2+x1; \
z=z1; \
rgb=(r1 << 16) & 0xFFC00000; \
rgb|=(g1 >> 5) & 0x000007FF; \
@@ -83,12 +85,14 @@
PUT_PIXEL(2); \
PUT_PIXEL(3); \
pz+=4; \
+ pz_2+=4; \
pp+=4; \
n-=4; \
} \
while (n>=0) { \
PUT_PIXEL(0); \
pz+=1; \
+ pz_2+=1; \
pp+=1; \
n-=1; \
} \
@@ -118,9 +122,9 @@
#define PUT_PIXEL(_a) \
{ \
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]; \
- pz[_a]=zz; \
+ pz_2[_a]=z; \
} \
z+=dzdx; \
s+=dsdx; \
@@ -143,6 +147,7 @@
ZBufferPoint *t,*pr1,*pr2,*l1,*l2;
float fdx1, fdx2, fdy1, fdy2, fz, d1, d2;
unsigned short *pz1;
+ unsigned long *pz2;
PIXEL *pp1;
int part,update_left,update_right;
@@ -245,6 +250,7 @@
pp1 = (PIXEL *) ((char *) zb->pbuf + zb->linesize * p0->y);
pz1 = zb->zbuf + p0->y * zb->xsize;
+ pz2 = zb->zbuf2 + p0->y * zb->xsize;
{
texture=zb->current_texture;
@@ -350,6 +356,7 @@
{
register unsigned short *pz;
+ register unsigned long *pz_2;
register PIXEL *pp;
register unsigned int s,t,z,zz,rgb,drgbdx;
register int n,dsdx,dtdx;
@@ -359,6 +366,7 @@
zinv=(float)(1.0 / fz);
pp=(PIXEL *)((char *)pp1 + x1 * PSZB);
pz=pz1+x1;
+ pz_2=pz2+x1;
z=z1;
sz=sz1;
tz=tz1;
@@ -381,7 +389,7 @@
for (int _a = 0; _a < 8; _a++)
{
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;
unsigned int light = tmp | (tmp >> 16);
PIXEL pixel = *(PIXEL *)((char *)texture+
@@ -397,7 +405,7 @@
c_b = (c_b * l_b) / 256;
pixel = ((c_r & 0xF8) << 8) | ((c_g & 0xFC) << 3) | (c_b >> 3);
pp[_a]=pixel;
- pz[_a]=zz;
+ pz_2[_a]=z;
}
z+=dzdx;
s+=dsdx;
@@ -406,6 +414,7 @@
}
pz+=NB_INTERP;
+ pz_2+=NB_INTERP;
pp=(PIXEL *)((char *)pp + NB_INTERP * PSZB);
n-=NB_INTERP;
sz+=ndszdx;
@@ -423,7 +432,7 @@
while (n>=0) {
{
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;
unsigned int light = tmp | (tmp >> 16);
PIXEL pixel = *(PIXEL *)((char *)texture+
@@ -439,7 +448,7 @@
c_b = (c_b * l_b) / 256;
pixel = ((c_r & 0xF8) << 8) | ((c_g & 0xFC) << 3) | (c_b >> 3);
pp[0]=pixel;
- pz[0]=zz;
+ pz_2[0]=z;
}
z+=dzdx;
s+=dsdx;
@@ -447,6 +456,7 @@
rgb=(rgb+drgbdx) & ( ~ 0x00200800);
}
pz+=1;
+ pz_2+=1;
pp=(PIXEL *)((char *)pp + PSZB);
n-=1;
}
@@ -485,6 +495,7 @@
/* screen coordinates */
pp1=(PIXEL *)((char *)pp1 + zb->linesize);
pz1+=zb->xsize;
+ pz2+=zb->xsize;
}
}
}
Modified: residual/trunk/tinygl/ztriangle.h
===================================================================
--- residual/trunk/tinygl/ztriangle.h 2006-05-15 17:31:48 UTC (rev 22482)
+++ residual/trunk/tinygl/ztriangle.h 2006-05-16 07:28:47 UTC (rev 22483)
@@ -6,6 +6,7 @@
ZBufferPoint *t,*pr1,*pr2,*l1,*l2;
float fdx1, fdx2, fdy1, fdy2, fz, d1, d2;
unsigned short *pz1;
+ unsigned long *pz2;
PIXEL *pp1;
int part,update_left,update_right;
@@ -134,6 +135,7 @@
pp1 = (PIXEL *) ((char *) zb->pbuf + zb->linesize * p0->y);
pz1 = zb->zbuf + p0->y * zb->xsize;
+ pz2 = zb->zbuf2 + p0->y * zb->xsize;
DRAW_INIT();
@@ -247,6 +249,7 @@
register int n;
#ifdef INTERP_Z
register unsigned short *pz;
+ register unsigned long *pz_2;
register unsigned int z,zz;
#endif
#ifdef INTERP_RGB
@@ -263,6 +266,7 @@
pp=(PIXEL *)((char *)pp1 + x1 * PSZB);
#ifdef INTERP_Z
pz=pz1+x1;
+ pz_2=pz2+x1;
z=z1;
#endif
#ifdef INTERP_RGB
@@ -285,6 +289,7 @@
PUT_PIXEL(3);
#ifdef INTERP_Z
pz+=4;
+ pz_2+=4;
#endif
pp=(PIXEL *)((char *)pp + 4 * PSZB);
n-=4;
@@ -293,6 +298,7 @@
PUT_PIXEL(0);
#ifdef INTERP_Z
pz+=1;
+ pz_2+=1;
#endif
pp=(PIXEL *)((char *)pp + PSZB);
n-=1;
@@ -349,6 +355,7 @@
/* screen coordinates */
pp1=(PIXEL *)((char *)pp1 + zb->linesize);
pz1+=zb->xsize;
+ pz2+=zb->xsize;
}
}
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Scummvm-git-logs
mailing list