gl: Fix GL vertex array client state handling

This commit is contained in:
Eidolon 2026-04-09 23:39:28 -05:00
parent 0d54b41983
commit 49beb6b74b

View file

@ -1385,6 +1385,14 @@ void SetStates(void)
pglLoadIdentity();
pglScalef(1.0f, 1.0f, -1.0f);
pglGetFloatv(GL_MODELVIEW_MATRIX, modelMatrix); // added for new coronas' code (without depth buffer)
pglBindBuffer(GL_ARRAY_BUFFER, 0);
pglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
pglDisableClientState(GL_VERTEX_ARRAY);
pglDisableClientState(GL_TEXTURE_COORD_ARRAY);
pglDisableClientState(GL_NORMAL_ARRAY);
pglDisableClientState(GL_COLOR_ARRAY);
SetShader(SHADER_NONE);
}
@ -1646,12 +1654,14 @@ EXPORT void HWRAPI(Draw2DLine) (F2DCoord * v1,
p[6] = v2->x + dx; p[7] = -(v2->y - dy); p[8] = 1;
p[9] = v1->x + dx; p[10] = -(v1->y - dy); p[11] = 1;
pglDisableClientState(GL_TEXTURE_COORD_ARRAY);
pglColor4ubv((GLubyte*)&Color.s);
pglVertexPointer(3, GL_FLOAT, 0, p);
pglDrawArrays(GL_TRIANGLE_FAN, 0, 4);
pglEnableClientState(GL_TEXTURE_COORD_ARRAY);
pglEnableClientState(GL_VERTEX_ARRAY);
pglBindBuffer(GL_ARRAY_BUFFER, 0);
pglDrawArrays(GL_TRIANGLE_FAN, 0, 4);
pglDisableClientState(GL_VERTEX_ARRAY);
pglEnable(GL_TEXTURE_2D);
}
@ -2472,7 +2482,14 @@ EXPORT void HWRAPI(DrawPolygon) (FSurfaceInfo *pSurf, FOutVector *pOutVerts, FUI
pglVertexPointer(3, GL_FLOAT, sizeof(FOutVector), &pOutVerts[0].x);
pglTexCoordPointer(2, GL_FLOAT, sizeof(FOutVector), &pOutVerts[0].s);
pglEnableClientState(GL_VERTEX_ARRAY);
pglEnableClientState(GL_TEXTURE_COORD_ARRAY);
pglBindBuffer(GL_ARRAY_BUFFER, 0);
pglDrawArrays(PolyFlags & PF_WireFrame ? GL_LINES : GL_TRIANGLE_FAN, 0, iNumPts);
pglDisableClientState(GL_VERTEX_ARRAY);
pglDisableClientState(GL_TEXTURE_COORD_ARRAY);
if (PolyFlags & PF_RemoveYWrap)
pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
@ -2490,7 +2507,14 @@ EXPORT void HWRAPI(DrawIndexedTriangles) (FSurfaceInfo *pSurf, FOutVector *pOutV
pglVertexPointer(3, GL_FLOAT, sizeof(FOutVector), &pOutVerts[0].x);
pglTexCoordPointer(2, GL_FLOAT, sizeof(FOutVector), &pOutVerts[0].s);
pglEnableClientState(GL_VERTEX_ARRAY);
pglEnableClientState(GL_TEXTURE_COORD_ARRAY);
pglBindBuffer(GL_ARRAY_BUFFER, 0);
pglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
pglDrawElements(GL_TRIANGLES, iNumPts, GL_UNSIGNED_INT, IndexArray);
pglDisableClientState(GL_VERTEX_ARRAY);
pglDisableClientState(GL_TEXTURE_COORD_ARRAY);
// the DrawPolygon variant of this has some code about polyflags and wrapping here but havent noticed any problems from omitting it?
}
@ -2542,7 +2566,9 @@ EXPORT void HWRAPI(RenderSkyDome) (gl_sky_t *sky)
pglTexCoordPointer(2, GL_FLOAT, sizeof(sky->data[0]), sky_vbo_u);
pglColorPointer(4, GL_UNSIGNED_BYTE, sizeof(sky->data[0]), sky_vbo_r);
// activate color arrays
// activate client states
pglEnableClientState(GL_VERTEX_ARRAY);
pglEnableClientState(GL_TEXTURE_COORD_ARRAY);
pglEnableClientState(GL_COLOR_ARRAY);
// set transforms
@ -2582,7 +2608,9 @@ EXPORT void HWRAPI(RenderSkyDome) (gl_sky_t *sky)
if (gl_ext_arb_vertex_buffer_object)
pglBindBuffer(GL_ARRAY_BUFFER, 0);
// deactivate color array
// deactivate client states
pglDisableClientState(GL_VERTEX_ARRAY);
pglDisableClientState(GL_TEXTURE_COORD_ARRAY);
pglDisableClientState(GL_COLOR_ARRAY);
}
@ -3000,6 +3028,8 @@ static void DrawModelEx(model_t *model, INT32 frameIndex, float duration, float
memcmp(&(model->vbo_max_t), &(model->max_t), sizeof(model->max_t)) != 0)
useVBO = false;
pglEnableClientState(GL_VERTEX_ARRAY);
pglEnableClientState(GL_TEXTURE_COORD_ARRAY);
pglEnableClientState(GL_NORMAL_ARRAY);
for (i = 0; i < model->numMeshes; i++)
@ -3019,6 +3049,7 @@ static void DrawModelEx(model_t *model, INT32 frameIndex, float duration, float
if (useVBO)
{
pglBindBuffer(GL_ARRAY_BUFFER, frame->vboID);
pglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
pglVertexPointer(3, GL_SHORT, sizeof(vbotiny_t), BUFFER_OFFSET(0));
pglNormalPointer(GL_BYTE, sizeof(vbotiny_t), BUFFER_OFFSET(sizeof(short)*3));
pglTexCoordPointer(2, GL_FLOAT, sizeof(vbotiny_t), BUFFER_OFFSET(sizeof(short) * 3 + sizeof(char) * 6));
@ -3028,6 +3059,8 @@ static void DrawModelEx(model_t *model, INT32 frameIndex, float duration, float
}
else
{
pglBindBuffer(GL_ARRAY_BUFFER, 0);
pglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
pglVertexPointer(3, GL_SHORT, 0, frame->vertices);
pglNormalPointer(GL_BYTE, 0, frame->normals);
pglTexCoordPointer(2, GL_FLOAT, 0, mesh->uvs);
@ -3052,6 +3085,8 @@ static void DrawModelEx(model_t *model, INT32 frameIndex, float duration, float
*normPtr++ = (char)(frame->normals[j] + (pol * (nextframe->normals[j] - frame->normals[j])));
}
pglBindBuffer(GL_ARRAY_BUFFER, 0);
pglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
pglVertexPointer(3, GL_SHORT, 0, vertTinyBuffer);
pglNormalPointer(GL_BYTE, 0, normTinyBuffer);
pglTexCoordPointer(2, GL_FLOAT, 0, mesh->uvs);
@ -3115,6 +3150,8 @@ static void DrawModelEx(model_t *model, INT32 frameIndex, float duration, float
}
}
pglDisableClientState(GL_VERTEX_ARRAY);
pglDisableClientState(GL_TEXTURE_COORD_ARRAY);
pglDisableClientState(GL_NORMAL_ARRAY);
pglPopMatrix(); // should be the same as glLoadIdentity