Merge remote-tracking branch 'refs/remotes/raysan5/develop' into develop

This commit is contained in:
Joshua Reisenauer 2016-05-16 19:42:16 -07:00
commit 706755d146
5 changed files with 177 additions and 163 deletions

View file

@ -553,7 +553,7 @@ Model LoadModel(const char *fileName)
if (model.mesh.vertexCount == 0) TraceLog(WARNING, "Model could not be loaded"); if (model.mesh.vertexCount == 0) TraceLog(WARNING, "Model could not be loaded");
else else
{ {
rlglLoadMesh(&model.mesh); // Upload vertex data to GPU rlglLoadMesh(&model.mesh); // Upload vertex data to GPU
model.transform = MatrixIdentity(); model.transform = MatrixIdentity();
model.material = LoadDefaultMaterial(); model.material = LoadDefaultMaterial();
@ -567,7 +567,9 @@ Model LoadModelEx(Mesh data)
{ {
Model model = { 0 }; Model model = { 0 };
rlglLoadMesh(&data); // Upload vertex data to GPU model.mesh = data;
rlglLoadMesh(&model.mesh); // Upload vertex data to GPU
model.transform = MatrixIdentity(); model.transform = MatrixIdentity();
model.material = LoadDefaultMaterial(); model.material = LoadDefaultMaterial();
@ -693,12 +695,13 @@ Model LoadCubicmap(Image cubicmap)
void UnloadModel(Model model) void UnloadModel(Model model)
{ {
// Unload mesh data // Unload mesh data
free(model.mesh.vertices); if (model.mesh.vertices != NULL) free(model.mesh.vertices);
free(model.mesh.texcoords); if (model.mesh.texcoords != NULL) free(model.mesh.texcoords);
if (model.mesh.normals != NULL) free(model.mesh.normals); if (model.mesh.normals != NULL) free(model.mesh.normals);
if (model.mesh.colors != NULL) free(model.mesh.colors); if (model.mesh.colors != NULL) free(model.mesh.colors);
if (model.mesh.tangents != NULL) free(model.mesh.tangents); if (model.mesh.tangents != NULL) free(model.mesh.tangents);
if (model.mesh.texcoords2 != NULL) free(model.mesh.texcoords2); if (model.mesh.texcoords2 != NULL) free(model.mesh.texcoords2);
if (model.mesh.indices != NULL) free(model.mesh.indices);
TraceLog(INFO, "Unloaded model data from RAM (CPU)"); TraceLog(INFO, "Unloaded model data from RAM (CPU)");
@ -708,8 +711,11 @@ void UnloadModel(Model model)
rlDeleteBuffers(model.mesh.vboId[3]); // colors rlDeleteBuffers(model.mesh.vboId[3]); // colors
rlDeleteBuffers(model.mesh.vboId[4]); // tangents rlDeleteBuffers(model.mesh.vboId[4]); // tangents
rlDeleteBuffers(model.mesh.vboId[5]); // texcoords2 rlDeleteBuffers(model.mesh.vboId[5]); // texcoords2
rlDeleteBuffers(model.mesh.vboId[6]); // indices
rlDeleteVertexArrays(model.mesh.vaoId); rlDeleteVertexArrays(model.mesh.vaoId);
UnloadMaterial(model.material);
} }
// Load material data (from file) // Load material data (from file)
@ -743,6 +749,13 @@ Material LoadDefaultMaterial(void)
return material; return material;
} }
void UnloadMaterial(Material material)
{
rlDeleteTextures(material.texDiffuse.id);
rlDeleteTextures(material.texNormal.id);
rlDeleteTextures(material.texSpecular.id);
}
// Link a texture to a model // Link a texture to a model
void SetModelTexture(Model *model, Texture2D texture) void SetModelTexture(Model *model, Texture2D texture)
{ {
@ -2006,7 +2019,7 @@ static Material LoadMTL(const char *fileName)
char buffer[MAX_BUFFER_SIZE]; char buffer[MAX_BUFFER_SIZE];
Vector3 color = { 1.0f, 1.0f, 1.0f }; Vector3 color = { 1.0f, 1.0f, 1.0f };
char *mapFileName; char *mapFileName = NULL;
FILE *mtlFile; FILE *mtlFile;

View file

@ -368,18 +368,20 @@ typedef struct BoundingBox {
// Vertex data definning a mesh // Vertex data definning a mesh
typedef struct Mesh { typedef struct Mesh {
int vertexCount; // num vertices int vertexCount; // number of vertices stored in arrays
float *vertices; // vertex position (XYZ - 3 components per vertex) (shader-location = 0) float *vertices; // vertex position (XYZ - 3 components per vertex) (shader-location = 0)
float *texcoords; // vertex texture coordinates (UV - 2 components per vertex) (shader-location = 1) float *texcoords; // vertex texture coordinates (UV - 2 components per vertex) (shader-location = 1)
float *texcoords2; // vertex second texture coordinates (useful for lightmaps) (shader-location = 5) float *texcoords2; // vertex second texture coordinates (useful for lightmaps) (shader-location = 5)
float *normals; // vertex normals (XYZ - 3 components per vertex) (shader-location = 2) float *normals; // vertex normals (XYZ - 3 components per vertex) (shader-location = 2)
float *tangents; // vertex tangents (XYZ - 3 components per vertex) (shader-location = 4) float *tangents; // vertex tangents (XYZ - 3 components per vertex) (shader-location = 4)
unsigned char *colors; // vertex colors (RGBA - 4 components per vertex) (shader-location = 3) unsigned char *colors; // vertex colors (RGBA - 4 components per vertex) (shader-location = 3)
unsigned short *indices; // vertex indices (in case vertex data comes indexed)
int triangleCount; // number of triangles stored (indexed or not)
BoundingBox bounds; // mesh limits defined by min and max points BoundingBox bounds; // mesh limits defined by min and max points
unsigned int vaoId; // OpenGL Vertex Array Object id unsigned int vaoId; // OpenGL Vertex Array Object id
unsigned int vboId[6]; // OpenGL Vertex Buffer Objects id (6 types of vertex data) unsigned int vboId[7]; // OpenGL Vertex Buffer Objects id (7 types of vertex data)
} Mesh; } Mesh;
// Shader type (generic shader) // Shader type (generic shader)
@ -813,6 +815,7 @@ void SetModelTexture(Model *model, Texture2D texture); // Link a textur
Material LoadMaterial(const char *fileName); // Load material data (from file) Material LoadMaterial(const char *fileName); // Load material data (from file)
Material LoadDefaultMaterial(void); // Load default material (uses default models shader) Material LoadDefaultMaterial(void); // Load default material (uses default models shader)
void UnloadMaterial(Material material); // Unload material textures from VRAM
void DrawModel(Model model, Vector3 position, float scale, Color tint); // Draw a model (with texture if set) void DrawModel(Model model, Vector3 position, float scale, Color tint); // Draw a model (with texture if set)
void DrawModelEx(Model model, Vector3 position, Vector3 rotationAxis, float rotationAngle, Vector3 scale, Color tint); // Draw a model with extended parameters void DrawModelEx(Model model, Vector3 position, Vector3 rotationAxis, float rotationAngle, Vector3 scale, Color tint); // Draw a model with extended parameters

View file

@ -158,6 +158,7 @@ RMDEF void PrintMatrix(Matrix m); // Print matrix ut
//------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------
RMDEF float QuaternionLength(Quaternion quat); // Compute the length of a quaternion RMDEF float QuaternionLength(Quaternion quat); // Compute the length of a quaternion
RMDEF void QuaternionNormalize(Quaternion *q); // Normalize provided quaternion RMDEF void QuaternionNormalize(Quaternion *q); // Normalize provided quaternion
RMDEF void QuaternionInvert(Quaternion *quat); // Invert provided quaternion
RMDEF Quaternion QuaternionMultiply(Quaternion q1, Quaternion q2); // Calculate two quaternion multiplication RMDEF Quaternion QuaternionMultiply(Quaternion q1, Quaternion q2); // Calculate two quaternion multiplication
RMDEF Quaternion QuaternionSlerp(Quaternion q1, Quaternion q2, float slerp); // Calculates spherical linear interpolation between two quaternions RMDEF Quaternion QuaternionSlerp(Quaternion q1, Quaternion q2, float slerp); // Calculates spherical linear interpolation between two quaternions
RMDEF Quaternion QuaternionFromMatrix(Matrix matrix); // Returns a quaternion for a given rotation matrix RMDEF Quaternion QuaternionFromMatrix(Matrix matrix); // Returns a quaternion for a given rotation matrix
@ -908,6 +909,23 @@ RMDEF void QuaternionNormalize(Quaternion *q)
q->w *= ilength; q->w *= ilength;
} }
// Invert provided quaternion
RMDEF void QuaternionInvert(Quaternion *quat)
{
float length = QuaternionLength(*quat);
float lengthSq = length*length;
if (lengthSq != 0.0)
{
float i = 1.0f/lengthSq;
quat->x *= -i;
quat->y *= -i;
quat->z *= -i;
quat->w *= i;
}
}
// Calculate two quaternion multiplication // Calculate two quaternion multiplication
RMDEF Quaternion QuaternionMultiply(Quaternion q1, Quaternion q2) RMDEF Quaternion QuaternionMultiply(Quaternion q1, Quaternion q2)
{ {

View file

@ -128,54 +128,23 @@
// Types and Structures Definition // Types and Structures Definition
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
// Vertex buffer (position + color arrays) // Dynamic vertex buffers (position + texcoords + colors + indices arrays)
// NOTE: Used for lines and triangles VAOs
typedef struct { typedef struct {
int vCounter; int vCounter; // vertex position counter to process (and draw) from full buffer
int cCounter; int tcCounter; // vertex texcoord counter to process (and draw) from full buffer
float *vertices; // 3 components per vertex int cCounter; // vertex color counter to process (and draw) from full buffer
unsigned char *colors; // 4 components per vertex float *vertices; // vertex position (XYZ - 3 components per vertex) (shader-location = 0)
} VertexPositionColorBuffer; float *texcoords; // vertex texture coordinates (UV - 2 components per vertex) (shader-location = 1)
unsigned char *colors; // vertex colors (RGBA - 4 components per vertex) (shader-location = 3)
// Vertex buffer (position + texcoords + color arrays)
// NOTE: Not used
typedef struct {
int vCounter;
int tcCounter;
int cCounter;
float *vertices; // 3 components per vertex
float *texcoords; // 2 components per vertex
unsigned char *colors; // 4 components per vertex
} VertexPositionColorTextureBuffer;
// Vertex buffer (position + texcoords + normals arrays)
// NOTE: Not used
typedef struct {
int vCounter;
int tcCounter;
int nCounter;
float *vertices; // 3 components per vertex
float *texcoords; // 2 components per vertex
float *normals; // 3 components per vertex
//short *normals; // NOTE: Less data load... but padding issues and normalizing required!
} VertexPositionTextureNormalBuffer;
// Vertex buffer (position + texcoords + colors + indices arrays)
// NOTE: Used for quads VAO
typedef struct {
int vCounter;
int tcCounter;
int cCounter;
float *vertices; // 3 components per vertex
float *texcoords; // 2 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)
unsigned int *indices; // 6 indices per quad (could be int) unsigned int *indices; // vertex indices (in case vertex data comes indexed) (6 indices per quad)
#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; // vertex indices (in case vertex data comes indexed) (6 indices per quad)
// NOTE: 6*2 byte = 12 byte, not alignment problem! // NOTE: 6*2 byte = 12 byte, not alignment problem!
#endif #endif
} VertexPositionColorTextureIndexBuffer; unsigned int vaoId; // OpenGL Vertex Array Object id
unsigned int vboId[4]; // OpenGL Vertex Buffer Objects id (4 types of vertex data)
} DynamicBuffer;
// Draw call type // Draw call type
// NOTE: Used to track required draw-calls, organized by texture // NOTE: Used to track required draw-calls, organized by texture
@ -205,18 +174,9 @@ static DrawMode currentDrawMode;
static float currentDepth = -1.0f; static float currentDepth = -1.0f;
// Default vertex buffers for lines, triangles and quads static DynamicBuffer lines;
static VertexPositionColorBuffer lines; // No texture support static DynamicBuffer triangles;
static VertexPositionColorBuffer triangles; // No texture support static DynamicBuffer quads;
static VertexPositionColorTextureIndexBuffer quads;
// Default vertex buffers VAOs (if supported)
static GLuint vaoLines, vaoTriangles, vaoQuads;
// Default vertex buffers VBOs
static GLuint linesBuffer[2]; // Lines buffers (position, color)
static GLuint trianglesBuffer[2]; // Triangles buffers (position, color)
static GLuint quadsBuffer[4]; // Quads buffers (position, texcoord, color, index)
// Default buffers draw calls // Default buffers draw calls
static DrawCall *draws; static DrawCall *draws;
@ -783,16 +743,16 @@ void rlDisableDepthTest(void)
// Unload texture from GPU memory // Unload texture from GPU memory
void rlDeleteTextures(unsigned int id) void rlDeleteTextures(unsigned int id)
{ {
glDeleteTextures(1, &id); if (id != 0) glDeleteTextures(1, &id);
} }
// Unload render texture from GPU memory // Unload render texture from GPU memory
void rlDeleteRenderTextures(RenderTexture2D target) void rlDeleteRenderTextures(RenderTexture2D target)
{ {
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
glDeleteFramebuffers(1, &target.id); if (target.id != 0) glDeleteFramebuffers(1, &target.id);
glDeleteTextures(1, &target.texture.id); if (target.texture.id != 0) glDeleteTextures(1, &target.texture.id);
glDeleteTextures(1, &target.depth.id); if (target.depth.id != 0) glDeleteTextures(1, &target.depth.id);
#endif #endif
} }
@ -800,7 +760,7 @@ void rlDeleteRenderTextures(RenderTexture2D target)
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)
glDeleteProgram(id); if (id != 0) glDeleteProgram(id);
#endif #endif
} }
@ -810,7 +770,7 @@ 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)
if (vaoSupported) if (vaoSupported)
{ {
glDeleteVertexArrays(1, &id); if (id != 0) glDeleteVertexArrays(1, &id);
TraceLog(INFO, "[VAO ID %i] Unloaded model data from VRAM (GPU)", id); TraceLog(INFO, "[VAO ID %i] Unloaded model data from VRAM (GPU)", id);
} }
#endif #endif
@ -1094,7 +1054,7 @@ void rlglDrawEx(Mesh mesh, Material material, Matrix transform, bool wires)
glEnableClientState(GL_VERTEX_ARRAY); // Enable vertex array glEnableClientState(GL_VERTEX_ARRAY); // Enable vertex array
glEnableClientState(GL_TEXTURE_COORD_ARRAY); // Enable texture coords array glEnableClientState(GL_TEXTURE_COORD_ARRAY); // Enable texture coords array
if (mesh.normals != NULL) glEnableClientState(GL_NORMAL_ARRAY); // Enable normals array if (mesh.normals != NULL) glEnableClientState(GL_NORMAL_ARRAY); // Enable normals array
if (mesh.colors != NULL) glEnableClientState(GL_COLOR_ARRAY); // Enable colors array if (mesh.colors != NULL) glEnableClientState(GL_COLOR_ARRAY); // Enable colors array
glVertexPointer(3, GL_FLOAT, 0, mesh.vertices); // Pointer to vertex coords array glVertexPointer(3, GL_FLOAT, 0, mesh.vertices); // Pointer to vertex coords array
glTexCoordPointer(2, GL_FLOAT, 0, mesh.texcoords); // Pointer to texture coords array glTexCoordPointer(2, GL_FLOAT, 0, mesh.texcoords); // Pointer to texture coords array
@ -1104,7 +1064,9 @@ void rlglDrawEx(Mesh mesh, Material material, Matrix transform, bool wires)
rlPushMatrix(); rlPushMatrix();
rlMultMatrixf(MatrixToFloat(transform)); rlMultMatrixf(MatrixToFloat(transform));
rlColor4ub(material.colDiffuse.r, material.colDiffuse.g, material.colDiffuse.b, material.colDiffuse.a); rlColor4ub(material.colDiffuse.r, material.colDiffuse.g, material.colDiffuse.b, material.colDiffuse.a);
glDrawArrays(GL_TRIANGLES, 0, mesh.vertexCount);
if (mesh.indices != NULL) glDrawElements(GL_TRIANGLES, mesh.triangleCount*3, GL_UNSIGNED_SHORT, mesh.indices);
else glDrawArrays(GL_TRIANGLES, 0, mesh.vertexCount);
rlPopMatrix(); rlPopMatrix();
glDisableClientState(GL_VERTEX_ARRAY); // Disable vertex array glDisableClientState(GL_VERTEX_ARRAY); // Disable vertex array
@ -1204,10 +1166,13 @@ void rlglDrawEx(Mesh mesh, Material material, Matrix transform, bool wires)
glVertexAttribPointer(material.shader.texcoord2Loc, 2, GL_FLOAT, 0, 0, 0); glVertexAttribPointer(material.shader.texcoord2Loc, 2, GL_FLOAT, 0, 0, 0);
glEnableVertexAttribArray(material.shader.texcoord2Loc); glEnableVertexAttribArray(material.shader.texcoord2Loc);
} }
if (mesh.indices != NULL) glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, quads.vboId[3]);
} }
// Draw call! // Draw call!
glDrawArrays(GL_TRIANGLES, 0, mesh.vertexCount); if (mesh.indices != NULL) glDrawElements(GL_TRIANGLES, mesh.triangleCount*3, GL_UNSIGNED_SHORT, 0); // Indexed vertices draw
else glDrawArrays(GL_TRIANGLES, 0, mesh.vertexCount);
if (material.texNormal.id != 0) if (material.texNormal.id != 0)
{ {
@ -1225,7 +1190,11 @@ void rlglDrawEx(Mesh mesh, Material material, Matrix transform, bool wires)
glBindTexture(GL_TEXTURE_2D, 0); // Unbind textures glBindTexture(GL_TEXTURE_2D, 0); // Unbind textures
if (vaoSupported) glBindVertexArray(0); // Unbind VAO if (vaoSupported) glBindVertexArray(0); // Unbind VAO
else glBindBuffer(GL_ARRAY_BUFFER, 0); // Unbind VBOs else
{
glBindBuffer(GL_ARRAY_BUFFER, 0); // Unbind VBOs
if (mesh.indices != NULL) glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
}
glUseProgram(0); // Unbind shader program glUseProgram(0); // Unbind shader program
#endif #endif
@ -1682,11 +1651,11 @@ void rlglLoadMesh(Mesh *mesh)
mesh->vboId[3] = 0; // Vertex colors VBO mesh->vboId[3] = 0; // Vertex colors VBO
mesh->vboId[4] = 0; // Vertex tangents VBO mesh->vboId[4] = 0; // Vertex tangents VBO
mesh->vboId[5] = 0; // Vertex texcoords2 VBO mesh->vboId[5] = 0; // Vertex texcoords2 VBO
mesh->vboId[6] = 0; // Vertex indices VBO
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
GLuint vaoId = 0; // Vertex Array Objects (VAO) GLuint vaoId = 0; // Vertex Array Objects (VAO)
GLuint vboId[6]; // Vertex Buffer Objects (VBOs) GLuint vboId[7]; // Vertex Buffer Objects (VBOs)
if (vaoSupported) if (vaoSupported)
{ {
@ -1775,12 +1744,21 @@ void rlglLoadMesh(Mesh *mesh)
glDisableVertexAttribArray(5); glDisableVertexAttribArray(5);
} }
if (mesh->indices != NULL)
{
glGenBuffers(1, &vboId[6]);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboId[6]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(unsigned short)*mesh->triangleCount*3, mesh->indices, GL_STATIC_DRAW);
}
mesh->vboId[0] = vboId[0]; // Vertex position VBO mesh->vboId[0] = vboId[0]; // Vertex position VBO
mesh->vboId[1] = vboId[1]; // Texcoords VBO mesh->vboId[1] = vboId[1]; // Texcoords VBO
mesh->vboId[2] = vboId[2]; // Normals VBO mesh->vboId[2] = vboId[2]; // Normals VBO
mesh->vboId[3] = vboId[3]; // Colors VBO mesh->vboId[3] = vboId[3]; // Colors VBO
mesh->vboId[4] = vboId[4]; // Tangents VBO mesh->vboId[4] = vboId[4]; // Tangents VBO
mesh->vboId[5] = vboId[5]; // Texcoords2 VBO mesh->vboId[5] = vboId[5]; // Texcoords2 VBO
mesh->vboId[6] = vboId[6]; // Indices VBO
if (vaoSupported) if (vaoSupported)
{ {
@ -2388,22 +2366,28 @@ static void LoadDefaultBuffers(void)
// Lines - Initialize arrays (vertex position and color data) // Lines - Initialize arrays (vertex position and color data)
lines.vertices = (float *)malloc(sizeof(float)*3*2*MAX_LINES_BATCH); // 3 float by vertex, 2 vertex by line lines.vertices = (float *)malloc(sizeof(float)*3*2*MAX_LINES_BATCH); // 3 float by vertex, 2 vertex by line
lines.colors = (unsigned char *)malloc(sizeof(unsigned char)*4*2*MAX_LINES_BATCH); // 4 float by color, 2 colors by line lines.colors = (unsigned char *)malloc(sizeof(unsigned char)*4*2*MAX_LINES_BATCH); // 4 float by color, 2 colors by line
lines.texcoords = NULL;
lines.indices = NULL;
for (int i = 0; i < (3*2*MAX_LINES_BATCH); i++) lines.vertices[i] = 0.0f; for (int i = 0; i < (3*2*MAX_LINES_BATCH); i++) lines.vertices[i] = 0.0f;
for (int i = 0; i < (4*2*MAX_LINES_BATCH); i++) lines.colors[i] = 0; for (int i = 0; i < (4*2*MAX_LINES_BATCH); i++) lines.colors[i] = 0;
lines.vCounter = 0; lines.vCounter = 0;
lines.cCounter = 0; lines.cCounter = 0;
lines.tcCounter = 0;
// Triangles - Initialize arrays (vertex position and color data) // Triangles - Initialize arrays (vertex position and color data)
triangles.vertices = (float *)malloc(sizeof(float)*3*3*MAX_TRIANGLES_BATCH); // 3 float by vertex, 3 vertex by triangle triangles.vertices = (float *)malloc(sizeof(float)*3*3*MAX_TRIANGLES_BATCH); // 3 float by vertex, 3 vertex by triangle
triangles.colors = (unsigned char *)malloc(sizeof(unsigned char)*4*3*MAX_TRIANGLES_BATCH); // 4 float by color, 3 colors by triangle triangles.colors = (unsigned char *)malloc(sizeof(unsigned char)*4*3*MAX_TRIANGLES_BATCH); // 4 float by color, 3 colors by triangle
triangles.texcoords = NULL;
triangles.indices = NULL;
for (int i = 0; i < (3*3*MAX_TRIANGLES_BATCH); i++) triangles.vertices[i] = 0.0f; for (int i = 0; i < (3*3*MAX_TRIANGLES_BATCH); i++) triangles.vertices[i] = 0.0f;
for (int i = 0; i < (4*3*MAX_TRIANGLES_BATCH); i++) triangles.colors[i] = 0; for (int i = 0; i < (4*3*MAX_TRIANGLES_BATCH); i++) triangles.colors[i] = 0;
triangles.vCounter = 0; triangles.vCounter = 0;
triangles.cCounter = 0; triangles.cCounter = 0;
triangles.tcCounter = 0;
// Quads - Initialize arrays (vertex position, texcoord, color data and indexes) // Quads - Initialize arrays (vertex position, texcoord, color data and indexes)
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
@ -2449,96 +2433,95 @@ static void LoadDefaultBuffers(void)
if (vaoSupported) if (vaoSupported)
{ {
// Initialize Lines VAO // Initialize Lines VAO
glGenVertexArrays(1, &vaoLines); glGenVertexArrays(1, &lines.vaoId);
glBindVertexArray(vaoLines); glBindVertexArray(lines.vaoId);
} }
// Create buffers for our vertex data
glGenBuffers(2, linesBuffer);
// Lines - Vertex buffers binding and attributes enable // Lines - Vertex buffers binding and attributes enable
// Vertex position buffer (shader-location = 0) // Vertex position buffer (shader-location = 0)
glBindBuffer(GL_ARRAY_BUFFER, linesBuffer[0]); glGenBuffers(2, &lines.vboId[0]);
glBindBuffer(GL_ARRAY_BUFFER, lines.vboId[0]);
glBufferData(GL_ARRAY_BUFFER, sizeof(float)*3*2*MAX_LINES_BATCH, lines.vertices, GL_DYNAMIC_DRAW); glBufferData(GL_ARRAY_BUFFER, sizeof(float)*3*2*MAX_LINES_BATCH, lines.vertices, GL_DYNAMIC_DRAW);
glEnableVertexAttribArray(currentShader.vertexLoc); glEnableVertexAttribArray(currentShader.vertexLoc);
glVertexAttribPointer(currentShader.vertexLoc, 3, GL_FLOAT, 0, 0, 0); glVertexAttribPointer(currentShader.vertexLoc, 3, GL_FLOAT, 0, 0, 0);
// Vertex color buffer (shader-location = 3) // Vertex color buffer (shader-location = 3)
glBindBuffer(GL_ARRAY_BUFFER, linesBuffer[1]); glGenBuffers(2, &lines.vboId[1]);
glBindBuffer(GL_ARRAY_BUFFER, lines.vboId[1]);
glBufferData(GL_ARRAY_BUFFER, sizeof(unsigned char)*4*2*MAX_LINES_BATCH, lines.colors, GL_DYNAMIC_DRAW); glBufferData(GL_ARRAY_BUFFER, sizeof(unsigned char)*4*2*MAX_LINES_BATCH, lines.colors, GL_DYNAMIC_DRAW);
glEnableVertexAttribArray(currentShader.colorLoc); glEnableVertexAttribArray(currentShader.colorLoc);
glVertexAttribPointer(currentShader.colorLoc, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, 0); glVertexAttribPointer(currentShader.colorLoc, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, 0);
if (vaoSupported) TraceLog(INFO, "[VAO ID %i] Default buffers VAO initialized successfully (lines)", vaoLines); if (vaoSupported) TraceLog(INFO, "[VAO ID %i] Default buffers VAO initialized successfully (lines)", lines.vaoId);
else TraceLog(INFO, "[VBO ID %i][VBO ID %i] Default buffers VBOs initialized successfully (lines)", linesBuffer[0], linesBuffer[1]); else TraceLog(INFO, "[VBO ID %i][VBO ID %i] Default buffers VBOs initialized successfully (lines)", lines.vboId[0], lines.vboId[1]);
// Upload and link triangles vertex buffers // Upload and link triangles vertex buffers
if (vaoSupported) if (vaoSupported)
{ {
// Initialize Triangles VAO // Initialize Triangles VAO
glGenVertexArrays(1, &vaoTriangles); glGenVertexArrays(1, &triangles.vaoId);
glBindVertexArray(vaoTriangles); glBindVertexArray(triangles.vaoId);
} }
// Create buffers for our vertex data
glGenBuffers(2, trianglesBuffer);
// Triangles - Vertex buffers binding and attributes enable // Triangles - Vertex buffers binding and attributes enable
// Vertex position buffer (shader-location = 0) // Vertex position buffer (shader-location = 0)
glBindBuffer(GL_ARRAY_BUFFER, trianglesBuffer[0]); glGenBuffers(1, &triangles.vboId[0]);
glBindBuffer(GL_ARRAY_BUFFER, triangles.vboId[0]);
glBufferData(GL_ARRAY_BUFFER, sizeof(float)*3*3*MAX_TRIANGLES_BATCH, triangles.vertices, GL_DYNAMIC_DRAW); glBufferData(GL_ARRAY_BUFFER, sizeof(float)*3*3*MAX_TRIANGLES_BATCH, triangles.vertices, GL_DYNAMIC_DRAW);
glEnableVertexAttribArray(currentShader.vertexLoc); glEnableVertexAttribArray(currentShader.vertexLoc);
glVertexAttribPointer(currentShader.vertexLoc, 3, GL_FLOAT, 0, 0, 0); glVertexAttribPointer(currentShader.vertexLoc, 3, GL_FLOAT, 0, 0, 0);
// Vertex color buffer (shader-location = 3) // Vertex color buffer (shader-location = 3)
glBindBuffer(GL_ARRAY_BUFFER, trianglesBuffer[1]); glGenBuffers(1, &triangles.vboId[1]);
glBindBuffer(GL_ARRAY_BUFFER, triangles.vboId[1]);
glBufferData(GL_ARRAY_BUFFER, sizeof(unsigned char)*4*3*MAX_TRIANGLES_BATCH, triangles.colors, GL_DYNAMIC_DRAW); glBufferData(GL_ARRAY_BUFFER, sizeof(unsigned char)*4*3*MAX_TRIANGLES_BATCH, triangles.colors, GL_DYNAMIC_DRAW);
glEnableVertexAttribArray(currentShader.colorLoc); glEnableVertexAttribArray(currentShader.colorLoc);
glVertexAttribPointer(currentShader.colorLoc, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, 0); glVertexAttribPointer(currentShader.colorLoc, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, 0);
if (vaoSupported) TraceLog(INFO, "[VAO ID %i] Default buffers VAO initialized successfully (triangles)", vaoTriangles); if (vaoSupported) TraceLog(INFO, "[VAO ID %i] Default buffers VAO initialized successfully (triangles)", triangles.vaoId);
else TraceLog(INFO, "[VBO ID %i][VBO ID %i] Default buffers VBOs initialized successfully(triangles)", trianglesBuffer[0], trianglesBuffer[1]); else TraceLog(INFO, "[VBO ID %i][VBO ID %i] Default buffers VBOs initialized successfully(triangles)", triangles.vboId[0], triangles.vboId[1]);
// Upload and link quads vertex buffers // Upload and link quads vertex buffers
if (vaoSupported) if (vaoSupported)
{ {
// Initialize Quads VAO // Initialize Quads VAO
glGenVertexArrays(1, &vaoQuads); glGenVertexArrays(1, &quads.vaoId);
glBindVertexArray(vaoQuads); glBindVertexArray(quads.vaoId);
} }
// Create buffers for our vertex data
glGenBuffers(4, quadsBuffer);
// Quads - Vertex buffers binding and attributes enable // Quads - Vertex buffers binding and attributes enable
// Vertex position buffer (shader-location = 0) // Vertex position buffer (shader-location = 0)
glBindBuffer(GL_ARRAY_BUFFER, quadsBuffer[0]); glGenBuffers(1, &quads.vboId[0]);
glBindBuffer(GL_ARRAY_BUFFER, quads.vboId[0]);
glBufferData(GL_ARRAY_BUFFER, sizeof(float)*3*4*MAX_QUADS_BATCH, quads.vertices, GL_DYNAMIC_DRAW); glBufferData(GL_ARRAY_BUFFER, sizeof(float)*3*4*MAX_QUADS_BATCH, quads.vertices, GL_DYNAMIC_DRAW);
glEnableVertexAttribArray(currentShader.vertexLoc); glEnableVertexAttribArray(currentShader.vertexLoc);
glVertexAttribPointer(currentShader.vertexLoc, 3, GL_FLOAT, 0, 0, 0); glVertexAttribPointer(currentShader.vertexLoc, 3, GL_FLOAT, 0, 0, 0);
// Vertex texcoord buffer (shader-location = 1) // Vertex texcoord buffer (shader-location = 1)
glBindBuffer(GL_ARRAY_BUFFER, quadsBuffer[1]); glGenBuffers(1, &quads.vboId[1]);
glBindBuffer(GL_ARRAY_BUFFER, quads.vboId[1]);
glBufferData(GL_ARRAY_BUFFER, sizeof(float)*2*4*MAX_QUADS_BATCH, quads.texcoords, GL_DYNAMIC_DRAW); glBufferData(GL_ARRAY_BUFFER, sizeof(float)*2*4*MAX_QUADS_BATCH, quads.texcoords, GL_DYNAMIC_DRAW);
glEnableVertexAttribArray(currentShader.texcoordLoc); glEnableVertexAttribArray(currentShader.texcoordLoc);
glVertexAttribPointer(currentShader.texcoordLoc, 2, GL_FLOAT, 0, 0, 0); glVertexAttribPointer(currentShader.texcoordLoc, 2, GL_FLOAT, 0, 0, 0);
// Vertex color buffer (shader-location = 3) // Vertex color buffer (shader-location = 3)
glBindBuffer(GL_ARRAY_BUFFER, quadsBuffer[2]); glGenBuffers(1, &quads.vboId[2]);
glBindBuffer(GL_ARRAY_BUFFER, quads.vboId[2]);
glBufferData(GL_ARRAY_BUFFER, sizeof(unsigned char)*4*4*MAX_QUADS_BATCH, quads.colors, GL_DYNAMIC_DRAW); glBufferData(GL_ARRAY_BUFFER, sizeof(unsigned char)*4*4*MAX_QUADS_BATCH, quads.colors, GL_DYNAMIC_DRAW);
glEnableVertexAttribArray(currentShader.colorLoc); glEnableVertexAttribArray(currentShader.colorLoc);
glVertexAttribPointer(currentShader.colorLoc, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, 0); glVertexAttribPointer(currentShader.colorLoc, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, 0);
// Fill index buffer // Fill index buffer
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, quadsBuffer[3]); glGenBuffers(1, &quads.vboId[3]);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, quads.vboId[3]);
#if defined(GRAPHICS_API_OPENGL_33) #if defined(GRAPHICS_API_OPENGL_33)
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);
#endif #endif
if (vaoSupported) TraceLog(INFO, "[VAO ID %i] Default buffers VAO initialized successfully (quads)", vaoQuads); if (vaoSupported) TraceLog(INFO, "[VAO ID %i] Default buffers VAO initialized successfully (quads)", quads.vaoId);
else TraceLog(INFO, "[VBO ID %i][VBO ID %i][VBO ID %i][VBO ID %i] Default buffers VBOs initialized successfully (quads)", quadsBuffer[0], quadsBuffer[1], quadsBuffer[2], quadsBuffer[3]); else TraceLog(INFO, "[VBO ID %i][VBO ID %i][VBO ID %i][VBO ID %i] Default buffers VBOs initialized successfully (quads)", quads.vboId[0], quads.vboId[1], quads.vboId[2], quads.vboId[3]);
// Unbind the current VAO // Unbind the current VAO
if (vaoSupported) glBindVertexArray(0); if (vaoSupported) glBindVertexArray(0);
@ -2554,15 +2537,15 @@ static void UpdateDefaultBuffers(void)
if (lines.vCounter > 0) if (lines.vCounter > 0)
{ {
// Activate Lines VAO // Activate Lines VAO
if (vaoSupported) glBindVertexArray(vaoLines); if (vaoSupported) glBindVertexArray(lines.vaoId);
// Lines - vertex positions buffer // Lines - vertex positions buffer
glBindBuffer(GL_ARRAY_BUFFER, linesBuffer[0]); glBindBuffer(GL_ARRAY_BUFFER, lines.vboId[0]);
//glBufferData(GL_ARRAY_BUFFER, sizeof(float)*3*2*MAX_LINES_BATCH, lines.vertices, GL_DYNAMIC_DRAW); //glBufferData(GL_ARRAY_BUFFER, sizeof(float)*3*2*MAX_LINES_BATCH, lines.vertices, GL_DYNAMIC_DRAW);
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(float)*3*lines.vCounter, lines.vertices); // target - offset (in bytes) - size (in bytes) - data pointer glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(float)*3*lines.vCounter, lines.vertices); // target - offset (in bytes) - size (in bytes) - data pointer
// Lines - colors buffer // Lines - colors buffer
glBindBuffer(GL_ARRAY_BUFFER, linesBuffer[1]); glBindBuffer(GL_ARRAY_BUFFER, lines.vboId[1]);
//glBufferData(GL_ARRAY_BUFFER, sizeof(float)*4*2*MAX_LINES_BATCH, lines.colors, GL_DYNAMIC_DRAW); //glBufferData(GL_ARRAY_BUFFER, sizeof(float)*4*2*MAX_LINES_BATCH, lines.colors, GL_DYNAMIC_DRAW);
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(unsigned char)*4*lines.cCounter, lines.colors); glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(unsigned char)*4*lines.cCounter, lines.colors);
} }
@ -2571,15 +2554,15 @@ static void UpdateDefaultBuffers(void)
if (triangles.vCounter > 0) if (triangles.vCounter > 0)
{ {
// Activate Triangles VAO // Activate Triangles VAO
if (vaoSupported) glBindVertexArray(vaoTriangles); if (vaoSupported) glBindVertexArray(triangles.vaoId);
// Triangles - vertex positions buffer // Triangles - vertex positions buffer
glBindBuffer(GL_ARRAY_BUFFER, trianglesBuffer[0]); glBindBuffer(GL_ARRAY_BUFFER, triangles.vboId[0]);
//glBufferData(GL_ARRAY_BUFFER, sizeof(float)*3*3*MAX_TRIANGLES_BATCH, triangles.vertices, GL_DYNAMIC_DRAW); //glBufferData(GL_ARRAY_BUFFER, sizeof(float)*3*3*MAX_TRIANGLES_BATCH, triangles.vertices, GL_DYNAMIC_DRAW);
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(float)*3*triangles.vCounter, triangles.vertices); glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(float)*3*triangles.vCounter, triangles.vertices);
// Triangles - colors buffer // Triangles - colors buffer
glBindBuffer(GL_ARRAY_BUFFER, trianglesBuffer[1]); glBindBuffer(GL_ARRAY_BUFFER, triangles.vboId[1]);
//glBufferData(GL_ARRAY_BUFFER, sizeof(float)*4*3*MAX_TRIANGLES_BATCH, triangles.colors, GL_DYNAMIC_DRAW); //glBufferData(GL_ARRAY_BUFFER, sizeof(float)*4*3*MAX_TRIANGLES_BATCH, triangles.colors, GL_DYNAMIC_DRAW);
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(unsigned char)*4*triangles.cCounter, triangles.colors); glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(unsigned char)*4*triangles.cCounter, triangles.colors);
} }
@ -2588,20 +2571,20 @@ static void UpdateDefaultBuffers(void)
if (quads.vCounter > 0) if (quads.vCounter > 0)
{ {
// Activate Quads VAO // Activate Quads VAO
if (vaoSupported) glBindVertexArray(vaoQuads); if (vaoSupported) glBindVertexArray(quads.vaoId);
// Quads - vertex positions buffer // Quads - vertex positions buffer
glBindBuffer(GL_ARRAY_BUFFER, quadsBuffer[0]); glBindBuffer(GL_ARRAY_BUFFER, quads.vboId[0]);
//glBufferData(GL_ARRAY_BUFFER, sizeof(float)*3*4*MAX_QUADS_BATCH, quads.vertices, GL_DYNAMIC_DRAW); //glBufferData(GL_ARRAY_BUFFER, sizeof(float)*3*4*MAX_QUADS_BATCH, quads.vertices, GL_DYNAMIC_DRAW);
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(float)*3*quads.vCounter, quads.vertices); glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(float)*3*quads.vCounter, quads.vertices);
// Quads - texture coordinates buffer // Quads - texture coordinates buffer
glBindBuffer(GL_ARRAY_BUFFER, quadsBuffer[1]); glBindBuffer(GL_ARRAY_BUFFER, quads.vboId[1]);
//glBufferData(GL_ARRAY_BUFFER, sizeof(float)*2*4*MAX_QUADS_BATCH, quads.texcoords, GL_DYNAMIC_DRAW); //glBufferData(GL_ARRAY_BUFFER, sizeof(float)*2*4*MAX_QUADS_BATCH, quads.texcoords, GL_DYNAMIC_DRAW);
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(float)*2*quads.vCounter, quads.texcoords); glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(float)*2*quads.vCounter, quads.texcoords);
// Quads - colors buffer // Quads - colors buffer
glBindBuffer(GL_ARRAY_BUFFER, quadsBuffer[2]); glBindBuffer(GL_ARRAY_BUFFER, quads.vboId[2]);
//glBufferData(GL_ARRAY_BUFFER, sizeof(float)*4*4*MAX_QUADS_BATCH, quads.colors, GL_DYNAMIC_DRAW); //glBufferData(GL_ARRAY_BUFFER, sizeof(float)*4*4*MAX_QUADS_BATCH, quads.colors, GL_DYNAMIC_DRAW);
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(unsigned char)*4*quads.vCounter, quads.colors); glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(unsigned char)*4*quads.vCounter, quads.colors);
@ -2640,17 +2623,17 @@ static void DrawDefaultBuffers(void)
if (vaoSupported) if (vaoSupported)
{ {
glBindVertexArray(vaoLines); glBindVertexArray(lines.vaoId);
} }
else else
{ {
// Bind vertex attrib: position (shader-location = 0) // Bind vertex attrib: position (shader-location = 0)
glBindBuffer(GL_ARRAY_BUFFER, linesBuffer[0]); glBindBuffer(GL_ARRAY_BUFFER, lines.vboId[0]);
glVertexAttribPointer(currentShader.vertexLoc, 3, GL_FLOAT, 0, 0, 0); glVertexAttribPointer(currentShader.vertexLoc, 3, GL_FLOAT, 0, 0, 0);
glEnableVertexAttribArray(currentShader.vertexLoc); glEnableVertexAttribArray(currentShader.vertexLoc);
// Bind vertex attrib: color (shader-location = 3) // Bind vertex attrib: color (shader-location = 3)
glBindBuffer(GL_ARRAY_BUFFER, linesBuffer[1]); glBindBuffer(GL_ARRAY_BUFFER, lines.vboId[1]);
glVertexAttribPointer(currentShader.colorLoc, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, 0); glVertexAttribPointer(currentShader.colorLoc, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, 0);
glEnableVertexAttribArray(currentShader.colorLoc); glEnableVertexAttribArray(currentShader.colorLoc);
} }
@ -2668,17 +2651,17 @@ static void DrawDefaultBuffers(void)
if (vaoSupported) if (vaoSupported)
{ {
glBindVertexArray(vaoTriangles); glBindVertexArray(triangles.vaoId);
} }
else else
{ {
// Bind vertex attrib: position (shader-location = 0) // Bind vertex attrib: position (shader-location = 0)
glBindBuffer(GL_ARRAY_BUFFER, trianglesBuffer[0]); glBindBuffer(GL_ARRAY_BUFFER, triangles.vboId[0]);
glVertexAttribPointer(currentShader.vertexLoc, 3, GL_FLOAT, 0, 0, 0); glVertexAttribPointer(currentShader.vertexLoc, 3, GL_FLOAT, 0, 0, 0);
glEnableVertexAttribArray(currentShader.vertexLoc); glEnableVertexAttribArray(currentShader.vertexLoc);
// Bind vertex attrib: color (shader-location = 3) // Bind vertex attrib: color (shader-location = 3)
glBindBuffer(GL_ARRAY_BUFFER, trianglesBuffer[1]); glBindBuffer(GL_ARRAY_BUFFER, triangles.vboId[1]);
glVertexAttribPointer(currentShader.colorLoc, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, 0); glVertexAttribPointer(currentShader.colorLoc, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, 0);
glEnableVertexAttribArray(currentShader.colorLoc); glEnableVertexAttribArray(currentShader.colorLoc);
} }
@ -2698,26 +2681,26 @@ static void DrawDefaultBuffers(void)
if (vaoSupported) if (vaoSupported)
{ {
glBindVertexArray(vaoQuads); glBindVertexArray(quads.vaoId);
} }
else else
{ {
// Bind vertex attrib: position (shader-location = 0) // Bind vertex attrib: position (shader-location = 0)
glBindBuffer(GL_ARRAY_BUFFER, quadsBuffer[0]); glBindBuffer(GL_ARRAY_BUFFER, quads.vboId[0]);
glVertexAttribPointer(currentShader.vertexLoc, 3, GL_FLOAT, 0, 0, 0); glVertexAttribPointer(currentShader.vertexLoc, 3, GL_FLOAT, 0, 0, 0);
glEnableVertexAttribArray(currentShader.vertexLoc); glEnableVertexAttribArray(currentShader.vertexLoc);
// Bind vertex attrib: texcoord (shader-location = 1) // Bind vertex attrib: texcoord (shader-location = 1)
glBindBuffer(GL_ARRAY_BUFFER, quadsBuffer[1]); glBindBuffer(GL_ARRAY_BUFFER, quads.vboId[1]);
glVertexAttribPointer(currentShader.texcoordLoc, 2, GL_FLOAT, 0, 0, 0); glVertexAttribPointer(currentShader.texcoordLoc, 2, GL_FLOAT, 0, 0, 0);
glEnableVertexAttribArray(currentShader.texcoordLoc); glEnableVertexAttribArray(currentShader.texcoordLoc);
// Bind vertex attrib: color (shader-location = 3) // Bind vertex attrib: color (shader-location = 3)
glBindBuffer(GL_ARRAY_BUFFER, quadsBuffer[2]); glBindBuffer(GL_ARRAY_BUFFER, quads.vboId[2]);
glVertexAttribPointer(currentShader.colorLoc, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, 0); glVertexAttribPointer(currentShader.colorLoc, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, 0);
glEnableVertexAttribArray(currentShader.colorLoc); glEnableVertexAttribArray(currentShader.colorLoc);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, quadsBuffer[3]); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, quads.vboId[3]);
} }
//TraceLog(DEBUG, "Draws required per frame: %i", drawsCounter); //TraceLog(DEBUG, "Draws required per frame: %i", drawsCounter);
@ -2733,9 +2716,9 @@ static void DrawDefaultBuffers(void)
// 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)
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));
#endif #endif
//GLenum err; //GLenum err;
//if ((err = glGetError()) != GL_NO_ERROR) TraceLog(INFO, "OpenGL error: %i", (int)err); //GL_INVALID_ENUM! //if ((err = glGetError()) != GL_NO_ERROR) TraceLog(INFO, "OpenGL error: %i", (int)err); //GL_INVALID_ENUM!
@ -2787,21 +2770,21 @@ static void UnloadDefaultBuffers(void)
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
// Delete VBOs from GPU (VRAM) // Delete VBOs from GPU (VRAM)
glDeleteBuffers(1, &linesBuffer[0]); glDeleteBuffers(1, &lines.vboId[0]);
glDeleteBuffers(1, &linesBuffer[1]); glDeleteBuffers(1, &lines.vboId[1]);
glDeleteBuffers(1, &trianglesBuffer[0]); glDeleteBuffers(1, &triangles.vboId[0]);
glDeleteBuffers(1, &trianglesBuffer[1]); glDeleteBuffers(1, &triangles.vboId[1]);
glDeleteBuffers(1, &quadsBuffer[0]); glDeleteBuffers(1, &quads.vboId[0]);
glDeleteBuffers(1, &quadsBuffer[1]); glDeleteBuffers(1, &quads.vboId[1]);
glDeleteBuffers(1, &quadsBuffer[2]); glDeleteBuffers(1, &quads.vboId[2]);
glDeleteBuffers(1, &quadsBuffer[3]); glDeleteBuffers(1, &quads.vboId[3]);
if (vaoSupported) if (vaoSupported)
{ {
// Delete VAOs from GPU (VRAM) // Delete VAOs from GPU (VRAM)
glDeleteVertexArrays(1, &vaoLines); glDeleteVertexArrays(1, &lines.vaoId);
glDeleteVertexArrays(1, &vaoTriangles); glDeleteVertexArrays(1, &triangles.vaoId);
glDeleteVertexArrays(1, &vaoQuads); glDeleteVertexArrays(1, &quads.vaoId);
} }
// Free vertex arrays memory from CPU (RAM) // Free vertex arrays memory from CPU (RAM)

