Use RenderableParams for creating Renderables.

PiperOrigin-RevId: 902569516
Change-Id: Id233a5ef7fe86ce5902ce2552d8d0fec6ce860b7
This commit is contained in:
Haroon Qureshi
2026-04-20 04:50:38 -07:00
committed by Copybara-Service
parent 508e581ba9
commit 86ad41b9c2
4 changed files with 63 additions and 46 deletions
@@ -268,8 +268,11 @@ void ImguiBridge::Update() {
void ImguiBridge::PrepareRenderables(int count) { void ImguiBridge::PrepareRenderables(int count) {
while (renderables_.size() < count) { while (renderables_.size() < count) {
RenderableParams config;
DefaultRenderableParams(&config);
config.shading_model = ShadingModel::Ux;
auto& r = renderables_.emplace_back( auto& r = renderables_.emplace_back(
std::make_unique<Renderable>(Renderable::Usage::Ux, object_mgr_)); std::make_unique<Renderable>(object_mgr_, config));
r->SetCastShadows(false); r->SetCastShadows(false);
r->SetReceiveShadows(false); r->SetReceiveShadows(false);
r->SetBlendOrder(static_cast<std::uint16_t>(renderables_.size())); r->SetBlendOrder(static_cast<std::uint16_t>(renderables_.size()));
@@ -16,7 +16,6 @@
#include <algorithm> #include <algorithm>
#include <cstdint> #include <cstdint>
#include <utility>
#include <filament/Engine.h> #include <filament/Engine.h>
#include <filament/Material.h> #include <filament/Material.h>
@@ -31,8 +30,12 @@
namespace mujoco { namespace mujoco {
Renderable::Renderable(Usage usage, ObjectManager* object_mgr) void DefaultRenderableParams(RenderableParams* params) {
: usage_(usage), object_mgr_(object_mgr) {} params->shading_model = ShadingModel::SceneObject;
}
Renderable::Renderable(ObjectManager* object_mgr, const RenderableParams& params)
: object_mgr_(object_mgr), params_(params) {}
Renderable::~Renderable() noexcept { Renderable::~Renderable() noexcept {
while (!entities_.empty()) { while (!entities_.empty()) {
@@ -188,18 +191,19 @@ void Renderable::RemoveFromScene(filament::Scene* scene) {
void Renderable::UpdateMaterial(const MaterialParams& params, void Renderable::UpdateMaterial(const MaterialParams& params,
const MaterialTextures& textures) { const MaterialTextures& textures) {
params_ = params; material_params_ = params;
textures_ = textures; material_textures_ = textures;
AssignMaterial(DrawMode::Color, GetColorMaterialType()); AssignMaterial(DrawMode::Color, GetColorMaterialType());
if (usage_ == Usage::SceneObject) { if (params_.shading_model == ShadingModel::SceneObject) {
AssignMaterial(DrawMode::Depth, ObjectManager::kUnlitDepth); AssignMaterial(DrawMode::Depth, ObjectManager::kUnlitDepth);
AssignMaterial(DrawMode::Segmentation, ObjectManager::kUnlitSegmentation); AssignMaterial(DrawMode::Segmentation, ObjectManager::kUnlitSegmentation);
} }
for (int i = 0; i < kNumDrawModes; ++i) { for (int i = 0; i < kNumDrawModes; ++i) {
if (instances_[i]) { if (instances_[i]) {
UpdateMaterialInstance(instances_[i], params_, textures_, object_mgr_); UpdateMaterialInstance(instances_[i], material_params_,
material_textures_, object_mgr_);
} }
} }
SetDrawMode(draw_mode_); SetDrawMode(draw_mode_);
@@ -225,16 +229,16 @@ void Renderable::AssignMaterial(DrawMode mode,
} }
const MaterialParams& Renderable::GetMaterialParams() const { const MaterialParams& Renderable::GetMaterialParams() const {
return params_; return material_params_;
} }
const MaterialTextures& Renderable::GetMaterialTextures() const { const MaterialTextures& Renderable::GetMaterialTextures() const {
return textures_; return material_textures_;
} }
void Renderable::SetDrawMode(DrawMode mode) { void Renderable::SetDrawMode(DrawMode mode) {
// Only SceneObjects support non-color draw modes. // Only SceneObjects support non-color draw modes.
if (usage_ != Usage::SceneObject) { if (params_.shading_model != ShadingModel::SceneObject) {
mode = DrawMode::Color; mode = DrawMode::Color;
} }
@@ -333,21 +337,21 @@ void Renderable::SetWireframe(bool wireframe) {
ObjectManager::MaterialType Renderable::GetColorMaterialType() const { ObjectManager::MaterialType Renderable::GetColorMaterialType() const {
if (usage_ == Usage::DecorLines) { if (params_.shading_model == ShadingModel::DecorLines) {
return ObjectManager::kUnlitLine; return ObjectManager::kUnlitLine;
} else if (usage_ == Usage::Decor) { } else if (params_.shading_model == ShadingModel::Decor) {
return ObjectManager::kUnlitSegmentation; return ObjectManager::kUnlitDecor;
} else if (usage_ == Usage::Ux) { } else if (params_.shading_model == ShadingModel::Ux) {
return ObjectManager::kUnlitUi; return ObjectManager::kUnlitUi;
} else if (textures_.orm) { } else if (material_textures_.orm) {
return ObjectManager::kPbrPacked; return ObjectManager::kPbrPacked;
} else if (textures_.metallic) { } else if (material_textures_.metallic) {
return ObjectManager::kPbr; return ObjectManager::kPbr;
} else if (textures_.roughness) { } else if (material_textures_.roughness) {
return ObjectManager::kPbr; return ObjectManager::kPbr;
} else if (params_.metallic >= 0) { } else if (material_params_.metallic >= 0) {
return ObjectManager::kPbr; return ObjectManager::kPbr;
} else if (params_.roughness >= 0) { } else if (material_params_.roughness >= 0) {
return ObjectManager::kPbr; return ObjectManager::kPbr;
} }
@@ -363,35 +367,35 @@ ObjectManager::MaterialType Renderable::GetColorMaterialType() const {
has_texcoords = (it != attribs.end()); has_texcoords = (it != attribs.end());
} }
if (textures_.color == nullptr) { if (material_textures_.color == nullptr) {
if (params_.color.a < 1.0f) { if (material_params_.color.a < 1.0f) {
return ObjectManager::kPhongColorFade; return ObjectManager::kPhongColorFade;
} else if (params_.reflective) { } else if (material_params_.reflective) {
return ObjectManager::kPhongColorReflect; return ObjectManager::kPhongColorReflect;
} else { } else {
return ObjectManager::kPhongColor; return ObjectManager::kPhongColor;
} }
} else if (textures_.color->GetFilamentTexture()->getTarget() == } else if (material_textures_.color->GetFilamentTexture()->getTarget() ==
filament::Texture::Sampler::SAMPLER_CUBEMAP) { filament::Texture::Sampler::SAMPLER_CUBEMAP) {
if (params_.color.a < 1.0f) { if (material_params_.color.a < 1.0f) {
return ObjectManager::kPhongCubeFade; return ObjectManager::kPhongCubeFade;
} else if (params_.reflective) { } else if (material_params_.reflective) {
return ObjectManager::kPhongCubeReflect; return ObjectManager::kPhongCubeReflect;
} else { } else {
return ObjectManager::kPhongCube; return ObjectManager::kPhongCube;
} }
} else if (has_texcoords) { } else if (has_texcoords) {
if (params_.color.a < 1.0f) { if (material_params_.color.a < 1.0f) {
return ObjectManager::kPhong2dUvFade; return ObjectManager::kPhong2dUvFade;
} else if (params_.reflective) { } else if (material_params_.reflective) {
return ObjectManager::kPhong2dUvReflect; return ObjectManager::kPhong2dUvReflect;
} else { } else {
return ObjectManager::kPhong2dUv; return ObjectManager::kPhong2dUv;
} }
} else { } else {
if (params_.color.a < 1.0f) { if (material_params_.color.a < 1.0f) {
return ObjectManager::kPhong2dFade; return ObjectManager::kPhong2dFade;
} else if (params_.reflective) { } else if (material_params_.reflective) {
return ObjectManager::kPhong2dReflect; return ObjectManager::kPhong2dReflect;
} else { } else {
return ObjectManager::kPhong2d; return ObjectManager::kPhong2d;
+19 -12
View File
@@ -28,6 +28,21 @@
namespace mujoco { namespace mujoco {
// The shading model (material) for a Renderable.
enum class ShadingModel {
SceneObject,
Decor,
DecorLines,
Ux,
};
// Configuration parameters for a Renderable.
struct RenderableParams {
ShadingModel shading_model;
};
void DefaultRenderableParams(RenderableParams* params);
// A collection of meshes and a material that, together, define an object that // A collection of meshes and a material that, together, define an object that
// can be rendered in a scene. // can be rendered in a scene.
// //
@@ -38,19 +53,11 @@ namespace mujoco {
// assigns the same material instance to all of them. // assigns the same material instance to all of them.
class Renderable { class Renderable {
public: public:
// How the material is to be used for rendering.
enum class Usage {
SceneObject,
Decor,
DecorLines,
Ux,
};
// Default filament values for priority and layer mask. // Default filament values for priority and layer mask.
static constexpr std::uint8_t kDefaultPriority = 4; static constexpr std::uint8_t kDefaultPriority = 4;
static constexpr std::uint8_t kDefaultLayerMask = 0x01; static constexpr std::uint8_t kDefaultLayerMask = 0x01;
Renderable(Usage usage, ObjectManager* object_mgr); Renderable(ObjectManager* object_mgr, const RenderableParams& params);
~Renderable() noexcept; ~Renderable() noexcept;
Renderable(const Renderable&) = delete; Renderable(const Renderable&) = delete;
@@ -145,11 +152,11 @@ class Renderable {
ObjectManager::MaterialType GetColorMaterialType() const; ObjectManager::MaterialType GetColorMaterialType() const;
Usage usage_;
ObjectManager* object_mgr_; ObjectManager* object_mgr_;
RenderableParams params_;
filament::MaterialInstance* instances_[kNumDrawModes] = {nullptr}; filament::MaterialInstance* instances_[kNumDrawModes] = {nullptr};
MaterialParams params_; MaterialParams material_params_;
MaterialTextures textures_; MaterialTextures material_textures_;
DrawMode draw_mode_ = DrawMode::Color; DrawMode draw_mode_ = DrawMode::Color;
filament::Scene* assigned_scene_ = nullptr; filament::Scene* assigned_scene_ = nullptr;
std::vector<utils::Entity> entities_; std::vector<utils::Entity> entities_;
@@ -459,14 +459,17 @@ static void UpdateGeomMaterial(Renderable& renderable, const mjvGeom& geom,
std::unique_ptr<Renderable> CreateGeomRenderable( std::unique_ptr<Renderable> CreateGeomRenderable(
const mjvGeom& geom, const mjvScene* scene, ObjectManager* object_mgr, const mjvGeom& geom, const mjvScene* scene, ObjectManager* object_mgr,
ModelObjects* model_objs, const float headpos[3]) { ModelObjects* model_objs, const float headpos[3]) {
Renderable::Usage usage = Renderable::Usage::SceneObject; ShadingModel shading_model = ShadingModel::SceneObject;
if (geom.type == mjGEOM_LINE || geom.type == mjGEOM_LINEBOX) { if (geom.type == mjGEOM_LINE || geom.type == mjGEOM_LINEBOX) {
usage = Renderable::Usage::DecorLines; shading_model = ShadingModel::DecorLines;
} else if (geom.category == mjCAT_DECOR) { } else if (geom.category == mjCAT_DECOR) {
usage = Renderable::Usage::Decor; shading_model = ShadingModel::Decor;
} }
auto renderable = std::make_unique<Renderable>(usage, object_mgr); RenderableParams config;
DefaultRenderableParams(&config);
config.shading_model = shading_model;
auto renderable = std::make_unique<Renderable>(object_mgr, config);
// The order of these calls is important. e.g. We need to create the filament // The order of these calls is important. e.g. We need to create the filament
// renderable entities before we can set their transform. // renderable entities before we can set their transform.