# HG changeset patch # User nkeynes # Date 1169775459 0 # Node ID a6048d3a9a79bd5938f9a950fb8b02bec6530ded # Parent ae85a338b95456d7fa0258b5422c7be88968de5e Z should be rendered as 1/Z - fixes a host of depth issues --- a/src/pvr2/rendbkg.c Fri Jan 26 01:17:49 2007 +0000 +++ b/src/pvr2/rendbkg.c Fri Jan 26 01:37:39 2007 +0000 @@ -1,5 +1,5 @@ /** - * $Id: rendbkg.c,v 1.4 2006-12-15 10:17:30 nkeynes Exp $ + * $Id: rendbkg.c,v 1.5 2007-01-26 01:37:39 nkeynes Exp $ * * PVR2 background renderer. * @@ -163,7 +163,7 @@ float *vertexf = (float *)vertexes; result[i].x = vertexf[0]; result[i].y = vertexf[1]; - result[i].z = vertexf[2]; + result[i].z = 1/vertexf[2]; uint32_t argb; if( POLY1_TEXTURED(*polygon) ) { if( POLY1_UV16(*polygon) ) { --- a/src/pvr2/rendcore.c Fri Jan 26 01:17:49 2007 +0000 +++ b/src/pvr2/rendcore.c Fri Jan 26 01:37:39 2007 +0000 @@ -1,5 +1,5 @@ /** - * $Id: rendcore.c,v 1.13 2007-01-25 08:18:03 nkeynes Exp $ + * $Id: rendcore.c,v 1.14 2007-01-26 01:37:39 nkeynes Exp $ * * PVR2 renderer core. * @@ -250,9 +250,9 @@ (unpacked[3].y - unpacked[1].y) * diff1.x) / detxy; float s = ((unpacked[3].y - unpacked[1].y) * diff0.x - (unpacked[3].x - unpacked[1].x) * diff0.y) / detxy; - diff0.z = unpacked[0].z - unpacked[1].z; - diff1.z = unpacked[2].z - unpacked[1].z; - unpacked[3].z = unpacked[1].z + (t*diff0.z) + (s*diff1.z); + diff0.z = (1/unpacked[0].z) - (1/unpacked[1].z); + diff1.z = (1/unpacked[2].z) - (1/unpacked[1].z); + unpacked[3].z = 1/((1/unpacked[1].z) + (t*diff0.z) + (s*diff1.z)); diff0.u = unpacked[0].u - unpacked[1].u; diff0.v = unpacked[0].v - unpacked[1].v; @@ -298,7 +298,7 @@ vertexes[i]->offset_rgba[1], vertexes[i]->offset_rgba[2] ); } - glVertex3f( vertexes[i]->x, vertexes[i]->y, vertexes[i]->z ); + glVertex3f( vertexes[i]->x, vertexes[i]->y, 1/vertexes[i]->z ); } glEnd(); @@ -353,7 +353,7 @@ glSecondaryColor3ubEXT( (GLubyte)(spec >> 16), (GLubyte)(spec >> 8), (GLubyte)spec ); } - glVertex3f( vertexf[0], vertexf[1], vertexf[2] ); + glVertex3f( vertexf[0], vertexf[1], 1/vertexf[2] ); vertexes += vertex_size; } @@ -613,5 +613,5 @@ } while( ((segment++)->control & SEGMENT_END) == 0 ); - return maximumz; + return 1/maximumz; } --- a/src/pvr2/render.c Fri Jan 26 01:17:49 2007 +0000 +++ b/src/pvr2/render.c Fri Jan 26 01:37:39 2007 +0000 @@ -1,5 +1,5 @@ /** - * $Id: render.c,v 1.19 2007-01-25 08:18:03 nkeynes Exp $ + * $Id: render.c,v 1.20 2007-01-26 01:37:39 nkeynes Exp $ * * PVR2 Renderer support. This part is primarily * @@ -186,7 +186,7 @@ glViewport( 0, 0, width, height ); glMatrixMode(GL_PROJECTION); glLoadIdentity(); - glOrtho( 0, width, height, 0, bgplanez, -(nearz+1) ); + glOrtho( 0, width, height, 0, -bgplanez, -nearz ); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glCullFace( GL_BACK ); @@ -225,7 +225,7 @@ render_to_tex = FALSE; } - float bgplanez = MMIO_READF( PVR2, RENDER_FARCLIP ); + float bgplanez = 1/MMIO_READF( PVR2, RENDER_FARCLIP ); uint32_t render_mode = MMIO_READ( PVR2, RENDER_MODE ); int width = 640; /* FIXME - get this from the tile buffer */ int height = 480; --- a/src/pvr2/rendsort.c Fri Jan 26 01:17:49 2007 +0000 +++ b/src/pvr2/rendsort.c Fri Jan 26 01:37:39 2007 +0000 @@ -1,5 +1,5 @@ /** - * $Id: rendsort.c,v 1.4 2007-01-24 08:11:14 nkeynes Exp $ + * $Id: rendsort.c,v 1.5 2007-01-26 01:37:39 nkeynes Exp $ * * PVR2 renderer routines for depth sorted polygons * @@ -72,8 +72,11 @@ triangle[i].maxx = MAX3(triangle[i].vertexes[0][0],triangle[i].vertexes[1][0],triangle[i].vertexes[2][0]); triangle[i].miny = MIN3(triangle[i].vertexes[0][1],triangle[i].vertexes[1][1],triangle[i].vertexes[2][1]); triangle[i].maxy = MAX3(triangle[i].vertexes[0][1],triangle[i].vertexes[1][1],triangle[i].vertexes[2][1]); - triangle[i].minz = MIN3(triangle[i].vertexes[0][2],triangle[i].vertexes[1][2],triangle[i].vertexes[2][2]); - triangle[i].maxz = MAX3(triangle[i].vertexes[0][2],triangle[i].vertexes[1][2],triangle[i].vertexes[2][2]); + float az = 1/triangle[i].vertexes[0][2]; + float bz = 1/triangle[i].vertexes[1][2]; + float cz = 1/triangle[i].vertexes[2][2]; + triangle[i].minz = MIN3(az,bz,cz); + triangle[i].maxz = MAX3(az,bz,cz); } } @@ -178,6 +181,8 @@ int i,j, k, m = 0; for( i=0; iminz < tri2->minz ) { + if( tri1->minz < tri2->minz ) { + return 1; // No these _aren't_ back to front... + } else if( tri1->minz > tri2->minz ) { return -1; - } else if( tri1->minz > tri2->minz ) { - return 1; } else { return 0; }