rasterize: improve texturing precision

This commit is contained in:
zeromus 2009-02-06 04:14:11 +00:00
parent cd962b82e4
commit a0940cad34
1 changed files with 47 additions and 87 deletions

View File

@ -22,14 +22,12 @@
*/ */
//nothing in this file should be assumed to be accurate //nothing in this file should be assumed to be accurate
//please check everything carefully, and sign off on it when you think it is accurate
//if you change it, erase other signatures.
//if you optimize it and think it is risky, erase other signatures
#include "rasterize.h" #include "rasterize.h"
#include <algorithm> #include <algorithm>
#include <assert.h> #include <assert.h>
#include <math.h>
#include <string.h> #include <string.h>
#include "bits.h" #include "bits.h"
@ -153,12 +151,9 @@ struct Vertex
int w; int w;
} verts[3]; } verts[3];
static void SubmitVertex(VERT* rawvert) INLINE static void SubmitVertex(int vert_index, VERT* rawvert)
{ {
static int vert_index = 0; Vertex &vert = verts[vert_index];
Vertex &vert = verts[vert_index++];
if(vert_index==3) vert_index = 0;
vert.vert = rawvert; vert.vert = rawvert;
vert.w = rawvert->coord[3] * 4096; //not sure about this vert.w = rawvert->coord[3] * 4096; //not sure about this
} }
@ -233,8 +228,8 @@ static struct Sampler
Fragment::Color sample(float u, float v) Fragment::Color sample(float u, float v)
{ {
int iu = iround(u); int iu = (int)floorf(u);
int iv = iround(v); int iv = (int)floorf(v);
dowrap(iu,iv); dowrap(iu,iv);
Fragment::Color color; Fragment::Color color;
@ -419,9 +414,9 @@ static void triangle_from_devmaster()
u8 r1 = verts[0].vert->color[0], g1 = verts[0].vert->color[1], b1 = verts[0].vert->color[2], a1 = verts[0].vert->color[3]; u8 r1 = verts[0].vert->color[0], g1 = verts[0].vert->color[1], b1 = verts[0].vert->color[2], a1 = verts[0].vert->color[3];
u8 r2 = verts[1].vert->color[0], g2 = verts[1].vert->color[1], b2 = verts[1].vert->color[2], a2 = verts[1].vert->color[3]; u8 r2 = verts[1].vert->color[0], g2 = verts[1].vert->color[1], b2 = verts[1].vert->color[2], a2 = verts[1].vert->color[3];
u8 r3 = verts[2].vert->color[0], g3 = verts[2].vert->color[1], b3 = verts[2].vert->color[2], a3 = verts[2].vert->color[3]; u8 r3 = verts[2].vert->color[0], g3 = verts[2].vert->color[1], b3 = verts[2].vert->color[2], a3 = verts[2].vert->color[3];
int u1 = verts[0].vert->texcoord[0], v1 = verts[0].vert->texcoord[1]; float u1 = verts[0].vert->texcoord[0], v1 = verts[0].vert->texcoord[1];
int u2 = verts[1].vert->texcoord[0], v2 = verts[1].vert->texcoord[1]; float u2 = verts[1].vert->texcoord[0], v2 = verts[1].vert->texcoord[1];
int u3 = verts[2].vert->texcoord[0], v3 = verts[2].vert->texcoord[1]; float u3 = verts[2].vert->texcoord[0], v3 = verts[2].vert->texcoord[1];
int w1 = verts[0].w, w2 = verts[1].w, w3 = verts[2].w; int w1 = verts[0].w, w2 = verts[1].w, w3 = verts[2].w;
Interpolator i_color_r(fx1,fx2,fx3,fy1,fy2,fy3,r1,r2,r3); Interpolator i_color_r(fx1,fx2,fx3,fy1,fy2,fy3,r1,r2,r3);
@ -492,7 +487,7 @@ static void triangle_from_devmaster()
int w = i_w.cur(); int w = i_w.cur();
if(polyAttr.decalMode) if(polyAttr.decalMode)
{ {
if(abs(w-destFragment.depth)>1) if(abs(w-(int)destFragment.depth)>1)
goto rejected_fragment; goto rejected_fragment;
} }
else else
@ -693,17 +688,6 @@ static void SoftRastRender()
//this should be moved to gfx3d, but first we need to redo the way the lists are built //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. //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) //(must we throw out verts if a poly gets backface culled? if not, then it might be easier)
//TODO - use some freaking matrix and vector classes
/* float ab[3], ac[3];
Vector3Copy(ab,verts[0]->coord);
Vector3Copy(ac,verts[0]->coord);
Vector3Subtract(ab,verts[1]->coord);
Vector3Subtract(ac,verts[2]->coord);
float cross[3];
Vector3Cross(cross,ab,ac);
float view[3] = {0,0,1};
float dot = Vector3Dot(view,cross);
bool backfacing = dot<0;*/
float ab[2], ac[2]; float ab[2], ac[2];
Vector2Copy(ab, verts[1]->coord); Vector2Copy(ab, verts[1]->coord);
Vector2Copy(ac, verts[2]->coord); Vector2Copy(ac, verts[2]->coord);
@ -732,78 +716,54 @@ static void SoftRastRender()
//note that when we build our triangle vert lists, we reorder them for our renderer. //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; //we should probably fix the renderer so we dont have to do this;
//but then again, what does it matter? //but then again, what does it matter?
/* if(type == 4) { if(type == 4)
if(backfacing)
{
SubmitVertex(verts[0]);
SubmitVertex(verts[1]);
SubmitVertex(verts[2]);
triangle_from_devmaster();
SubmitVertex(verts[2]);
SubmitVertex(verts[3]);
SubmitVertex(verts[0]);
triangle_from_devmaster();
}
else
{
SubmitVertex(verts[2]);
SubmitVertex(verts[1]);
SubmitVertex(verts[0]);
triangle_from_devmaster();
SubmitVertex(verts[0]);
SubmitVertex(verts[3]);
SubmitVertex(verts[2]);
triangle_from_devmaster();
}
}
if(type == 3) {
if(backfacing)
{
SubmitVertex(verts[0]);
SubmitVertex(verts[1]);
SubmitVertex(verts[2]);
}
else
{
SubmitVertex(verts[2]);
SubmitVertex(verts[1]);
SubmitVertex(verts[0]);
}
triangle_from_devmaster();
}*/
for(int j = 1; j < (type-1); j++)
{ {
VERT *vert0 = &gfx3d.vertlist->list[poly->vertIndexes[0]];
VERT *vert1 = &gfx3d.vertlist->list[poly->vertIndexes[j]];
VERT *vert2 = &gfx3d.vertlist->list[poly->vertIndexes[j+1]];
if(backfacing) if(backfacing)
{ {
SubmitVertex(vert1); SubmitVertex(0,verts[0]);
SubmitVertex(vert2); SubmitVertex(1,verts[1]);
SubmitVertex(vert0); SubmitVertex(2,verts[2]);
triangle_from_devmaster();
SubmitVertex(0,verts[2]);
SubmitVertex(1,verts[3]);
SubmitVertex(2,verts[0]);
triangle_from_devmaster();
} }
else else
{ {
SubmitVertex(vert2); SubmitVertex(0,verts[2]);
SubmitVertex(vert1); SubmitVertex(1,verts[1]);
SubmitVertex(vert0); SubmitVertex(2,verts[0]);
} triangle_from_devmaster();
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); printf("rendered %d of %d polys after backface culling\n",gfx3d.polylist->count-culled,gfx3d.polylist->count);
} }