Parcourir la source

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

Joshua Reisenauer il y a 9 ans
Parent
commit
529d20ee6a
3 fichiers modifiés avec 55 ajouts et 20 suppressions
  1. 18 5
      src/models.c
  2. 5 2
      src/raylib.h
  3. 32 13
      src/rlgl.c

+ 18 - 5
src/models.c

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

+ 5 - 2
src/raylib.h

@@ -368,18 +368,20 @@ typedef struct BoundingBox {
 
 // Vertex data definning a 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 *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 *normals;             // vertex normals (XYZ - 3 components per vertex) (shader-location = 2)
     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 short *indices;    // vertex indices (in case vertex data comes indexed)
+    int triangleCount;         // number of triangles to draw
     
     BoundingBox bounds;         // mesh limits defined by min and max points
     
     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;
 
 // 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 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 DrawModelEx(Model model, Vector3 position, Vector3 rotationAxis, float rotationAngle, Vector3 scale, Color tint);      // Draw a model with extended parameters

+ 32 - 13
src/rlgl.c

@@ -783,16 +783,16 @@ void rlDisableDepthTest(void)
 // Unload texture from GPU memory
 void rlDeleteTextures(unsigned int id)
 {
-    glDeleteTextures(1, &id);
+    if (id != 0) glDeleteTextures(1, &id);
 }
 
 // Unload render texture from GPU memory
 void rlDeleteRenderTextures(RenderTexture2D target)
 {
 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
-    glDeleteFramebuffers(1, &target.id);
-    glDeleteTextures(1, &target.texture.id);
-    glDeleteTextures(1, &target.depth.id);
+    if (target.id != 0) glDeleteFramebuffers(1, &target.id);
+    if (target.texture.id != 0) glDeleteTextures(1, &target.texture.id);
+    if (target.depth.id != 0) glDeleteTextures(1, &target.depth.id);
 #endif
 }
 
@@ -800,7 +800,7 @@ void rlDeleteRenderTextures(RenderTexture2D target)
 void rlDeleteShader(unsigned int id)
 {
 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
-    glDeleteProgram(id);
+    if (id != 0) glDeleteProgram(id);
 #endif
 }
 
@@ -810,7 +810,7 @@ void rlDeleteVertexArrays(unsigned int id)
 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
     if (vaoSupported) 
     {
-        glDeleteVertexArrays(1, &id);
+        if (id != 0) glDeleteVertexArrays(1, &id);
         TraceLog(INFO, "[VAO ID %i] Unloaded model data from VRAM (GPU)", id);
     }
 #endif
@@ -1094,7 +1094,7 @@ void rlglDrawEx(Mesh mesh, Material material, Matrix transform, bool wires)
     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          
+    if (mesh.colors != NULL) glEnableClientState(GL_COLOR_ARRAY);       // Enable colors 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
@@ -1104,7 +1104,9 @@ void rlglDrawEx(Mesh mesh, Material material, Matrix transform, bool wires)
     rlPushMatrix();
         rlMultMatrixf(MatrixToFloat(transform));
         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();
 
     glDisableClientState(GL_VERTEX_ARRAY);                  // Disable vertex array
@@ -1204,10 +1206,13 @@ void rlglDrawEx(Mesh mesh, Material material, Matrix transform, bool wires)
             glVertexAttribPointer(material.shader.texcoord2Loc, 2, GL_FLOAT, 0, 0, 0);
             glEnableVertexAttribArray(material.shader.texcoord2Loc);
         }
+        
+        if (mesh.indices != NULL) glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, quadsBuffer[3]);
     }
 
     // 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)
     {
@@ -1225,7 +1230,11 @@ void rlglDrawEx(Mesh mesh, Material material, Matrix transform, bool wires)
     glBindTexture(GL_TEXTURE_2D, 0);            // Unbind textures
 
     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
 #endif
@@ -1682,11 +1691,12 @@ void rlglLoadMesh(Mesh *mesh)
     mesh->vboId[3] = 0;     // Vertex colors VBO
     mesh->vboId[4] = 0;     // Vertex tangents 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)
     GLuint vaoId = 0;       // Vertex Array Objects (VAO)
-    GLuint vboId[6];        // Vertex Buffer Objects (VBOs)
+    GLuint vboId[7];        // Vertex Buffer Objects (VBOs)
 
     if (vaoSupported)
     {
@@ -1775,12 +1785,21 @@ void rlglLoadMesh(Mesh *mesh)
         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[1] = vboId[1];     // Texcoords VBO
     mesh->vboId[2] = vboId[2];     // Normals VBO
     mesh->vboId[3] = vboId[3];     // Colors VBO
     mesh->vboId[4] = vboId[4];     // Tangents VBO
     mesh->vboId[5] = vboId[5];     // Texcoords2 VBO
+    mesh->vboId[6] = vboId[6];     // Indices VBO
 
     if (vaoSupported)
     {
@@ -2733,9 +2752,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
 #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)
-            glDrawElements(GL_TRIANGLES, numIndicesToProcess, GL_UNSIGNED_SHORT, (GLvoid*) (sizeof(GLushort) * indicesOffset));
+            glDrawElements(GL_TRIANGLES, numIndicesToProcess, GL_UNSIGNED_SHORT, (GLvoid *)(sizeof(GLushort)*indicesOffset));
 #endif
             //GLenum err;
             //if ((err = glGetError()) != GL_NO_ERROR) TraceLog(INFO, "OpenGL error: %i", (int)err);    //GL_INVALID_ENUM!