View file

@ -137,37 +137,41 @@ typedef enum { OPENGL_11 = 1, OPENGL_33, OPENGL_ES_20 } GlVersion;
Vector3 max; Vector3 max;
} BoundingBox; } BoundingBox;
// Mesh with vertex data type // Vertex data definning a mesh
// NOTE: If using OpenGL 1.1, data loaded in CPU; if OpenGL 3.3+ data loaded in GPU (vaoId)
typedef struct Mesh { typedef struct Mesh {
int vertexCount; // num vertices int vertexCount; // number of vertices stored in arrays
float *vertices; // vertex position (XYZ - 3 components per vertex) float *vertices; // vertex position (XYZ - 3 components per vertex) (shader-location = 0)
float *texcoords; // vertex texture coordinates (UV - 2 components per vertex) float *texcoords; // vertex texture coordinates (UV - 2 components per vertex) (shader-location = 1)
float *texcoords2; // vertex second texture coordinates (useful for lightmaps) float *texcoords2; // vertex second texture coordinates (useful for lightmaps) (shader-location = 5)
float *normals; // vertex normals (XYZ - 3 components per vertex) float *normals; // vertex normals (XYZ - 3 components per vertex) (shader-location = 2)
float *tangents; // vertex tangents (XYZ - 3 components per vertex) float *tangents; // vertex tangents (XYZ - 3 components per vertex) (shader-location = 4)
unsigned char *colors; // vertex colors (RGBA - 4 components per vertex) unsigned char *colors; // vertex colors (RGBA - 4 components per vertex) (shader-location = 3)
unsigned short *indices; // vertex indices (in case vertex data comes indexed)
int triangleCount; // number of triangles stored (indexed or not)
BoundingBox bounds; // mesh limits defined by min and max points BoundingBox bounds; // mesh limits defined by min and max points
unsigned int vaoId; // OpenGL Vertex Array Object id unsigned int vaoId; // OpenGL Vertex Array Object id
unsigned int vboId[6]; // OpenGL Vertex Buffer Objects id (6 types of vertex data) unsigned int vboId[7]; // OpenGL Vertex Buffer Objects id (7 types of vertex data)
} Mesh; } Mesh;
// Shader type // Shader type (generic shader)
typedef struct Shader { typedef struct Shader {
unsigned int id; // Shader program id unsigned int id; // Shader program id
// Vertex attributes locations (default locations)
int vertexLoc; // Vertex attribute location point (default-location = 0)
int texcoordLoc; // Texcoord attribute location point (default-location = 1)
int normalLoc; // Normal attribute location point (default-location = 2)
int colorLoc; // Color attibute location point (default-location = 3)
int tangentLoc; // Tangent attribute location point (default-location = 4)
int texcoord2Loc; // Texcoord2 attribute location point (default-location = 5)
// Variable attributes // Uniform locations
int vertexLoc; // Vertex attribute location point (vertex shader)
int texcoordLoc; // Texcoord attribute location point (vertex shader)
int normalLoc; // Normal attribute location point (vertex shader)
int colorLoc; // Color attibute location point (vertex shader)
// Uniforms
int mvpLoc; // ModelView-Projection matrix uniform location point (vertex shader) int mvpLoc; // ModelView-Projection matrix uniform location point (vertex shader)
int tintColorLoc; // Color uniform location point (fragment shader) int tintColorLoc; // Color uniform location point (fragment shader)
// Texture map locations
int mapDiffuseLoc; // Diffuse map texture uniform location point (fragment shader) int mapDiffuseLoc; // Diffuse map texture uniform location point (fragment shader)
int mapNormalLoc; // Normal map texture uniform location point (fragment shader) int mapNormalLoc; // Normal map texture uniform location point (fragment shader)
int mapSpecularLoc; // Specular map texture uniform location point (fragment shader) int mapSpecularLoc; // Specular map texture uniform location point (fragment shader)
@ -205,13 +209,6 @@ typedef enum { OPENGL_11 = 1, OPENGL_33, OPENGL_ES_20 } GlVersion;
float glossiness; float glossiness;
float normalDepth; float normalDepth;
} Material; } Material;
// 3d Model type
typedef struct Model {
Mesh mesh;
Matrix transform;
Material material;
} Model;
// Color blending modes (pre-defined) // Color blending modes (pre-defined)
typedef enum { BLEND_ALPHA = 0, BLEND_ADDITIVE, BLEND_MULTIPLIED } BlendMode; typedef enum { BLEND_ALPHA = 0, BLEND_ADDITIVE, BLEND_MULTIPLIED } BlendMode;