GRIM: Fix memory leaks related to EMI models
This commit is contained in:
parent
420f19d6de
commit
14b5763408
5 changed files with 40 additions and 2 deletions
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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) {}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue