Expose Renderable settings in mjrRenderableParams.

PiperOrigin-RevId: 908587103
Change-Id: Ic0e19a7fb3535bf32782b85d2da0049ec4ac8ec7
This commit is contained in:
Haroon Qureshi
2026-05-01 00:17:56 -07:00
committed by Copybara-Service
parent 0399bfd058
commit ee3ac5b349
6 changed files with 53 additions and 34 deletions
@@ -85,6 +85,8 @@ SceneBridge::SceneBridge(FilamentContext* ctx, const mjModel* model)
: ctx_(ctx) { : ctx_(ctx) {
mjrSceneParams params; mjrSceneParams params;
mjr_defaultSceneParams(&params); mjr_defaultSceneParams(&params);
params.layer_mask = mjCAT_ALL;
params.reflection_layer_mask = mjCAT_DYNAMIC | mjCAT_STATIC;
scene_view_ = std::make_unique<SceneView>(ctx_, params); scene_view_ = std::make_unique<SceneView>(ctx_, params);
model_objects_ = std::make_unique<ModelObjects>(model, ctx_); model_objects_ = std::make_unique<ModelObjects>(model, ctx_);
@@ -122,11 +122,11 @@ void Renderable::InitPartEntity(Part& part) {
if (instances_[static_cast<int>(draw_mode_)] != nullptr) { if (instances_[static_cast<int>(draw_mode_)] != nullptr) {
builder.material(0, instances_[static_cast<int>(draw_mode_)]); builder.material(0, instances_[static_cast<int>(draw_mode_)]);
} }
builder.castShadows(cast_shadows_); builder.castShadows(params_.cast_shadows);
builder.receiveShadows(receive_shadows_); builder.receiveShadows(params_.receive_shadows);
builder.layerMask(0xff, layer_mask_); builder.layerMask(0xff, params_.layer_mask);
builder.priority(priority_); builder.priority(params_.priority);
builder.blendOrder(0, blend_order_); builder.blendOrder(0, params_.blend_order);
builder.screenSpaceContactShadows(true); builder.screenSpaceContactShadows(true);
builder.build(*GetEngine(), part.entity); builder.build(*GetEngine(), part.entity);
@@ -264,62 +264,62 @@ void Renderable::SetDrawMode(mjrDrawMode mode) {
} }
std::uint8_t Renderable::SetLayerMask(std::uint8_t mask) { std::uint8_t Renderable::SetLayerMask(std::uint8_t mask) {
std::uint8_t prev = layer_mask_; std::uint8_t prev = params_.layer_mask;
if (mask != layer_mask_) { if (mask != params_.layer_mask) {
layer_mask_ = mask; params_.layer_mask = mask;
filament::RenderableManager& rm = GetEngine()->getRenderableManager(); filament::RenderableManager& rm = GetEngine()->getRenderableManager();
for (Part& part : parts_) { for (Part& part : parts_) {
rm.setLayerMask(rm.getInstance(part.entity), 0xff, layer_mask_); rm.setLayerMask(rm.getInstance(part.entity), 0xff, params_.layer_mask);
} }
} }
return prev; return prev;
} }
std::uint8_t Renderable::SetPriority(std::uint8_t priority) { std::uint8_t Renderable::SetPriority(std::uint8_t priority) {
std::uint8_t prev = priority_; std::uint8_t prev = params_.priority;
if (priority != priority_) { if (priority != params_.priority) {
priority_ = priority; params_.priority = priority;
filament::RenderableManager& rm = GetEngine()->getRenderableManager(); filament::RenderableManager& rm = GetEngine()->getRenderableManager();
for (Part& part : parts_) { for (Part& part : parts_) {
rm.setPriority(rm.getInstance(part.entity), priority_); rm.setPriority(rm.getInstance(part.entity), params_.priority);
} }
} }
return prev; return prev;
} }
std::uint16_t Renderable::SetBlendOrder(std::uint16_t blend_order) { std::uint16_t Renderable::SetBlendOrder(std::uint16_t blend_order) {
std::uint16_t prev = blend_order_; std::uint16_t prev = params_.blend_order;
if (blend_order != blend_order_) { if (blend_order != params_.blend_order) {
blend_order_ = blend_order; params_.blend_order = blend_order;
filament::RenderableManager& rm = GetEngine()->getRenderableManager(); filament::RenderableManager& rm = GetEngine()->getRenderableManager();
for (Part& part : parts_) { for (Part& part : parts_) {
rm.setBlendOrderAt(rm.getInstance(part.entity), 0, blend_order_); rm.setBlendOrderAt(rm.getInstance(part.entity), 0, params_.blend_order);
} }
} }
return prev; return prev;
} }
void Renderable::SetCastShadows(bool cast_shadows) { void Renderable::SetCastShadows(bool cast_shadows) {
if (cast_shadows_ != cast_shadows) { if (params_.cast_shadows != cast_shadows) {
cast_shadows_ = cast_shadows; params_.cast_shadows = cast_shadows;
filament::RenderableManager& rm = GetEngine()->getRenderableManager(); filament::RenderableManager& rm = GetEngine()->getRenderableManager();
for (Part& part : parts_) { for (Part& part : parts_) {
rm.setCastShadows(rm.getInstance(part.entity), cast_shadows_); rm.setCastShadows(rm.getInstance(part.entity), params_.cast_shadows);
} }
} }
} }
void Renderable::SetReceiveShadows(bool receive_shadows) { void Renderable::SetReceiveShadows(bool receive_shadows) {
if (receive_shadows_ != receive_shadows) { if (params_.receive_shadows != receive_shadows) {
receive_shadows_ = receive_shadows; params_.receive_shadows = receive_shadows;
filament::RenderableManager& rm = GetEngine()->getRenderableManager(); filament::RenderableManager& rm = GetEngine()->getRenderableManager();
for (Part& part : parts_) { for (Part& part : parts_) {
rm.setReceiveShadows(rm.getInstance(part.entity), receive_shadows_); rm.setReceiveShadows(rm.getInstance(part.entity), params_.receive_shadows);
} }
} }
} }
@@ -48,10 +48,6 @@ namespace mujoco {
// of the Renderable. // of the Renderable.
class Renderable : public mjrRenderable { class Renderable : public mjrRenderable {
public: public:
// Default filament values for priority and layer mask.
static constexpr std::uint8_t kDefaultPriority = 4;
static constexpr std::uint8_t kDefaultLayerMask = 0x01;
Renderable(FilamentContext* ctx, const mjrRenderableParams& params); Renderable(FilamentContext* ctx, const mjrRenderableParams& params);
~Renderable() noexcept; ~Renderable() noexcept;
@@ -155,12 +151,7 @@ class Renderable : public mjrRenderable {
std::vector<Part> parts_; std::vector<Part> parts_;
filament::math::mat4f transform_; filament::math::mat4f transform_;
GetTransformFn get_transform_fn_; GetTransformFn get_transform_fn_;
std::uint8_t priority_ = kDefaultPriority;
std::uint8_t layer_mask_ = kDefaultLayerMask;
std::uint16_t blend_order_ = 0;
bool wireframe_ = false; bool wireframe_ = false;
bool cast_shadows_ = true;
bool receive_shadows_ = true;
}; };
} // namespace mujoco } // namespace mujoco
@@ -132,7 +132,7 @@ SceneView::SceneView(FilamentContext* ctx, const mjrSceneParams& params)
view = engine->createView(); view = engine->createView();
view->setScene(scene_); view->setScene(scene_);
view->setCamera(camera_); view->setCamera(camera_);
view->setVisibleLayers(0xff, mjCAT_ALL); view->setVisibleLayers(0xff, params.layer_mask);
} }
reflect_view_ = engine->createView(); reflect_view_ = engine->createView();
@@ -140,7 +140,7 @@ SceneView::SceneView(FilamentContext* ctx, const mjrSceneParams& params)
reflect_view_->setCamera(reflect_camera_); reflect_view_->setCamera(reflect_camera_);
reflect_view_->setShadowingEnabled(false); reflect_view_->setShadowingEnabled(false);
reflect_view_->setPostProcessingEnabled(false); reflect_view_->setPostProcessingEnabled(false);
reflect_view_->setVisibleLayers(0xff, mjCAT_DYNAMIC | mjCAT_STATIC); reflect_view_->setVisibleLayers(0xff, params.reflection_layer_mask);
// Disable post processing for the depth and segmentation views to preserve // Disable post processing for the depth and segmentation views to preserve
// the values. // the values.
@@ -67,6 +67,8 @@ void mjr_defaultSceneParams(mjrSceneParams* params) {
params->enable_post_processing = true; params->enable_post_processing = true;
params->enable_reflections = true; params->enable_reflections = true;
params->enable_shadows = true; params->enable_shadows = true;
params->layer_mask = 0xff;
params->reflection_layer_mask = 0xff;
} }
void mjr_defaultLightParams(mjrLightParams* params) { void mjr_defaultLightParams(mjrLightParams* params) {
@@ -113,6 +115,11 @@ void mjr_defaultMaterialParams(mjrMaterialParams* params) {
void mjr_defaultRenderableParams(mjrRenderableParams* params) { void mjr_defaultRenderableParams(mjrRenderableParams* params) {
params->shading_model = mjSHADING_MODEL_SCENE_OBJECT; params->shading_model = mjSHADING_MODEL_SCENE_OBJECT;
params->cast_shadows = true;
params->receive_shadows = true;
params->layer_mask = 0x01;
params->priority = 4;
params->blend_order = 0;
} }
void mjr_defaultRenderTargetConfig(mjrRenderTargetConfig* config) { void mjr_defaultRenderTargetConfig(mjrRenderTargetConfig* config) {
@@ -206,6 +206,20 @@ void mjr_defaultTextureConfig(mjrTextureConfig* config);
struct mjrRenderableParams { struct mjrRenderableParams {
// The shading model to use for the Renderable. // The shading model to use for the Renderable.
mjrShadingModel shading_model; mjrShadingModel shading_model;
// Whether or not the Renderable casts shadows.
mjtByte cast_shadows;
// Whether or not the Renderable receives shadows.
mjtByte receive_shadows;
// The layers to which the Renderable belongs. This mask is used in
// conjunction with the layer mask in the Scene to determine which
// Renderables to render. Defaults to 0xff.
uint8_t layer_mask;
// Controls the order in which the Renderable is drawn relative to other
// Renderables; defaults to 4.
uint8_t priority;
// Similar to priority, but provides finer-grained control for Renderables
// with transparency; defaults to 0.
uint16_t blend_order;
}; };
// Initializes the mjrRenderableParams to default values. // Initializes the mjrRenderableParams to default values.
@@ -292,6 +306,11 @@ struct mjrSceneParams {
mjtByte enable_reflections; mjtByte enable_reflections;
// Whether or not to enable shadows; enabled by default. // Whether or not to enable shadows; enabled by default.
mjtByte enable_shadows; mjtByte enable_shadows;
// This mask, in conjunction with the layer mask in the Renderable, determines
// which Renderables to render within the Scene.
uint8_t layer_mask;
// The layer mask to use for reflections.
uint8_t reflection_layer_mask;
}; };
// Initializes the mjrSceneParams to default values. // Initializes the mjrSceneParams to default values.