Add support for opengl 2.1

This commit is contained in:
Denis Volk 2016-05-15 12:09:42 +02:00
parent 75a73d9417
commit a9e88c1cc9
4 changed files with 105 additions and 59 deletions

View File

@ -55,7 +55,7 @@
#if defined(PLATFORM_DESKTOP) #if defined(PLATFORM_DESKTOP)
#define GLAD_EXTENSIONS_LOADER #define GLAD_EXTENSIONS_LOADER
#if defined(GLEW_EXTENSIONS_LOADER) #if defined(GLEW_EXTENSIONS_LOADER) || defined(GRAPHICS_API_OPENGL_21)
#define GLEW_STATIC #define GLEW_STATIC
#include <GL/glew.h> // GLEW extensions loading lib #include <GL/glew.h> // GLEW extensions loading lib
#elif defined(GLAD_EXTENSIONS_LOADER) #elif defined(GLAD_EXTENSIONS_LOADER)
@ -1504,7 +1504,7 @@ static void InitDisplay(int width, int height)
// NOTE: GLEW is a big library that loads ALL extensions, we can use some alternative to load only required ones // NOTE: GLEW is a big library that loads ALL extensions, we can use some alternative to load only required ones
// Alternatives: glLoadGen, glad, libepoxy // Alternatives: glLoadGen, glad, libepoxy
#elif defined(GLAD_EXTENSIONS_LOADER) #elif defined(GLAD_EXTENSIONS_LOADER) && defined(GRAPHICS_API_OPENGL_33)
// NOTE: glad is generated and contains only required OpenGL version and Core extensions // NOTE: glad is generated and contains only required OpenGL version and Core extensions
//if (!gladLoadGL()) TraceLog(ERROR, "Failed to initialize glad\n"); //if (!gladLoadGL()) TraceLog(ERROR, "Failed to initialize glad\n");
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) TraceLog(ERROR, "Failed to initialize glad\n"); // No GLFW3 in this module... if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) TraceLog(ERROR, "Failed to initialize glad\n"); // No GLFW3 in this module...
@ -1516,6 +1516,15 @@ static void InitDisplay(int width, int height)
//if (GLAD_GL_ARB_vertex_array_object) // Use GL_ARB_vertex_array_object //if (GLAD_GL_ARB_vertex_array_object) // Use GL_ARB_vertex_array_object
#endif #endif
} }
#if defined(GRAPHICS_API_OPENGL_21)
else if(rlGetVersion() == OPENGL_21)
{
GLenum error = glewInit();
if (error != GLEW_OK) TraceLog(ERROR, "Failed to initialize GLEW - Error Code: %s\n", glewGetErrorString(error));
if (glewIsSupported("GL_VERSION_2_1")) TraceLog(INFO, "OpenGL 2.1 profile supported");
else TraceLog(ERROR, "OpenGL 2.1 profile not supported");
}
#endif
#endif #endif
// Enables GPU v-sync, so frames are not limited to screen refresh rate (60Hz -> 60 FPS) // Enables GPU v-sync, so frames are not limited to screen refresh rate (60Hz -> 60 FPS)

View File

@ -49,6 +49,7 @@ ifeq ($(PLATFORM),PLATFORM_RPI)
else else
# define raylib graphics api to use (OpenGL 1.1 by default) # define raylib graphics api to use (OpenGL 1.1 by default)
GRAPHICS ?= GRAPHICS_API_OPENGL_11 GRAPHICS ?= GRAPHICS_API_OPENGL_11
#GRAPHICS = GRAPHICS_API_OPENGL_21 # Uncomment to use OpenGL 2.1
#GRAPHICS = GRAPHICS_API_OPENGL_33 # Uncomment to use OpenGL 3.3 #GRAPHICS = GRAPHICS_API_OPENGL_33 # Uncomment to use OpenGL 3.3
endif endif
ifeq ($(PLATFORM),PLATFORM_WEB) ifeq ($(PLATFORM),PLATFORM_WEB)

View File

