Move Material into Renderables.

PiperOrigin-RevId: 898873853
Change-Id: I3ef13e44c16334c52ea6f08dbc44fde23096ef4c
This commit is contained in:
Haroon Qureshi
2026-04-13 02:51:22 -07:00
committed by Copybara-Service
parent 126d5b67e3
commit b38aa0fa23
6 changed files with 46 additions and 64 deletions
+4 -24
View File
@@ -35,6 +35,7 @@
#include "experimental/filament/filament/mesh.h" #include "experimental/filament/filament/mesh.h"
#include "experimental/filament/filament/model_objects.h" #include "experimental/filament/filament/model_objects.h"
#include "experimental/filament/filament/object_manager.h" #include "experimental/filament/filament/object_manager.h"
#include "experimental/filament/filament/renderables.h"
#include "experimental/filament/filament/texture.h" #include "experimental/filament/filament/texture.h"
namespace mujoco { namespace mujoco {
@@ -87,8 +88,7 @@ static bool IsBehind(const float* headpos, const float* pos, const float* mat) {
Drawable::Drawable(ModelObjects* model_objects, const mjvScene* scene, Drawable::Drawable(ModelObjects* model_objects, const mjvScene* scene,
const mjvGeom& geom) const mjvGeom& geom)
: material_(model_objects->GetEngine()), : renderables_(model_objects->GetEngine()) {
renderables_(model_objects->GetEngine()) {
if (geom.category == mjCAT_DECOR) { if (geom.category == mjCAT_DECOR) {
renderables_.SetCastShadows(false); renderables_.SetCastShadows(false);
renderables_.SetReceiveShadows(false); renderables_.SetReceiveShadows(false);
@@ -201,26 +201,6 @@ void Drawable::AddShape(ModelObjects* model_objs,
renderables_.Append(mesh); renderables_.Append(mesh);
} }
void Drawable::AddToScene(filament::Scene* scene) {
renderables_.AddToScene(scene);
}
void Drawable::RemoveFromScene(filament::Scene* scene) {
renderables_.RemoveFromScene(scene);
}
void Drawable::SetDrawMode(Material::DrawMode mode) {
renderables_.SetMaterialInstance(material_.GetMaterialInstance(mode));
}
Material& Drawable::GetMaterial() {
return material_;
}
void Drawable::SetLayerMask(std::uint8_t mask) {
renderables_.SetLayerMask(mask);
}
void Drawable::SetTransform(const mjvGeom& geom) { void Drawable::SetTransform(const mjvGeom& geom) {
// Flex and skin geometries are in global space. // Flex and skin geometries are in global space.
if (geom.type == mjGEOM_FLEX || geom.type == mjGEOM_SKIN) { if (geom.type == mjGEOM_FLEX || geom.type == mjGEOM_SKIN) {
@@ -371,7 +351,7 @@ void Drawable::UpdateMaterial(const mjModel* model, const mjvGeom& geom,
model_objs->GetTexture(geom.matid, mjTEXROLE_ROUGHNESS); model_objs->GetTexture(geom.matid, mjTEXROLE_ROUGHNESS);
textures.occlusion = textures.occlusion =
model_objs->GetTexture(geom.matid, mjTEXROLE_OCCLUSION); model_objs->GetTexture(geom.matid, mjTEXROLE_OCCLUSION);
material_.UpdateTextures(textures); GetMaterial().UpdateTextures(textures);
} }
if (geom.type == mjGEOM_LINE || geom.type == mjGEOM_LINEBOX) { if (geom.type == mjGEOM_LINE || geom.type == mjGEOM_LINEBOX) {
@@ -543,6 +523,6 @@ void Drawable::UpdateMaterial(const mjModel* model, const mjvGeom& geom,
params.specular *= model_objs->GetSpecularMultiplier(); params.specular *= model_objs->GetSpecularMultiplier();
params.glossiness *= model_objs->GetShininessMultiplier(); params.glossiness *= model_objs->GetShininessMultiplier();
material_.UpdateParams(params); GetMaterial().UpdateParams(params);
} }
} // namespace mujoco } // namespace mujoco
+3 -20
View File
@@ -15,9 +15,6 @@
#ifndef MUJOCO_SRC_EXPERIMENTAL_FILAMENT_FILAMENT_DRAWABLE_H_ #ifndef MUJOCO_SRC_EXPERIMENTAL_FILAMENT_FILAMENT_DRAWABLE_H_
#define MUJOCO_SRC_EXPERIMENTAL_FILAMENT_FILAMENT_DRAWABLE_H_ #define MUJOCO_SRC_EXPERIMENTAL_FILAMENT_FILAMENT_DRAWABLE_H_
#include <cstdint>
#include <filament/Engine.h>
#include <filament/Scene.h>
#include <math/mat4.h> #include <math/mat4.h>
#include <mujoco/mjmodel.h> #include <mujoco/mjmodel.h>
#include <mujoco/mjtnum.h> #include <mujoco/mjtnum.h>
@@ -39,13 +36,6 @@ class Drawable {
Drawable(const Drawable&) = delete; Drawable(const Drawable&) = delete;
Drawable& operator=(const Drawable&) = delete; Drawable& operator=(const Drawable&) = delete;
// Adds the Drawable to the given filament Scene. Note that a Drawable can
// only be assigned to a single Scene at any given time.
void AddToScene(filament::Scene* scene);
// Removes the Drawable from the given filament Scene.
void RemoveFromScene(filament::Scene* scene);
// Updates the transform of the drawable for rendering. // Updates the transform of the drawable for rendering.
void SetTransform(const mjvGeom& geom); void SetTransform(const mjvGeom& geom);
@@ -58,17 +48,11 @@ class Drawable {
// Returns the transform of the drawable. // Returns the transform of the drawable.
const filament::math::mat4& GetTransform() const { return transform_; } const filament::math::mat4& GetTransform() const { return transform_; }
// Swaps the MaterialInstance that will be used to render the Drawable (e.g. // Returns the renderables for the drawable.
// normal, depth, segmentation, etc.). This must be called before the filament Renderables& GetRenderables() { return renderables_; }
// beginFrame/endFrame.
void SetDrawMode(Material::DrawMode mode);
// Sets the layer mask for all managed entities. This can be used to show
// or hide the drawable from specific passes. The default layer mask is 0x01.
void SetLayerMask(std::uint8_t mask);
// Returns the material for the drawable. // Returns the material for the drawable.
Material& GetMaterial(); Material& GetMaterial() { return renderables_.GetMaterial(); }
private: private:
void AddMesh(ModelObjects* model_objs, int data_id); void AddMesh(ModelObjects* model_objs, int data_id);
@@ -77,7 +61,6 @@ class Drawable {
void AddHeightField(ModelObjects* model_objs, int hfield_id); void AddHeightField(ModelObjects* model_objs, int hfield_id);
void AddShape(ModelObjects* model_objs, ModelObjects::ShapeType shape_type); void AddShape(ModelObjects* model_objs, ModelObjects::ShapeType shape_type);
Material material_;
Renderables renderables_; Renderables renderables_;
filament::math::mat4 transform_; filament::math::mat4 transform_;
}; };
@@ -94,6 +94,9 @@ class Material {
return instances_[mode]; return instances_[mode];
} }
// Returns the filament Engine managing the material.
filament::Engine* GetEngine() const { return engine_; }
private: private:
// Updates the material instances based on the currently set parameters and // Updates the material instances based on the currently set parameters and
// textures. // textures.
@@ -22,11 +22,12 @@
#include <filament/Scene.h> #include <filament/Scene.h>
#include <utils/EntityManager.h> #include <utils/EntityManager.h>
#include <mujoco/mujoco.h> #include <mujoco/mujoco.h>
#include "experimental/filament/filament/material.h"
#include "experimental/filament/filament/mesh.h" #include "experimental/filament/filament/mesh.h"
namespace mujoco { namespace mujoco {
Renderables::Renderables(filament::Engine* engine) : engine_(engine) {} Renderables::Renderables(filament::Engine* engine) : material_(engine) {}
Renderables::~Renderables() noexcept { Renderables::~Renderables() noexcept {
while (!entities_.empty()) { while (!entities_.empty()) {
@@ -46,7 +47,7 @@ void Renderables::RemoveLast() {
assigned_scene_->remove(entity); assigned_scene_->remove(entity);
} }
engine_->destroy(entity); GetEngine()->destroy(entity);
em.destroy(entity); em.destroy(entity);
entities_.pop_back(); entities_.pop_back();
meshes_.pop_back(); meshes_.pop_back();
@@ -114,7 +115,7 @@ utils::Entity Renderables::CreateEntity(const Mesh* mesh) {
builder.priority(priority_); builder.priority(priority_);
builder.screenSpaceContactShadows(true);; builder.screenSpaceContactShadows(true);;
builder.build(*engine_, entity); builder.build(*GetEngine(), entity);
if (assigned_scene_) { if (assigned_scene_) {
assigned_scene_->addEntity(entity); assigned_scene_->addEntity(entity);
} }
@@ -132,13 +133,14 @@ void Renderables::UpdateEntity(utils::Entity entity, const Mesh* mesh) {
mju_error("Invalid (null) index buffer."); mju_error("Invalid (null) index buffer.");
} }
filament::RenderableManager& rm = engine_->getRenderableManager(); filament::RenderableManager& rm = GetEngine()->getRenderableManager();
rm.setGeometryAt(rm.getInstance(entity), 0, mesh->GetPrimitiveType(), rm.setGeometryAt(rm.getInstance(entity), 0, mesh->GetPrimitiveType(),
vertex_buffer, index_buffer, 0, vertex_buffer, index_buffer, 0,
index_buffer->getIndexCount()); index_buffer->getIndexCount());
} }
void Renderables::UpdateMeshes(int index, const Mesh* mesh, MeshPtr owned_mesh) { void Renderables::UpdateMeshes(int index, const Mesh* mesh,
MeshPtr owned_mesh) {
if (index < 0 || index >= meshes_.size()) { if (index < 0 || index >= meshes_.size()) {
mju_error("Invalid index %d for renderable.", index); mju_error("Invalid index %d for renderable.", index);
} }
@@ -173,7 +175,7 @@ void Renderables::RemoveFromScene(filament::Scene* scene) {
void Renderables::SetMaterialInstance( void Renderables::SetMaterialInstance(
filament::MaterialInstance* instance) { filament::MaterialInstance* instance) {
if (instance != material_instance_) { if (instance != material_instance_) {
filament::RenderableManager& rm = engine_->getRenderableManager(); filament::RenderableManager& rm = GetEngine()->getRenderableManager();
for (utils::Entity& entity : entities_) { for (utils::Entity& entity : entities_) {
filament::RenderableManager::Instance ri = rm.getInstance(entity); filament::RenderableManager::Instance ri = rm.getInstance(entity);
rm.setMaterialInstanceAt(ri, 0, instance); rm.setMaterialInstanceAt(ri, 0, instance);
@@ -186,7 +188,7 @@ void Renderables::SetLayerMask(std::uint8_t mask) {
if (mask != layer_mask_) { if (mask != layer_mask_) {
layer_mask_ = mask; layer_mask_ = mask;
filament::RenderableManager& rm = engine_->getRenderableManager(); filament::RenderableManager& rm = GetEngine()->getRenderableManager();
for (utils::Entity& entity : entities_) { for (utils::Entity& entity : entities_) {
rm.setLayerMask(rm.getInstance(entity), 0xff, layer_mask_); rm.setLayerMask(rm.getInstance(entity), 0xff, layer_mask_);
} }
@@ -197,7 +199,7 @@ void Renderables::SetPriority(std::uint8_t priority) {
if (priority != priority_) { if (priority != priority_) {
priority_ = priority; priority_ = priority;
filament::RenderableManager& rm = engine_->getRenderableManager(); filament::RenderableManager& rm = GetEngine()->getRenderableManager();
for (utils::Entity& entity : entities_) { for (utils::Entity& entity : entities_) {
rm.setPriority(rm.getInstance(entity), priority_); rm.setPriority(rm.getInstance(entity), priority_);
} }
@@ -208,7 +210,7 @@ void Renderables::SetCastShadows(bool cast_shadows) {
if (cast_shadows_ != cast_shadows) { if (cast_shadows_ != cast_shadows) {
cast_shadows_ = cast_shadows; cast_shadows_ = cast_shadows;
filament::RenderableManager& rm = engine_->getRenderableManager(); filament::RenderableManager& rm = GetEngine()->getRenderableManager();
for (utils::Entity& entity : entities_) { for (utils::Entity& entity : entities_) {
rm.setCastShadows(rm.getInstance(entity), cast_shadows_); rm.setCastShadows(rm.getInstance(entity), cast_shadows_);
} }
@@ -219,7 +221,7 @@ void Renderables::SetReceiveShadows(bool receive_shadows) {
if (receive_shadows_ != receive_shadows) { if (receive_shadows_ != receive_shadows) {
receive_shadows_ = receive_shadows; receive_shadows_ = receive_shadows;
filament::RenderableManager& rm = engine_->getRenderableManager(); filament::RenderableManager& rm = GetEngine()->getRenderableManager();
for (utils::Entity& entity : entities_) { for (utils::Entity& entity : entities_) {
rm.setReceiveShadows(rm.getInstance(entity), receive_shadows_); rm.setReceiveShadows(rm.getInstance(entity), receive_shadows_);
} }
@@ -233,7 +235,7 @@ void Renderables::SetWireframe(bool wireframe) {
if (wireframe != wireframe_) { if (wireframe != wireframe_) {
wireframe_ = wireframe; wireframe_ = wireframe;
filament::RenderableManager& rm = engine_->getRenderableManager(); filament::RenderableManager& rm = GetEngine()->getRenderableManager();
for (int i = 0; i < entities_.size(); ++i) { for (int i = 0; i < entities_.size(); ++i) {
utils::Entity& entity = entities_[i]; utils::Entity& entity = entities_[i];
const Mesh* mesh = meshes_[i].mesh; const Mesh* mesh = meshes_[i].mesh;
@@ -247,4 +249,10 @@ void Renderables::SetWireframe(bool wireframe) {
} }
} }
Material& Renderables::GetMaterial() { return material_; }
filament::Engine* Renderables::GetEngine() {
return material_.GetEngine();
}
} // namespace mujoco } // namespace mujoco
@@ -21,6 +21,7 @@
#include <filament/Engine.h> #include <filament/Engine.h>
#include <filament/Scene.h> #include <filament/Scene.h>
#include <utils/Entity.h> #include <utils/Entity.h>
#include "experimental/filament/filament/material.h"
#include "experimental/filament/filament/mesh.h" #include "experimental/filament/filament/mesh.h"
namespace mujoco { namespace mujoco {
@@ -79,8 +80,11 @@ class Renderables {
// Sets the material instance for all managed entities. // Sets the material instance for all managed entities.
void SetMaterialInstance(filament::MaterialInstance* material_instance); void SetMaterialInstance(filament::MaterialInstance* material_instance);
// Returns the filament Engine managing the entities in this collection. // Returns the material for the renderables.
filament::Engine* GetEngine() { return engine_; } Material& GetMaterial();
// Returns the filament Engine managing the renderables.
filament::Engine* GetEngine();
private: private:
utils::Entity CreateEntity(const Mesh* mesh); utils::Entity CreateEntity(const Mesh* mesh);
@@ -92,7 +96,7 @@ class Renderables {
const Mesh* mesh = nullptr; const Mesh* mesh = nullptr;
}; };
filament::Engine* engine_ = nullptr; Material material_;
filament::Scene* assigned_scene_ = nullptr; filament::Scene* assigned_scene_ = nullptr;
filament::MaterialInstance* material_instance_ = nullptr; filament::MaterialInstance* material_instance_ = nullptr;
std::vector<utils::Entity> entities_; std::vector<utils::Entity> entities_;
@@ -45,6 +45,7 @@
#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/render_target.h" #include "experimental/filament/filament/render_target.h"
#include "experimental/filament/filament/renderables.h"
#include "experimental/filament/filament/texture.h" #include "experimental/filament/filament/texture.h"
namespace mujoco { namespace mujoco {
@@ -162,7 +163,7 @@ SceneView::~SceneView() {
light->RemoveFromScene(scene_); light->RemoveFromScene(scene_);
} }
for (auto& drawable : drawables_) { for (auto& drawable : drawables_) {
drawable->RemoveFromScene(scene_); drawable->GetRenderables().RemoveFromScene(scene_);
} }
lights_.clear(); lights_.clear();
drawables_.clear(); drawables_.clear();
@@ -193,7 +194,7 @@ void SceneView::RemoveFromScene(Light* light) {
void SceneView::AddToScene(Drawable* drawable) { void SceneView::AddToScene(Drawable* drawable) {
if (drawables_.insert(drawable).second) { if (drawables_.insert(drawable).second) {
drawable->AddToScene(scene_); drawable->GetRenderables().AddToScene(scene_);
if (drawable->GetMaterial().GetParams().reflective) { if (drawable->GetMaterial().GetParams().reflective) {
AddReflectiveDrawable(drawable); AddReflectiveDrawable(drawable);
} }
@@ -206,7 +207,7 @@ void SceneView::RemoveFromScene(Drawable* drawable) {
if (it != reflectives_.end()) { if (it != reflectives_.end()) {
reflectives_.erase(it); reflectives_.erase(it);
} }
drawable->RemoveFromScene(scene_); drawable->GetRenderables().RemoveFromScene(scene_);
} }
} }
@@ -246,7 +247,10 @@ void SceneView::Render(filament::Renderer* renderer,
SetupCamera(request.camera, viewport, camera_); SetupCamera(request.camera, viewport, camera_);
for (auto& iter : drawables_) { for (auto& iter : drawables_) {
iter->SetDrawMode(request.draw_mode); Material& material = iter->GetMaterial();
Renderables& renderables = iter->GetRenderables();
renderables.SetMaterialInstance(
material.GetMaterialInstance(request.draw_mode));
} }
filament::View* view = views_[static_cast<int>(request.draw_mode)]; filament::View* view = views_[static_cast<int>(request.draw_mode)];
@@ -268,7 +272,7 @@ void SceneView::Render(filament::Renderer* renderer,
SetupReflectionCamera(drawable->GetTransform(), camera_, reflect_camera_); SetupReflectionCamera(drawable->GetTransform(), camera_, reflect_camera_);
// Hide reflective surface from its own reflection pass. // Hide reflective surface from its own reflection pass.
drawable->SetLayerMask(0x00); drawable->GetRenderables().SetLayerMask(0x00);
// Render the reflection to its render target. // Render the reflection to its render target.
reflect_view_->setRenderTarget( reflect_view_->setRenderTarget(
@@ -276,7 +280,7 @@ void SceneView::Render(filament::Renderer* renderer,
renderer->render(reflect_view_); renderer->render(reflect_view_);
// Unhide the reflective surface. // Unhide the reflective surface.
drawable->SetLayerMask(0x01); drawable->GetRenderables().SetLayerMask(0x01);
} }
} }