Align LINES and TRIANGLES drawing
When drawing LINES or TRIANGLES, vertex are accumulated in same buffer as QUADS and new draw calls are registered but QUADS drawing uses an index buffer for optimization, so, when adding LINES/TRIANGLES vertices we need to make sure next draw calls for QUADS keep aligned with indices buffer. To get that we just add some alignment vertex at the end of the LINES/TRIANGLES draw calls, to make them multiple of 4 vertex.
This commit is contained in:
parent
165ced9428
commit
186d34827a
59
src/rlgl.h
59
src/rlgl.h
@ -728,6 +728,7 @@ typedef struct DynamicBuffer {
|
||||
typedef struct DrawCall {
|
||||
int mode; // Drawing mode: LINES, TRIANGLES, QUADS
|
||||
int vertexCount; // Number of vertex of the draw
|
||||
int vertexAlignment; // Number of vertex required for index alignment (LINES, TRIANGLES)
|
||||
//unsigned int vaoId; // Vertex Array id to be used on the draw
|
||||
//unsigned int shaderId; // Shader id to be used on the draw
|
||||
unsigned int textureId; // Texture id to be used on the draw
|
||||
@ -1123,7 +1124,27 @@ void rlBegin(int mode)
|
||||
// NOTE: In all three cases, vertex are accumulated over default internal vertex buffer
|
||||
if (draws[drawsCounter - 1].mode != mode)
|
||||
{
|
||||
if (draws[drawsCounter - 1].vertexCount > 0) drawsCounter++;
|
||||
if (draws[drawsCounter - 1].vertexCount > 0)
|
||||
{
|
||||
// Make sure current draws[i].vertexCount is aligned a multiple of 4,
|
||||
// that way, following QUADS drawing will keep aligned with index processing
|
||||
// It implies adding some extra alignment vertex at the end of the draw,
|
||||
// those vertex are not processed but they are considered as an additional offset
|
||||
// for the next set of vertex to be drawn
|
||||
if (draws[drawsCounter - 1].mode == RL_LINES) draws[drawsCounter - 1].vertexAlignment = ((draws[drawsCounter - 1].vertexCount < 4)? draws[drawsCounter - 1].vertexCount : draws[drawsCounter - 1].vertexCount%4);
|
||||
else if (draws[drawsCounter - 1].mode == RL_TRIANGLES) draws[drawsCounter - 1].vertexAlignment = ((draws[drawsCounter - 1].vertexCount < 4)? 1 : (4 - (draws[drawsCounter - 1].vertexCount%4)));
|
||||
|
||||
if (rlCheckBufferLimit(draws[drawsCounter - 1].vertexAlignment)) rlglDraw();
|
||||
else
|
||||
{
|
||||
vertexData[currentBuffer].vCounter += draws[drawsCounter - 1].vertexAlignment;
|
||||
vertexData[currentBuffer].cCounter += draws[drawsCounter - 1].vertexAlignment;
|
||||
vertexData[currentBuffer].tcCounter += draws[drawsCounter - 1].vertexAlignment;
|
||||
|
||||
drawsCounter++;
|
||||
}
|
||||
}
|
||||
|
||||
if (drawsCounter >= MAX_DRAWCALL_REGISTERED) rlglDraw();
|
||||
|
||||
draws[drawsCounter - 1].mode = mode;
|
||||
@ -1135,15 +1156,6 @@ void rlBegin(int mode)
|
||||
// Finish vertex providing
|
||||
void rlEnd(void)
|
||||
{
|
||||
// Make sure current draws[i].vertexCount is multiple of 4, to align with index processing
|
||||
// NOTE: It implies adding some extra vertex at the end of the draw, those vertex will be
|
||||
// processed but are placed in a single point to not result in a fragment output...
|
||||
// TODO: System could be improved (a bit) just storing every draw alignment value
|
||||
// and adding it to vertexOffset on drawing... maybe in a future...
|
||||
int vertexCount = draws[drawsCounter - 1].vertexCount;
|
||||
int vertexToAlign = (vertexCount >= 4)? vertexCount%4 : (4 - vertexCount%4);
|
||||
for (int i = 0; i < vertexToAlign; i++) rlVertex3f(-1, -1, -1);
|
||||
|
||||
// Make sure vertexCount is the same for vertices, texcoords, colors and normals
|
||||
// NOTE: In OpenGL 1.1, one glColor call can be made for all the subsequent glVertex calls
|
||||
|
||||
@ -1283,7 +1295,27 @@ void rlEnableTexture(unsigned int id)
|
||||
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
|
||||
if (draws[drawsCounter - 1].textureId != id)
|
||||
{
|
||||
if (draws[drawsCounter - 1].vertexCount > 0) drawsCounter++;
|
||||
if (draws[drawsCounter - 1].vertexCount > 0)
|
||||
{
|
||||
// Make sure current draws[i].vertexCount is aligned a multiple of 4,
|
||||
// that way, following QUADS drawing will keep aligned with index processing
|
||||
// It implies adding some extra alignment vertex at the end of the draw,
|
||||
// those vertex are not processed but they are considered as an additional offset
|
||||
// for the next set of vertex to be drawn
|
||||
if (draws[drawsCounter - 1].mode == RL_LINES) draws[drawsCounter - 1].vertexAlignment = ((draws[drawsCounter - 1].vertexCount < 4)? draws[drawsCounter - 1].vertexCount : draws[drawsCounter - 1].vertexCount%4);
|
||||
else if (draws[drawsCounter - 1].mode == RL_TRIANGLES) draws[drawsCounter - 1].vertexAlignment = ((draws[drawsCounter - 1].vertexCount < 4)? 1 : (4 - (draws[drawsCounter - 1].vertexCount%4)));
|
||||
|
||||
if (rlCheckBufferLimit(draws[drawsCounter - 1].vertexAlignment)) rlglDraw();
|
||||
else
|
||||
{
|
||||
vertexData[currentBuffer].vCounter += draws[drawsCounter - 1].vertexAlignment;
|
||||
vertexData[currentBuffer].cCounter += draws[drawsCounter - 1].vertexAlignment;
|
||||
vertexData[currentBuffer].tcCounter += draws[drawsCounter - 1].vertexAlignment;
|
||||
|
||||
drawsCounter++;
|
||||
}
|
||||
}
|
||||
|
||||
if (drawsCounter >= MAX_DRAWCALL_REGISTERED) rlglDraw();
|
||||
|
||||
draws[drawsCounter - 1].textureId = id;
|
||||
@ -1682,6 +1714,7 @@ void rlglInit(int width, int height)
|
||||
{
|
||||
draws[i].mode = RL_QUADS;
|
||||
draws[i].vertexCount = 0;
|
||||
draws[i].vertexAlignment = 0;
|
||||
//draws[i].vaoId = 0;
|
||||
//draws[i].shaderId = 0;
|
||||
draws[i].textureId = defaultTextureId;
|
||||
@ -4190,8 +4223,8 @@ static void DrawBuffersDefault(void)
|
||||
glDrawElements(GL_TRIANGLES, draws[i].vertexCount/4*6, GL_UNSIGNED_SHORT, (GLvoid *)(sizeof(GLushort)*vertexOffset/4*6));
|
||||
#endif
|
||||
}
|
||||
|
||||
vertexOffset += draws[i].vertexCount;
|
||||
|
||||
vertexOffset += (draws[i].vertexCount + draws[i].vertexAlignment);
|
||||
}
|
||||
|
||||
if (!vaoSupported)
|
||||
|
Loading…
Reference in New Issue
Block a user