Remove layer mask from public API.
Instead, use materials to determine the layer mask of an object. This hides the details/complexities of how layers are used to render different passes from the user and will allow the renderer to do more advanced rendering passes. PiperOrigin-RevId: 928682525 Change-Id: I1f53dc8d12d2e574de6528977f55e79f896c6e42
This commit is contained in:
committed by
Copybara-Service
parent
982e3be9ef
commit
2fcd135179
@@ -43,8 +43,6 @@ SceneBridge::SceneBridge(mjrfContext* ctx, const mjModel* model)
|
||||
: ctx_(ctx) {
|
||||
mjrfSceneParams params;
|
||||
mjrf_defaultSceneParams(¶ms);
|
||||
params.layer_mask = mjCAT_ALL;
|
||||
params.reflection_layer_mask = mjCAT_DYNAMIC | mjCAT_STATIC;
|
||||
scene_ = CreateScene(ctx_, params);
|
||||
model_objects_ = std::make_unique<ModelObjects>(model, ctx_);
|
||||
|
||||
|
||||
@@ -268,7 +268,6 @@ UniquePtr<mjrfRenderable> CreateGeomRenderable(
|
||||
const mjtByte render_flags[mjNRNDFLAG]) {
|
||||
mjrfRenderableParams params;
|
||||
mjrf_defaultRenderableParams(¶ms);
|
||||
params.layer_mask = geom.category;
|
||||
auto renderable = CreateRenderable(ctx, params);
|
||||
PrepareGeomMeshes(renderable.get(), geom, model_objs);
|
||||
UpdateGeomMaterial(renderable.get(), geom, model_objs, render_flags);
|
||||
|
||||
@@ -136,8 +136,6 @@ void Renderable::InitPartEntity(Part& part) {
|
||||
}
|
||||
builder.castShadows(params_.cast_shadows);
|
||||
builder.receiveShadows(params_.receive_shadows);
|
||||
builder.layerMask(0xff, params_.layer_mask);
|
||||
builder.priority(params_.priority);
|
||||
builder.blendOrder(0, params_.blend_order);
|
||||
builder.screenSpaceContactShadows(true);
|
||||
|
||||
@@ -223,6 +221,11 @@ void Renderable::RemoveFromScene(filament::Scene* scene) {
|
||||
}
|
||||
|
||||
void Renderable::UpdateMaterial(const mjrfMaterial& material) {
|
||||
uint8_t layer_mask_ = kLayerMask_Object;
|
||||
if (material.decor_ux) {
|
||||
layer_mask_ = kLayerMask_Decor;
|
||||
}
|
||||
SetLayerMask(layer_mask_);
|
||||
material_ = material;
|
||||
}
|
||||
|
||||
@@ -390,26 +393,13 @@ void Renderable::BindMaterialInstance(const mjrfRenderRequest& request) {
|
||||
}
|
||||
|
||||
std::uint8_t Renderable::SetLayerMask(std::uint8_t mask) {
|
||||
std::uint8_t prev = params_.layer_mask;
|
||||
if (mask != params_.layer_mask) {
|
||||
params_.layer_mask = mask;
|
||||
std::uint8_t prev = layer_mask_;
|
||||
if (mask != layer_mask_) {
|
||||
layer_mask_ = mask;
|
||||
|
||||
filament::RenderableManager& rm = GetEngine()->getRenderableManager();
|
||||
for (Part& part : parts_) {
|
||||
rm.setLayerMask(rm.getInstance(part.entity), 0xff, params_.layer_mask);
|
||||
}
|
||||
}
|
||||
return prev;
|
||||
}
|
||||
|
||||
std::uint8_t Renderable::SetPriority(std::uint8_t priority) {
|
||||
std::uint8_t prev = params_.priority;
|
||||
if (priority != params_.priority) {
|
||||
params_.priority = priority;
|
||||
|
||||
filament::RenderableManager& rm = GetEngine()->getRenderableManager();
|
||||
for (Part& part : parts_) {
|
||||
rm.setPriority(rm.getInstance(part.entity), params_.priority);
|
||||
rm.setLayerMask(rm.getInstance(part.entity), 0xff, layer_mask_);
|
||||
}
|
||||
}
|
||||
return prev;
|
||||
|
||||
@@ -35,6 +35,13 @@
|
||||
|
||||
namespace mujoco {
|
||||
|
||||
enum LayerMask : uint8_t {
|
||||
kLayerMask_Object = 0x01 << 1,
|
||||
kLayerMask_Decor = 0x01 << 2,
|
||||
kLayerMask_All = 0xff,
|
||||
kLayerMask_None = 0x00,
|
||||
};
|
||||
|
||||
// A Renderable is effectively two things: a mesh and a material.
|
||||
//
|
||||
// The mesh describes the surface geometry of the object and the material
|
||||
@@ -73,10 +80,6 @@ class Renderable : public mjrfRenderable {
|
||||
// show/hide groups of renderables in scenes. Returns the previous layer mask.
|
||||
std::uint8_t SetLayerMask(std::uint8_t mask);
|
||||
|
||||
// Sets the draw priority this renderable. The priority determines the order
|
||||
// in which renderables are rendered. Returns the previous priority.
|
||||
std::uint8_t SetPriority(std::uint8_t priority);
|
||||
|
||||
// Sets the blend order for this renderable. This determines the order in
|
||||
// which transparent renderables are blended together. Returns the previous
|
||||
// blend order.
|
||||
@@ -173,6 +176,7 @@ class Renderable : public mjrfRenderable {
|
||||
filament::math::mat4f transform_;
|
||||
GetTransformFn get_transform_fn_;
|
||||
Trs trs_;
|
||||
uint8_t layer_mask_ = 0x00;
|
||||
bool infinite_plane_ = false;
|
||||
};
|
||||
|
||||
|
||||
@@ -131,12 +131,12 @@ SceneView::SceneView(filament::Engine* engine, const mjrfSceneParams& params)
|
||||
main_view_ = engine->createView();
|
||||
main_view_->setScene(scene_);
|
||||
main_view_->setCamera(camera_);
|
||||
main_view_->setVisibleLayers(0xff, params.layer_mask);
|
||||
main_view_->setVisibleLayers(0xff, kLayerMask_All);
|
||||
|
||||
depth_segment_view_ = engine->createView();
|
||||
depth_segment_view_->setScene(scene_);
|
||||
depth_segment_view_->setCamera(camera_);
|
||||
depth_segment_view_->setVisibleLayers(0xff, params.layer_mask);
|
||||
depth_segment_view_->setVisibleLayers(0xff, kLayerMask_Object);
|
||||
depth_segment_view_->setPostProcessingEnabled(false);
|
||||
|
||||
reflect_view_ = engine->createView();
|
||||
@@ -145,7 +145,7 @@ SceneView::SceneView(filament::Engine* engine, const mjrfSceneParams& params)
|
||||
reflect_view_->setShadowingEnabled(false);
|
||||
reflect_view_->setPostProcessingEnabled(false);
|
||||
reflect_view_->setFrontFaceWindingInverted(true);
|
||||
reflect_view_->setVisibleLayers(0xff, params.reflection_layer_mask);
|
||||
reflect_view_->setVisibleLayers(0xff, kLayerMask_Object);
|
||||
reflect_view_->setMultiSampleAntiAliasingOptions({.enabled = false});
|
||||
|
||||
// Rotate the fog to align with mujoco's +Z up space.
|
||||
@@ -270,7 +270,7 @@ void SceneView::Render(filament::Renderer* renderer, const mjrfRenderRequest& re
|
||||
SetupReflectionCamera(transform, camera_, reflect_camera_);
|
||||
|
||||
// Hide reflective surface from its own reflection pass.
|
||||
std::uint8_t previous_layer_mask = renderable->SetLayerMask(0x00);
|
||||
std::uint8_t prev_layer_mask = renderable->SetLayerMask(kLayerMask_None);
|
||||
|
||||
// Render the reflection to its render target.
|
||||
viewport.left = 0;
|
||||
@@ -282,7 +282,7 @@ void SceneView::Render(filament::Renderer* renderer, const mjrfRenderRequest& re
|
||||
reflect_view_->setRenderTarget(nullptr);
|
||||
|
||||
// Unhide the reflective surface.
|
||||
renderable->SetLayerMask(previous_layer_mask);
|
||||
renderable->SetLayerMask(prev_layer_mask);
|
||||
}
|
||||
|
||||
view->setRenderTarget(render_target ? render_target->GetFilamentRenderTarget()
|
||||
|
||||
@@ -57,8 +57,6 @@ void mjrf_defaultMeshData(mjrfMeshData* data) {
|
||||
|
||||
void mjrf_defaultSceneParams(mjrfSceneParams* params) {
|
||||
memset(params, 0, sizeof(mjrfSceneParams));
|
||||
params->layer_mask = 0xff;
|
||||
params->reflection_layer_mask = 0xff;
|
||||
}
|
||||
|
||||
void mjrf_defaultLightParams(mjrfLightParams* params) {
|
||||
@@ -94,8 +92,6 @@ void mjrf_defaultRenderableParams(mjrfRenderableParams* params) {
|
||||
memset(params, 0, sizeof(mjrfRenderableParams));
|
||||
params->cast_shadows = true;
|
||||
params->receive_shadows = true;
|
||||
params->layer_mask = 0x01;
|
||||
params->priority = 4;
|
||||
params->blend_order = 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -467,12 +467,6 @@ void mjrf_destroyMesh(mjrfMesh* mesh);
|
||||
|
||||
// Configuration parameters for a Scene.
|
||||
struct mjrfSceneParams {
|
||||
// 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 mjrfSceneParams to default values.
|
||||
@@ -687,15 +681,6 @@ struct mjrfRenderableParams {
|
||||
// Whether or not the Renderable receives shadows.
|
||||
mjtBool 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;
|
||||
|
||||
Reference in New Issue
Block a user