3D/GL: experimental attempt at reducing warping on quads, pentagons, etc...
This commit is contained in:
parent
de19ce6250
commit
00f33343e4
|
@ -641,26 +641,130 @@ void BuildPolygons(RendererPolygon* polygons, int npolys)
|
||||||
*iptr++ = vidx - 1;
|
*iptr++ = vidx - 1;
|
||||||
rp->NumIndices += 3;
|
rp->NumIndices += 3;
|
||||||
}
|
}
|
||||||
else
|
else // quad, pentagon, etc
|
||||||
{
|
{
|
||||||
rp->PrimType = GL_TRIANGLES;
|
rp->PrimType = GL_TRIANGLES;
|
||||||
|
|
||||||
for (int j = 0; j < poly->NumVertices; j++)
|
if (false)
|
||||||
{
|
{
|
||||||
Vertex* vtx = poly->Vertices[j];
|
// regular triangle-splitting
|
||||||
|
|
||||||
vptr = SetupVertex(poly, j, vtx, vtxattr, vptr);
|
for (int j = 0; j < poly->NumVertices; j++)
|
||||||
|
|
||||||
if (j >= 2)
|
|
||||||
{
|
{
|
||||||
// build a triangle
|
Vertex* vtx = poly->Vertices[j];
|
||||||
*iptr++ = vidx_first;
|
|
||||||
*iptr++ = vidx - 1;
|
vptr = SetupVertex(poly, j, vtx, vtxattr, vptr);
|
||||||
*iptr++ = vidx;
|
|
||||||
rp->NumIndices += 3;
|
if (j >= 2)
|
||||||
|
{
|
||||||
|
// build a triangle
|
||||||
|
*iptr++ = vidx_first;
|
||||||
|
*iptr++ = vidx - 1;
|
||||||
|
*iptr++ = vidx;
|
||||||
|
rp->NumIndices += 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
vidx++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// attempt at 'better' splitting
|
||||||
|
// this doesn't get rid of the error while splitting a bigger polygon into triangles
|
||||||
|
// but we can attempt to reduce it
|
||||||
|
|
||||||
|
u32 cX = 0, cY = 0;
|
||||||
|
float cZ = 0;
|
||||||
|
float cW = 0;
|
||||||
|
|
||||||
|
float cR = 0, cG = 0, cB = 0;
|
||||||
|
float cS = 0, cT = 0;
|
||||||
|
|
||||||
|
for (int j = 0; j < poly->NumVertices; j++)
|
||||||
|
{
|
||||||
|
Vertex* vtx = poly->Vertices[j];
|
||||||
|
|
||||||
|
cX += vtx->HiresPosition[0];
|
||||||
|
cY += vtx->HiresPosition[1];
|
||||||
|
|
||||||
|
float fw = (float)poly->FinalW[j] * poly->NumVertices;
|
||||||
|
cW += 1.0f / fw;
|
||||||
|
|
||||||
|
if (poly->WBuffer) cZ += poly->FinalZ[j] / fw;
|
||||||
|
else cZ += poly->FinalZ[j];
|
||||||
|
|
||||||
|
cR += (vtx->FinalColor[0] >> 1) / fw;
|
||||||
|
cG += (vtx->FinalColor[1] >> 1) / fw;
|
||||||
|
cB += (vtx->FinalColor[2] >> 1) / fw;
|
||||||
|
|
||||||
|
cS += vtx->TexCoords[0] / fw;
|
||||||
|
cT += vtx->TexCoords[1] / fw;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cX /= poly->NumVertices;
|
||||||
|
cY /= poly->NumVertices;
|
||||||
|
|
||||||
|
cW = 1.0f / cW;
|
||||||
|
|
||||||
|
if (poly->WBuffer) cZ *= cW;
|
||||||
|
else cZ /= poly->NumVertices;
|
||||||
|
|
||||||
|
cR *= cW;
|
||||||
|
cG *= cW;
|
||||||
|
cB *= cW;
|
||||||
|
|
||||||
|
cS *= cW;
|
||||||
|
cT *= cW;
|
||||||
|
|
||||||
|
cX = (cX * ScaleFactor) >> 4;
|
||||||
|
cY = (cY * ScaleFactor) >> 4;
|
||||||
|
|
||||||
|
u32 w = (u32)cW;
|
||||||
|
|
||||||
|
u32 z = (u32)cZ;
|
||||||
|
u32 zshift = 0;
|
||||||
|
while (z > 0xFFFF) { z >>= 1; zshift++; }
|
||||||
|
|
||||||
|
// build center vertex
|
||||||
|
*vptr++ = cX | (cY << 16);
|
||||||
|
*vptr++ = z | (w << 16);
|
||||||
|
|
||||||
|
*vptr++ = (u32)cR |
|
||||||
|
((u32)cG << 8) |
|
||||||
|
((u32)cB << 16) |
|
||||||
|
(alpha << 24);
|
||||||
|
|
||||||
|
*vptr++ = (u16)cS | ((u16)cT << 16);
|
||||||
|
|
||||||
|
*vptr++ = vtxattr | (zshift << 16);
|
||||||
|
*vptr++ = poly->TexParam;
|
||||||
|
*vptr++ = poly->TexPalette;
|
||||||
|
|
||||||
vidx++;
|
vidx++;
|
||||||
|
|
||||||
|
// build the final polygon
|
||||||
|
for (int j = 0; j < poly->NumVertices; j++)
|
||||||
|
{
|
||||||
|
Vertex* vtx = poly->Vertices[j];
|
||||||
|
|
||||||
|
vptr = SetupVertex(poly, j, vtx, vtxattr, vptr);
|
||||||
|
|
||||||
|
if (j >= 1)
|
||||||
|
{
|
||||||
|
// build a triangle
|
||||||
|
*iptr++ = vidx_first;
|
||||||
|
*iptr++ = vidx - 1;
|
||||||
|
*iptr++ = vidx;
|
||||||
|
rp->NumIndices += 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
vidx++;
|
||||||
|
}
|
||||||
|
|
||||||
|
*iptr++ = vidx_first;
|
||||||
|
*iptr++ = vidx - 1;
|
||||||
|
*iptr++ = vidx_first + 1;
|
||||||
|
rp->NumIndices += 3;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue