rasterize: fixes to depth buffering. now w- and z- buffer both work. also update version to 1.9.2

This commit is contained in:
zeromus 2009-02-08 23:38:21 +00:00
parent be2a4ba077
commit 852ede072a
3 changed files with 18 additions and 156 deletions

View File

@ -1230,7 +1230,6 @@ void gfx3d_glFlush(u32 v)
flushPending = TRUE; flushPending = TRUE;
gfx3d.sortmode = BIT0(v); gfx3d.sortmode = BIT0(v);
gfx3d.wbuffer = BIT1(v); gfx3d.wbuffer = BIT1(v);
gfx3d.wbuffer = FALSE;
// reset // reset
clInd = 0; clInd = 0;

View File

@ -501,11 +501,13 @@ static void triangle_from_devmaster()
//depth test //depth test
int depth; int depth;
if(gfx3d.wbuffer) if(gfx3d.wbuffer)
depth = i_w.cur(); //not sure about this
//this value was chosen to make the skybox, castle window decals, and water level render correctly in SM64
depth = 4096/i_invw.Z;
else else
{ {
float z = i_z.Z; float z = i_z.Z;
depth = z*0xFFFFFF; //not sure about this depth = z*0x7FFF; //not sure about this
} }
if(polyAttr.decalMode) if(polyAttr.decalMode)
{ {
@ -733,10 +735,11 @@ static void clipSegmentVsPlane(VERT** verts, const int coord, int which)
else else
out1 = verts[1]->coord[coord] > verts[1]->coord[3]; out1 = verts[1]->coord[coord] > verts[1]->coord[3];
if(coord==2 && which==-1) { //CONSIDER: should we try and clip things behind the eye? does this code even successfully do it? not sure.
out0 = verts[0]->coord[2] < 0; //if(coord==2 && which==1) {
out1 = verts[1]->coord[2] < 0; // out0 = verts[0]->coord[2] < 0;
} // out1 = verts[1]->coord[2] < 0;
//}
//both outside: insert no points //both outside: insert no points
if(out0 && out1) { if(out0 && out1) {
@ -768,10 +771,6 @@ static void clipSegmentVsPlane(VERT** verts, const int coord, int which)
static void clipPolyVsPlane(const int coord, int which) static void clipPolyVsPlane(const int coord, int which)
{ {
if(tempClippedPoly.type<2)
{
int zzz=9;
}
outClippedPoly.type = 0; outClippedPoly.type = 0;
CLIPLOG2("Clipping coord %d against %f\n",coord,x); CLIPLOG2("Clipping coord %d against %f\n",coord,x);
for(int i=0;i<tempClippedPoly.type;i++) for(int i=0;i<tempClippedPoly.type;i++)
@ -808,7 +807,8 @@ static void clipPoly(POLY* poly)
if(tempClippedPoly.type < 3) if(tempClippedPoly.type < 3)
{ {
//a degenerate poly. we're not handling these right now //a totally clipped poly. discard it.
//or, a degenerate poly. we're not handling these right now
} }
else if(tempClippedPoly.type < 5) else if(tempClippedPoly.type < 5)
{ {
@ -844,6 +844,8 @@ static void SoftRastRender()
for(int i=0;i<256*192;i++) for(int i=0;i<256*192;i++)
screen[i] = clearFragment; screen[i] = clearFragment;
//printf("%d\n",gfx3d.wbuffer?1:0);
//submit all polys to clipper //submit all polys to clipper
clippedPolyCounter = 0; clippedPolyCounter = 0;
for(int i=0;i<gfx3d.polylist->count;i++) for(int i=0;i<gfx3d.polylist->count;i++)
@ -986,149 +988,10 @@ static void SoftRastRender()
} }
// printf("rendered %d of %d polys after backface culling\n",gfx3d.polylist->count-culled,gfx3d.polylist->count); // printf("rendered %d of %d polys after backface culling\n",gfx3d.polylist->count-culled,gfx3d.polylist->count);
} }
//the old non-clipping renderer
//static void SoftRastRender()
//{
// Fragment clearFragment;
// clearFragment.color.components.r = gfx3d.clearColor&0x1F;
// clearFragment.color.components.g = (gfx3d.clearColor>>5)&0x1F;
// clearFragment.color.components.b = (gfx3d.clearColor>>10)&0x1F;
// clearFragment.color.components.a = (gfx3d.clearColor>>16)&0x1F;
// clearFragment.polyid.opaque = clearFragment.polyid.translucent = (gfx3d.clearColor>>24)&0x3F;
// clearFragment.depth = gfx3d.clearDepth;
//
// for(int i=0;i<256*192;i++)
// {
// screen[i] = clearFragment;
// }
//
//
// for(int i=0;i<gfx3d.vertlist->count;i++)
// {
// VERT &vert = gfx3d.vertlist->list[i];
//
// //perspective division and viewport transform
// vert.coord[0] = (vert.coord[0]+vert.coord[3])*256 / (2*vert.coord[3]) + 0;
// vert.coord[1] = (vert.coord[1]+vert.coord[3])*192 / (2*vert.coord[3]) + 0;
// vert.coord[2] = (vert.coord[2]+vert.coord[3]) / (2*vert.coord[3]);
// vert.coord[3] *= 4096; //not sure about this
// }
//
// //a counter for how many polys got culled
// int culled = 0;
//
// u32 lastTextureFormat = 0, lastTexturePalette = 0, lastPolyAttr = 0;
//
// //iterate over polys
// bool needInitTexture = true;
// for(int i=0;i<gfx3d.polylist->count;i++)
// {
// polynum = i;
//
// POLY *poly = &gfx3d.polylist->list[gfx3d.indexlist[i]];
// int type = poly->type;
//
// VERT* verts[4] = {
// &gfx3d.vertlist->list[poly->vertIndexes[0]],
// &gfx3d.vertlist->list[poly->vertIndexes[1]],
// &gfx3d.vertlist->list[poly->vertIndexes[2]],
// type==4?&gfx3d.vertlist->list[poly->vertIndexes[3]]:0
// };
//
//
// if(i == 0 || lastPolyAttr != poly->polyAttr)
// {
// polyAttr.setup(poly->polyAttr);
// lastPolyAttr = poly->polyAttr;
// }
//
// //HACK: backface culling
// //this should be moved to gfx3d, but first we need to redo the way the lists are built
// //because it is too convoluted right now.
// //(must we throw out verts if a poly gets backface culled? if not, then it might be easier)
// float ab[2], ac[2];
// Vector2Copy(ab, verts[1]->coord);
// Vector2Copy(ac, verts[2]->coord);
// Vector2Subtract(ab, verts[0]->coord);
// Vector2Subtract(ac, verts[0]->coord);
// float cross = Vector2Cross(ab, ac);
// bool backfacing = (cross<0);
//
//
// if(!polyAttr.isVisible(backfacing)) {
// culled++;
// continue;
// }
//
// if(needInitTexture || lastTextureFormat != poly->texParam || lastTexturePalette != poly->texPalette)
// {
// TexCache_SetTexture(poly->texParam,poly->texPalette);
// sampler.setup(poly->texParam);
// lastTextureFormat = poly->texParam;
// lastTexturePalette = poly->texPalette;
// needInitTexture = false;
// }
//
// //hmm... shader gets setup every time because it depends on sampler which may have just changed
// shader.setup(poly->polyAttr);
//
// //note that when we build our triangle vert lists, we reorder them for our renderer.
// //we should probably fix the renderer so we dont have to do this;
// //but then again, what does it matter?
// if(type == 4)
// {
// if(backfacing)
// {
// SubmitVertex(0,verts[0]);
// SubmitVertex(1,verts[1]);
// SubmitVertex(2,verts[2]);
// triangle_from_devmaster();
//
// SubmitVertex(0,verts[2]);
// SubmitVertex(1,verts[3]);
// SubmitVertex(2,verts[0]);
// triangle_from_devmaster();
// }
// else
// {
// SubmitVertex(0,verts[2]);
// SubmitVertex(1,verts[1]);
// SubmitVertex(2,verts[0]);
// triangle_from_devmaster();
//
// SubmitVertex(0,verts[0]);
// SubmitVertex(1,verts[3]);
// SubmitVertex(2,verts[2]);
// triangle_from_devmaster();
// }
// }
// if(type == 3)
// {
// if(backfacing)
// {
// SubmitVertex(0,verts[0]);
// SubmitVertex(1,verts[1]);
// SubmitVertex(2,verts[2]);
// triangle_from_devmaster();
// }
// else
// {
// SubmitVertex(0,verts[2]);
// SubmitVertex(1,verts[1]);
// SubmitVertex(2,verts[0]);
// triangle_from_devmaster();
// }
// }
//
// }
//
// //printf("rendered %d of %d polys after backface culling\n",gfx3d.polylist->count-culled,gfx3d.polylist->count);
//}
GPU3DInterface gpu3DRasterize = { GPU3DInterface gpu3DRasterize = {
"SoftRasterizer", "SoftRasterizer",
SoftRastInit, SoftRastInit,

View File

@ -44,7 +44,7 @@
#ifdef RELEASE #ifdef RELEASE
#define DESMUME_SUBVERSION_STRING "" #define DESMUME_SUBVERSION_STRING ""
#else #else
#define DESMUME_SUBVERSION_STRING " interim" #define DESMUME_SUBVERSION_STRING " prerelease"
#endif #endif
#endif #endif
@ -55,8 +55,8 @@
#define DESMUME_COMPILER "" #define DESMUME_COMPILER ""
#endif #endif
#define DESMUME_VERSION_NUMERIC 90000 #define DESMUME_VERSION_NUMERIC 90200
#define DESMUME_VERSION_STRING " " "0.9" DESMUME_PLATFORM_STRING DESMUME_CPUEXT_STRING DESMUME_SUBVERSION_STRING DESMUME_COMPILER #define DESMUME_VERSION_STRING " " "0.9.2" DESMUME_PLATFORM_STRING DESMUME_CPUEXT_STRING DESMUME_SUBVERSION_STRING DESMUME_COMPILER
#define DESMUME_NAME_AND_VERSION " " DESMUME_NAME DESMUME_VERSION_STRING #define DESMUME_NAME_AND_VERSION " " DESMUME_NAME DESMUME_VERSION_STRING
#ifdef _WIN32 #ifdef _WIN32