From 60928ec82c28fae8ea98f5f29e260b24717123ff Mon Sep 17 00:00:00 2001 From: Ray Date: Tue, 1 Dec 2020 23:44:10 +0100 Subject: [PATCH] ADDED: UnloadModelKeepMeshes() #1441 --- src/models.c | 47 +++++++++++++++++++++++++++++++++++++++++------ src/raylib.h | 3 ++- 2 files changed, 43 insertions(+), 7 deletions(-) diff --git a/src/models.c b/src/models.c index dbc58fc05..4ce4f825f 100644 --- a/src/models.c +++ b/src/models.c @@ -782,16 +782,25 @@ 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); @@ -800,7 +809,32 @@ 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 (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); + + // Unload animation data + RL_FREE(model.bones); + RL_FREE(model.bindPose); + + 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 610c836d8..2d635406c 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