Reimplement line rendering

This commit is contained in:
yaz0r 2025-06-14 14:05:15 -07:00
parent acc927b52d
commit 1d0f29be5b
1 changed files with 60 additions and 65 deletions

View File

@ -62,11 +62,6 @@ struct polyVertex
float U; float U;
float V; float V;
unsigned char R;
unsigned char G;
unsigned char B;
unsigned char A;
}; };
struct sphereVertex struct sphereVertex
@ -95,6 +90,7 @@ std::array<polyVertex, NUM_MAX_NOISE_VERTICES> noiseVertices;
std::array<polyVertex, NUM_MAX_TRANSPARENT_VERTICES> transparentVertices; std::array<polyVertex, NUM_MAX_TRANSPARENT_VERTICES> transparentVertices;
std::array<polyVertex, NUM_MAX_RAMP_VERTICES> rampVertices; std::array<polyVertex, NUM_MAX_RAMP_VERTICES> rampVertices;
std::array<sphereVertex, NUM_MAX_SPHERES_VERTICES> sphereVertices; std::array<sphereVertex, NUM_MAX_SPHERES_VERTICES> sphereVertices;
std::vector<polyVertex> g_lineVertices;
int numUsedFlatVertices = 0; int numUsedFlatVertices = 0;
int numUsedNoiseVertices = 0; int numUsedNoiseVertices = 0;
@ -618,7 +614,6 @@ void osystem_flushPendingPrimitives()
.begin() .begin()
.add(bgfx::Attrib::Position, 3, bgfx::AttribType::Float) .add(bgfx::Attrib::Position, 3, bgfx::AttribType::Float)
.add(bgfx::Attrib::TexCoord0, 2, bgfx::AttribType::Float) .add(bgfx::Attrib::TexCoord0, 2, bgfx::AttribType::Float)
.add(bgfx::Attrib::Color0, 4, bgfx::AttribType::Uint8)
.end(); .end();
bgfx::TransientVertexBuffer transientBuffer; bgfx::TransientVertexBuffer transientBuffer;
@ -652,7 +647,6 @@ void osystem_flushPendingPrimitives()
.begin() .begin()
.add(bgfx::Attrib::Position, 3, bgfx::AttribType::Float) .add(bgfx::Attrib::Position, 3, bgfx::AttribType::Float)
.add(bgfx::Attrib::TexCoord0, 2, bgfx::AttribType::Float) .add(bgfx::Attrib::TexCoord0, 2, bgfx::AttribType::Float)
.add(bgfx::Attrib::Color0, 4, bgfx::AttribType::Uint8)
.end(); .end();
bgfx::TransientVertexBuffer transientBuffer; bgfx::TransientVertexBuffer transientBuffer;
@ -686,7 +680,6 @@ void osystem_flushPendingPrimitives()
.begin() .begin()
.add(bgfx::Attrib::Position, 3, bgfx::AttribType::Float) .add(bgfx::Attrib::Position, 3, bgfx::AttribType::Float)
.add(bgfx::Attrib::TexCoord0, 2, bgfx::AttribType::Float) .add(bgfx::Attrib::TexCoord0, 2, bgfx::AttribType::Float)
.add(bgfx::Attrib::Color0, 4, bgfx::AttribType::Uint8)
.end(); .end();
bgfx::TransientVertexBuffer transientBuffer; bgfx::TransientVertexBuffer transientBuffer;
@ -744,6 +737,39 @@ void osystem_flushPendingPrimitives()
bgfx::setVertexBuffer(0, &transientBuffer); bgfx::setVertexBuffer(0, &transientBuffer);
bgfx::submit(gameViewId, getSphereShader()); bgfx::submit(gameViewId, getSphereShader());
} }
if (g_lineVertices.size()) {
bgfx::VertexLayout layout;
layout
.begin()
.add(bgfx::Attrib::Position, 3, bgfx::AttribType::Float)
.add(bgfx::Attrib::TexCoord0, 2, bgfx::AttribType::Float)
.end();
bgfx::TransientVertexBuffer transientBuffer;
bgfx::allocTransientVertexBuffer(&transientBuffer, g_lineVertices.size(), layout);
memcpy(transientBuffer.data, g_lineVertices.data(), sizeof(polyVertex) * g_lineVertices.size());
bgfx::setState(0 | BGFX_STATE_PT_LINES
| BGFX_STATE_WRITE_RGB
| BGFX_STATE_WRITE_A
| BGFX_STATE_WRITE_Z
| BGFX_STATE_DEPTH_TEST_LEQUAL
| BGFX_STATE_MSAA
);
static bgfx::UniformHandle paletteTextureUniform = BGFX_INVALID_HANDLE;
if (!bgfx::isValid(paletteTextureUniform))
{
paletteTextureUniform = bgfx::createUniform("s_paletteTexture", bgfx::UniformType::Sampler);
}
bgfx::setTexture(1, paletteTextureUniform, g_paletteTexture);
bgfx::setVertexBuffer(0, &transientBuffer);
bgfx::submit(gameViewId, getFlatShader());
}
#if 0 #if 0
if (numUsedTransparentVertices) if (numUsedTransparentVertices)
{ {
@ -761,6 +787,7 @@ void osystem_flushPendingPrimitives()
numUsedRampVertices = 0; numUsedRampVertices = 0;
numUsedSpheres = 0; numUsedSpheres = 0;
numUsedTransparentVertices = 0; numUsedTransparentVertices = 0;
g_lineVertices.clear();
} }
void osystem_fillPoly(float* buffer, int numPoint, unsigned char color, u8 polyType) void osystem_fillPoly(float* buffer, int numPoint, unsigned char color, u8 polyType)
@ -884,10 +911,11 @@ void osystem_fillPoly(float* buffer, int numPoint, unsigned char color, u8 polyT
pVertex->Y = buffer[i * 3 + 1]; pVertex->Y = buffer[i * 3 + 1];
pVertex->Z = buffer[i * 3 + 2]; pVertex->Z = buffer[i * 3 + 2];
pVertex->R = RGB_Pal[color * 3]; int bank = (color & 0xF0) >> 4;
pVertex->G = RGB_Pal[color * 3 + 1]; int startColor = color & 0xF;
pVertex->B = RGB_Pal[color * 3 + 2]; float colorf = startColor;
pVertex->A = 128; pVertex->U = colorf / 15.f;
pVertex->V = bank / 15.f;
pVertex++; pVertex++;
} }
break; break;
@ -1004,6 +1032,26 @@ void osystem_fillPoly(float* buffer, int numPoint, unsigned char color, u8 polyT
void osystem_draw3dLine(float x1, float y1, float z1, float x2, float y2, float z2, unsigned char color) void osystem_draw3dLine(float x1, float y1, float z1, float x2, float y2, float z2, unsigned char color)
{ {
polyVertex vertex1;
polyVertex vertex2;
vertex1.X = x1;
vertex1.Y = y1;
vertex1.Z = z1;
vertex2.X = x2;
vertex2.Y = y2;
vertex2.Z = z2;
int bank = (color & 0xF0) >> 4;
int startColor = color & 0xF;
float colorf = startColor;
vertex1.U = vertex2.U = colorf / 15.f;
vertex1.V = vertex2.V = bank / 15.f;
g_lineVertices.push_back(vertex1);
g_lineVertices.push_back(vertex2);
#if 0 #if 0
GLfloat lineVertices[2 * 3]; GLfloat lineVertices[2 * 3];
GLubyte lineColor[2 * 4]; GLubyte lineColor[2 * 4];
@ -1071,63 +1119,10 @@ void osystem_draw3dLine(float x1, float y1, float z1, float x2, float y2, float
void osystem_draw3dQuad(float x1, float y1, float z1, float x2, float y2, float z2, float x3, float y3, float z3, float x4, float y4, float z4, unsigned char color, int transparency) void osystem_draw3dQuad(float x1, float y1, float z1, float x2, float y2, float z2, float x3, float y3, float z3, float x4, float y4, float z4, unsigned char color, int transparency)
{ {
float lineVertices[4 * 3];
unsigned char lineColor1[4 * 4];
unsigned char lineColor2[4 * 4];
for (int i = 0; i < 4; i++)
{
lineColor1[i * 4 + 0] = RGB_Pal[(color + 3) * 3];
lineColor1[i * 4 + 1] = RGB_Pal[(color + 3) * 3 + 1];
lineColor1[i * 4 + 2] = RGB_Pal[(color + 3) * 3 + 2];
lineColor1[i * 4 + 3] = 255;
lineColor2[i * 4 + 0] = RGB_Pal[color * 3];
lineColor2[i * 4 + 1] = RGB_Pal[color * 3 + 1];
lineColor2[i * 4 + 2] = RGB_Pal[color * 3 + 2];
lineColor2[i * 4 + 3] = 255;
}
lineVertices[0] = x1;
lineVertices[1] = y1;
lineVertices[2] = z1;
lineVertices[3] = x2;
lineVertices[4] = y2;
lineVertices[5] = z2;
lineVertices[6] = x4;
lineVertices[7] = y4;
lineVertices[8] = z4;
lineVertices[9] = x3;
lineVertices[10] = y3;
lineVertices[11] = z3;
osystem_draw3dLine(x1, y1, z1, x2, y2, z2, color); osystem_draw3dLine(x1, y1, z1, x2, y2, z2, color);
osystem_draw3dLine(x2, y2, z2, x3, y3, z3, color); osystem_draw3dLine(x2, y2, z2, x3, y3, z3, color);
osystem_draw3dLine(x3, y3, z3, x4, y4, z4, color); osystem_draw3dLine(x3, y3, z3, x4, y4, z4, color);
osystem_draw3dLine(x4, y4, z4, x1, y1, z1, color); osystem_draw3dLine(x4, y4, z4, x1, y1, z1, color);
//glEnable(GL_DEPTH_TEST);
//glDisable(GL_BLEND);
/*glColor4ub(1.f, 1.f, 1.f, 1.f);
glVertexPointer(3, GL_FLOAT, 0, lineVertices);
glColorPointer(4, GL_UNSIGNED_BYTE, 0, lineColor1);
glDrawArrays(GL_LINE_LOOP, 0, 4);
checkGL();*/
/*
{
checkGL();
glVertexPointer(3, GL_FLOAT, 0, lineVertices);
glColorPointer(4, GL_UNSIGNED_BYTE, 0, lineColor2);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
checkGL();
}
*/
} }
void osystem_drawSphere(float X, float Y, float Z, u8 color, u8 material, float size) void osystem_drawSphere(float X, float Y, float Z, u8 color, u8 material, float size)