aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRay <raysan5@gmail.com>2019-03-28 18:05:32 +0100
committerRay <raysan5@gmail.com>2019-03-28 18:05:32 +0100
commit186d34827af93ec760c81a2abea09991c01556b3 (patch)
tree4352e3cb90165a58af293dce91988bde57eefa87 /src
parent165ced94286073a708d69119e8e8fde381710da2 (diff)
downloadraylib-186d34827af93ec760c81a2abea09991c01556b3.tar.gz
raylib-186d34827af93ec760c81a2abea09991c01556b3.zip
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.
Diffstat (limited to 'src')
-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)