Make wireframe rendering a draw mode.
PiperOrigin-RevId: 916042943 Change-Id: Ifbf0033bfc0607c7808d90423648deb0296056a3
This commit is contained in:
committed by
Copybara-Service
parent
093b92acc1
commit
99b01b9f87
@@ -59,7 +59,10 @@ void MjrFilamentRenderer::Render(const mjrRect& viewport,
|
|||||||
reqs[0].draw_mode = mjDRAW_MODE_SEGMENTATION;
|
reqs[0].draw_mode = mjDRAW_MODE_SEGMENTATION;
|
||||||
} else if (render_flags_[mjRND_DEPTH]) {
|
} else if (render_flags_[mjRND_DEPTH]) {
|
||||||
reqs[0].draw_mode = mjDRAW_MODE_DEPTH;
|
reqs[0].draw_mode = mjDRAW_MODE_DEPTH;
|
||||||
|
} else if (render_flags_[mjRND_WIREFRAME]) {
|
||||||
|
reqs[0].draw_mode = mjDRAW_MODE_WIREFRAME;
|
||||||
}
|
}
|
||||||
|
|
||||||
reqs[0].camera = scene_bridge_->GetCamera();
|
reqs[0].camera = scene_bridge_->GetCamera();
|
||||||
reqs[0].viewport = viewport;
|
reqs[0].viewport = viewport;
|
||||||
reqs[0].enable_shadows = render_flags_[mjRND_SHADOW];
|
reqs[0].enable_shadows = render_flags_[mjRND_SHADOW];
|
||||||
@@ -109,6 +112,8 @@ void MjrFilamentRenderer::ReadPixels(mjrRect viewport, unsigned char* rgb,
|
|||||||
reqs[0].draw_mode = mjDRAW_MODE_SEGMENTATION;
|
reqs[0].draw_mode = mjDRAW_MODE_SEGMENTATION;
|
||||||
} else if (render_flags_[mjRND_DEPTH]) {
|
} else if (render_flags_[mjRND_DEPTH]) {
|
||||||
reqs[0].draw_mode = mjDRAW_MODE_DEPTH;
|
reqs[0].draw_mode = mjDRAW_MODE_DEPTH;
|
||||||
|
} else if (render_flags_[mjRND_WIREFRAME]) {
|
||||||
|
reqs[0].draw_mode = mjDRAW_MODE_WIREFRAME;
|
||||||
}
|
}
|
||||||
reqs[0].camera = scene_bridge_->GetCamera();
|
reqs[0].camera = scene_bridge_->GetCamera();
|
||||||
reqs[0].viewport = viewport;
|
reqs[0].viewport = viewport;
|
||||||
|
|||||||
@@ -191,8 +191,6 @@ static void UpdateGeomMaterial(mjrRenderable* renderable, const mjvGeom& geom,
|
|||||||
if (geom.category == mjCAT_DECOR) {
|
if (geom.category == mjCAT_DECOR) {
|
||||||
mjrf_setRenderableCastShadows(renderable, false);
|
mjrf_setRenderableCastShadows(renderable, false);
|
||||||
mjrf_setRenderableReceiveShadows(renderable, false);
|
mjrf_setRenderableReceiveShadows(renderable, false);
|
||||||
} else {
|
|
||||||
mjrf_setRenderableWireframe(renderable, render_flags[mjRND_WIREFRAME]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (geom.matid >= 0 && geom.matid < model->nmat) {
|
if (geom.matid >= 0 && geom.matid < model->nmat) {
|
||||||
|
|||||||
@@ -210,8 +210,10 @@ void Renderable::UpdateMaterial(const mjrMaterial& material) {
|
|||||||
|
|
||||||
const Mesh* mesh = !parts_.empty() ? parts_[0].mesh : nullptr;
|
const Mesh* mesh = !parts_.empty() ? parts_[0].mesh : nullptr;
|
||||||
|
|
||||||
AssignMaterial(mjDRAW_MODE_COLOR, GetMaterialType(material_, mesh));
|
const ObjectManager::MaterialType type = GetMaterialType(material, mesh);
|
||||||
|
AssignMaterial(mjDRAW_MODE_COLOR, type);
|
||||||
if (!material_.decor_ux) {
|
if (!material_.decor_ux) {
|
||||||
|
AssignMaterial(mjDRAW_MODE_WIREFRAME, type);
|
||||||
AssignMaterial(mjDRAW_MODE_DEPTH, ObjectManager::kUnlitDepth);
|
AssignMaterial(mjDRAW_MODE_DEPTH, ObjectManager::kUnlitDepth);
|
||||||
AssignMaterial(mjDRAW_MODE_SEGMENTATION, ObjectManager::kUnlitSegmentation);
|
AssignMaterial(mjDRAW_MODE_SEGMENTATION, ObjectManager::kUnlitSegmentation);
|
||||||
}
|
}
|
||||||
@@ -221,7 +223,6 @@ void Renderable::UpdateMaterial(const mjrMaterial& material) {
|
|||||||
UpdateMaterialInstance(instances_[i], material_, object_mgr_);
|
UpdateMaterialInstance(instances_[i], material_, object_mgr_);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
SetDrawMode(draw_mode_);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Renderable::AssignMaterial(mjrDrawMode mode,
|
void Renderable::AssignMaterial(mjrDrawMode mode,
|
||||||
@@ -257,6 +258,8 @@ void Renderable::SetDrawMode(mjrDrawMode mode) {
|
|||||||
mode = mjDRAW_MODE_COLOR;
|
mode = mjDRAW_MODE_COLOR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SetWireframe(mode == mjDRAW_MODE_WIREFRAME);
|
||||||
|
|
||||||
filament::MaterialInstance* instance = instances_[static_cast<int>(mode)];
|
filament::MaterialInstance* instance = instances_[static_cast<int>(mode)];
|
||||||
if (instance) {
|
if (instance) {
|
||||||
filament::RenderableManager& rm = GetEngine()->getRenderableManager();
|
filament::RenderableManager& rm = GetEngine()->getRenderableManager();
|
||||||
|
|||||||
@@ -127,12 +127,16 @@ SceneView::SceneView(filament::Engine* engine, const mjrSceneParams& params)
|
|||||||
camera_ = engine->createCamera(utils::EntityManager::get().create());
|
camera_ = engine->createCamera(utils::EntityManager::get().create());
|
||||||
reflect_camera_ = engine->createCamera(utils::EntityManager::get().create());
|
reflect_camera_ = engine->createCamera(utils::EntityManager::get().create());
|
||||||
|
|
||||||
for (auto& view : views_) {
|
main_view_ = engine->createView();
|
||||||
view = engine->createView();
|
main_view_->setScene(scene_);
|
||||||
view->setScene(scene_);
|
main_view_->setCamera(camera_);
|
||||||
view->setCamera(camera_);
|
main_view_->setVisibleLayers(0xff, params.layer_mask);
|
||||||
view->setVisibleLayers(0xff, params.layer_mask);
|
|
||||||
}
|
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_->setPostProcessingEnabled(false);
|
||||||
|
|
||||||
reflect_view_ = engine->createView();
|
reflect_view_ = engine->createView();
|
||||||
reflect_view_->setScene(scene_);
|
reflect_view_->setScene(scene_);
|
||||||
@@ -142,13 +146,8 @@ SceneView::SceneView(filament::Engine* engine, const mjrSceneParams& params)
|
|||||||
reflect_view_->setFrontFaceWindingInverted(true);
|
reflect_view_->setFrontFaceWindingInverted(true);
|
||||||
reflect_view_->setVisibleLayers(0xff, params.reflection_layer_mask);
|
reflect_view_->setVisibleLayers(0xff, params.reflection_layer_mask);
|
||||||
|
|
||||||
// Disable post processing for the depth and segmentation views to preserve
|
|
||||||
// the values.
|
|
||||||
views_[mjDRAW_MODE_DEPTH]->setPostProcessingEnabled(false);
|
|
||||||
views_[mjDRAW_MODE_SEGMENTATION]->setPostProcessingEnabled(false);
|
|
||||||
|
|
||||||
// Rotate the fog to align with mujoco's +Z up space.
|
// Rotate the fog to align with mujoco's +Z up space.
|
||||||
auto fog = views_[mjDRAW_MODE_COLOR]->getFogEntity();
|
auto fog = main_view_->getFogEntity();
|
||||||
auto& tm = engine->getTransformManager();
|
auto& tm = engine->getTransformManager();
|
||||||
tm.create(fog);
|
tm.create(fog);
|
||||||
tm.setTransform(tm.getInstance(fog),
|
tm.setTransform(tm.getInstance(fog),
|
||||||
@@ -176,9 +175,8 @@ SceneView::~SceneView() {
|
|||||||
engine_->destroy(color_grading_);
|
engine_->destroy(color_grading_);
|
||||||
}
|
}
|
||||||
engine_->destroy(scene_);
|
engine_->destroy(scene_);
|
||||||
for (auto& view : views_) {
|
engine_->destroy(depth_segment_view_);
|
||||||
engine_->destroy(view);
|
engine_->destroy(main_view_);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SceneView::AddToScene(Light* light) {
|
void SceneView::AddToScene(Light* light) {
|
||||||
@@ -237,12 +235,10 @@ void SceneView::Render(filament::Renderer* renderer, const mjrRenderRequest& req
|
|||||||
DisableReflections();
|
DisableReflections();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
filament::Viewport viewport(request.viewport.left, request.viewport.bottom,
|
filament::Viewport viewport(request.viewport.left, request.viewport.bottom,
|
||||||
request.viewport.width, request.viewport.height);
|
request.viewport.width, request.viewport.height);
|
||||||
for (auto& view : views_) {
|
main_view_->setViewport(viewport);
|
||||||
view->setViewport(viewport);
|
depth_segment_view_->setViewport(viewport);
|
||||||
}
|
|
||||||
reflect_view_->setViewport(viewport);
|
reflect_view_->setViewport(viewport);
|
||||||
|
|
||||||
SetupCamera(request.camera, viewport, camera_);
|
SetupCamera(request.camera, viewport, camera_);
|
||||||
@@ -251,7 +247,11 @@ void SceneView::Render(filament::Renderer* renderer, const mjrRenderRequest& req
|
|||||||
iter->SetDrawMode(request.draw_mode);
|
iter->SetDrawMode(request.draw_mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
filament::View* view = views_[static_cast<int>(request.draw_mode)];
|
filament::View* view = main_view_;
|
||||||
|
if (request.draw_mode == mjDRAW_MODE_DEPTH ||
|
||||||
|
request.draw_mode == mjDRAW_MODE_SEGMENTATION) {
|
||||||
|
view = depth_segment_view_;
|
||||||
|
}
|
||||||
view->setShadowingEnabled(request.enable_shadows);
|
view->setShadowingEnabled(request.enable_shadows);
|
||||||
view->setPostProcessingEnabled(request.enable_post_processing);
|
view->setPostProcessingEnabled(request.enable_post_processing);
|
||||||
|
|
||||||
@@ -328,7 +328,7 @@ void SceneView::SetColorGradingOptions(const ColorGradingOptions& opts) {
|
|||||||
auto color_grading = ToBuilder(color_grading_options_)
|
auto color_grading = ToBuilder(color_grading_options_)
|
||||||
.toneMapper(tone_mapper.get())
|
.toneMapper(tone_mapper.get())
|
||||||
.build(*GetEngine());
|
.build(*GetEngine());
|
||||||
views_[mjDRAW_MODE_COLOR]->setColorGrading(color_grading);
|
main_view_->setColorGrading(color_grading);
|
||||||
if (color_grading_) {
|
if (color_grading_) {
|
||||||
GetEngine()->destroy(color_grading_);
|
GetEngine()->destroy(color_grading_);
|
||||||
}
|
}
|
||||||
@@ -364,7 +364,7 @@ void SceneView::DisableReflections() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
filament::View* SceneView::GetDefaultRenderView() {
|
filament::View* SceneView::GetDefaultRenderView() {
|
||||||
return views_[mjDRAW_MODE_COLOR];
|
return main_view_;
|
||||||
}
|
}
|
||||||
|
|
||||||
ColorGradingOptions SceneView::GetColorGradingOptions() const {
|
ColorGradingOptions SceneView::GetColorGradingOptions() const {
|
||||||
@@ -372,8 +372,6 @@ ColorGradingOptions SceneView::GetColorGradingOptions() const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void SceneView::Configure(const mjModel* model) {
|
void SceneView::Configure(const mjModel* model) {
|
||||||
filament::View* view = views_[mjDRAW_MODE_COLOR];
|
|
||||||
|
|
||||||
auto cg = color_grading_options_;
|
auto cg = color_grading_options_;
|
||||||
cg.exposure = ReadElement(model, "filament.cg.exposure", cg.exposure);
|
cg.exposure = ReadElement(model, "filament.cg.exposure", cg.exposure);
|
||||||
cg.contrast = ReadElement(model, "filament.cg.contrast", cg.contrast);
|
cg.contrast = ReadElement(model, "filament.cg.contrast", cg.contrast);
|
||||||
@@ -415,7 +413,7 @@ void SceneView::Configure(const mjModel* model) {
|
|||||||
}
|
}
|
||||||
SetColorGradingOptions(cg);
|
SetColorGradingOptions(cg);
|
||||||
|
|
||||||
auto ao = view->getAmbientOcclusionOptions();
|
auto ao = main_view_->getAmbientOcclusionOptions();
|
||||||
ao.enabled = ReadElement(model, "filament.ao.enabled", true);
|
ao.enabled = ReadElement(model, "filament.ao.enabled", true);
|
||||||
ao.bentNormals = ReadElement(model, "filament.ao.bent_normals", false);
|
ao.bentNormals = ReadElement(model, "filament.ao.bent_normals", false);
|
||||||
ao.ssct.enabled = ReadElement(model, "filament.ao.ssct", ao.ssct.enabled);
|
ao.ssct.enabled = ReadElement(model, "filament.ao.ssct", ao.ssct.enabled);
|
||||||
@@ -427,17 +425,17 @@ void SceneView::Configure(const mjModel* model) {
|
|||||||
filament::QualityLevel::ULTRA);
|
filament::QualityLevel::ULTRA);
|
||||||
ao.bilateralThreshold =
|
ao.bilateralThreshold =
|
||||||
ReadElement(model, "filament.ao.bilateral_threshold", 0.5f);
|
ReadElement(model, "filament.ao.bilateral_threshold", 0.5f);
|
||||||
view->setAmbientOcclusionOptions(ao);
|
main_view_->setAmbientOcclusionOptions(ao);
|
||||||
|
|
||||||
auto msaa = view->getMultiSampleAntiAliasingOptions();
|
auto msaa = main_view_->getMultiSampleAntiAliasingOptions();
|
||||||
msaa.enabled = ReadElement(model, "filament.msaa.enabled", true);
|
msaa.enabled = ReadElement(model, "filament.msaa.enabled", true);
|
||||||
view->setMultiSampleAntiAliasingOptions(msaa);
|
main_view_->setMultiSampleAntiAliasingOptions(msaa);
|
||||||
|
|
||||||
auto shadow_type = view->getShadowType();
|
auto shadow_type = main_view_->getShadowType();
|
||||||
shadow_type = ReadElement(model, "filament.shadows.type", shadow_type);
|
shadow_type = ReadElement(model, "filament.shadows.type", shadow_type);
|
||||||
view->setShadowType(shadow_type);
|
main_view_->setShadowType(shadow_type);
|
||||||
|
|
||||||
auto fog_opts = view->getFogOptions();
|
auto fog_opts = main_view_->getFogOptions();
|
||||||
fog_opts.enabled =
|
fog_opts.enabled =
|
||||||
ReadElement(model, "filament.fog.enabled", fog_opts.enabled);
|
ReadElement(model, "filament.fog.enabled", fog_opts.enabled);
|
||||||
fog_opts.color = ReadElement(model, "filament.fog.color", fog_opts.color);
|
fog_opts.color = ReadElement(model, "filament.fog.color", fog_opts.color);
|
||||||
@@ -456,9 +454,9 @@ void SceneView::Configure(const mjModel* model) {
|
|||||||
model, "filament.fog.inScatteringStart", fog_opts.inScatteringStart);
|
model, "filament.fog.inScatteringStart", fog_opts.inScatteringStart);
|
||||||
fog_opts.inScatteringSize = ReadElement(
|
fog_opts.inScatteringSize = ReadElement(
|
||||||
model, "filament.fog.inScatteringSize", fog_opts.inScatteringSize);
|
model, "filament.fog.inScatteringSize", fog_opts.inScatteringSize);
|
||||||
view->setFogOptions(fog_opts);
|
main_view_->setFogOptions(fog_opts);
|
||||||
|
|
||||||
auto bloom = view->getBloomOptions();
|
auto bloom = main_view_->getBloomOptions();
|
||||||
bloom.enabled = ReadElement(model, "filament.bloom.enabled", bloom.enabled);
|
bloom.enabled = ReadElement(model, "filament.bloom.enabled", bloom.enabled);
|
||||||
bloom.strength =
|
bloom.strength =
|
||||||
ReadElement(model, "filament.bloom.strength", bloom.strength);
|
ReadElement(model, "filament.bloom.strength", bloom.strength);
|
||||||
@@ -468,6 +466,6 @@ void SceneView::Configure(const mjModel* model) {
|
|||||||
bloom.resolution =
|
bloom.resolution =
|
||||||
ReadElement(model, "filament.bloom.resolution", bloom.resolution);
|
ReadElement(model, "filament.bloom.resolution", bloom.resolution);
|
||||||
bloom.levels = ReadElement(model, "filament.bloom.levels", bloom.levels);
|
bloom.levels = ReadElement(model, "filament.bloom.levels", bloom.levels);
|
||||||
view->setBloomOptions(bloom);
|
main_view_->setBloomOptions(bloom);
|
||||||
}
|
}
|
||||||
} // namespace mujoco
|
} // namespace mujoco
|
||||||
|
|||||||
@@ -92,7 +92,8 @@ class SceneView : public mjrScene {
|
|||||||
filament::Camera* camera_ = nullptr;
|
filament::Camera* camera_ = nullptr;
|
||||||
filament::ColorGrading* color_grading_ = nullptr;
|
filament::ColorGrading* color_grading_ = nullptr;
|
||||||
ColorGradingOptions color_grading_options_;
|
ColorGradingOptions color_grading_options_;
|
||||||
std::array<filament::View*, mjNUM_DRAW_MODES> views_;
|
filament::View* main_view_;
|
||||||
|
filament::View* depth_segment_view_;
|
||||||
|
|
||||||
// Scene objects.
|
// Scene objects.
|
||||||
std::unordered_set<Light*> lights_;
|
std::unordered_set<Light*> lights_;
|
||||||
|
|||||||
@@ -277,10 +277,6 @@ void mjrf_setRenderableLayerMask(mjrRenderable* renderable,
|
|||||||
mujoco::Renderable::downcast(renderable)->SetLayerMask(layer_mask);
|
mujoco::Renderable::downcast(renderable)->SetLayerMask(layer_mask);
|
||||||
}
|
}
|
||||||
|
|
||||||
void mjrf_setRenderableWireframe(mjrRenderable* renderable, mjtByte wireframe) {
|
|
||||||
mujoco::Renderable::downcast(renderable)->SetWireframe(wireframe);
|
|
||||||
}
|
|
||||||
|
|
||||||
void mjrf_setRenderableCastShadows(mjrRenderable* renderable,
|
void mjrf_setRenderableCastShadows(mjrRenderable* renderable,
|
||||||
mjtByte cast_shadows) {
|
mjtByte cast_shadows) {
|
||||||
mujoco::Renderable::downcast(renderable)->SetCastShadows(cast_shadows);
|
mujoco::Renderable::downcast(renderable)->SetCastShadows(cast_shadows);
|
||||||
|
|||||||
@@ -130,6 +130,8 @@ void mjrf_destroyContext(mjrfContext* ctx);
|
|||||||
typedef enum mjrDrawMode_ {
|
typedef enum mjrDrawMode_ {
|
||||||
// Render the scene with "normal" colors and lighting.
|
// Render the scene with "normal" colors and lighting.
|
||||||
mjDRAW_MODE_COLOR,
|
mjDRAW_MODE_COLOR,
|
||||||
|
// Render the scene as a wireframe.
|
||||||
|
mjDRAW_MODE_WIREFRAME,
|
||||||
// Render the scene as a grayscale depth map.
|
// Render the scene as a grayscale depth map.
|
||||||
mjDRAW_MODE_DEPTH,
|
mjDRAW_MODE_DEPTH,
|
||||||
// Render each object with a unique, uniform (flat) color regardless of
|
// Render each object with a unique, uniform (flat) color regardless of
|
||||||
@@ -137,7 +139,7 @@ typedef enum mjrDrawMode_ {
|
|||||||
mjDRAW_MODE_SEGMENTATION,
|
mjDRAW_MODE_SEGMENTATION,
|
||||||
} mjrDrawMode;
|
} mjrDrawMode;
|
||||||
|
|
||||||
enum { mjNUM_DRAW_MODES = 3 }; // Number of modes in `mjrDrawMode`.
|
enum { mjNUM_DRAW_MODES = 4 }; // Number of modes in `mjrDrawMode`.
|
||||||
|
|
||||||
// Parameters describing the camera to use for rendering an image.
|
// Parameters describing the camera to use for rendering an image.
|
||||||
typedef mjvGLCamera mjrCamera;
|
typedef mjvGLCamera mjrCamera;
|
||||||
@@ -708,9 +710,6 @@ void mjrf_setRenderableCastShadows(mjrRenderable* renderable,
|
|||||||
void mjrf_setRenderableReceiveShadows(mjrRenderable* renderable,
|
void mjrf_setRenderableReceiveShadows(mjrRenderable* renderable,
|
||||||
mjtByte receive_shadows);
|
mjtByte receive_shadows);
|
||||||
|
|
||||||
// Forces the renderable to be rendered using lines.
|
|
||||||
void mjrf_setRenderableWireframe(mjrRenderable* renderable, mjtByte wireframe);
|
|
||||||
|
|
||||||
// Sets the layer mask of the renderable. See mjrRenderableParams for details.
|
// Sets the layer mask of the renderable. See mjrRenderableParams for details.
|
||||||
void mjrf_setRenderableLayerMask(mjrRenderable* renderable, uint8_t layer_mask);
|
void mjrf_setRenderableLayerMask(mjrRenderable* renderable, uint8_t layer_mask);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user