OGLRender: prefer GL_LINE_LOOP rather than GL_QUADS for line segment.

Algorithm of isPolyLine() isn't perfect, but I think it'll work good enough for most cases.
This change should improve Castlevania Portrait of Ruin (trajectory of ricochet, and glow of warp stone)
SoftRasterizer must have a similar issue, it doesn't display both of them.
This commit is contained in:
gocha 2010-12-20 12:45:39 +00:00
parent b721929595
commit 4ba4419e8f
1 changed files with 62 additions and 1 deletions

View File

@ -817,6 +817,64 @@ static void GL_ReadFramebuffer()
#endif
}
// "Workaround" for line poly
static bool isLinePoly(int listIndex)
{
POLY *poly = &gfx3d.polylist->list[gfx3d.indexlist.list[listIndex]];
int type = poly->type;
VERT *vert1, *vert2;
if (type <= 2)
return true;
else if (type > 4)
return false;
// Method 1:
// Castlevania Portrait of Ruin - trajectory of ricochet
bool duplicatedVert[4] = { false, false, false, false };
for(int i = 0; i < type - 1; i++)
{
vert1 = &gfx3d.vertlist->list[poly->vertIndexes[i]];
for(int j = i + 1; j < type; j++)
{
vert2 = &gfx3d.vertlist->list[poly->vertIndexes[j]];
if (vert1->x == vert2->x && vert1->y == vert2->y)
{
duplicatedVert[j] = true;
}
}
}
int vertCount = type;
for(int i = 0; i < type; i++)
{
if (duplicatedVert[i])
vertCount--;
}
if (vertCount <= 2)
return true;
// Method 2:
// Castlevania Portrait of Ruin - warp stone
bool horizontalLine = true;
bool verticalLine = true;
vert1 = &gfx3d.vertlist->list[poly->vertIndexes[0]];
for(int i = 1; i < type && (horizontalLine || verticalLine); i++)
{
vert2 = &gfx3d.vertlist->list[poly->vertIndexes[i]];
if (vert1->coord[0] != vert2->coord[0])
{
verticalLine = false;
}
if (vert1->coord[1] != vert2->coord[1])
{
horizontalLine = false;
}
}
if (horizontalLine || verticalLine)
return true;
return false;
}
static void OGLRender()
{
@ -894,8 +952,11 @@ static void OGLRender()
float alpha = poly->getAlpha()/31.0f;
if(wireframe) alpha = 1.0;
bool linePoly = isLinePoly(i);
if (type == 4)
if (linePoly)
glBegin(GL_LINE_LOOP);
else if (type == 4)
glBegin(GL_QUADS);
else
glBegin(GL_TRIANGLES);