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/model_objects.h"
#include "experimental/filament/filament/object_manager.h"
#include "experimental/filament/filament/renderables.h"
#include "experimental/filament/filament/texture.h"
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,
const mjvGeom& geom)
: material_(model_objects->GetEngine()),
renderables_(model_objects->GetEngine()) {
: renderables_(model_objects->GetEngine()) {
if (geom.category == mjCAT_DECOR) {
renderables_.SetCastShadows(false);
renderables_.SetReceiveShadows(false);
@@ -201,26 +201,6 @@ void Drawable::AddShape(ModelObjects* model_objs,
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) {
// Flex and skin geometries are in global space.
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);
textures.occlusion =
model_objs->GetTexture(geom.matid, mjTEXROLE_OCCLUSION);
material_.UpdateTextures(textures);
GetMaterial().UpdateTextures(textures);
}
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.glossiness *= model_objs->GetShininessMultiplier();
material_.UpdateParams(params);
GetMaterial().UpdateParams(params);
}
} // namespace mujoco
+3 -20
View File
@@ -15,9 +15,6 @@
#ifndef 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 <mujoco/mjmodel.h>
#include <mujoco/mjtnum.h>
@@ -39,13 +36,6 @@ class Drawable {
Drawable(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.
void SetTransform(const mjvGeom& geom);
@@ -58,17 +48,11 @@ class Drawable {
// Returns the transform of the drawable.
const filament::math::mat4& GetTransform() const { return transform_; }
// Swaps the MaterialInstance that will be used to render the Drawable (e.g.
// normal, depth, segmentation, etc.). This must be called before the filament
// 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 renderables for the drawable.
Renderables& GetRenderables() { return renderables_; }
// Returns the material for the drawable.
Material& GetMaterial();
Material& GetMaterial() { return renderables_.GetMaterial(); }
private:
void AddMesh(ModelObjects* model_objs, int data_id);
@@ -77,7 +61,6 @@ class Drawable {
void AddHeightField(ModelObjects* model_objs, int hfield_id);
void AddShape(ModelObjects* model_objs, ModelObjects::ShapeType shape_type);
Material material_;
Renderables renderables_;
filament::math::mat4 transform_;
};
@@ -94,6 +94,9 @@ class Material {
return instances_[mode];
}
// Returns the filament Engine managing the material.
filament::Engine* GetEngine() const { return engine_; }
private:
// Updates the material instances based on the currently set parameters and
// textures.
@@ -22,11 +22,12 @@
#include <filament/Scene.h>
#include <utils/EntityManager.h>
#include <mujoco/mujoco.h>
#include "experimental/filament/filament/material.h"
#include "experimental/filament/filament/mesh.h"
namespace mujoco {
Renderables::Renderables(filament::Engine* engine) : engine_(engine) {}
Renderables::Renderables(filament::Engine* engine) : material_(engine) {}
Renderables::~Renderables() noexcept {
while (!entities_.empty()) {
@@ -46,7 +47,7 @@ void Renderables::RemoveLast() {
assigned_scene_->remove(entity);
}
engine_->destroy(entity);
GetEngine()->destroy(entity);
em.destroy(entity);
entities_.pop_back();
meshes_.pop_back();
@@ -114,7 +115,7 @@ utils::Entity Renderables::CreateEntity(const Mesh* mesh) {
builder.priority(priority_);
builder.screenSpaceContactShadows(true);;
builder.build(*engine_, entity);
builder.build(*GetEngine(), entity);
if (assigned_scene_) {
assigned_scene_->addEntity(entity);
}
@@ -132,13 +133,14 @@ void Renderables::UpdateEntity(utils::Entity entity, const Mesh* mesh) {
mju_error("Invalid (null) index buffer.");
}
filament::RenderableManager& rm = engine_->getRenderableManager();
filament::RenderableManager& rm = GetEngine()->getRenderableManager();
rm.setGeometryAt(rm.getInstance(entity), 0, mesh->GetPrimitiveType(),
vertex_buffer, index_buffer, 0,
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()) {
mju_error("Invalid index %d for renderable.", index);
}
@@ -173,7 +175,7 @@ void Renderables::RemoveFromScene(filament::Scene* scene) {
void Renderables::SetMaterialInstance(
filament::MaterialInstance* instance) {
if (instance != material_instance_) {
filament::RenderableManager& rm = engine_->getRenderableManager();
filament::RenderableManager& rm = GetEngine()->getRenderableManager();
for (utils::Entity& entity : entities_) {
filament::RenderableManager::Instance ri = rm.getInstance(entity);
rm.setMaterialInstanceAt(ri, 0, instance);
@@ -186,7 +188,7 @@ void Renderables::SetLayerMask(std::uint8_t mask) {
if (mask != layer_mask_) {
layer_mask_ = mask;
filament::RenderableManager& rm = engine_->getRenderableManager();
filament::RenderableManager& rm = GetEngine()->getRenderableManager();
for (utils::Entity& entity : entities_) {
rm.setLayerMask(rm.getInstance(entity), 0xff, layer_mask_);
}
@@ -197,7 +199,7 @@ void Renderables::SetPriority(std::uint8_t priority) {
if (priority != priority_) {
priority_ = priority;
filament::RenderableManager& rm = engine_->getRenderableManager();
filament::RenderableManager& rm = GetEngine()->getRenderableManager();
for (utils::Entity& entity : entities_) {
rm.setPriority(rm.getInstance(entity), priority_);
}
@@ -208,7 +210,7 @@ void Renderables::SetCastShadows(bool cast_shadows) {
if (cast_shadows_ != cast_shadows) {
cast_shadows_ = cast_shadows;
filament::RenderableManager& rm = engine_->getRenderableManager();
filament::RenderableManager& rm = GetEngine()->getRenderableManager();
for (utils::Entity& entity : entities_) {
rm.setCastShadows(rm.getInstance(entity), cast_shadows_);
}
@@ -219,7 +221,7 @@ void Renderables::SetReceiveShadows(bool receive_shadows) {
if (receive_shadows_ != receive_shadows) {
receive_shadows_ = receive_shadows;
filament::RenderableManager& rm = engine_->getRenderableManager();
filament::RenderableManager& rm = GetEngine()->getRenderableManager();
for (utils::Entity& entity : entities_) {
rm.setReceiveShadows(rm.getInstance(entity), receive_shadows_);
}
@@ -233,7 +235,7 @@ void Renderables::SetWireframe(bool wireframe) {
if (wireframe != wireframe_) {
wireframe_ = wireframe;
filament::RenderableManager& rm = engine_->getRenderableManager();
filament::RenderableManager& rm = GetEngine()->getRenderableManager();
for (int i = 0; i < entities_.size(); ++i) {
utils::Entity& entity = entities_[i];
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
@@ -21,6 +21,7 @@
#include <filament/Engine.h>
#include <filament/Scene.h>
#include <utils/Entity.h>
#include "experimental/filament/filament/material.h"
#include "experimental/filament/filament/mesh.h"
namespace mujoco {
@@ -79,8 +80,11 @@ class Renderables {
// Sets the material instance for all managed entities.
void SetMaterialInstance(filament::MaterialInstance* material_instance);
// Returns the filament Engine managing the entities in this collection.
filament::Engine* GetEngine() { return engine_; }
// Returns the material for the renderables.
Material& GetMaterial();
// Returns the filament Engine managing the renderables.
filament::Engine* GetEngine();
private:
utils::Entity CreateEntity(const Mesh* mesh);
@@ -92,7 +96,7 @@ class Renderables {
const Mesh* mesh = nullptr;
};
filament::Engine* engine_ = nullptr;
Material material_;
filament::Scene* assigned_scene_ = nullptr;
filament::MaterialInstance* material_instance_ = nullptr;
std::vector<utils::Entity> entities_;
@@ -45,6 +45,7 @@
#include "experimental/filament/filament/material.h"
#include "experimental/filament/filament/math_util.h"
#include "experimental/filament/filament/render_target.h"
#include "experimental/filament/filament/renderables.h"
#include "experimental/filament/filament/texture.h"
namespace mujoco {
@@ -162,7 +163,7 @@ SceneView::~SceneView() {
light->RemoveFromScene(scene_);
}
for (auto& drawable : drawables_) {
drawable->RemoveFromScene(scene_);
drawable->GetRenderables().RemoveFromScene(scene_);
}
lights_.clear();
drawables_.clear();
@@ -193,7 +194,7 @@ void SceneView::RemoveFromScene(Light* light) {
void SceneView::AddToScene(Drawable* drawable) {
if (drawables_.insert(drawable).second) {
drawable->AddToScene(scene_);
drawable->GetRenderables().AddToScene(scene_);
if (drawable->GetMaterial().GetParams().reflective) {
AddReflectiveDrawable(drawable);
}
@@ -206,7 +207,7 @@ void SceneView::RemoveFromScene(Drawable* drawable) {
if (it != reflectives_.end()) {
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_);
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)];
@@ -268,7 +272,7 @@ void SceneView::Render(filament::Renderer* renderer,
SetupReflectionCamera(drawable->GetTransform(), camera_, reflect_camera_);
// Hide reflective surface from its own reflection pass.
drawable->SetLayerMask(0x00);
drawable->GetRenderables().SetLayerMask(0x00);
// Render the reflection to its render target.
reflect_view_->setRenderTarget(
@@ -276,7 +280,7 @@ void SceneView::Render(filament::Renderer* renderer,
renderer->render(reflect_view_);
// Unhide the reflective surface.
drawable->SetLayerMask(0x01);
drawable->GetRenderables().SetLayerMask(0x01);
}
}