diff --git a/src/experimental/filament/filament/gui_view.cc b/src/experimental/filament/filament/gui_view.cc index 25fe8357..ff98b757 100644 --- a/src/experimental/filament/filament/gui_view.cc +++ b/src/experimental/filament/filament/gui_view.cc @@ -64,7 +64,7 @@ GuiView::GuiView(filament::Engine* engine, ObjectManager* object_mgr) GuiView::~GuiView() { ResetRenderable(); for (auto& instance : instances_) { - engine_->destroy(instance.second); + engine_->destroy(instance); } engine_->destroyCameraComponent(camera_->getEntity()); engine_->destroy(view_); @@ -166,7 +166,8 @@ bool GuiView::PrepareRenderable() { } mjrRect clip_rect{clip_left, clip_bottom, clip_width, clip_height}; - builder.material(drawable_index, GetMaterialInstance(clip_rect)); + builder.material(drawable_index, + GetMaterialInstance(drawable_index, clip_rect)); builder.geometry(drawable_index, kTriangles, buffer.vertex_buffer, buffer.index_buffer, index_offset, command.ElemCount); @@ -184,26 +185,17 @@ bool GuiView::PrepareRenderable() { return true; } -// Maps a rect into a 64-bit key to assist with lookup. -static uint64_t MakeRectKey(mjrRect rect) { - return static_cast(rect.left & 0xff) << 24 | - static_cast(rect.bottom & 0xff) << 16 | - static_cast(rect.width & 0xff) << 8 | - static_cast(rect.height & 0xff); -} - -filament::MaterialInstance* GuiView::GetMaterialInstance(mjrRect rect) { - const uint64_t key = MakeRectKey(rect); - auto iter = instances_.find(key); - if (iter != instances_.end()) { - return iter->second; +filament::MaterialInstance* GuiView::GetMaterialInstance(int index, + mjrRect rect) { + while (index >= instances_.size()) { + filament::TextureSampler sampler; + filament::MaterialInstance* instance = material_->createInstance(); + instance->setParameter("glyph", object_mgr_->GetFont(0), sampler); + instances_.push_back(instance); } - auto instance = material_->createInstance(); + filament::MaterialInstance* instance = instances_[index]; instance->setScissor(rect.left, rect.bottom, rect.width, rect.height); - filament::TextureSampler sampler; - instance->setParameter("glyph", object_mgr_->GetFont(0), sampler); - instances_[key] = instance; return instance; } diff --git a/src/experimental/filament/filament/gui_view.h b/src/experimental/filament/filament/gui_view.h index a4156053..236903e9 100644 --- a/src/experimental/filament/filament/gui_view.h +++ b/src/experimental/filament/filament/gui_view.h @@ -49,7 +49,7 @@ class GuiView { private: // Returns the filament::MaterialInstance configured to draw into the given // scissor rect. - filament::MaterialInstance* GetMaterialInstance(mjrRect rect); + filament::MaterialInstance* GetMaterialInstance(int index, mjrRect rect); // Clears the filament::Scene of the UX renderable and releases all buffers. void ResetRenderable(); @@ -62,7 +62,7 @@ class GuiView { filament::Material* material_ = nullptr; utils::Entity renderable_; std::vector buffers_; - std::unordered_map instances_; + std::vector instances_; }; // Draws text at the given screen coordinates in clip space (i.e. [-1,-1,-1] to