Move DrawMode into its own header file.
PiperOrigin-RevId: 900656695 Change-Id: I4db6f0f74c2109752efe40bc37c7104505139049
This commit is contained in:
committed by
Copybara-Service
parent
56e98cc16c
commit
1117e7db39
@@ -27,6 +27,7 @@ target_sources(${MUJOCO_FILAMENT_TARGET_NAME}
|
|||||||
filament/builtins.h
|
filament/builtins.h
|
||||||
filament/color_grading_options.cc
|
filament/color_grading_options.cc
|
||||||
filament/color_grading_options.h
|
filament/color_grading_options.h
|
||||||
|
filament/draw_mode.h
|
||||||
filament/filament_context.cc
|
filament/filament_context.cc
|
||||||
filament/filament_context.h
|
filament/filament_context.h
|
||||||
filament/filament_platform_factory.cc
|
filament/filament_platform_factory.cc
|
||||||
|
|||||||
@@ -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_
|
||||||
@@ -38,6 +38,7 @@
|
|||||||
#include <mujoco/mjmodel.h>
|
#include <mujoco/mjmodel.h>
|
||||||
#include <mujoco/mjvisualize.h>
|
#include <mujoco/mjvisualize.h>
|
||||||
#include <mujoco/mujoco.h>
|
#include <mujoco/mujoco.h>
|
||||||
|
#include "experimental/filament/filament/draw_mode.h"
|
||||||
#include "experimental/filament/filament/filament_platform_factory.h"
|
#include "experimental/filament/filament/filament_platform_factory.h"
|
||||||
#include "experimental/filament/filament/imgui_bridge.h"
|
#include "experimental/filament/filament/imgui_bridge.h"
|
||||||
#include "experimental/filament/filament/imgui_editor.h"
|
#include "experimental/filament/filament/imgui_editor.h"
|
||||||
@@ -134,11 +135,11 @@ void FilamentContext::Render(const mjrRect& viewport, const mjvScene* scene) {
|
|||||||
imgui_bridge_->Update();
|
imgui_bridge_->Update();
|
||||||
}
|
}
|
||||||
|
|
||||||
last_render_mode_ = SceneView::DrawMode::kNormal;
|
last_render_mode_ = DrawMode::Color;
|
||||||
if (scene->flags[mjRND_SEGMENT]) {
|
if (scene->flags[mjRND_SEGMENT]) {
|
||||||
last_render_mode_ = SceneView::DrawMode::kSegmentation;
|
last_render_mode_ = DrawMode::Segmentation;
|
||||||
} else if (scene->flags[mjRND_DEPTH]) {
|
} 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);
|
last_camera_ = mjv_averageCamera(scene->camera, scene->camera + 1);
|
||||||
|
|
||||||
@@ -242,7 +243,7 @@ void FilamentContext::ReadPixels(mjrRect viewport, unsigned char* rgb,
|
|||||||
if (depth) {
|
if (depth) {
|
||||||
if (renderer_->beginFrame(offscreen_swap_chain_)) {
|
if (renderer_->beginFrame(offscreen_swap_chain_)) {
|
||||||
SceneView::RenderRequest request;
|
SceneView::RenderRequest request;
|
||||||
request.draw_mode = SceneView::DrawMode::kDepth;
|
request.draw_mode = DrawMode::Depth;
|
||||||
request.viewport = viewport;
|
request.viewport = viewport;
|
||||||
request.target = depth_target_.get();
|
request.target = depth_target_.get();
|
||||||
request.camera = last_camera_;
|
request.camera = last_camera_;
|
||||||
|
|||||||
@@ -24,6 +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/draw_mode.h"
|
||||||
#include "experimental/filament/filament/imgui_bridge.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"
|
||||||
@@ -80,7 +81,7 @@ class FilamentContext {
|
|||||||
filament::SwapChain* offscreen_swap_chain_ = nullptr;
|
filament::SwapChain* offscreen_swap_chain_ = nullptr;
|
||||||
std::unique_ptr<filament::backend::Platform> platform_;
|
std::unique_ptr<filament::backend::Platform> platform_;
|
||||||
|
|
||||||
SceneView::DrawMode last_render_mode_ = SceneView::DrawMode::kNormal;
|
DrawMode last_render_mode_ = DrawMode::Color;
|
||||||
mjvGLCamera last_camera_;
|
mjvGLCamera last_camera_;
|
||||||
SwapChainType scene_swap_chain_target_ = kWindowSwapChain;
|
SwapChainType scene_swap_chain_target_ = kWindowSwapChain;
|
||||||
SwapChainType gui_swap_chain_target_ = kWindowSwapChain;
|
SwapChainType gui_swap_chain_target_ = kWindowSwapChain;
|
||||||
|
|||||||
@@ -23,6 +23,7 @@
|
|||||||
#include <imgui.h>
|
#include <imgui.h>
|
||||||
#include <math/vec4.h>
|
#include <math/vec4.h>
|
||||||
#include <mujoco/mujoco.h>
|
#include <mujoco/mujoco.h>
|
||||||
|
#include "experimental/filament/filament/draw_mode.h"
|
||||||
#include "experimental/filament/filament/material.h"
|
#include "experimental/filament/filament/material.h"
|
||||||
#include "experimental/filament/filament/mesh.h"
|
#include "experimental/filament/filament/mesh.h"
|
||||||
#include "experimental/filament/filament/renderable.h"
|
#include "experimental/filament/filament/renderable.h"
|
||||||
@@ -276,7 +277,7 @@ void ImguiBridge::PrepareRenderables(int count) {
|
|||||||
r->SetBlendOrder(static_cast<std::uint16_t>(renderables_.size()));
|
r->SetBlendOrder(static_cast<std::uint16_t>(renderables_.size()));
|
||||||
|
|
||||||
Material& material = r->GetMaterial();
|
Material& material = r->GetMaterial();
|
||||||
Material::DrawMode mode = Material::DrawMode::kNormal;
|
DrawMode mode = DrawMode::Color;
|
||||||
material.SetMaterial(mode, object_mgr_->GetMaterial(ObjectManager::kUnlitUi));
|
material.SetMaterial(mode, object_mgr_->GetMaterial(ObjectManager::kUnlitUi));
|
||||||
r->SetMaterialInstance(material.GetMaterialInstance(mode));
|
r->SetMaterialInstance(material.GetMaterialInstance(mode));
|
||||||
scene_view_->AddToUxScene(r.get());
|
scene_view_->AddToUxScene(r.get());
|
||||||
|
|||||||
@@ -20,6 +20,7 @@
|
|||||||
#include <filament/RenderableManager.h>
|
#include <filament/RenderableManager.h>
|
||||||
#include <filament/TextureSampler.h>
|
#include <filament/TextureSampler.h>
|
||||||
#include <mujoco/mujoco.h>
|
#include <mujoco/mujoco.h>
|
||||||
|
#include "experimental/filament/filament/draw_mode.h"
|
||||||
#include "experimental/filament/filament/texture.h"
|
#include "experimental/filament/filament/texture.h"
|
||||||
#include "experimental/filament/filament/object_manager.h"
|
#include "experimental/filament/filament/object_manager.h"
|
||||||
|
|
||||||
@@ -38,22 +39,27 @@ Material::~Material() noexcept {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Material::SetMaterial(DrawMode mode, filament::Material* material) {
|
void Material::SetMaterial(DrawMode mode, filament::Material* material) {
|
||||||
if (instances_[mode]) {
|
const int index = static_cast<int>(mode);
|
||||||
|
if (instances_[index]) {
|
||||||
const filament::Material* current_material =
|
const filament::Material* current_material =
|
||||||
instances_[mode]->getMaterial();
|
instances_[index]->getMaterial();
|
||||||
if (current_material == material) {
|
if (current_material == material) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
GetEngine()->destroy(instances_[mode]);
|
GetEngine()->destroy(instances_[index]);
|
||||||
instances_[mode] = nullptr;
|
instances_[index] = nullptr;
|
||||||
}
|
}
|
||||||
if (material) {
|
if (material) {
|
||||||
instances_[mode] = material->createInstance();
|
instances_[index] = material->createInstance();
|
||||||
UpdateMaterialInstances();
|
UpdateMaterialInstances();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
filament::MaterialInstance* Material::GetMaterialInstance(DrawMode mode) {
|
||||||
|
return instances_[static_cast<int>(mode)];
|
||||||
|
}
|
||||||
|
|
||||||
void Material::UpdateParams(const Params& params) {
|
void Material::UpdateParams(const Params& params) {
|
||||||
params_ = params;
|
params_ = params;
|
||||||
UpdateMaterialInstances();
|
UpdateMaterialInstances();
|
||||||
@@ -65,7 +71,8 @@ void Material::UpdateTextures(const Textures& textures) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Material::UpdateMaterialInstances() {
|
void Material::UpdateMaterialInstances() {
|
||||||
filament::MaterialInstance* instance = instances_[DrawMode::kNormal];
|
filament::MaterialInstance* instance =
|
||||||
|
instances_[static_cast<int>(DrawMode::Color)];
|
||||||
if (instance == nullptr) {
|
if (instance == nullptr) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -107,9 +114,10 @@ void Material::UpdateMaterialInstances() {
|
|||||||
instance->setParameter("Reflectance", params_.reflectance);
|
instance->setParameter("Reflectance", params_.reflectance);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (instances_[DrawMode::kSegmentation]) {
|
const int segmentation_index = static_cast<int>(DrawMode::Segmentation);
|
||||||
instances_[DrawMode::kSegmentation]->setParameter(
|
if (instances_[segmentation_index]) {
|
||||||
"BaseColorFactor", params_.segmentation_color);
|
instances_[segmentation_index]->setParameter("BaseColorFactor",
|
||||||
|
params_.segmentation_color);
|
||||||
}
|
}
|
||||||
|
|
||||||
// All textures use the same default sampler.
|
// All textures use the same default sampler.
|
||||||
|
|||||||
@@ -20,6 +20,7 @@
|
|||||||
#include <math/vec2.h>
|
#include <math/vec2.h>
|
||||||
#include <math/vec3.h>
|
#include <math/vec3.h>
|
||||||
#include <math/vec4.h>
|
#include <math/vec4.h>
|
||||||
|
#include "experimental/filament/filament/draw_mode.h"
|
||||||
#include "experimental/filament/filament/texture.h"
|
#include "experimental/filament/filament/texture.h"
|
||||||
#include "experimental/filament/filament/object_manager.h"
|
#include "experimental/filament/filament/object_manager.h"
|
||||||
|
|
||||||
@@ -27,16 +28,6 @@ namespace mujoco {
|
|||||||
|
|
||||||
class Material {
|
class Material {
|
||||||
public:
|
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.
|
// The textures that can be assigned to the drawable's material.
|
||||||
struct Textures {
|
struct Textures {
|
||||||
const Texture* color = nullptr;
|
const Texture* color = nullptr;
|
||||||
@@ -89,9 +80,7 @@ class Material {
|
|||||||
const Textures& GetTextures() const { return textures_; }
|
const Textures& GetTextures() const { return textures_; }
|
||||||
|
|
||||||
// Returns the material instance assigned to the draw mode.
|
// Returns the material instance assigned to the draw mode.
|
||||||
filament::MaterialInstance* GetMaterialInstance(DrawMode mode) {
|
filament::MaterialInstance* GetMaterialInstance(DrawMode mode);
|
||||||
return instances_[mode];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Returns the filament Engine managing the material.
|
// Returns the filament Engine managing the material.
|
||||||
filament::Engine* GetEngine() const { return object_mgr_->GetEngine(); }
|
filament::Engine* GetEngine() const { return object_mgr_->GetEngine(); }
|
||||||
|
|||||||
@@ -31,6 +31,7 @@
|
|||||||
#include <utils/Entity.h>
|
#include <utils/Entity.h>
|
||||||
#include <mujoco/mjvisualize.h>
|
#include <mujoco/mjvisualize.h>
|
||||||
#include <mujoco/mujoco.h>
|
#include <mujoco/mujoco.h>
|
||||||
|
#include "experimental/filament/filament/draw_mode.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"
|
||||||
#include "experimental/filament/filament/mesh.h"
|
#include "experimental/filament/filament/mesh.h"
|
||||||
@@ -533,14 +534,11 @@ static void UpdateGeomMaterial(Renderable& renderable, const mjvGeom& geom,
|
|||||||
params.glossiness *= model_objs->GetShininessMultiplier();
|
params.glossiness *= model_objs->GetShininessMultiplier();
|
||||||
material.UpdateParams(params);
|
material.UpdateParams(params);
|
||||||
|
|
||||||
|
material.SetMaterial(DrawMode::Color, object_mgr->GetMaterial(material_type));
|
||||||
|
material.SetMaterial(DrawMode::Depth,
|
||||||
|
object_mgr->GetMaterial(ObjectManager::kUnlitDepth));
|
||||||
material.SetMaterial(
|
material.SetMaterial(
|
||||||
Material::DrawMode::kNormal,
|
DrawMode::Segmentation,
|
||||||
object_mgr->GetMaterial(material_type));
|
|
||||||
material.SetMaterial(
|
|
||||||
Material::DrawMode::kDepth,
|
|
||||||
object_mgr->GetMaterial(ObjectManager::kUnlitDepth));
|
|
||||||
material.SetMaterial(
|
|
||||||
Material::DrawMode::kSegmentation,
|
|
||||||
object_mgr->GetMaterial(ObjectManager::kUnlitSegmentation));
|
object_mgr->GetMaterial(ObjectManager::kUnlitSegmentation));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -40,6 +40,7 @@
|
|||||||
#include <utils/EntityManager.h>
|
#include <utils/EntityManager.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/draw_mode.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"
|
||||||
@@ -53,12 +54,9 @@ using filament::math::float3;
|
|||||||
using filament::math::float4;
|
using filament::math::float4;
|
||||||
using filament::math::mat4;
|
using filament::math::mat4;
|
||||||
|
|
||||||
static constexpr int kNormalIndex =
|
static constexpr int kNormalIndex = static_cast<int>(DrawMode::Color);
|
||||||
static_cast<int>(Material::DrawMode::kNormal);
|
static constexpr int kDepthIndex = static_cast<int>(DrawMode::Depth);
|
||||||
static constexpr int kDepthIndex =
|
static constexpr int kSegmentIndex = static_cast<int>(DrawMode::Segmentation);
|
||||||
static_cast<int>(Material::DrawMode::kDepth);
|
|
||||||
static constexpr int kSegmentIndex =
|
|
||||||
static_cast<int>(Material::DrawMode::kSegmentation);
|
|
||||||
|
|
||||||
static filament::ColorGrading::Builder ToBuilder(
|
static filament::ColorGrading::Builder ToBuilder(
|
||||||
const ColorGradingOptions& opts) {
|
const ColorGradingOptions& opts) {
|
||||||
@@ -279,7 +277,7 @@ void SceneView::Render(filament::Renderer* renderer,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Render reflection passes.
|
// Render reflection passes.
|
||||||
if (request.draw_mode == DrawMode::kNormal) {
|
if (request.draw_mode == DrawMode::Color) {
|
||||||
filament::TransformManager& tm = engine_->getTransformManager();
|
filament::TransformManager& tm = engine_->getTransformManager();
|
||||||
for (size_t i = 0; i < reflectives_.size(); ++i) {
|
for (size_t i = 0; i < reflectives_.size(); ++i) {
|
||||||
Renderable* renderable = reflectives_[i];
|
Renderable* renderable = reflectives_[i];
|
||||||
|
|||||||
@@ -27,8 +27,8 @@
|
|||||||
#include <filament/View.h>
|
#include <filament/View.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/draw_mode.h"
|
||||||
#include "experimental/filament/filament/light.h"
|
#include "experimental/filament/filament/light.h"
|
||||||
#include "experimental/filament/filament/material.h"
|
|
||||||
#include "experimental/filament/filament/renderable.h"
|
#include "experimental/filament/filament/renderable.h"
|
||||||
#include "experimental/filament/filament/render_target.h"
|
#include "experimental/filament/filament/render_target.h"
|
||||||
|
|
||||||
@@ -58,10 +58,9 @@ class SceneView {
|
|||||||
void RemoveFromUxScene(Renderable* renderable);
|
void RemoveFromUxScene(Renderable* renderable);
|
||||||
|
|
||||||
// Parameters for rendering the scene.
|
// Parameters for rendering the scene.
|
||||||
using DrawMode = Material::DrawMode;
|
|
||||||
struct RenderRequest {
|
struct RenderRequest {
|
||||||
// The draw mode (e.g. normal, depth, segmentation) to render.
|
// 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.
|
// The target viewport for the rendered image.
|
||||||
mjrRect viewport;
|
mjrRect viewport;
|
||||||
// The camera from which to render the scene.
|
// The camera from which to render the scene.
|
||||||
@@ -102,8 +101,7 @@ class SceneView {
|
|||||||
filament::Camera* camera_ = nullptr;
|
filament::Camera* camera_ = nullptr;
|
||||||
filament::ColorGrading* color_grading_ = nullptr;
|
filament::ColorGrading* color_grading_ = nullptr;
|
||||||
ColorGradingOptions color_grading_options_;
|
ColorGradingOptions color_grading_options_;
|
||||||
std::array<filament::View*, DrawMode::kNumDrawModes> views_;
|
std::array<filament::View*, kNumDrawModes> views_;
|
||||||
DrawMode active_mode_ = DrawMode::kNumDrawModes;
|
|
||||||
|
|
||||||
// Scene objects.
|
// Scene objects.
|
||||||
std::unordered_set<Light*> lights_;
|
std::unordered_set<Light*> lights_;
|
||||||
|
|||||||
Reference in New Issue
Block a user