diff --git a/src/render/filament/core/material_manager.cc b/src/render/filament/core/material_manager.cc index 111a3cb6..f07d1aaa 100644 --- a/src/render/filament/core/material_manager.cc +++ b/src/render/filament/core/material_manager.cc @@ -236,7 +236,11 @@ MaterialManager::MaterialKey MaterialManager::PrepareMaterialInstance( return key; } -filament::MaterialInstance* MaterialManager::GetInstance(MaterialKey key) { +const filament::MaterialInstance* MaterialManager::GetInstance(MaterialKey key) { + if (key == 0) { + return GetEngine()->getDefaultMaterial()->getDefaultInstance(); + } + auto it = instances_.find(key); if (it == instances_.end()) { return nullptr; diff --git a/src/render/filament/core/material_manager.h b/src/render/filament/core/material_manager.h index ab79abfd..5f71eb89 100644 --- a/src/render/filament/core/material_manager.h +++ b/src/render/filament/core/material_manager.h @@ -67,7 +67,7 @@ class MaterialManager { const Mesh* mesh); // Returns the MaterialInstance associated with the given key. - filament::MaterialInstance* GetInstance(MaterialKey key); + const filament::MaterialInstance* GetInstance(MaterialKey key); ObjectManager* GetObjectManager() const; filament::Engine* GetEngine() const; diff --git a/src/render/filament/core/renderable.cc b/src/render/filament/core/renderable.cc index 8c975cc9..31aac819 100644 --- a/src/render/filament/core/renderable.cc +++ b/src/render/filament/core/renderable.cc @@ -239,6 +239,9 @@ const mjrfMaterial& Renderable::GetMaterial() const { return material_; } void Renderable::Prepare(std::span requests, ReflectionManager* reflection_mgr) { + // Ensure the renderable has no material instances set from the previous + // frame. This will allow us to recycle material instances if needed. + SetMaterialInstance(0); // We assume BindMaterialInstance will be called with the same requests in // the same order. As such, we'll just store the draw state in a deque rather // than trying to perform any kind of matching with the requests. @@ -388,7 +391,8 @@ MaterialManager::MaterialKey Renderable::SetMaterialInstance( MaterialManager::MaterialKey key) { MaterialManager::MaterialKey prev = curr_state_.material_key; if (key != curr_state_.material_key) { - filament::MaterialInstance* instance = material_mgr_->GetInstance(key); + const filament::MaterialInstance* instance = + material_mgr_->GetInstance(key); filament::RenderableManager& rm = GetEngine()->getRenderableManager(); for (Part& part : parts_) { filament::RenderableManager::Instance ri = rm.getInstance(part.entity);