summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/models.c47
-rw-r--r--src/raylib.h3
2 files changed, 43 insertions, 7 deletions
diff --git a/src/models.c b/src/models.c
index dbc58fc0..4ce4f825 100644
--- a/src/models.c
+++ b/src/models.c
@@ -782,16 +782,50 @@ Model LoadModelFromMesh(Mesh mesh)
return model;
}
-// Unload model from memory (RAM and/or VRAM)
+// Unload model (meshes/materials) from memory (RAM and/or VRAM)
+// NOTE: This function takes care of all model elements, for a detailed control
+// over them, use UnloadMesh() and UnloadMaterial()
void UnloadModel(Model model)
{
+ // Unload meshes
for (int i = 0; i < model.meshCount; i++) UnloadMesh(model.meshes[i]);
- // As the user could be sharing shaders and textures between models,
- // we don't unload the material but just free it's maps, the user
- // is responsible for freeing models shaders and textures
- for (int i = 0; i < model.materialCount; i++) RL_FREE(model.materials[i].maps);
+ // Unload materials maps and params
+ // NOTE: As the user could be sharing shaders and textures between models,
+ // we don't unload the material but just free it's maps and params,
+ // the user is responsible for freeing models shaders and textures
+ for (int i = 0; i < model.materialCount; i++)
+ {
+ RL_FREE(model.materials[i].maps);
+ RL_FREE(model.materials[i].params);
+ }
+
+ // Unload arrays
+ RL_FREE(model.meshes);
+ RL_FREE(model.materials);
+ RL_FREE(model.meshMaterial);
+
+ // Unload animation data
+ RL_FREE(model.bones);
+ RL_FREE(model.bindPose);
+
+ TRACELOG(LOG_INFO, "MODEL: Unloaded model (and meshes) from RAM and VRAM");
+}
+
+// Unload model (but not meshes) from memory (RAM and/or VRAM)
+void UnloadModelKeepMeshes(Model model)
+{
+ // Unload materials maps and params
+ // NOTE: As the user could be sharing shaders and textures between models,
+ // we don't unload the material but just free it's maps and params,
+ // the user is responsible for freeing models shaders and textures
+ for (int i = 0; i < model.materialCount; i++)
+ {
+ RL_FREE(model.materials[i].maps);
+ RL_FREE(model.materials[i].params);
+ }
+ // Unload arrays
RL_FREE(model.meshes);
RL_FREE(model.materials);
RL_FREE(model.meshMaterial);
@@ -800,7 +834,7 @@ void UnloadModel(Model model)
RL_FREE(model.bones);
RL_FREE(model.bindPose);
- TRACELOG(LOG_INFO, "MODEL: Unloaded model from RAM and VRAM");
+ TRACELOG(LOG_INFO, "MODEL: Unloaded model (but not meshes) from RAM and VRAM");
}
// Load meshes from model file
@@ -950,6 +984,7 @@ void UnloadMaterial(Material material)
}
RL_FREE(material.maps);
+ RL_FREE(material.params);
}
// Set texture for a material map type (MAP_DIFFUSE, MAP_SPECULAR...)
diff --git a/src/raylib.h b/src/raylib.h
index 610c836d..2d635406 100644
--- a/src/raylib.h
+++ b/src/raylib.h
@@ -1321,7 +1321,8 @@ RLAPI void DrawGizmo(Vector3 position);
// Model loading/unloading functions
RLAPI Model LoadModel(const char *fileName); // Load model from files (meshes and materials)
RLAPI Model LoadModelFromMesh(Mesh mesh); // Load model from generated mesh (default material)
-RLAPI void UnloadModel(Model model); // Unload model from memory (RAM and/or VRAM)
+RLAPI void UnloadModel(Model model); // Unload model (including meshes) from memory (RAM and/or VRAM)
+RLAPI void UnloadModelKeepMeshes(Model model); // Unload model (but not meshes) from memory (RAM and/or VRAM)
// Mesh loading/unloading functions
RLAPI Mesh *LoadMeshes(const char *fileName, int *meshCount); // Load meshes from model file