Rename GuiView to ImguiBridge.

PiperOrigin-RevId: 900186368
Change-Id: Ie8f08d081dbc9a2b5638b5e799788e81891c908a
This commit is contained in:
Haroon Qureshi
2026-04-15 08:43:21 -07:00
committed by Copybara-Service
parent a2d0e33c0f
commit e047f1101a
5 changed files with 35 additions and 40 deletions
@@ -39,7 +39,7 @@
#include <mujoco/mjvisualize.h> #include <mujoco/mjvisualize.h>
#include <mujoco/mujoco.h> #include <mujoco/mujoco.h>
#include "experimental/filament/filament/filament_platform_factory.h" #include "experimental/filament/filament/filament_platform_factory.h"
#include "experimental/filament/filament/gui_view.h" #include "experimental/filament/filament/imgui_bridge.h"
#include "experimental/filament/filament/imgui_editor.h" #include "experimental/filament/filament/imgui_editor.h"
#include "experimental/filament/filament/model_util.h" #include "experimental/filament/filament/model_util.h"
#include "experimental/filament/filament/object_manager.h" #include "experimental/filament/filament/object_manager.h"
@@ -82,7 +82,7 @@ FilamentContext::FilamentContext(const mjrFilamentConfig* config)
FilamentContext::~FilamentContext() { FilamentContext::~FilamentContext() {
DestroyRenderTargets(); DestroyRenderTargets();
gui_view_.reset(); imgui_bridge_.reset();
scene_bridge_.reset(); scene_bridge_.reset();
scene_view_.reset(); scene_view_.reset();
object_manager_.reset(); object_manager_.reset();
@@ -96,7 +96,7 @@ void FilamentContext::Init(const mjModel* model) {
scene_view_ = std::make_unique<SceneView>(engine_); scene_view_ = std::make_unique<SceneView>(engine_);
scene_bridge_ = std::make_unique<SceneBridge>(object_manager_.get(), model, scene_bridge_ = std::make_unique<SceneBridge>(object_manager_.get(), model,
scene_view_.get()); scene_view_.get());
gui_view_ = std::make_unique<GuiView>( imgui_bridge_ = std::make_unique<ImguiBridge>(
scene_view_.get(), object_manager_->GetMaterial(ObjectManager::kUnlitUi)); scene_view_.get(), object_manager_->GetMaterial(ObjectManager::kUnlitUi));
// Set clear options. // Set clear options.
@@ -127,11 +127,11 @@ void FilamentContext::Render(const mjrRect& viewport, const mjvScene* scene) {
scene_bridge_->Update(viewport, scene); scene_bridge_->Update(viewport, scene);
// Update the UX renderable entity after processing the scene in case there // Update the UX renderable entity after processing the scene in case there
// are any elements in the scene which generate UX draw calls (e.g. labels). // are any elements in the scene which generate UX draw calls (e.g. labels).
if (gui_view_ && gui_swap_chain_target_ == scene_swap_chain_target_) { if (imgui_bridge_ && gui_swap_chain_target_ == scene_swap_chain_target_) {
// Prepare the filament Renderable that contains the GUI draw commands. We // Prepare the filament Renderable that contains the GUI draw commands. We
// must call this function even if we do not plan on rendering the GUI to // must call this function even if we do not plan on rendering the GUI to
// ensure the ImGui state is updated. // ensure the ImGui state is updated.
gui_view_->Update(); imgui_bridge_->Update();
} }
last_render_mode_ = SceneView::DrawMode::kNormal; last_render_mode_ = SceneView::DrawMode::kNormal;
@@ -155,7 +155,7 @@ void FilamentContext::Render(const mjrRect& viewport, const mjvScene* scene) {
request.viewport = viewport; request.viewport = viewport;
request.camera = last_camera_; request.camera = last_camera_;
request.enable_ux = (gui_swap_chain_target_ == kWindowSwapChain); request.enable_ux = (gui_swap_chain_target_ == kWindowSwapChain);
request.gui_scale = gui_view_ ? gui_view_->GetScale() : 1.0f; request.gui_scale = imgui_bridge_ ? imgui_bridge_->GetScale() : 1.0f;
scene_view_->Render(renderer_, request); scene_view_->Render(renderer_, request);
renderer_->endFrame(); renderer_->endFrame();
} }
@@ -229,7 +229,7 @@ void FilamentContext::ReadPixels(mjrRect viewport, unsigned char* rgb,
request.target = color_target_.get(); request.target = color_target_.get();
request.camera = last_camera_; request.camera = last_camera_;
request.enable_ux = (gui_swap_chain_target_ == kOffscreenSwapChain); request.enable_ux = (gui_swap_chain_target_ == kOffscreenSwapChain);
request.gui_scale = gui_view_ ? gui_view_->GetScale() : 1.0f; request.gui_scale = imgui_bridge_ ? imgui_bridge_->GetScale() : 1.0f;
scene_view_->Render(renderer_, request); scene_view_->Render(renderer_, request);
const size_t num_bytes = viewport.width * viewport.height * 3; const size_t num_bytes = viewport.width * viewport.height * 3;
@@ -288,8 +288,8 @@ void FilamentContext::UploadHeightField(const mjModel* model, int id) {
uintptr_t FilamentContext::UploadGuiImage(uintptr_t tex_id, uintptr_t FilamentContext::UploadGuiImage(uintptr_t tex_id,
const uint8_t* pixels, int width, const uint8_t* pixels, int width,
int height, int bpp) { int height, int bpp) {
if (gui_view_) { if (imgui_bridge_) {
return gui_view_->UploadImage(tex_id, pixels, width, height, bpp); return imgui_bridge_->UploadImage(tex_id, pixels, width, height, bpp);
} }
return 0; return 0;
} }
@@ -24,7 +24,7 @@
#include <mujoco/mjmodel.h> #include <mujoco/mjmodel.h>
#include <mujoco/mjrender.h> #include <mujoco/mjrender.h>
#include <mujoco/mjvisualize.h> #include <mujoco/mjvisualize.h>
#include "experimental/filament/filament/gui_view.h" #include "experimental/filament/filament/imgui_bridge.h"
#include "experimental/filament/filament/object_manager.h" #include "experimental/filament/filament/object_manager.h"
#include "experimental/filament/filament/render_target.h" #include "experimental/filament/filament/render_target.h"
#include "experimental/filament/filament/scene_bridge.h" #include "experimental/filament/filament/scene_bridge.h"
@@ -89,7 +89,7 @@ class FilamentContext {
std::unique_ptr<ObjectManager> object_manager_; std::unique_ptr<ObjectManager> object_manager_;
std::unique_ptr<SceneView> scene_view_; std::unique_ptr<SceneView> scene_view_;
std::unique_ptr<SceneBridge> scene_bridge_; std::unique_ptr<SceneBridge> scene_bridge_;
std::unique_ptr<GuiView> gui_view_; std::unique_ptr<ImguiBridge> imgui_bridge_;
int window_width_ = 0; int window_width_ = 0;
int window_height_ = 0; int window_height_ = 0;
}; };
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
#include "experimental/filament/filament/gui_view.h" #include "experimental/filament/filament/imgui_bridge.h"
#include <cstddef> #include <cstddef>
#include <cstdint> #include <cstdint>
@@ -32,16 +32,13 @@
namespace mujoco { namespace mujoco {
GuiView::GuiView(SceneView* scene_view, filament::Material* ui_material) ImguiBridge::ImguiBridge(SceneView* scene_view, filament::Material* ui_material)
: scene_view_(scene_view), material_(ui_material) { : scene_view_(scene_view), material_(ui_material) {}
}
GuiView::~GuiView() { ImguiBridge::~ImguiBridge() { PrepareRenderables(0); }
PrepareRenderables(0);
}
uintptr_t GuiView::UploadImage(uintptr_t tex_id, const uint8_t* pixels, uintptr_t ImguiBridge::UploadImage(uintptr_t tex_id, const uint8_t* pixels,
int width, int height, int bpp) { int width, int height, int bpp) {
if (bpp != 4 && bpp != 3) { if (bpp != 4 && bpp != 3) {
mju_error("Unsupported image bpp. Got %d, wanted 3 or 4", bpp); mju_error("Unsupported image bpp. Got %d, wanted 3 or 4", bpp);
} }
@@ -79,9 +76,8 @@ uintptr_t GuiView::UploadImage(uintptr_t tex_id, const uint8_t* pixels,
// lifetime of the data. // lifetime of the data.
const size_t num_bytes = width * height * bpp; const size_t num_bytes = width * height * bpp;
std::byte* bytes = new std::byte[num_bytes]; std::byte* bytes = new std::byte[num_bytes];
const auto callback = +[](void* user) { const auto callback =
delete[] reinterpret_cast<std::byte*>(user); +[](void* user) { delete[] reinterpret_cast<std::byte*>(user); };
};
TextureData texture_data; TextureData texture_data;
DefaultTextureData(&texture_data); DefaultTextureData(&texture_data);
@@ -95,7 +91,7 @@ uintptr_t GuiView::UploadImage(uintptr_t tex_id, const uint8_t* pixels,
return tex_id; return tex_id;
} }
void GuiView::CreateTexture(ImTextureData* data) { void ImguiBridge::CreateTexture(ImTextureData* data) {
if (data->Format != ImTextureFormat_RGBA32) { if (data->Format != ImTextureFormat_RGBA32) {
mju_error("Unsupported texture format."); mju_error("Unsupported texture format.");
} }
@@ -115,7 +111,7 @@ void GuiView::CreateTexture(ImTextureData* data) {
UpdateTexture(data); UpdateTexture(data);
} }
void GuiView::UpdateTexture(ImTextureData* data) { void ImguiBridge::UpdateTexture(ImTextureData* data) {
auto iter = textures_.find(data->TexID); auto iter = textures_.find(data->TexID);
if (iter == textures_.end()) { if (iter == textures_.end()) {
mju_error("Texture not found: %llu", data->TexID); mju_error("Texture not found: %llu", data->TexID);
@@ -131,7 +127,7 @@ void GuiView::UpdateTexture(ImTextureData* data) {
data->SetStatus(ImTextureStatus_OK); data->SetStatus(ImTextureStatus_OK);
} }
void GuiView::DestroyTexture(ImTextureData* data) { void ImguiBridge::DestroyTexture(ImTextureData* data) {
auto iter = textures_.find(data->TexID); auto iter = textures_.find(data->TexID);
if (iter != textures_.end()) { if (iter != textures_.end()) {
textures_.erase(data->TexID); textures_.erase(data->TexID);
@@ -140,7 +136,7 @@ void GuiView::DestroyTexture(ImTextureData* data) {
} }
} }
void GuiView::Update() { void ImguiBridge::Update() {
if (!ImGui::GetCurrentContext()) { if (!ImGui::GetCurrentContext()) {
PrepareRenderables(0); PrepareRenderables(0);
return; return;
@@ -271,7 +267,7 @@ void GuiView::Update() {
} }
} }
void GuiView::PrepareRenderables(int count) { void ImguiBridge::PrepareRenderables(int count) {
while (renderables_.size() < count) { while (renderables_.size() < count) {
auto& r = renderables_.emplace_back( auto& r = renderables_.emplace_back(
std::make_unique<Renderable>(scene_view_->GetEngine())); std::make_unique<Renderable>(scene_view_->GetEngine()));
@@ -291,7 +287,7 @@ void GuiView::PrepareRenderables(int count) {
} }
} }
float GuiView::GetScale() const { float ImguiBridge::GetScale() const {
return ImGui::GetIO().DisplayFramebufferScale.x; return ImGui::GetIO().DisplayFramebufferScale.x;
} }
@@ -315,8 +311,7 @@ void DrawTextAt(const char* text, float x, float y, float z) {
const int flags = ImGuiWindowFlags_NoBringToFrontOnFocus | const int flags = ImGuiWindowFlags_NoBringToFrontOnFocus |
ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoFocusOnAppearing |
ImGuiWindowFlags_NoBackground | ImGuiWindowFlags_NoBackground |
ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoInputs |
ImGuiWindowFlags_NoInputs |
ImGuiWindowFlags_NoNav; ImGuiWindowFlags_NoNav;
ImGui::Begin("labels", nullptr, flags); ImGui::Begin("labels", nullptr, flags);
@@ -12,8 +12,8 @@
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
#ifndef MUJOCO_SRC_EXPERIMENTAL_FILAMENT_FILAMENT_GUI_VIEW_H_ #ifndef MUJOCO_SRC_EXPERIMENTAL_FILAMENT_FILAMENT_IMGUI_BRIDGE_H_
#define MUJOCO_SRC_EXPERIMENTAL_FILAMENT_FILAMENT_GUI_VIEW_H_ #define MUJOCO_SRC_EXPERIMENTAL_FILAMENT_FILAMENT_IMGUI_BRIDGE_H_
#include <cstdint> #include <cstdint>
#include <memory> #include <memory>
@@ -30,10 +30,10 @@
namespace mujoco { namespace mujoco {
// Manages Renderables that will be added a SceneView's UX scene. // Manages Renderables that will be added a SceneView's UX scene.
class GuiView { class ImguiBridge {
public: public:
GuiView(SceneView* scene_view, filament::Material* ui_material); ImguiBridge(SceneView* scene_view, filament::Material* ui_material);
~GuiView(); ~ImguiBridge();
// Prepares the Renderables using data from the current ImGui state. This // Prepares the Renderables using data from the current ImGui state. This
// function must be called once per frame to ensure ImGui state is correctly // function must be called once per frame to ensure ImGui state is correctly
@@ -47,8 +47,8 @@ class GuiView {
uintptr_t UploadImage(uintptr_t tex_id, const uint8_t* pixels, int width, uintptr_t UploadImage(uintptr_t tex_id, const uint8_t* pixels, int width,
int height, int bpp); int height, int bpp);
GuiView(const GuiView&) = delete; ImguiBridge(const ImguiBridge&) = delete;
GuiView& operator=(const GuiView&) = delete; ImguiBridge& operator=(const ImguiBridge&) = delete;
private: private:
// Ensures exactly `count` Renderables exist, creating or destroying them as // Ensures exactly `count` Renderables exist, creating or destroying them as
@@ -72,4 +72,4 @@ void DrawTextAt(const char* text, float x, float y, float z);
} // namespace mujoco } // namespace mujoco
#endif // MUJOCO_SRC_EXPERIMENTAL_FILAMENT_FILAMENT_GUI_VIEW_H_ #endif // MUJOCO_SRC_EXPERIMENTAL_FILAMENT_FILAMENT_IMGUI_BRIDGE_H_
@@ -37,7 +37,7 @@
#include <math/TVecHelpers.h> #include <math/TVecHelpers.h>
#include <mujoco/mujoco.h> #include <mujoco/mujoco.h>
#include "experimental/filament/filament/color_grading_options.h" #include "experimental/filament/filament/color_grading_options.h"
#include "experimental/filament/filament/gui_view.h" #include "experimental/filament/filament/imgui_bridge.h"
#include "experimental/filament/filament/light.h" #include "experimental/filament/filament/light.h"
#include "experimental/filament/filament/material.h" #include "experimental/filament/filament/material.h"
#include "experimental/filament/filament/math_util.h" #include "experimental/filament/filament/math_util.h"