diff --git a/engines/grim/material.cpp b/engines/grim/material.cpp index 4dcb31babff..56a159698a7 100644 --- a/engines/grim/material.cpp +++ b/engines/grim/material.cpp @@ -26,6 +26,7 @@ #include "engines/grim/material.h" #include "engines/grim/gfx_base.h" #include "engines/grim/colormap.h" +#include "engines/grim/resource.h" namespace Grim { @@ -95,6 +96,20 @@ Material::Material(const Common::String &filename, const char *data, int len, CM _data = MaterialData::getMaterialData(filename, data, len, cmap); } +void Material::reload(CMap *cmap) { + Common::String fname = _data->_fname; + --_data->_refCount; + if (_data->_refCount < 1) { + delete _data; + } + + Material *m = g_resourceloader->loadMaterial(fname, cmap); + // Steal the data from the new material and discard it. + _data = m->_data; + ++_data->_refCount; + delete m; +} + void Material::select() const { if (_data->_width && _data->_height) g_driver->selectMaterial(this); diff --git a/engines/grim/material.h b/engines/grim/material.h index d510622bac7..99187e9acbe 100644 --- a/engines/grim/material.h +++ b/engines/grim/material.h @@ -50,6 +50,7 @@ public: // Load a texture from the given data. Material(const Common::String &filename, const char *data, int len, CMap *cmap); + void reload(CMap *cmap); // Load this texture into the GL context void select() const; diff --git a/engines/grim/model.cpp b/engines/grim/model.cpp index f13d78ee2e0..fd38c2b11c4 100644 --- a/engines/grim/model.cpp +++ b/engines/grim/model.cpp @@ -242,13 +242,13 @@ void Model::loadMaterial(int index, CMap *cmap) { } _materials[index] = NULL; if (_parent) { - _materials[index] = _parent->findMaterial(_materialNames[index]); + _materials[index] = _parent->findMaterial(_materialNames[index], cmap); if (_materials[index]) { _materialsShared[index] = true; } } if (!_materials[index]) { - if (mat && cmap == _cmap) { + if (mat && cmap->getFilename() == _cmap->getFilename()) { _materials[index] = mat; } else { _materials[index] = g_resourceloader->loadMaterial(_materialNames[index], cmap); @@ -260,9 +260,11 @@ void Model::loadMaterial(int index, CMap *cmap) { } } -Material *Model::findMaterial(const char *name) const { +Material *Model::findMaterial(const char *name, CMap *cmap) const { for (int i = 0; i < _numMaterials; ++i) { if (scumm_stricmp(name, _materialNames[i]) == 0) { + if (cmap->getFilename() != _cmap->getFilename()) + _materials[i]->reload(cmap); return _materials[i]; } } diff --git a/engines/grim/model.h b/engines/grim/model.h index c2f094fd29a..2a5c7c5b6ba 100644 --- a/engines/grim/model.h +++ b/engines/grim/model.h @@ -55,7 +55,7 @@ public: void loadEMI(Common::MemoryReadStream &ms); void reload(CMap *cmap); void draw() const; - Material *findMaterial(const char *name) const; + Material *findMaterial(const char *name, CMap *cmap) const; ~Model();