[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