@ -42,6 +42,15 @@
#endif #endif
#endif #endif
#if defined(GRAPHICS_API_OPENGL_21)
#ifdef __APPLE__
// ?
#else
#define GLEW_STATIC
#include <GL/glew.h>
#endif
#endif
#if defined(GRAPHICS_API_OPENGL_33) #if defined(GRAPHICS_API_OPENGL_33)
#ifdef __APPLE__ // OpenGL include for OSX #ifdef __APPLE__ // OpenGL include for OSX
#include <OpenGL/gl3.h> #include <OpenGL/gl3.h>
@ -158,7 +167,7 @@ typedef struct {
float *vertices; // 3 components per vertex float *vertices; // 3 components per vertex
float *texcoords; // 2 components per vertex float *texcoords; // 2 components per vertex
unsigned char *colors; // 4 components per vertex unsigned char *colors; // 4 components per vertex
#if defined(GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_33) #if defined(GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_21)
unsigned int *indices; // 6 indices per quad (could be int) unsigned int *indices; // 6 indices per quad (could be int)
#elif defined(GRAPHICS_API_OPENGL_ES2) #elif defined(GRAPHICS_API_OPENGL_ES2)
unsigned short *indices; // 6 indices per quad (must be short) unsigned short *indices; // 6 indices per quad (must be short)
@ -197,7 +206,7 @@ typedef enum { INFO = 0, ERROR, WARNING, DEBUG, OTHER } TraceLogType;
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
// Global Variables Definition // Global Variables Definition
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) || defined(GRAPHICS_API_OPENGL_21)
static Matrix stack[MATRIX_STACK_SIZE]; static Matrix stack[MATRIX_STACK_SIZE];
static int stackCounter = 0; static int stackCounter = 0;
@ -277,7 +286,7 @@ unsigned int whiteTexture;
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
// Module specific Functions Declaration // Module specific Functions Declaration
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) || defined(GRAPHICS_API_OPENGL_21)
static Shader LoadDefaultShader(void); static Shader LoadDefaultShader(void);
static Shader LoadSimpleShader(void); static Shader LoadSimpleShader(void);
static void InitializeBuffers(void); static void InitializeBuffers(void);
@ -351,7 +360,7 @@ void rlRotatef(float angleDeg, float x, float y, float z) { glRotatef(angleDeg,
void rlScalef(float x, float y, float z) { glScalef(x, y, z); } void rlScalef(float x, float y, float z) { glScalef(x, y, z); }
void rlMultMatrixf(float *mat) { glMultMatrixf(mat); } void rlMultMatrixf(float *mat) { glMultMatrixf(mat); }
#elif defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) #elif defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) || defined(GRAPHICS_API_OPENGL_21)
// Choose the current matrix to be transformed // Choose the current matrix to be transformed
void rlMatrixMode(int mode) void rlMatrixMode(int mode)
@ -487,7 +496,7 @@ void rlColor4ub(byte r, byte g, byte b, byte a) { glColor4ub(r, g, b, a); }
void rlColor3f(float x, float y, float z) { glColor3f(x, y, z); } void rlColor3f(float x, float y, float z) { glColor3f(x, y, z); }
void rlColor4f(float x, float y, float z, float w) { glColor4f(x, y, z, w); } void rlColor4f(float x, float y, float z, float w) { glColor4f(x, y, z, w); }
#elif defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) #elif defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) || defined(GRAPHICS_API_OPENGL_21)
// Initialize drawing mode (how to organize vertex) // Initialize drawing mode (how to organize vertex)
void rlBegin(int mode) void rlBegin(int mode)
@ -760,7 +769,7 @@ void rlEnableTexture(unsigned int id)
glBindTexture(GL_TEXTURE_2D, id); glBindTexture(GL_TEXTURE_2D, id);
#endif #endif
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) || defined(GRAPHICS_API_OPENGL_21)
if (draws[drawsCounter - 1].textureId != id) if (draws[drawsCounter - 1].textureId != id)
{ {
if (draws[drawsCounter - 1].vertexCount > 0) drawsCounter++; if (draws[drawsCounter - 1].vertexCount > 0) drawsCounter++;
@ -789,7 +798,7 @@ void rlDeleteTextures(unsigned int id)
// Enable rendering to postprocessing FBO // Enable rendering to postprocessing FBO
void rlEnablePostproFBO() void rlEnablePostproFBO()
{ {
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) || defined(GRAPHICS_API_OPENGL_21)
glBindFramebuffer(GL_FRAMEBUFFER, postproFbo.id); glBindFramebuffer(GL_FRAMEBUFFER, postproFbo.id);
#endif #endif
} }
@ -797,7 +806,7 @@ void rlEnablePostproFBO()
// Unload shader from GPU memory // Unload shader from GPU memory
void rlDeleteShader(unsigned int id) void rlDeleteShader(unsigned int id)
{ {
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) || defined(GRAPHICS_API_OPENGL_21)
glDeleteProgram(id); glDeleteProgram(id);
#endif #endif
} }
@ -805,7 +814,7 @@ void rlDeleteShader(unsigned int id)
// Unload vertex data (VAO) from GPU memory // Unload vertex data (VAO) from GPU memory
void rlDeleteVertexArrays(unsigned int id) void rlDeleteVertexArrays(unsigned int id)
{ {
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) || defined(GRAPHICS_API_OPENGL_21)
if (vaoSupported) glDeleteVertexArrays(1, &id); if (vaoSupported) glDeleteVertexArrays(1, &id);
#endif #endif
} }
@ -813,7 +822,7 @@ void rlDeleteVertexArrays(unsigned int id)
// Unload vertex data (VBO) from GPU memory // Unload vertex data (VBO) from GPU memory
void rlDeleteBuffers(unsigned int id) void rlDeleteBuffers(unsigned int id)
{ {
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) || defined(GRAPHICS_API_OPENGL_21)
glDeleteBuffers(1, &id); glDeleteBuffers(1, &id);
#endif #endif
} }
@ -846,6 +855,8 @@ int rlGetVersion(void)
return OPENGL_33; return OPENGL_33;
#elif defined(GRAPHICS_API_OPENGL_ES2) #elif defined(GRAPHICS_API_OPENGL_ES2)
return OPENGL_ES_20; return OPENGL_ES_20;
#elif defined(GRAPHICS_API_OPENGL_21)
return OPENGL_21;
#endif #endif
} }
@ -889,11 +900,11 @@ void rlglInit(void)
//TraceLog(INFO, "OpenGL 1.1 (or driver default) profile initialized"); //TraceLog(INFO, "OpenGL 1.1 (or driver default) profile initialized");
#endif #endif
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) || defined(GRAPHICS_API_OPENGL_21)
// Get supported extensions list // Get supported extensions list
GLint numExt = 0; GLint numExt = 0;
#if defined(GRAPHICS_API_OPENGL_33) #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_21)
// NOTE: On OpenGL 3.3 VAO and NPOT are supported by default // NOTE: On OpenGL 3.3 VAO and NPOT are supported by default
vaoSupported = true; vaoSupported = true;
@ -1046,7 +1057,7 @@ void rlglInit(void)
// Modifies global variables: postproFbo, postproQuad // Modifies global variables: postproFbo, postproQuad
void rlglInitPostpro(void) void rlglInitPostpro(void)
{ {
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) || defined(GRAPHICS_API_OPENGL_21)
postproFbo = rlglLoadFBO(screenWidth, screenHeight); postproFbo = rlglLoadFBO(screenWidth, screenHeight);
if (postproFbo.id > 0) if (postproFbo.id > 0)
@ -1082,7 +1093,7 @@ FBO rlglLoadFBO(int width, int height)
FBO fbo; FBO fbo;
fbo.id = 0; fbo.id = 0;
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) || defined(GRAPHICS_API_OPENGL_21)
// Create the texture that will serve as the color attachment for the framebuffer // Create the texture that will serve as the color attachment for the framebuffer
glGenTextures(1, &fbo.colorTextureId); glGenTextures(1, &fbo.colorTextureId);
glBindTexture(GL_TEXTURE_2D, fbo.colorTextureId); glBindTexture(GL_TEXTURE_2D, fbo.colorTextureId);
@ -1149,7 +1160,7 @@ FBO rlglLoadFBO(int width, int height)
// Unload framebuffer object // Unload framebuffer object
void rlglUnloadFBO(FBO fbo) void rlglUnloadFBO(FBO fbo)
{ {
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) || defined(GRAPHICS_API_OPENGL_21)
glDeleteFramebuffers(1, &fbo.id); glDeleteFramebuffers(1, &fbo.id);
glDeleteTextures(1, &fbo.colorTextureId); glDeleteTextures(1, &fbo.colorTextureId);
glDeleteTextures(1, &fbo.depthTextureId); glDeleteTextures(1, &fbo.depthTextureId);
@ -1161,7 +1172,7 @@ void rlglUnloadFBO(FBO fbo)
// Vertex Buffer Object deinitialization (memory free) // Vertex Buffer Object deinitialization (memory free)
void rlglClose(void) void rlglClose(void)
{ {
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) || defined(GRAPHICS_API_OPENGL_21)
// Unbind everything // Unbind everything
if (vaoSupported) glBindVertexArray(0); if (vaoSupported) glBindVertexArray(0);
glDisableVertexAttribArray(0); glDisableVertexAttribArray(0);
@ -1241,7 +1252,7 @@ void rlglClose(void)
// Drawing batches: triangles, quads, lines // Drawing batches: triangles, quads, lines
void rlglDraw(void) void rlglDraw(void)
{ {
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) || defined(GRAPHICS_API_OPENGL_21)
UpdateBuffers(); UpdateBuffers();
if ((lines.vCounter > 0) || (triangles.vCounter > 0) || (quads.vCounter > 0)) if ((lines.vCounter > 0) || (triangles.vCounter > 0) || (quads.vCounter > 0))
@ -1355,7 +1366,7 @@ void rlglDraw(void)
glBindTexture(GL_TEXTURE_2D, draws[i].textureId); glBindTexture(GL_TEXTURE_2D, draws[i].textureId);
// NOTE: The final parameter tells the GPU the offset in bytes from the start of the index buffer to the location of the first index to process // NOTE: The final parameter tells the GPU the offset in bytes from the start of the index buffer to the location of the first index to process
#if defined(GRAPHICS_API_OPENGL_33) #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_21)
glDrawElements(GL_TRIANGLES, numIndicesToProcess, GL_UNSIGNED_INT, (GLvoid*) (sizeof(GLuint) * indicesOffset)); glDrawElements(GL_TRIANGLES, numIndicesToProcess, GL_UNSIGNED_INT, (GLvoid*) (sizeof(GLuint) * indicesOffset));
#elif defined(GRAPHICS_API_OPENGL_ES2) #elif defined(GRAPHICS_API_OPENGL_ES2)
glDrawElements(GL_TRIANGLES, numIndicesToProcess, GL_UNSIGNED_SHORT, (GLvoid*) (sizeof(GLushort) * indicesOffset)); glDrawElements(GL_TRIANGLES, numIndicesToProcess, GL_UNSIGNED_SHORT, (GLvoid*) (sizeof(GLushort) * indicesOffset));
@ -1403,7 +1414,7 @@ void rlglDraw(void)
// Draw with postprocessing shader // Draw with postprocessing shader
void rlglDrawPostpro(void) void rlglDrawPostpro(void)
{ {
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) || defined(GRAPHICS_API_OPENGL_21)
glBindFramebuffer(GL_FRAMEBUFFER, 0); glBindFramebuffer(GL_FRAMEBUFFER, 0);
rlglDrawModel(postproQuad, (Vector3){ 0.0f, 0.0f, 0.0f }, (Vector3){ 0.0f, 0.0f, 0.0f }, 0.0f, (Vector3){1.0f, 1.0f, 1.0f}, (Color){ 255, 255, 255, 255 }, false); rlglDrawModel(postproQuad, (Vector3){ 0.0f, 0.0f, 0.0f }, (Vector3){ 0.0f, 0.0f, 0.0f }, 0.0f, (Vector3){1.0f, 1.0f, 1.0f}, (Color){ 255, 255, 255, 255 }, false);
@ -1414,7 +1425,7 @@ void rlglDrawPostpro(void)
// NOTE: Model transform can come within model struct // NOTE: Model transform can come within model struct
void rlglDrawModel(Model model, Vector3 position, Vector3 rotationAxis, float rotationAngle, Vector3 scale, Color color, bool wires) void rlglDrawModel(Model model, Vector3 position, Vector3 rotationAxis, float rotationAngle, Vector3 scale, Color color, bool wires)
{ {
#if defined (GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_33) #if defined (GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_21)
// NOTE: glPolygonMode() not available on OpenGL ES // NOTE: glPolygonMode() not available on OpenGL ES
if (wires) glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); if (wires) glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
#endif #endif
@ -1451,7 +1462,7 @@ void rlglDrawModel(Model model, Vector3 position, Vector3 rotationAxis, float ro
glBindTexture(GL_TEXTURE_2D, 0); glBindTexture(GL_TEXTURE_2D, 0);
#endif #endif
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) || defined(GRAPHICS_API_OPENGL_21)
glUseProgram(model.shader.id); glUseProgram(model.shader.id);
// At this point the modelview matrix just contains the view matrix (camera) // At this point the modelview matrix just contains the view matrix (camera)
@ -1552,7 +1563,7 @@ void rlglDrawModel(Model model, Vector3 position, Vector3 rotationAxis, float ro
glUseProgram(0); // Unbind shader program glUseProgram(0); // Unbind shader program
#endif #endif
#if defined (GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_33) #if defined (GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_21)
// NOTE: glPolygonMode() not available on OpenGL ES // NOTE: glPolygonMode() not available on OpenGL ES
if (wires) glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); if (wires) glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
#endif #endif
@ -1684,7 +1695,7 @@ unsigned int rlglLoadTexture(void *data, int width, int height, int textureForma
TraceLog(WARNING, "DXT compressed texture format not supported"); TraceLog(WARNING, "DXT compressed texture format not supported");
return id; return id;
} }
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) || defined(GRAPHICS_API_OPENGL_21)
if ((!texCompETC1Supported) && (textureFormat == COMPRESSED_ETC1_RGB)) if ((!texCompETC1Supported) && (textureFormat == COMPRESSED_ETC1_RGB))
{ {
TraceLog(WARNING, "ETC1 compressed texture format not supported"); TraceLog(WARNING, "ETC1 compressed texture format not supported");
@ -1712,13 +1723,13 @@ unsigned int rlglLoadTexture(void *data, int width, int height, int textureForma
glGenTextures(1, &id); // Generate Pointer to the texture glGenTextures(1, &id); // Generate Pointer to the texture
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) || defined(GRAPHICS_API_OPENGL_21)
//glActiveTexture(GL_TEXTURE0); // If not defined, using GL_TEXTURE0 by default (shader texture) //glActiveTexture(GL_TEXTURE0); // If not defined, using GL_TEXTURE0 by default (shader texture)
#endif #endif
glBindTexture(GL_TEXTURE_2D, id); glBindTexture(GL_TEXTURE_2D, id);
#if defined(GRAPHICS_API_OPENGL_33) #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_21)
// NOTE: We define internal (GPU) format as GL_RGBA8 (probably BGRA8 in practice, driver takes care) // NOTE: We define internal (GPU) format as GL_RGBA8 (probably BGRA8 in practice, driver takes care)
// NOTE: On embedded systems, we let the driver choose the best internal format // NOTE: On embedded systems, we let the driver choose the best internal format
@ -1822,7 +1833,7 @@ unsigned int rlglLoadTexture(void *data, int width, int height, int textureForma
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); // Alternative: GL_LINEAR glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); // Alternative: GL_LINEAR
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); // Alternative: GL_LINEAR glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); // Alternative: GL_LINEAR
#if defined(GRAPHICS_API_OPENGL_33) #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_21)
if (mipmapCount > 1) if (mipmapCount > 1)
{ {
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
@ -1847,7 +1858,7 @@ void rlglUpdateTexture(unsigned int id, int width, int height, int format, void
{ {
glBindTexture(GL_TEXTURE_2D, id); glBindTexture(GL_TEXTURE_2D, id);
#if defined(GRAPHICS_API_OPENGL_33) #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_21)
switch (format) switch (format)
{ {
case UNCOMPRESSED_GRAYSCALE: glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_RED, GL_UNSIGNED_BYTE, (unsigned char *)data); break; case UNCOMPRESSED_GRAYSCALE: glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_RED, GL_UNSIGNED_BYTE, (unsigned char *)data); break;
@ -1916,7 +1927,7 @@ void rlglGenerateMipmaps(Texture2D texture)
TraceLog(WARNING, "[TEX ID %i] Mipmaps generated manually on CPU side", texture.id); TraceLog(WARNING, "[TEX ID %i] Mipmaps generated manually on CPU side", texture.id);
#elif defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) #elif defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) || defined(GRAPHICS_API_OPENGL_21)
glGenerateMipmap(GL_TEXTURE_2D); // Generate mipmaps automatically glGenerateMipmap(GL_TEXTURE_2D); // Generate mipmaps automatically
TraceLog(INFO, "[TEX ID %i] Mipmaps generated automatically", texture.id); TraceLog(INFO, "[TEX ID %i] Mipmaps generated automatically", texture.id);
@ -1945,7 +1956,7 @@ Model rlglLoadModel(Mesh mesh)
model.texture.id = 0; // No texture required model.texture.id = 0; // No texture required
model.shader.id = 0; // No shader used model.shader.id = 0; // No shader used
#elif defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) #elif defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) || defined(GRAPHICS_API_OPENGL_21)
model.texture.id = whiteTexture; // Default whiteTexture model.texture.id = whiteTexture; // Default whiteTexture
model.texture.width = 1; // Default whiteTexture width model.texture.width = 1; // Default whiteTexture width
model.texture.height = 1; // Default whiteTexture height model.texture.height = 1; // Default whiteTexture height
@ -2041,7 +2052,7 @@ void *rlglReadTexturePixels(Texture2D texture)
{ {
void *pixels = NULL; void *pixels = NULL;
#if defined(GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_33) #if defined(GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_21)
glBindTexture(GL_TEXTURE_2D, texture.id); glBindTexture(GL_TEXTURE_2D, texture.id);
// NOTE: Using texture.id, we can retrieve some texture info (but not on OpenGL ES 2.0) // NOTE: Using texture.id, we can retrieve some texture info (but not on OpenGL ES 2.0)
@ -2065,7 +2076,7 @@ void *rlglReadTexturePixels(Texture2D texture)
#if defined(GRAPHICS_API_OPENGL_11) #if defined(GRAPHICS_API_OPENGL_11)
case UNCOMPRESSED_GRAYSCALE: pixels = (unsigned char *)malloc(size); glFormat = GL_LUMINANCE; glType = GL_UNSIGNED_BYTE; break; // 8 bit per pixel (no alpha) case UNCOMPRESSED_GRAYSCALE: pixels = (unsigned char *)malloc(size); glFormat = GL_LUMINANCE; glType = GL_UNSIGNED_BYTE; break; // 8 bit per pixel (no alpha)
case UNCOMPRESSED_GRAY_ALPHA: pixels = (unsigned char *)malloc(size*2); glFormat = GL_LUMINANCE_ALPHA; glType = GL_UNSIGNED_BYTE; break; // 16 bpp (2 channels) case UNCOMPRESSED_GRAY_ALPHA: pixels = (unsigned char *)malloc(size*2); glFormat = GL_LUMINANCE_ALPHA; glType = GL_UNSIGNED_BYTE; break; // 16 bpp (2 channels)
#elif defined(GRAPHICS_API_OPENGL_33) #elif defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_21)
case UNCOMPRESSED_GRAYSCALE: pixels = (unsigned char *)malloc(size); glFormat = GL_RED; glType = GL_UNSIGNED_BYTE; break; case UNCOMPRESSED_GRAYSCALE: pixels = (unsigned char *)malloc(size); glFormat = GL_RED; glType = GL_UNSIGNED_BYTE; break;
case UNCOMPRESSED_GRAY_ALPHA: pixels = (unsigned char *)malloc(size*2); glFormat = GL_RG; glType = GL_UNSIGNED_BYTE; break; case UNCOMPRESSED_GRAY_ALPHA: pixels = (unsigned char *)malloc(size*2); glFormat = GL_RG; glType = GL_UNSIGNED_BYTE; break;
#endif #endif
@ -2169,7 +2180,7 @@ Shader LoadShader(char *vsFileName, char *fsFileName)
shader.id = 0; // Default value in case of loading failure shader.id = 0; // Default value in case of loading failure
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) || defined(GRAPHICS_API_OPENGL_21)
// Shaders loading from external text file // Shaders loading from external text file
char *vShaderStr = TextFileRead(vsFileName); char *vShaderStr = TextFileRead(vsFileName);
char *fShaderStr = TextFileRead(fsFileName); char *fShaderStr = TextFileRead(fsFileName);
@ -2230,7 +2241,7 @@ unsigned int LoadShaderProgram(char *vShaderStr, char *fShaderStr)
{ {
unsigned int program = 0; unsigned int program = 0;
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) || defined(GRAPHICS_API_OPENGL_21)
GLuint vertexShader; GLuint vertexShader;
GLuint fragmentShader; GLuint fragmentShader;
@ -2338,7 +2349,7 @@ void UnloadShader(Shader shader)
// Set custom shader to be used on batch draw // Set custom shader to be used on batch draw
void SetCustomShader(Shader shader) void SetCustomShader(Shader shader)
{ {
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) || defined(GRAPHICS_API_OPENGL_21)
if (currentShader.id != shader.id) if (currentShader.id != shader.id)
{ {
rlglDraw(); rlglDraw();
@ -2372,7 +2383,7 @@ void SetCustomShader(Shader shader)
// NOTE: Uses global variables screenWidth and screenHeight // NOTE: Uses global variables screenWidth and screenHeight
void SetPostproShader(Shader shader) void SetPostproShader(Shader shader)
{ {
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) || defined(GRAPHICS_API_OPENGL_21)
if (!enabledPostpro) if (!enabledPostpro)
{ {
enabledPostpro = true; enabledPostpro = true;
@ -2399,7 +2410,7 @@ void SetPostproShader(Shader shader)
// Set default shader to be used in batch draw // Set default shader to be used in batch draw
void SetDefaultShader(void) void SetDefaultShader(void)
{ {
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) || defined(GRAPHICS_API_OPENGL_21)
SetCustomShader(defaultShader); SetCustomShader(defaultShader);
if (enabledPostpro) if (enabledPostpro)
@ -2413,7 +2424,7 @@ void SetDefaultShader(void)
// Link shader to model // Link shader to model
void SetModelShader(Model *model, Shader shader) void SetModelShader(Model *model, Shader shader)
{ {
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) || defined(GRAPHICS_API_OPENGL_21)
model->shader = shader; model->shader = shader;
if (vaoSupported) glBindVertexArray(model->mesh.vaoId); if (vaoSupported) glBindVertexArray(model->mesh.vaoId);
@ -2445,7 +2456,7 @@ void SetModelShader(Model *model, Shader shader)
// Check if postprocessing is enabled (used in module: core) // Check if postprocessing is enabled (used in module: core)
bool IsPosproShaderEnabled(void) bool IsPosproShaderEnabled(void)
{ {
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) || defined(GRAPHICS_API_OPENGL_21)
return enabledPostpro; return enabledPostpro;
#elif defined(GRAPHICS_API_OPENGL_11) #elif defined(GRAPHICS_API_OPENGL_11)
return false; return false;
@ -2456,7 +2467,7 @@ bool IsPosproShaderEnabled(void)
int GetShaderLocation(Shader shader, const char *uniformName) int GetShaderLocation(Shader shader, const char *uniformName)
{ {
int location = -1; int location = -1;
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) || defined(GRAPHICS_API_OPENGL_21)
location = glGetUniformLocation(shader.id, uniformName); location = glGetUniformLocation(shader.id, uniformName);
if (location == -1) TraceLog(WARNING, "[SHDR ID %i] Shader location for %s could not be found", shader.id, uniformName); if (location == -1) TraceLog(WARNING, "[SHDR ID %i] Shader location for %s could not be found", shader.id, uniformName);
@ -2467,7 +2478,7 @@ int GetShaderLocation(Shader shader, const char *uniformName)
// Set shader uniform value (float) // Set shader uniform value (float)
void SetShaderValue(Shader shader, int uniformLoc, float *value, int size) void SetShaderValue(Shader shader, int uniformLoc, float *value, int size)
{ {
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) || defined(GRAPHICS_API_OPENGL_21)
glUseProgram(shader.id); glUseProgram(shader.id);
if (size == 1) glUniform1fv(uniformLoc, 1, value); // Shader uniform type: float if (size == 1) glUniform1fv(uniformLoc, 1, value); // Shader uniform type: float
@ -2483,7 +2494,7 @@ void SetShaderValue(Shader shader, int uniformLoc, float *value, int size)
// Set shader uniform value (int) // Set shader uniform value (int)
void SetShaderValuei(Shader shader, int uniformLoc, int *value, int size) void SetShaderValuei(Shader shader, int uniformLoc, int *value, int size)
{ {
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) || defined(GRAPHICS_API_OPENGL_21)
glUseProgram(shader.id); glUseProgram(shader.id);
if (size == 1) glUniform1iv(uniformLoc, 1, value); // Shader uniform type: int if (size == 1) glUniform1iv(uniformLoc, 1, value); // Shader uniform type: int
@ -2499,7 +2510,7 @@ void SetShaderValuei(Shader shader, int uniformLoc, int *value, int size)
// Set shader uniform value (matrix 4x4) // Set shader uniform value (matrix 4x4)
void SetShaderValueMatrix(Shader shader, int uniformLoc, Matrix mat) void SetShaderValueMatrix(Shader shader, int uniformLoc, Matrix mat)
{ {
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) || defined(GRAPHICS_API_OPENGL_21)
glUseProgram(shader.id); glUseProgram(shader.id);
glUniformMatrix4fv(uniformLoc, 1, false, MatrixToFloat(mat)); glUniformMatrix4fv(uniformLoc, 1, false, MatrixToFloat(mat));
@ -2511,7 +2522,7 @@ void SetShaderValueMatrix(Shader shader, int uniformLoc, Matrix mat)
// Default diffuse shader map texture assignment // Default diffuse shader map texture assignment
void SetShaderMapDiffuse(Shader *shader, Texture2D texture) void SetShaderMapDiffuse(Shader *shader, Texture2D texture)
{ {
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) || defined(GRAPHICS_API_OPENGL_21)
shader->texDiffuseId = texture.id; shader->texDiffuseId = texture.id;
glUseProgram(shader->id); glUseProgram(shader->id);
@ -2530,7 +2541,7 @@ void SetShaderMapDiffuse(Shader *shader, Texture2D texture)
// Normal map texture shader assignment // Normal map texture shader assignment
void SetShaderMapNormal(Shader *shader, const char *uniformName, Texture2D texture) void SetShaderMapNormal(Shader *shader, const char *uniformName, Texture2D texture)
{ {
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) || defined(GRAPHICS_API_OPENGL_21)
shader->mapNormalLoc = glGetUniformLocation(shader->id, uniformName); shader->mapNormalLoc = glGetUniformLocation(shader->id, uniformName);
if (shader->mapNormalLoc == -1) TraceLog(WARNING, "[SHDR ID %i] Shader location for %s could not be found", shader->id, uniformName); if (shader->mapNormalLoc == -1) TraceLog(WARNING, "[SHDR ID %i] Shader location for %s could not be found", shader->id, uniformName);
@ -2555,7 +2566,7 @@ void SetShaderMapNormal(Shader *shader, const char *uniformName, Texture2D textu
// Specular map texture shader assignment // Specular map texture shader assignment
void SetShaderMapSpecular(Shader *shader, const char *uniformName, Texture2D texture) void SetShaderMapSpecular(Shader *shader, const char *uniformName, Texture2D texture)
{ {
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) || defined(GRAPHICS_API_OPENGL_21)
shader->mapSpecularLoc = glGetUniformLocation(shader->id, uniformName); shader->mapSpecularLoc = glGetUniformLocation(shader->id, uniformName);
if (shader->mapSpecularLoc == -1) TraceLog(WARNING, "[SHDR ID %i] Shader location for %s could not be found", shader->id, uniformName); if (shader->mapSpecularLoc == -1) TraceLog(WARNING, "[SHDR ID %i] Shader location for %s could not be found", shader->id, uniformName);
@ -2585,7 +2596,7 @@ void SetShaderMapSpecular(Shader *shader, const char *uniformName, Texture2D tex
void SetShaderMap(Shader *shader, int mapLocation, Texture2D texture, int textureUnit) void SetShaderMap(Shader *shader, int mapLocation, Texture2D texture, int textureUnit)
{ {
/* /*
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) || defined(GRAPHICS_API_OPENGL_21)
if (mapLocation == -1) TraceLog(WARNING, "[SHDR ID %i] Map location could not be found", shader->id); if (mapLocation == -1) TraceLog(WARNING, "[SHDR ID %i] Map location could not be found", shader->id);
else else
{ {
@ -2626,7 +2637,7 @@ void SetBlendMode(int mode)
} }
} }
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) || defined(GRAPHICS_API_OPENGL_21)
void PrintProjectionMatrix(void) void PrintProjectionMatrix(void)
{ {
PrintMatrix(projection); PrintMatrix(projection);
@ -2642,7 +2653,7 @@ void PrintModelviewMatrix(void)
// Module specific Functions Definition // Module specific Functions Definition
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) || defined(GRAPHICS_API_OPENGL_21)
// Convert image data to OpenGL texture (returns OpenGL valid Id) // Convert image data to OpenGL texture (returns OpenGL valid Id)
// NOTE: Expected compressed image data and POT image // NOTE: Expected compressed image data and POT image
static void LoadCompressedTexture(unsigned char *data, int width, int height, int mipmapCount, int compressedFormat) static void LoadCompressedTexture(unsigned char *data, int width, int height, int mipmapCount, int compressedFormat)
@ -2704,6 +2715,13 @@ static Shader LoadDefaultShader(void)
"attribute vec4 vertexColor; \n" "attribute vec4 vertexColor; \n"
"varying vec2 fragTexCoord; \n" "varying vec2 fragTexCoord; \n"
"varying vec4 fragTintColor; \n" "varying vec4 fragTintColor; \n"
#elif defined(GRAPHICS_API_OPENGL_21)
char vShaderStr[] = "#version 120 \n"
"attribute vec3 vertexPosition; \n"
"attribute vec2 vertexTexCoord; \n"
"attribute vec4 vertexColor; \n"
"varying vec2 fragTexCoord; \n"
"varying vec4 fragTintColor; \n"
#endif #endif
"uniform mat4 mvpMatrix; \n" "uniform mat4 mvpMatrix; \n"
"void main() \n" "void main() \n"
@ -2723,6 +2741,10 @@ static Shader LoadDefaultShader(void)
"precision mediump float; \n" // precision required for OpenGL ES2 (WebGL) "precision mediump float; \n" // precision required for OpenGL ES2 (WebGL)
"varying vec2 fragTexCoord; \n" "varying vec2 fragTexCoord; \n"
"varying vec4 fragTintColor; \n" "varying vec4 fragTintColor; \n"
#elif defined(GRAPHICS_API_OPENGL_21)
char fShaderStr[] = "#version 120 \n"
"varying vec2 fragTexCoord; \n"
"varying vec4 fragTintColor; \n"
#endif #endif
"uniform sampler2D texture0; \n" "uniform sampler2D texture0; \n"
"void main() \n" "void main() \n"
@ -2784,6 +2806,12 @@ static Shader LoadSimpleShader(void)
"attribute vec2 vertexTexCoord; \n" "attribute vec2 vertexTexCoord; \n"
"attribute vec3 vertexNormal; \n" "attribute vec3 vertexNormal; \n"
"varying vec2 fragTexCoord; \n" "varying vec2 fragTexCoord; \n"
#elif defined(GRAPHICS_API_OPENGL_21)
char vShaderStr[] = "#version 120 \n"
"attribute vec3 vertexPosition; \n"
"attribute vec2 vertexTexCoord; \n"
"attribute vec3 vertexNormal; \n"
"varying vec2 fragTexCoord; \n"
#endif #endif
"uniform mat4 mvpMatrix; \n" "uniform mat4 mvpMatrix; \n"
"void main() \n" "void main() \n"
@ -2800,6 +2828,9 @@ static Shader LoadSimpleShader(void)
char fShaderStr[] = "#version 100 \n" char fShaderStr[] = "#version 100 \n"
"precision mediump float; \n" // precision required for OpenGL ES2 (WebGL) "precision mediump float; \n" // precision required for OpenGL ES2 (WebGL)
"varying vec2 fragTexCoord; \n" "varying vec2 fragTexCoord; \n"
#elif defined(GRAPHICS_API_OPENGL_21)
char fShaderStr[] = "#version 120 \n"
"varying vec2 fragTexCoord; \n"
#endif #endif
"uniform sampler2D texture0; \n" "uniform sampler2D texture0; \n"
"uniform vec4 fragTintColor; \n" "uniform vec4 fragTintColor; \n"
@ -2900,7 +2931,7 @@ static void InitializeBuffers(void)
quads.vertices = (float *)malloc(sizeof(float)*3*4*MAX_QUADS_BATCH); // 3 float by vertex, 4 vertex by quad quads.vertices = (float *)malloc(sizeof(float)*3*4*MAX_QUADS_BATCH); // 3 float by vertex, 4 vertex by quad
quads.texcoords = (float *)malloc(sizeof(float)*2*4*MAX_QUADS_BATCH); // 2 float by texcoord, 4 texcoord by quad quads.texcoords = (float *)malloc(sizeof(float)*2*4*MAX_QUADS_BATCH); // 2 float by texcoord, 4 texcoord by quad
quads.colors = (unsigned char *)malloc(sizeof(unsigned char)*4*4*MAX_QUADS_BATCH); // 4 float by color, 4 colors by quad quads.colors = (unsigned char *)malloc(sizeof(unsigned char)*4*4*MAX_QUADS_BATCH); // 4 float by color, 4 colors by quad
#if defined(GRAPHICS_API_OPENGL_33) #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_21)
quads.indices = (unsigned int *)malloc(sizeof(int)*6*MAX_QUADS_BATCH); // 6 int by quad (indices) quads.indices = (unsigned int *)malloc(sizeof(int)*6*MAX_QUADS_BATCH); // 6 int by quad (indices)
#elif defined(GRAPHICS_API_OPENGL_ES2) #elif defined(GRAPHICS_API_OPENGL_ES2)
quads.indices = (unsigned short *)malloc(sizeof(short)*6*MAX_QUADS_BATCH); // 6 int by quad (indices) quads.indices = (unsigned short *)malloc(sizeof(short)*6*MAX_QUADS_BATCH); // 6 int by quad (indices)
@ -3016,7 +3047,7 @@ static void InitializeBuffersGPU(void)
// Fill index buffer // Fill index buffer
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, quadsBuffer[3]); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, quadsBuffer[3]);
#if defined(GRAPHICS_API_OPENGL_33) #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_21)
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(int)*6*MAX_QUADS_BATCH, quads.indices, GL_STATIC_DRAW); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(int)*6*MAX_QUADS_BATCH, quads.indices, GL_STATIC_DRAW);
#elif defined(GRAPHICS_API_OPENGL_ES2) #elif defined(GRAPHICS_API_OPENGL_ES2)
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(short)*6*MAX_QUADS_BATCH, quads.indices, GL_STATIC_DRAW); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(short)*6*MAX_QUADS_BATCH, quads.indices, GL_STATIC_DRAW);
@ -3098,7 +3129,7 @@ static void UpdateBuffers(void)
// Unbind the current VAO // Unbind the current VAO
if (vaoSupported) glBindVertexArray(0); if (vaoSupported) glBindVertexArray(0);
} }
#endif //defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) #endif //defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) || defined(GRAPHICS_API_OPENGL_21)
#if defined(GRAPHICS_API_OPENGL_11) #if defined(GRAPHICS_API_OPENGL_11)
// Mipmaps data is generated after image data // Mipmaps data is generated after image data

View File

@ -44,11 +44,12 @@
// Choose opengl version here or just define it at compile time: -DGRAPHICS_API_OPENGL_33 // Choose opengl version here or just define it at compile time: -DGRAPHICS_API_OPENGL_33
//#define GRAPHICS_API_OPENGL_11 // Only available on PLATFORM_DESKTOP //#define GRAPHICS_API_OPENGL_11 // Only available on PLATFORM_DESKTOP
//#define GRAPHICS_API_OPENGL_21 // Only available on PLATFORM_DESKTOP
//#define GRAPHICS_API_OPENGL_33 // Only available on PLATFORM_DESKTOP //#define GRAPHICS_API_OPENGL_33 // Only available on PLATFORM_DESKTOP
//#define GRAPHICS_API_OPENGL_ES2 // Only available on PLATFORM_ANDROID or PLATFORM_RPI or PLATFORM_WEB //#define GRAPHICS_API_OPENGL_ES2 // Only available on PLATFORM_ANDROID or PLATFORM_RPI or PLATFORM_WEB
// Security check in case no GRAPHICS_API_OPENGL_* defined // Security check in case no GRAPHICS_API_OPENGL_* defined
#if !defined(GRAPHICS_API_OPENGL_11) && !defined(GRAPHICS_API_OPENGL_33) && !defined(GRAPHICS_API_OPENGL_ES2) #if !defined(GRAPHICS_API_OPENGL_11) && !defined(GRAPHICS_API_OPENGL_33) && !defined(GRAPHICS_API_OPENGL_ES2) && !defined(GRAPHICS_API_OPENGL_21)
#define GRAPHICS_API_OPENGL_11 #define GRAPHICS_API_OPENGL_11
#endif #endif
@ -58,6 +59,10 @@
#undef GRAPHICS_API_OPENGL_33 #undef GRAPHICS_API_OPENGL_33
#endif #endif
#if defined(GRAPHICS_API_OPENGL_21)
#undef GRAPHICS_API_OPENGL_21
#endif
#if defined(GRAPHICS_API_OPENGL_ES2) #if defined(GRAPHICS_API_OPENGL_ES2)
#undef GRAPHICS_API_OPENGL_ES2 #undef GRAPHICS_API_OPENGL_ES2
#endif #endif
@ -66,7 +71,7 @@
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
// Defines and Macros // Defines and Macros
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
#if defined(GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_33) #if defined(GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_21)
// NOTE: This is the maximum amount of lines, triangles and quads per frame, be careful! // NOTE: This is the maximum amount of lines, triangles and quads per frame, be careful!
#define MAX_LINES_BATCH 8192 #define MAX_LINES_BATCH 8192
#define MAX_TRIANGLES_BATCH 4096 #define MAX_TRIANGLES_BATCH 4096
@ -86,7 +91,7 @@ typedef enum { RL_PROJECTION, RL_MODELVIEW, RL_TEXTURE } MatrixMode;
typedef enum { RL_LINES, RL_TRIANGLES, RL_QUADS } DrawMode; typedef enum { RL_LINES, RL_TRIANGLES, RL_QUADS } DrawMode;
typedef enum { OPENGL_11 = 1, OPENGL_33, OPENGL_ES_20 } GlVersion; typedef enum { OPENGL_11 = 1, OPENGL_33, OPENGL_ES_20, OPENGL_21 } GlVersion;
#if defined(RLGL_STANDALONE) #if defined(RLGL_STANDALONE)
#ifndef __cplusplus #ifndef __cplusplus
@ -269,7 +274,7 @@ Vector3 rlglUnproject(Vector3 source, Matrix proj, Matrix view); // Get world
unsigned char *rlglReadScreenPixels(int width, int height); // Read screen pixel data (color buffer) unsigned char *rlglReadScreenPixels(int width, int height); // Read screen pixel data (color buffer)
void *rlglReadTexturePixels(Texture2D texture); // Read texture pixel data void *rlglReadTexturePixels(Texture2D texture); // Read texture pixel data
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) || defined(GRAPHICS_API_OPENGL_21)
void PrintProjectionMatrix(void); // DEBUG: Print projection matrix void PrintProjectionMatrix(void); // DEBUG: Print projection matrix
void PrintModelviewMatrix(void); // DEBUG: Print modelview matrix void PrintModelviewMatrix(void); // DEBUG: Print modelview matrix
#endif #endif