From 4ce0ee2011c23dc670f8842c76e7c7eacfab7daf Mon Sep 17 00:00:00 2001 From: Haroon Qureshi Date: Wed, 26 Nov 2025 02:35:09 -0800 Subject: [PATCH] Update texture handling due to recent ImGui upgrade. PiperOrigin-RevId: 837030453 Change-Id: I042c4a7df7dc6c7e07c40eb5f32e5031e5b1d60a --- .../filament/filament/gui_view.cc | 64 ++++++++++++++++--- src/experimental/filament/filament/gui_view.h | 4 +- 2 files changed, 57 insertions(+), 11 deletions(-) diff --git a/src/experimental/filament/filament/gui_view.cc b/src/experimental/filament/filament/gui_view.cc index 2fa5cf53..b331a7b5 100644 --- a/src/experimental/filament/filament/gui_view.cc +++ b/src/experimental/filament/filament/gui_view.cc @@ -17,6 +17,7 @@ #include #include #include +#include #include #include @@ -50,15 +51,6 @@ GuiView::GuiView(filament::Engine* engine, ObjectManager* object_mgr) view_->setPostProcessingEnabled(false); material_ = object_mgr_->GetMaterial(ObjectManager::kUnlitUi); - - // Upload the ImGui font as a texture that is sampled by the UX material. - int font_width = 0; - int font_height = 0; - int font_bpp = 0; - unsigned char* pixels = nullptr; - ImGuiIO& io = ImGui::GetIO(); - io.Fonts->GetTexDataAsRGBA32(&pixels, &font_width, &font_height, &font_bpp); - object_mgr_->UploadFont(pixels, font_width, font_height, 0); } GuiView::~GuiView() { @@ -88,6 +80,52 @@ void GuiView::ResetRenderable() { buffers_.clear(); } +void GuiView::ProcessTexture(ImTextureData* data) { + filament::Engine* engine = object_mgr_->GetEngine(); + + if (data->Status == ImTextureStatus_OK) { + return; + } else if (data->Status == ImTextureStatus_WantCreate) { + if (data->Format != ImTextureFormat_RGBA32) { + mju_error("Unsupported texture format."); + } + + filament::Texture* texture = + filament::Texture::Builder() + .width(data->Width) + .height(data->Height) + .levels(1) + .format(filament::Texture::InternalFormat::RGBA8) + .sampler(filament::Texture::Sampler::SAMPLER_2D) + .build(*engine); + + const int size = data->Width * data->Height * 4; + filament::Texture::PixelBufferDescriptor pb(data->GetPixels(), size, + filament::Texture::Format::RGBA, + filament::Texture::Type::UBYTE); + texture->setImage(*engine, 0, std::move(pb)); + + data->SetTexID((ImTextureID)texture); + data->SetStatus(ImTextureStatus_OK); + } else if (data->Status == ImTextureStatus_WantUpdates) { + const int size = data->Width * data->Height * 4; + filament::Texture::PixelBufferDescriptor pb(data->GetPixels(), size, + filament::Texture::Format::RGBA, + filament::Texture::Type::UBYTE); + filament::Texture* texture = (filament::Texture*)data->TexID; + texture->setImage(*engine, 0, std::move(pb)); + data->SetStatus(ImTextureStatus_OK); + } else if (data->Status == ImTextureStatus_WantDestroy && + data->UnusedFrames > 0) { + filament::Texture* texture = + reinterpret_cast(data->TexID); + engine->destroy(texture); + + data->SetTexID(ImTextureID_Invalid); + data->SetStatus(ImTextureStatus_Destroyed); + } +} + bool GuiView::PrepareRenderable() { ResetRenderable(); @@ -126,6 +164,12 @@ bool GuiView::PrepareRenderable() { builder.boundingBox({{-100, -100, -100}, {100, 100, 100}}); builder.culling(false); + if (commands->Textures != nullptr) { + for (ImTextureData* tex : *commands->Textures) { + ProcessTexture(tex); + } + } + int drawable_index = 0; for (int n = 0; n < commands->CmdListsCount; ++n) { const ImDrawList* cmds = commands->CmdLists[n]; @@ -190,7 +234,7 @@ filament::MaterialInstance* GuiView::GetMaterialInstance(int index, mjrRect rect, intptr_t texture_id) { while (index >= instances_.size()) { - const filament::Texture* texture = object_mgr_->GetFont(texture_id); + const auto* texture = reinterpret_cast(texture_id); filament::TextureSampler sampler; filament::MaterialInstance* instance = material_->createInstance(); diff --git a/src/experimental/filament/filament/gui_view.h b/src/experimental/filament/filament/gui_view.h index a65ec43e..5e41b17d 100644 --- a/src/experimental/filament/filament/gui_view.h +++ b/src/experimental/filament/filament/gui_view.h @@ -16,9 +16,9 @@ #define MUJOCO_SRC_EXPERIMENTAL_FILAMENT_FILAMENT_GUI_VIEW_H_ #include -#include #include +#include #include #include #include @@ -47,6 +47,8 @@ class GuiView { filament::View* PrepareRenderView(); private: + void ProcessTexture(ImTextureData* data); + // Returns the filament::MaterialInstance configured to draw into the given // scissor rect. filament::MaterialInstance* GetMaterialInstance(int index, mjrRect rect,