GRIM: Fix memory leaks related to EMI models

This commit is contained in:
Bastien Bouclet 2016-07-12 06:09:39 +02:00
parent 420f19d6de
commit 14b5763408
5 changed files with 40 additions and 2 deletions

View file

@ -1935,8 +1935,7 @@ void Actor::clearShadowPlane(int i) {
shadow->active = false;
shadow->dontNegate = false;
// TODO: Clean up the userData properly
shadow->userData = nullptr;
g_driver->destroyShadow(shadow);
}
void Actor::putInSet(const Common::String &set) {

View file

@ -465,6 +465,8 @@ EMIModel::EMIModel(const Common::String &filename, Common::SeekableReadStream *d
}
EMIModel::~EMIModel() {
g_driver->destroyEMIModel(this);
delete[] _vertices;
delete[] _drawVertices;
delete[] _normals;

View file

@ -133,6 +133,7 @@ public:
virtual bool isShadowModeActive();
virtual void setShadowColor(byte r, byte g, byte b) = 0;
virtual void getShadowColor(byte *r, byte *g, byte *b) = 0;
virtual void destroyShadow(Shadow *shadow) {}
virtual void set3DMode() = 0;
@ -265,6 +266,7 @@ public:
virtual void destroyMesh(const Mesh *mesh) {}
virtual void createEMIModel(EMIModel *model) {}
virtual void updateEMIModel(const EMIModel *model) {}
virtual void destroyEMIModel(EMIModel *model) {}
virtual int genBuffer() { return 0; }
virtual void delBuffer(int buffer) {}

View file

@ -909,6 +909,17 @@ void GfxOpenGLS::getShadowColor(byte *r, byte *g, byte *b) {
*b = _shadowColorB;
}
void GfxOpenGLS::destroyShadow(Shadow *shadow) {
ShadowUserData *sud = static_cast<ShadowUserData *>(shadow->userData);
if (sud) {
OpenGL::Shader::freeBuffer(sud->_verticesVBO);
OpenGL::Shader::freeBuffer(sud->_indicesVBO);
delete sud;
}
shadow->userData = nullptr;
}
void GfxOpenGLS::set3DMode() {
}
@ -1992,6 +2003,28 @@ void GfxOpenGLS::createEMIModel(EMIModel *model) {
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
}
void GfxOpenGLS::destroyEMIModel(EMIModel *model) {
for (uint32 i = 0; i < model->_numFaces; ++i) {
EMIMeshFace *face = &model->_faces[i];
OpenGL::Shader::freeBuffer(face->_indicesEBO);
face->_indicesEBO = 0;
}
EMIModelUserData *mud = static_cast<EMIModelUserData *>(model->_userData);
if (mud) {
OpenGL::Shader::freeBuffer(mud->_verticesVBO);
OpenGL::Shader::freeBuffer(mud->_normalsVBO);
OpenGL::Shader::freeBuffer(mud->_texCoordsVBO);
OpenGL::Shader::freeBuffer(mud->_colorMapVBO);
delete mud->_shader;
delete mud;
}
model->_userData = nullptr;
}
void GfxOpenGLS::createMesh(Mesh *mesh) {
Common::Array<GrimVertex> meshInfo;
meshInfo.reserve(mesh->_numVertices * 5);

View file

@ -80,6 +80,7 @@ public:
virtual bool isShadowModeActive() override;
virtual void setShadowColor(byte r, byte g, byte b) override;
virtual void getShadowColor(byte *r, byte *g, byte *b) override;
virtual void destroyShadow(Shadow *shadow) override;
virtual void set3DMode() override;
@ -206,6 +207,7 @@ public:
virtual void destroyMesh(const Mesh *mesh) override;
virtual void createEMIModel(EMIModel *model) override;
virtual void updateEMIModel(const EMIModel* model) override;
virtual void destroyEMIModel(EMIModel *model) override;
virtual void setBlendMode(bool additive) override;