From 26db3915760179c4985a335196d4e8299da2eb6d Mon Sep 17 00:00:00 2001 From: raysan5 Date: Thu, 12 Aug 2021 20:38:57 +0200 Subject: [PATCH 1/3] ADDED: `rlActiveDrawBuffers()` #1911 - ADDED: rlEnableColorBlend()/rlDisableColorBlend() --- src/rlgl.h | 56 ++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 50 insertions(+), 6 deletions(-) diff --git a/src/rlgl.h b/src/rlgl.h index b6203ae87..9cb1a2d89 100644 --- a/src/rlgl.h +++ b/src/rlgl.h @@ -525,8 +525,11 @@ RLAPI void rlDisableShader(void); // Disable shader progra // Framebuffer state RLAPI void rlEnableFramebuffer(unsigned int id); // Enable render texture (fbo) RLAPI void rlDisableFramebuffer(void); // Disable render texture (fbo), return to default framebuffer +RLAPI void rlActiveDrawBuffers(int count); // Activate multiple draw color buffers // General render state +RLAPI void rlEnableColorBlend(void); // Enable color blending +RLAPI void rlDisableColorBlend(void); // Disable color blending RLAPI void rlEnableDepthTest(void); // Enable depth test RLAPI void rlDisableDepthTest(void); // Disable depth test RLAPI void rlEnableDepthMask(void); // Enable depth write @@ -1544,6 +1547,49 @@ void rlDisableFramebuffer(void) #endif } +// Activate multiple draw color buffers +// NOTE: One color buffer is always active by default +void rlActiveDrawBuffers(int count) +{ +#if (defined(GRAPHICS_API_OPENGL_33) && defined(SUPPORT_RENDER_TEXTURES_HINT)) + // NOTE: Maximum number of draw buffers supported is implementation dependant, + // it can be queried with glGet*() but it must be at least 8 + //GLint maxDrawBuffers = 0; + //glGetIntegerv(GL_MAX_DRAW_BUFFERS, &maxDrawBuffers); + + if (count > 0) + { + if (count > 8) TRACELOG(LOG_WARNING, "GL: Max color buffers limited to 8"); + else + { + unsigned int buffers[8] = { + GL_COLOR_ATTACHMENT0, + GL_COLOR_ATTACHMENT1, + GL_COLOR_ATTACHMENT2, + GL_COLOR_ATTACHMENT3, + GL_COLOR_ATTACHMENT4, + GL_COLOR_ATTACHMENT5, + GL_COLOR_ATTACHMENT6, + GL_COLOR_ATTACHMENT7, + }; + + glDrawBuffers(count, buffers); + } + } + else TRACELOG(LOG_WARNING, "GL: One color buffer active by default"); +#endif +} + +//---------------------------------------------------------------------------------- +// General render state configuration +//---------------------------------------------------------------------------------- + +// Enable color blending +void rlEnableColorBlend(void) { glEnable(GL_BLEND); } + +// Disable color blending +void rlDisableColorBlend(void) { glDisable(GL_BLEND); } + // Enable depth test void rlEnableDepthTest(void) { glEnable(GL_DEPTH_TEST); } @@ -1588,11 +1634,9 @@ void rlDisableWireMode(void) glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); #endif } + // Set the line drawing width -void rlSetLineWidth(float width) -{ - glLineWidth(width); -} +void rlSetLineWidth(float width) { glLineWidth(width); } // Get the line drawing width float rlGetLineWidth(void) @@ -3209,10 +3253,10 @@ void rlDisableVertexBufferElement(void) // Update GPU buffer with new data // NOTE: dataSize and offset must be provided in bytes -void rlUpdateVertexBuffer(unsigned int bufferId, void *data, int dataSize, int offset) +void rlUpdateVertexBuffer(unsigned int id, void *data, int dataSize, int offset) { #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) - glBindBuffer(GL_ARRAY_BUFFER, bufferId); + glBindBuffer(GL_ARRAY_BUFFER, id); glBufferSubData(GL_ARRAY_BUFFER, offset, dataSize, data); #endif } From 1dff5814be140a69de77b634f2d3e3ddac73243f Mon Sep 17 00:00:00 2001 From: raysan5 Date: Thu, 12 Aug 2021 21:01:09 +0200 Subject: [PATCH 2/3] ADDED: rlUpdateVertexBufferElements() #1915 --- src/rlgl.h | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/src/rlgl.h b/src/rlgl.h index 9cb1a2d89..6d18638db 100644 --- a/src/rlgl.h +++ b/src/rlgl.h @@ -506,8 +506,8 @@ RLAPI void rlDisableVertexBufferElement(void); // Disable vertex buffer RLAPI void rlEnableVertexAttribute(unsigned int index); // Enable vertex attribute index RLAPI void rlDisableVertexAttribute(unsigned int index);// Disable vertex attribute index #if defined(GRAPHICS_API_OPENGL_11) -RLAPI void rlEnableStatePointer(int vertexAttribType, void *buffer); -RLAPI void rlDisableStatePointer(int vertexAttribType); +RLAPI void rlEnableStatePointer(int vertexAttribType, void *buffer); // Enable attribute state pointer +RLAPI void rlDisableStatePointer(int vertexAttribType); // Disable attribute state pointer #endif // Textures state @@ -3223,6 +3223,7 @@ unsigned int rlLoadVertexBufferElement(void *buffer, int size, bool dynamic) return id; } +// Enable vertex buffer (VBO) void rlEnableVertexBuffer(unsigned int id) { #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) @@ -3230,6 +3231,7 @@ void rlEnableVertexBuffer(unsigned int id) #endif } +// Disable vertex buffer (VBO) void rlDisableVertexBuffer(void) { #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) @@ -3237,6 +3239,7 @@ void rlDisableVertexBuffer(void) #endif } +// Enable vertex buffer element (VBO element) void rlEnableVertexBufferElement(unsigned int id) { #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) @@ -3244,6 +3247,7 @@ void rlEnableVertexBufferElement(unsigned int id) #endif } +// Disable vertex buffer element (VBO element) void rlDisableVertexBufferElement(void) { #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) @@ -3251,7 +3255,7 @@ void rlDisableVertexBufferElement(void) #endif } -// Update GPU buffer with new data +// Update vertex buffer with new data // NOTE: dataSize and offset must be provided in bytes void rlUpdateVertexBuffer(unsigned int id, void *data, int dataSize, int offset) { @@ -3261,6 +3265,17 @@ void rlUpdateVertexBuffer(unsigned int id, void *data, int dataSize, int offset) #endif } +// Update vertex buffer elements with new data +// NOTE: dataSize and offset must be provided in bytes +void rlUpdateVertexBufferElements(unsigned int id, void *data, int dataSize, int offset) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, id); + glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, offset, dataSize, data); +#endif +} + +// Enable vertex array object (VAO) bool rlEnableVertexArray(unsigned int vaoId) { bool result = false; @@ -3274,6 +3289,7 @@ bool rlEnableVertexArray(unsigned int vaoId) return result; } +// Disable vertex array object (VAO) void rlDisableVertexArray(void) { #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) @@ -3281,6 +3297,7 @@ void rlDisableVertexArray(void) #endif } +// Enable vertex attribute index void rlEnableVertexAttribute(unsigned int index) { #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) @@ -3288,6 +3305,7 @@ void rlEnableVertexAttribute(unsigned int index) #endif } +// Disable vertex attribute index void rlDisableVertexAttribute(unsigned int index) { #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) @@ -3295,16 +3313,19 @@ void rlDisableVertexAttribute(unsigned int index) #endif } +// Draw vertex array void rlDrawVertexArray(int offset, int count) { glDrawArrays(GL_TRIANGLES, offset, count); } +// Draw vertex array elements void rlDrawVertexArrayElements(int offset, int count, void *buffer) { glDrawElements(GL_TRIANGLES, count, GL_UNSIGNED_SHORT, (unsigned short *)buffer + offset); } +// Draw vertex array instanced void rlDrawVertexArrayInstanced(int offset, int count, int instances) { #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) @@ -3312,6 +3333,7 @@ void rlDrawVertexArrayInstanced(int offset, int count, int instances) #endif } +// Draw vertex array elements instanced void rlDrawVertexArrayElementsInstanced(int offset, int count, void *buffer, int instances) { #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) @@ -3320,6 +3342,7 @@ void rlDrawVertexArrayElementsInstanced(int offset, int count, void *buffer, int } #if defined(GRAPHICS_API_OPENGL_11) +// Enable vertex state pointer void rlEnableStatePointer(int vertexAttribType, void *buffer) { if (buffer != NULL) glEnableClientState(vertexAttribType); @@ -3334,12 +3357,14 @@ void rlEnableStatePointer(int vertexAttribType, void *buffer) } } +// Disable vertex state pointer void rlDisableStatePointer(int vertexAttribType) { glDisableClientState(vertexAttribType); } #endif +// Load vertex array object (VAO) unsigned int rlLoadVertexArray(void) { unsigned int vaoId = 0; @@ -3352,6 +3377,7 @@ unsigned int rlLoadVertexArray(void) return vaoId; } +// Set vertex attribute void rlSetVertexAttribute(unsigned int index, int compSize, int type, bool normalized, int stride, void *pointer) { #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) @@ -3359,6 +3385,7 @@ void rlSetVertexAttribute(unsigned int index, int compSize, int type, bool norma #endif } +// Set vertex attribute divisor void rlSetVertexAttributeDivisor(unsigned int index, int divisor) { #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) @@ -3366,6 +3393,7 @@ void rlSetVertexAttributeDivisor(unsigned int index, int divisor) #endif } +// Unload vertex array object (VAO) void rlUnloadVertexArray(unsigned int vaoId) { #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) @@ -3378,6 +3406,7 @@ void rlUnloadVertexArray(unsigned int vaoId) #endif } +// Unload vertex buffer (VBO) void rlUnloadVertexBuffer(unsigned int vboId) { #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) From 092435d51c7cbb94105d0b2b34156e0bf28d5980 Mon Sep 17 00:00:00 2001 From: 630Studios Date: Thu, 12 Aug 2021 14:01:40 -0500 Subject: [PATCH 3/3] [Models] Fix for issue #1809 (#1917) * GenMeshTangents Fix * GenMeshTangents Fix - Comment Update * GenMeshTangents Fix - Comment Update final * Code Style Changes * Code Style Changes Final * Code Style Changes Final 2 * GenMeshTangents better handling for issue #1876 * GenMeshTangents better handling for issue #1876 * GenMeshTangents: Better fix for issue #1876 * vboId location fix * rlUpdateVertexBuffer - bufferId is an unsigned int * Fix for issue#1809 - Obj with more materials then mesh caused crash * Fix for issue#1809 - Formatting Update --- src/models.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/models.c b/src/models.c index 329d8d4a8..fd7daee6f 100644 --- a/src/models.c +++ b/src/models.c @@ -3370,7 +3370,7 @@ static Model LoadOBJ(const char *fileName) if (ret != TINYOBJ_SUCCESS) TRACELOG(LOG_WARNING, "MODEL: [%s] Failed to load OBJ data", fileName); else TRACELOG(LOG_INFO, "MODEL: [%s] OBJ data loaded successfully: %i meshes/%i materials", fileName, meshCount, materialCount); - model.meshCount = materialCount; // TODO: REVIEW!!! + model.meshCount = materialCount; // Init model materials array if (materialCount > 0) @@ -3389,7 +3389,7 @@ static Model LoadOBJ(const char *fileName) model.meshMaterial = (int *)RL_CALLOC(model.meshCount, sizeof(int)); // Count the faces for each material - int *matFaces = RL_CALLOC(meshCount, sizeof(int)); + int *matFaces = RL_CALLOC(materialCount, sizeof(int)); for (unsigned int mi = 0; mi < meshCount; mi++) { @@ -3400,7 +3400,6 @@ static Model LoadOBJ(const char *fileName) matFaces[idx]++; } } - //-------------------------------------- // Create the material meshes