diff --git a/src/models.c b/src/models.c index a78144167..4c5a08331 100644 --- a/src/models.c +++ b/src/models.c @@ -813,9 +813,6 @@ void UnloadModelKeepMeshes(Model model) TRACELOG(LOG_INFO, "MODEL: Unloaded model (but not meshes) from RAM and VRAM"); } -#define GL_UNSIGNED_BYTE 0x1401 -#define GL_FLOAT 0x1406 - // Upload vertex data into a VAO (if supported) and VBO void UploadMesh(Mesh *mesh, bool dynamic) { @@ -845,19 +842,19 @@ void UploadMesh(Mesh *mesh, bool dynamic) // Enable vertex attributes: position (shader-location = 0) mesh->vboId[0] = rlLoadVertexBuffer(mesh->vertices, mesh->vertexCount*3*sizeof(float), dynamic); - rlSetVertexAttribute(0, 3, GL_FLOAT, 0, 0, 0); + rlSetVertexAttribute(0, 3, RL_FLOAT, 0, 0, 0); rlEnableVertexAttribute(0); // Enable vertex attributes: texcoords (shader-location = 1) mesh->vboId[1] = rlLoadVertexBuffer(mesh->texcoords, mesh->vertexCount*2*sizeof(float), dynamic); - rlSetVertexAttribute(1, 2, GL_FLOAT, 0, 0, 0); + rlSetVertexAttribute(1, 2, RL_FLOAT, 0, 0, 0); rlEnableVertexAttribute(1); if (mesh->normals != NULL) { // Enable vertex attributes: normals (shader-location = 2) mesh->vboId[2] = rlLoadVertexBuffer(mesh->normals, mesh->vertexCount*3*sizeof(float), dynamic); - rlSetVertexAttribute(2, 3, GL_FLOAT, 0, 0, 0); + rlSetVertexAttribute(2, 3, RL_FLOAT, 0, 0, 0); rlEnableVertexAttribute(2); } else @@ -872,7 +869,7 @@ void UploadMesh(Mesh *mesh, bool dynamic) { // Enable vertex attribute: color (shader-location = 3) mesh->vboId[3] = rlLoadVertexBuffer(mesh->colors, mesh->vertexCount*4*sizeof(unsigned char), dynamic); - rlSetVertexAttribute(3, 4, GL_UNSIGNED_BYTE, 1, 0, 0); + rlSetVertexAttribute(3, 4, RL_UNSIGNED_BYTE, 1, 0, 0); rlEnableVertexAttribute(3); } else @@ -887,7 +884,7 @@ void UploadMesh(Mesh *mesh, bool dynamic) { // Enable vertex attribute: tangent (shader-location = 4) mesh->vboId[4] = rlLoadVertexBuffer(mesh->tangents, mesh->vertexCount*4*sizeof(float), dynamic); - rlSetVertexAttribute(4, 4, GL_FLOAT, 0, 0, 0); + rlSetVertexAttribute(4, 4, RL_FLOAT, 0, 0, 0); rlEnableVertexAttribute(4); } else @@ -902,7 +899,7 @@ void UploadMesh(Mesh *mesh, bool dynamic) { // Enable vertex attribute: texcoord2 (shader-location = 5) mesh->vboId[5] = rlLoadVertexBuffer(mesh->texcoords2, mesh->vertexCount*2*sizeof(float), dynamic); - rlSetVertexAttribute(5, 2, GL_FLOAT, 0, 0, 0); + rlSetVertexAttribute(5, 2, RL_FLOAT, 0, 0, 0); rlEnableVertexAttribute(5); } else @@ -929,37 +926,35 @@ void UploadMesh(Mesh *mesh, bool dynamic) void DrawMesh(Mesh mesh, Material material, Matrix transform) { #if defined(GRAPHICS_API_OPENGL_11) -/* - glEnable(GL_TEXTURE_2D); - glBindTexture(GL_TEXTURE_2D, material.maps[MATERIAL_MAP_DIFFUSE].texture.id); - - // NOTE: On OpenGL 1.1 we use Vertex Arrays to draw model - glEnableClientState(GL_VERTEX_ARRAY); // Enable vertex array - glEnableClientState(GL_TEXTURE_COORD_ARRAY); // Enable texture coords array - if (mesh.normals != NULL) glEnableClientState(GL_NORMAL_ARRAY); // Enable normals array - if (mesh.colors != NULL) glEnableClientState(GL_COLOR_ARRAY); // Enable colors array + #define GL_VERTEX_ARRAY 0x8074 + #define GL_NORMAL_ARRAY 0x8075 + #define GL_COLOR_ARRAY 0x8076 + #define GL_TEXTURE_COORD_ARRAY 0x8078 - glVertexPointer(3, GL_FLOAT, 0, mesh.vertices); // Pointer to vertex coords array - glTexCoordPointer(2, GL_FLOAT, 0, mesh.texcoords); // Pointer to texture coords array - if (mesh.normals != NULL) glNormalPointer(GL_FLOAT, 0, mesh.normals); // Pointer to normals array - if (mesh.colors != NULL) glColorPointer(4, GL_UNSIGNED_BYTE, 0, mesh.colors); // Pointer to colors array + rlEnableTexture(material.maps[MATERIAL_MAP_DIFFUSE].texture.id); + rlEnableStatePointer(GL_VERTEX_ARRAY, mesh.vertices); + rlEnableStatePointer(GL_TEXTURE_COORD_ARRAY, mesh.texcoords); + rlEnableStatePointer(GL_NORMAL_ARRAY, mesh.normals); + rlEnableStatePointer(GL_COLOR_ARRAY, mesh.colors); + rlPushMatrix(); rlMultMatrixf(MatrixToFloat(transform)); - rlColor4ub(material.maps[MATERIAL_MAP_DIFFUSE].color.r, material.maps[MATERIAL_MAP_DIFFUSE].color.g, material.maps[MATERIAL_MAP_DIFFUSE].color.b, material.maps[MATERIAL_MAP_DIFFUSE].color.a); + rlColor4ub(material.maps[MATERIAL_MAP_DIFFUSE].color.r, + material.maps[MATERIAL_MAP_DIFFUSE].color.g, + material.maps[MATERIAL_MAP_DIFFUSE].color.b, + material.maps[MATERIAL_MAP_DIFFUSE].color.a); - if (mesh.indices != NULL) glDrawArrayElements(GL_TRIANGLES, mesh.triangleCount*3, GL_UNSIGNED_SHORT, mesh.indices); - else glDrawArrays(0, mesh.vertexCount); + if (mesh.indices != NULL) rlDrawVertexArrayElements(0, mesh.triangleCount*3, mesh.indices); + else rlDrawVertexArray(0, mesh.vertexCount); rlPopMatrix(); - glDisableClientState(GL_VERTEX_ARRAY); // Disable vertex array - glDisableClientState(GL_TEXTURE_COORD_ARRAY); // Disable texture coords array - if (mesh.normals != NULL) glDisableClientState(GL_NORMAL_ARRAY); // Disable normals array - if (mesh.colors != NULL) glDisableClientState(GL_NORMAL_ARRAY); // Disable colors array + rlDisableStatePointer(GL_VERTEX_ARRAY); + rlDisableStatePointer(GL_TEXTURE_COORD_ARRAY); + rlDisableStatePointer(GL_NORMAL_ARRAY); + rlDisableStatePointer(GL_COLOR_ARRAY); - glDisable(GL_TEXTURE_2D); - glBindTexture(GL_TEXTURE_2D, 0); -*/ + rlDisableTexture(); #endif #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) @@ -1039,23 +1034,23 @@ void DrawMesh(Mesh mesh, Material material, Matrix transform) { // Bind mesh VBO data: vertex position (shader-location = 0) rlEnableVertexBuffer(mesh.vboId[0]); - rlSetVertexAttribute(material.shader.locs[SHADER_LOC_VERTEX_POSITION], 3, GL_FLOAT, 0, 0, 0); + rlSetVertexAttribute(material.shader.locs[SHADER_LOC_VERTEX_POSITION], 3, RL_FLOAT, 0, 0, 0); rlEnableVertexAttribute(material.shader.locs[SHADER_LOC_VERTEX_POSITION]); rlEnableVertexBuffer(mesh.vboId[0]); - rlSetVertexAttribute(material.shader.locs[SHADER_LOC_VERTEX_POSITION], 3, GL_FLOAT, 0, 0, 0); + rlSetVertexAttribute(material.shader.locs[SHADER_LOC_VERTEX_POSITION], 3, RL_FLOAT, 0, 0, 0); rlEnableVertexAttribute(material.shader.locs[SHADER_LOC_VERTEX_POSITION]); // Bind mesh VBO data: vertex texcoords (shader-location = 1) rlEnableVertexBuffer(mesh.vboId[1]); - rlSetVertexAttribute(material.shader.locs[SHADER_LOC_VERTEX_TEXCOORD01], 2, GL_FLOAT, 0, 0, 0); + rlSetVertexAttribute(material.shader.locs[SHADER_LOC_VERTEX_TEXCOORD01], 2, RL_FLOAT, 0, 0, 0); rlEnableVertexAttribute(material.shader.locs[SHADER_LOC_VERTEX_TEXCOORD01]); if (material.shader.locs[SHADER_LOC_VERTEX_NORMAL] != -1) { // Bind mesh VBO data: vertex normals (shader-location = 2) rlEnableVertexBuffer(mesh.vboId[2]); - rlSetVertexAttribute(material.shader.locs[SHADER_LOC_VERTEX_NORMAL], 3, GL_FLOAT, 0, 0, 0); + rlSetVertexAttribute(material.shader.locs[SHADER_LOC_VERTEX_NORMAL], 3, RL_FLOAT, 0, 0, 0); rlEnableVertexAttribute(material.shader.locs[SHADER_LOC_VERTEX_NORMAL]); } @@ -1065,7 +1060,7 @@ void DrawMesh(Mesh mesh, Material material, Matrix transform) if (mesh.vboId[3] != 0) { rlEnableVertexBuffer(mesh.vboId[3]); - rlSetVertexAttribute(material.shader.locs[SHADER_LOC_VERTEX_COLOR], 4, GL_UNSIGNED_BYTE, 1, 0, 0); + rlSetVertexAttribute(material.shader.locs[SHADER_LOC_VERTEX_COLOR], 4, RL_UNSIGNED_BYTE, 1, 0, 0); rlEnableVertexAttribute(material.shader.locs[SHADER_LOC_VERTEX_COLOR]); } else @@ -1082,7 +1077,7 @@ void DrawMesh(Mesh mesh, Material material, Matrix transform) if (material.shader.locs[SHADER_LOC_VERTEX_TANGENT] != -1) { rlEnableVertexBuffer(mesh.vboId[4]); - rlSetVertexAttribute(material.shader.locs[SHADER_LOC_VERTEX_TANGENT], 4, GL_FLOAT, 0, 0, 0); + rlSetVertexAttribute(material.shader.locs[SHADER_LOC_VERTEX_TANGENT], 4, RL_FLOAT, 0, 0, 0); rlEnableVertexAttribute(material.shader.locs[SHADER_LOC_VERTEX_TANGENT]); } @@ -1090,7 +1085,7 @@ void DrawMesh(Mesh mesh, Material material, Matrix transform) if (material.shader.locs[SHADER_LOC_VERTEX_TEXCOORD02] != -1) { rlEnableVertexBuffer(mesh.vboId[5]); - rlSetVertexAttribute(material.shader.locs[SHADER_LOC_VERTEX_TEXCOORD02], 2, GL_FLOAT, 0, 0, 0); + rlSetVertexAttribute(material.shader.locs[SHADER_LOC_VERTEX_TEXCOORD02], 2, RL_FLOAT, 0, 0, 0); rlEnableVertexAttribute(material.shader.locs[SHADER_LOC_VERTEX_TEXCOORD02]); } @@ -1124,7 +1119,7 @@ void DrawMesh(Mesh mesh, Material material, Matrix transform) rlSetUniformMatrix(material.shader.locs[SHADER_LOC_MATRIX_MVP], matMVP); // Draw calls - if (mesh.indices != NULL) rlDrawVertexArrayElements(0, mesh.triangleCount*3); + if (mesh.indices != NULL) rlDrawVertexArrayElements(0, mesh.triangleCount*3, 0); else rlDrawVertexArray(0, mesh.vertexCount); } diff --git a/src/rlgl.h b/src/rlgl.h index e1c161045..206b81946 100644 --- a/src/rlgl.h +++ b/src/rlgl.h @@ -206,6 +206,10 @@ #define RL_TRIANGLES 0x0004 // GL_TRIANGLES #define RL_QUADS 0x0007 // GL_QUADS +// GL equivalent data types +#define RL_UNSIGNED_BYTE 0x1401 // GL_UNSIGNED_BYTE +#define RL_FLOAT 0x1406 // GL_FLOAT + //---------------------------------------------------------------------------------- // Types and Structures Definition //---------------------------------------------------------------------------------- @@ -514,6 +518,10 @@ RLAPI void rlEnableVertexBufferElement(unsigned int id);// Enable vertex buffer RLAPI void rlDisableVertexBufferElement(void); // Disable vertex buffer element (VBO element) 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); +#endif // Textures state RLAPI void rlActiveTextureSlot(int slot); // Select and active a texture slot @@ -594,7 +602,7 @@ RLAPI void rlUnloadVertexBuffer(unsigned int vboId); RLAPI void rlSetVertexAttribute(unsigned int index, int compSize, int type, bool normalized, int stride, void *pointer); RLAPI void rlSetVertexAttributeDefault(int locIndex, const void *value, int attribType, int count); // Set vertex attribute default value RLAPI void rlDrawVertexArray(int offset, int count); -RLAPI void rlDrawVertexArrayElements(int offset, int count); +RLAPI void rlDrawVertexArrayElements(int offset, int count, void *buffer); // Textures management RLAPI unsigned int rlLoadTexture(void *data, int width, int height, int format, int mipmapCount); // Load texture in GPU @@ -770,6 +778,7 @@ RLAPI Texture2D rlGenTextureBRDF(Shader shader, int size); // Gener #define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 #define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 #endif + #if defined(GRAPHICS_API_OPENGL_21) #define GL_LUMINANCE 0x1909 #define GL_LUMINANCE_ALPHA 0x190A @@ -1041,7 +1050,6 @@ void rlOrtho(double left, double right, double bottom, double top, double znear, *RLGL.State.currentMatrix = MatrixMultiply(*RLGL.State.currentMatrix, matOrtho); } - #endif // Set the viewport area (transformation from normalized device coordinates to window coordinates) @@ -1295,14 +1303,16 @@ void rlSetTexture(unsigned int id) RLGL.currentBatch->draws[RLGL.currentBatch->drawsCounter - 1].textureId = id; RLGL.currentBatch->draws[RLGL.currentBatch->drawsCounter - 1].vertexCount = 0; } - } #endif + } } // Select and active a texture slot void rlActiveTextureSlot(int slot) { +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) glActiveTexture(GL_TEXTURE0 + slot); +#endif } // Enable texture @@ -1326,19 +1336,19 @@ void rlDisableTexture(void) // Enable texture cubemap void rlEnableTextureCubemap(unsigned int id) { -#if defined(GRAPHICS_API_OPENGL_11) - glEnable(GL_TEXTURE_CUBE_MAP); -#endif +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + glEnable(GL_TEXTURE_CUBE_MAP); // Core in OpenGL 1.4 glBindTexture(GL_TEXTURE_CUBE_MAP, id); +#endif } // Disable texture cubemap void rlDisableTextureCubemap(void) { -#if defined(GRAPHICS_API_OPENGL_11) +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) glDisable(GL_TEXTURE_CUBE_MAP); -#endif glBindTexture(GL_TEXTURE_CUBE_MAP, 0); +#endif } // Set texture parameters (wrap mode/filter mode) @@ -3028,22 +3038,30 @@ unsigned int rlLoadVertexBufferElement(void *buffer, int size, bool dynamic) void rlEnableVertexBuffer(unsigned int id) { +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) glBindBuffer(GL_ARRAY_BUFFER, id); +#endif } void rlDisableVertexBuffer(void) { +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) glBindBuffer(GL_ARRAY_BUFFER, 0); +#endif } void rlEnableVertexBufferElement(unsigned int id) { +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, id); +#endif } void rlDisableVertexBufferElement(void) { +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); +#endif } // Update GPU buffer with new data @@ -3095,24 +3113,46 @@ void rlDrawVertexArray(int offset, int count) glDrawArrays(GL_TRIANGLES, offset, count); } -void rlDrawVertexArrayElements(int offset, int count) +void rlDrawVertexArrayElements(int offset, int count, void *buffer) { - // TODO: review offset - glDrawElements(GL_TRIANGLES, count, GL_UNSIGNED_SHORT, 0); + glDrawElements(GL_TRIANGLES, count, GL_UNSIGNED_SHORT, buffer + offset); } +#if defined(GRAPHICS_API_OPENGL_11) +void rlEnableStatePointer(int vertexAttribType, void *buffer) +{ + if (buffer != NULL) glEnableClientState(vertexAttribType); + switch (vertexAttribType) + { + case GL_VERTEX_ARRAY: glVertexPointer(3, GL_FLOAT, 0, buffer); break; + case GL_TEXTURE_COORD_ARRAY: glTexCoordPointer(2, GL_FLOAT, 0, buffer); break; + case GL_NORMAL_ARRAY: if (buffer != NULL) glNormalPointer(GL_FLOAT, 0, buffer); break; + case GL_COLOR_ARRAY: if (buffer != NULL) glColorPointer(4, GL_UNSIGNED_BYTE, 0, buffer); break; + //case GL_INDEX_ARRAY: if (buffer != NULL) glIndexPointer(GL_SHORT, 0, buffer); break; // Indexed colors + default: break; + } +} + +void rlDisableStatePointer(int vertexAttribType) +{ + glDisableClientState(vertexAttribType); +} +#endif + unsigned int rlLoadVertexArray(void) { unsigned int vaoId = 0; - +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) glGenVertexArrays(1, &vaoId); - +#endif return vaoId; } 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) glVertexAttribPointer(index, compSize, type, normalized, stride, pointer); +#endif } void rlUnloadVertexArray(unsigned int vaoId) @@ -3129,12 +3169,12 @@ void rlUnloadVertexArray(unsigned int vaoId) void rlUnloadVertexBuffer(unsigned int vboId) { +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) glDeleteBuffers(1, &vboId); TRACELOG(LOG_INFO, "VBO: Unloaded vertex data from VRAM (GPU)"); +#endif } - - // Shaders management //----------------------------------------------------------------------------------------------- // Load shader from code strings @@ -3439,12 +3479,15 @@ Matrix rlGetMatrixProjection(void) // Get internal accumulated transform matrix Matrix rlGetMatrixTransform(void) { + Matrix mat = MatrixIdentity(); +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) // TODO: Consider possible transform matrices in the RLGL.State.stack // Is this the right order? or should we start with the first stored matrix instead of the last one? //Matrix matStackTransform = MatrixIdentity(); //for (int i = RLGL.State.stackCounter; i > 0; i--) matStackTransform = MatrixMultiply(RLGL.State.stack[i], matStackTransform); - - return RLGL.State.transform; + mat = RLGL.State.transform; +#endif + return mat; } // Set a custom modelview matrix (replaces internal modelview matrix)