fixed leaks, also see pbr example review required

This commit is contained in:
Chris 2019-09-15 17:35:14 +01:00
parent 65e942e5be
commit 5dd8ee76ba
4 changed files with 66 additions and 43 deletions

View File

@ -98,7 +98,17 @@ int main(void)
// De-Initialization
//--------------------------------------------------------------------------------------
UnloadMaterial(model.materials[0]); // Unload material: shader and textures
//
// REQUIRES REVIEW
// as unload model removes *just* the maps now (user may be using shaders
// and textures elsewhere) when using a custom material you need to unload
// it then give the model a default model (to avoid double free)
// how ever this still results in a small leak....
UnloadMaterial(model.materials[0]);
model.materials[0] = LoadMaterialDefault();
UnloadModel(model); // Unload model
CloseWindow(); // Close window and OpenGL context

View File

@ -669,7 +669,8 @@ Model LoadModel(const char *fileName)
model.materials = (Material *)RL_CALLOC(model.materialCount, sizeof(Material));
model.materials[0] = LoadMaterialDefault();
model.meshMaterial = (int *)RL_CALLOC(model.meshCount, sizeof(int));
// this is a double allocation, as LoadXXX should do it....
//model.meshMaterial = (int *)RL_CALLOC(model.meshCount, sizeof(int));
}
return model;
@ -2797,10 +2798,11 @@ static Model LoadOBJ(const char *fileName)
{
model.materialCount = materialCount;
model.materials = (Material *)RL_CALLOC(model.materialCount, sizeof(Material));
}
}
model.meshMaterial = (int *)RL_CALLOC(model.meshCount, sizeof(int));
/*
// Multiple meshes data reference
// NOTE: They are provided as a faces offset
@ -2915,12 +2917,17 @@ static Model LoadOBJ(const char *fileName)
if (materials[m].displacement_texname != NULL) model.materials[m].maps[MAP_HEIGHT].texture = LoadTexture(materials[m].displacement_texname); //char *displacement_texname; // disp
}
if (model.meshMaterial[0]==-1) {
model.meshMaterial[0] = 0; // will be given default material by LoadModel
}
tinyobj_attrib_free(&attrib);
tinyobj_shapes_free(meshes, meshCount);
tinyobj_materials_free(materials, materialCount);
RL_FREE(data); // oh ray how did you miss this...! :-p
}
// NOTE: At this point we have all model data loaded
TraceLog(LOG_INFO, "[%s] Model loaded successfully in RAM (CPU)", fileName);
@ -3251,6 +3258,8 @@ static Model LoadIQM(const char *fileName)
}
}
model.meshMaterial = (int *)RL_CALLOC(model.meshCount, sizeof(int));
fclose(iqmFile);
RL_FREE(imesh);
RL_FREE(tri);

View File

@ -468,13 +468,17 @@ static void InitAudioBufferPool()
for (int i = 0; i < MAX_AUDIO_BUFFER_POOL_CHANNELS; i++)
{
audioBufferPool[i] = InitAudioBuffer(DEVICE_FORMAT, DEVICE_CHANNELS, DEVICE_SAMPLE_RATE, 0, AUDIO_BUFFER_USAGE_STATIC);
// Not needed (only the audiobuffer header) - leak prevention!
RL_FREE(audioBufferPool[i]->buffer);
}
}
// Close the audio buffers pool
static void CloseAudioBufferPool()
{
for (int i = 0; i < MAX_AUDIO_BUFFER_POOL_CHANNELS; i++) RL_FREE(audioBufferPool[i]);
for (int i = 0; i < MAX_AUDIO_BUFFER_POOL_CHANNELS; i++) {
RL_FREE(audioBufferPool[i]);
}
}
//----------------------------------------------------------------------------------