From 1117e7db397492e5dfc97e97c0c4e7d0152dd482 Mon Sep 17 00:00:00 2001 From: Haroon Qureshi Date: Thu, 16 Apr 2026 04:43:39 -0700 Subject: [PATCH] Move DrawMode into its own header file. PiperOrigin-RevId: 900656695 Change-Id: I4db6f0f74c2109752efe40bc37c7104505139049 --- src/experimental/filament/CMakeLists.txt | 1 + .../filament/filament/draw_mode.h | 36 +++++++++++++++++++ .../filament/filament/filament_context.cc | 9 ++--- .../filament/filament/filament_context.h | 3 +- .../filament/filament/imgui_bridge.cc | 3 +- .../filament/filament/material.cc | 26 +++++++++----- src/experimental/filament/filament/material.h | 15 ++------ .../filament/filament/scene_geom_util.cc | 12 +++---- .../filament/filament/scene_view.cc | 12 +++---- .../filament/filament/scene_view.h | 8 ++--- 10 files changed, 78 insertions(+), 47 deletions(-) create mode 100644 src/experimental/filament/filament/draw_mode.h diff --git a/src/experimental/filament/CMakeLists.txt b/src/experimental/filament/CMakeLists.txt index f5809b3c..fa2081b5 100644 --- a/src/experimental/filament/CMakeLists.txt +++ b/src/experimental/filament/CMakeLists.txt @@ -27,6 +27,7 @@ target_sources(${MUJOCO_FILAMENT_TARGET_NAME} filament/builtins.h filament/color_grading_options.cc filament/color_grading_options.h + filament/draw_mode.h filament/filament_context.cc filament/filament_context.h filament/filament_platform_factory.cc diff --git a/src/experimental/filament/filament/draw_mode.h b/src/experimental/filament/filament/draw_mode.h new file mode 100644 index 00000000..15bb2bca --- /dev/null +++ b/src/experimental/filament/filament/draw_mode.h @@ -0,0 +1,36 @@ +// Copyright 2026 DeepMind Technologies Limited +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef MUJOCO_SRC_EXPERIMENTAL_FILAMENT_FILAMENT_DRAW_MODE_H_ +#define MUJOCO_SRC_EXPERIMENTAL_FILAMENT_FILAMENT_DRAW_MODE_H_ + +namespace mujoco { + +// The different modes that can be used to render the scene. +enum class DrawMode { + // Render the scene with "normal" colors and lighting. + Color, + // Render the scene as a grayscale depth map. + Depth, + // Render each object with a unique, uniform (flat) color regardless of + // lighting and texture. + Segmentation, +}; + +static constexpr int kNumDrawModes = 3; + +} // namespace mujoco + + +#endif // MUJOCO_SRC_EXPERIMENTAL_FILAMENT_FILAMENT_DRAW_MODE_H_ diff --git a/src/experimental/filament/filament/filament_context.cc b/src/experimental/filament/filament/filament_context.cc index f43d473f..4da0d63b 100644 --- a/src/experimental/filament/filament/filament_context.cc +++ b/src/experimental/filament/filament/filament_context.cc @@ -38,6 +38,7 @@ #include #include #include +#include "experimental/filament/filament/draw_mode.h" #include "experimental/filament/filament/filament_platform_factory.h" #include "experimental/filament/filament/imgui_bridge.h" #include "experimental/filament/filament/imgui_editor.h" @@ -134,11 +135,11 @@ void FilamentContext::Render(const mjrRect& viewport, const mjvScene* scene) { imgui_bridge_->Update(); } - last_render_mode_ = SceneView::DrawMode::kNormal; + last_render_mode_ = DrawMode::Color; if (scene->flags[mjRND_SEGMENT]) { - last_render_mode_ = SceneView::DrawMode::kSegmentation; + last_render_mode_ = DrawMode::Segmentation; } else if (scene->flags[mjRND_DEPTH]) { - last_render_mode_ = SceneView::DrawMode::kDepth; + last_render_mode_ = DrawMode::Depth; } last_camera_ = mjv_averageCamera(scene->camera, scene->camera + 1); @@ -242,7 +243,7 @@ void FilamentContext::ReadPixels(mjrRect viewport, unsigned char* rgb, if (depth) { if (renderer_->beginFrame(offscreen_swap_chain_)) { SceneView::RenderRequest request; - request.draw_mode = SceneView::DrawMode::kDepth; + request.draw_mode = DrawMode::Depth; request.viewport = viewport; request.target = depth_target_.get(); request.camera = last_camera_; diff --git a/src/experimental/filament/filament/filament_context.h b/src/experimental/filament/filament/filament_context.h index 935ca708..3f4eeb7f 100644 --- a/src/experimental/filament/filament/filament_context.h +++ b/src/experimental/filament/filament/filament_context.h @@ -24,6 +24,7 @@ #include #include #include +#include "experimental/filament/filament/draw_mode.h" #include "experimental/filament/filament/imgui_bridge.h" #include "experimental/filament/filament/object_manager.h" #include "experimental/filament/filament/render_target.h" @@ -80,7 +81,7 @@ class FilamentContext { filament::SwapChain* offscreen_swap_chain_ = nullptr; std::unique_ptr platform_; - SceneView::DrawMode last_render_mode_ = SceneView::DrawMode::kNormal; + DrawMode last_render_mode_ = DrawMode::Color; mjvGLCamera last_camera_; SwapChainType scene_swap_chain_target_ = kWindowSwapChain; SwapChainType gui_swap_chain_target_ = kWindowSwapChain; diff --git a/src/experimental/filament/filament/imgui_bridge.cc b/src/experimental/filament/filament/imgui_bridge.cc index efdadb07..7337a5b0 100644 --- a/src/experimental/filament/filament/imgui_bridge.cc +++ b/src/experimental/filament/filament/imgui_bridge.cc @@ -23,6 +23,7 @@ #include #include #include +#include "experimental/filament/filament/draw_mode.h" #include "experimental/filament/filament/material.h" #include "experimental/filament/filament/mesh.h" #include "experimental/filament/filament/renderable.h" @@ -276,7 +277,7 @@ void ImguiBridge::PrepareRenderables(int count) { r->SetBlendOrder(static_cast(renderables_.size())); Material& material = r->GetMaterial(); - Material::DrawMode mode = Material::DrawMode::kNormal; + DrawMode mode = DrawMode::Color; material.SetMaterial(mode, object_mgr_->GetMaterial(ObjectManager::kUnlitUi)); r->SetMaterialInstance(material.GetMaterialInstance(mode)); scene_view_->AddToUxScene(r.get()); diff --git a/src/experimental/filament/filament/material.cc b/src/experimental/filament/filament/material.cc index 864dea32..2e274f93 100644 --- a/src/experimental/filament/filament/material.cc +++ b/src/experimental/filament/filament/material.cc @@ -20,6 +20,7 @@ #include #include #include +#include "experimental/filament/filament/draw_mode.h" #include "experimental/filament/filament/texture.h" #include "experimental/filament/filament/object_manager.h" @@ -38,22 +39,27 @@ Material::~Material() noexcept { } void Material::SetMaterial(DrawMode mode, filament::Material* material) { - if (instances_[mode]) { + const int index = static_cast(mode); + if (instances_[index]) { const filament::Material* current_material = - instances_[mode]->getMaterial(); + instances_[index]->getMaterial(); if (current_material == material) { return; } - GetEngine()->destroy(instances_[mode]); - instances_[mode] = nullptr; + GetEngine()->destroy(instances_[index]); + instances_[index] = nullptr; } if (material) { - instances_[mode] = material->createInstance(); + instances_[index] = material->createInstance(); UpdateMaterialInstances(); } } +filament::MaterialInstance* Material::GetMaterialInstance(DrawMode mode) { + return instances_[static_cast(mode)]; +} + void Material::UpdateParams(const Params& params) { params_ = params; UpdateMaterialInstances(); @@ -65,7 +71,8 @@ void Material::UpdateTextures(const Textures& textures) { } void Material::UpdateMaterialInstances() { - filament::MaterialInstance* instance = instances_[DrawMode::kNormal]; + filament::MaterialInstance* instance = + instances_[static_cast(DrawMode::Color)]; if (instance == nullptr) { return; } @@ -107,9 +114,10 @@ void Material::UpdateMaterialInstances() { instance->setParameter("Reflectance", params_.reflectance); } - if (instances_[DrawMode::kSegmentation]) { - instances_[DrawMode::kSegmentation]->setParameter( - "BaseColorFactor", params_.segmentation_color); + const int segmentation_index = static_cast(DrawMode::Segmentation); + if (instances_[segmentation_index]) { + instances_[segmentation_index]->setParameter("BaseColorFactor", + params_.segmentation_color); } // All textures use the same default sampler. diff --git a/src/experimental/filament/filament/material.h b/src/experimental/filament/filament/material.h index ff8c37af..cf5854f6 100644 --- a/src/experimental/filament/filament/material.h +++ b/src/experimental/filament/filament/material.h @@ -20,6 +20,7 @@ #include #include #include +#include "experimental/filament/filament/draw_mode.h" #include "experimental/filament/filament/texture.h" #include "experimental/filament/filament/object_manager.h" @@ -27,16 +28,6 @@ namespace mujoco { class Material { public: - // The different methods for rendering objects. Each mode uses a different - // material, but all materials "share" the same textures and parameters - // (unless specifically noted otherwise). - enum DrawMode { - kNormal, - kDepth, - kSegmentation, - kNumDrawModes, - }; - // The textures that can be assigned to the drawable's material. struct Textures { const Texture* color = nullptr; @@ -89,9 +80,7 @@ class Material { const Textures& GetTextures() const { return textures_; } // Returns the material instance assigned to the draw mode. - filament::MaterialInstance* GetMaterialInstance(DrawMode mode) { - return instances_[mode]; - } + filament::MaterialInstance* GetMaterialInstance(DrawMode mode); // Returns the filament Engine managing the material. filament::Engine* GetEngine() const { return object_mgr_->GetEngine(); } diff --git a/src/experimental/filament/filament/scene_geom_util.cc b/src/experimental/filament/filament/scene_geom_util.cc index 7b75a796..3dba24d9 100644 --- a/src/experimental/filament/filament/scene_geom_util.cc +++ b/src/experimental/filament/filament/scene_geom_util.cc @@ -31,6 +31,7 @@ #include #include #include +#include "experimental/filament/filament/draw_mode.h" #include "experimental/filament/filament/material.h" #include "experimental/filament/filament/math_util.h" #include "experimental/filament/filament/mesh.h" @@ -533,14 +534,11 @@ static void UpdateGeomMaterial(Renderable& renderable, const mjvGeom& geom, params.glossiness *= model_objs->GetShininessMultiplier(); material.UpdateParams(params); + material.SetMaterial(DrawMode::Color, object_mgr->GetMaterial(material_type)); + material.SetMaterial(DrawMode::Depth, + object_mgr->GetMaterial(ObjectManager::kUnlitDepth)); material.SetMaterial( - Material::DrawMode::kNormal, - object_mgr->GetMaterial(material_type)); - material.SetMaterial( - Material::DrawMode::kDepth, - object_mgr->GetMaterial(ObjectManager::kUnlitDepth)); - material.SetMaterial( - Material::DrawMode::kSegmentation, + DrawMode::Segmentation, object_mgr->GetMaterial(ObjectManager::kUnlitSegmentation)); } diff --git a/src/experimental/filament/filament/scene_view.cc b/src/experimental/filament/filament/scene_view.cc index 41f3d3ad..1f4c4009 100644 --- a/src/experimental/filament/filament/scene_view.cc +++ b/src/experimental/filament/filament/scene_view.cc @@ -40,6 +40,7 @@ #include #include #include "experimental/filament/filament/color_grading_options.h" +#include "experimental/filament/filament/draw_mode.h" #include "experimental/filament/filament/light.h" #include "experimental/filament/filament/material.h" #include "experimental/filament/filament/math_util.h" @@ -53,12 +54,9 @@ using filament::math::float3; using filament::math::float4; using filament::math::mat4; -static constexpr int kNormalIndex = - static_cast(Material::DrawMode::kNormal); -static constexpr int kDepthIndex = - static_cast(Material::DrawMode::kDepth); -static constexpr int kSegmentIndex = - static_cast(Material::DrawMode::kSegmentation); +static constexpr int kNormalIndex = static_cast(DrawMode::Color); +static constexpr int kDepthIndex = static_cast(DrawMode::Depth); +static constexpr int kSegmentIndex = static_cast(DrawMode::Segmentation); static filament::ColorGrading::Builder ToBuilder( const ColorGradingOptions& opts) { @@ -279,7 +277,7 @@ void SceneView::Render(filament::Renderer* renderer, } // Render reflection passes. - if (request.draw_mode == DrawMode::kNormal) { + if (request.draw_mode == DrawMode::Color) { filament::TransformManager& tm = engine_->getTransformManager(); for (size_t i = 0; i < reflectives_.size(); ++i) { Renderable* renderable = reflectives_[i]; diff --git a/src/experimental/filament/filament/scene_view.h b/src/experimental/filament/filament/scene_view.h index d6546d7c..f50a86fa 100644 --- a/src/experimental/filament/filament/scene_view.h +++ b/src/experimental/filament/filament/scene_view.h @@ -27,8 +27,8 @@ #include #include #include "experimental/filament/filament/color_grading_options.h" +#include "experimental/filament/filament/draw_mode.h" #include "experimental/filament/filament/light.h" -#include "experimental/filament/filament/material.h" #include "experimental/filament/filament/renderable.h" #include "experimental/filament/filament/render_target.h" @@ -58,10 +58,9 @@ class SceneView { void RemoveFromUxScene(Renderable* renderable); // Parameters for rendering the scene. - using DrawMode = Material::DrawMode; struct RenderRequest { // The draw mode (e.g. normal, depth, segmentation) to render. - DrawMode draw_mode = DrawMode::kNormal; + DrawMode draw_mode = DrawMode::Color; // The target viewport for the rendered image. mjrRect viewport; // The camera from which to render the scene. @@ -102,8 +101,7 @@ class SceneView { filament::Camera* camera_ = nullptr; filament::ColorGrading* color_grading_ = nullptr; ColorGradingOptions color_grading_options_; - std::array views_; - DrawMode active_mode_ = DrawMode::kNumDrawModes; + std::array views_; // Scene objects. std::unordered_set lights_;