summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/rlgl.h59
1 files changed, 46 insertions, 13 deletions
diff --git a/src/rlgl.h b/src/rlgl.h
index 00658fa1..d4faec18 100644
--- a/src/rlgl.h
+++ b/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)