summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorRay <[email protected]>2021-03-25 20:35:48 +0100
committerRay <[email protected]>2021-03-25 20:35:48 +0100
commitfb9a437f8aa650c8b7903e1f22a199725b49b006 (patch)
treedd3695b24c4f171e747807a5848d537ebbe166d8
parentcba412cc313e4f95eafb3fba9303400e65c98984 (diff)
downloadraylib-fb9a437f8aa650c8b7903e1f22a199725b49b006.tar.gz
raylib-fb9a437f8aa650c8b7903e1f22a199725b49b006.zip
REVIEWED: OpenGL 1.1 working again
-rw-r--r--src/models.c75
-rw-r--r--src/rlgl.h77
2 files changed, 95 insertions, 57 deletions
diff --git a/src/models.c b/src/models.c
index a7814416..4c5a0833 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 e1c16104..206b8194 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)