Allow SceneView to read configuration from mjModel directly.

PiperOrigin-RevId: 910548865
Change-Id: I4db045e76cd36012810c75b9d150c6c5f5746488
This commit is contained in:
Haroon Qureshi
2026-05-05 02:51:44 -07:00
committed by Copybara-Service
parent 68fdc439e4
commit de030f4664
4 changed files with 110 additions and 101 deletions
@@ -64,9 +64,6 @@ void MjrFilamentRenderer::Init(const mjModel* model) {
render_requests_[1].camera.frustum_top = 0.0f;
render_requests_[1].camera.frustum_near = 0.0f;
render_requests_[1].camera.frustum_far = 1.0f;
filament_context_->SetClearColor(ReadElement(
model, "filament.clearColor", filament::math::float4(0, 0, 0, 1)));
}
void MjrFilamentRenderer::Render(const mjrRect& viewport,
@@ -90,109 +90,12 @@ SceneBridge::SceneBridge(FilamentContext* ctx, const mjModel* model)
scene_view_ = std::make_unique<SceneView>(ctx_, params);
model_objects_ = std::make_unique<ModelObjects>(model, ctx_);
// Configure options for the normal view.
auto cg = scene_view_->GetColorGradingOptions();
cg.exposure = ReadElement(model, "filament.cg.exposure", cg.exposure);
cg.contrast = ReadElement(model, "filament.cg.contrast", cg.contrast);
cg.vibrance = ReadElement(model, "filament.cg.vibrance", cg.vibrance);
cg.saturation = ReadElement(model, "filament.cg.saturation", cg.saturation);
cg.temperature =
ReadElement(model, "filament.cg.temperature", cg.temperature);
cg.tint = ReadElement(model, "filament.cg.tint", cg.tint);
cg.gamut_mapping =
ReadElement(model, "filament.cg.gamut_mapping", cg.gamut_mapping);
cg.luminance_scaling =
ReadElement(model, "filament.cg.luminance_scaling", cg.luminance_scaling);
cg.slope = ReadElement(model, "filament.cg.slope", cg.slope);
cg.offset = ReadElement(model, "filament.cg.offset", cg.offset);
cg.power = ReadElement(model, "filament.cg.power", cg.power);
cg.shadow_gamma =
ReadElement(model, "filament.cg.shadow_gamma", cg.shadow_gamma);
cg.mid_point = ReadElement(model, "filament.cg.mid_point", cg.mid_point);
cg.highlight_scale =
ReadElement(model, "filament.cg.highlight_scale", cg.highlight_scale);
cg.shadows = ReadElement(model, "filament.cg.shadows", cg.shadows);
cg.midtones = ReadElement(model, "filament.cg.midtones", cg.midtones);
cg.highlights = ReadElement(model, "filament.cg.highlights", cg.highlights);
cg.tonal_ranges =
ReadElement(model, "filament.cg.tonal_ranges", cg.tonal_ranges);
auto tone_mapping =
ReadElement<std::string_view>(model, "filament.cg.tone_mapping");
if (tone_mapping == "aces") {
cg.tone_mapper = ToneMapperType::kACES;
} else if (tone_mapping == "aces_legacy") {
cg.tone_mapper = ToneMapperType::kACESLegacy;
} else if (tone_mapping == "filmic") {
cg.tone_mapper = ToneMapperType::kFilmic;
} else if (tone_mapping == "linear") {
cg.tone_mapper = ToneMapperType::kLinear;
} else if (tone_mapping == "pbr_neutral") {
cg.tone_mapper = ToneMapperType::kPBRNeutral;
}
scene_view_->SetColorGradingOptions(cg);
filament::View* fview = scene_view_->GetDefaultRenderView();
auto ao = fview->getAmbientOcclusionOptions();
ao.enabled = ReadElement(model, "filament.ao.enabled", true);
ao.bentNormals = ReadElement(model, "filament.ao.bent_normals", false);
ao.ssct.enabled = ReadElement(model, "filament.ao.ssct", ao.ssct.enabled);
ao.quality =
ReadElement(model, "filament.ao.quality", filament::QualityLevel::ULTRA);
ao.lowPassFilter = ReadElement(model, "filament.ao.low_pass_filter",
filament::QualityLevel::ULTRA);
ao.upsampling = ReadElement(model, "filament.ao.upsampling",
filament::QualityLevel::ULTRA);
ao.bilateralThreshold =
ReadElement(model, "filament.ao.bilateral_threshold", 0.5f);
fview->setAmbientOcclusionOptions(ao);
auto bloom = fview->getBloomOptions();
bloom.enabled = ReadElement(model, "filament.bloom.enabled", bloom.enabled);
bloom.strength =
ReadElement(model, "filament.bloom.strength", bloom.strength);
bloom.dirtStrength =
ReadElement(model, "filament.bloom.dirt_strength", bloom.dirtStrength);
bloom.quality = ReadElement(model, "filament.bloom.quality", bloom.quality);
bloom.resolution =
ReadElement(model, "filament.bloom.resolution", bloom.resolution);
bloom.levels = ReadElement(model, "filament.bloom.levels", bloom.levels);
fview->setBloomOptions(bloom);
auto msaa = fview->getMultiSampleAntiAliasingOptions();
msaa.enabled = ReadElement(model, "filament.msaa.enabled", true);
fview->setMultiSampleAntiAliasingOptions(msaa);
scene_view_->Configure(model);
default_shadow_map_size_ = ReadElement(
model, "filament.shadows.map_size", default_shadow_map_size_);
default_vsm_blur_width_ = ReadElement(
model, "filament.shadows.vsm_blur_width", default_vsm_blur_width_);
auto shadow_type = fview->getShadowType();
shadow_type = ReadElement(model, "filament.shadows.type", shadow_type);
fview->setShadowType(shadow_type);
auto fog_opts = fview->getFogOptions();
fog_opts.enabled =
ReadElement(model, "filament.fog.enabled", fog_opts.enabled);
fog_opts.color = ReadElement(model, "filament.fog.color", fog_opts.color);
fog_opts.distance = ReadElement(
model, "filament.fog.distance", fog_opts.distance);
fog_opts.density = ReadElement(
model, "filament.fog.density", fog_opts.density);
fog_opts.cutOffDistance = ReadElement(
model, "filament.fog.cutOffDistance", fog_opts.cutOffDistance);
fog_opts.maximumOpacity = ReadElement(
model, "filament.fog.maximumOpacity", fog_opts.maximumOpacity);
fog_opts.height = ReadElement(model, "filament.fog.height", fog_opts.height);
fog_opts.heightFalloff = ReadElement(
model, "filament.fog.heightFalloff", fog_opts.heightFalloff);
fog_opts.inScatteringStart = ReadElement(
model, "filament.fog.inScatteringStart", fog_opts.inScatteringStart);
fog_opts.inScatteringSize = ReadElement(
model, "filament.fog.inScatteringSize", fog_opts.inScatteringSize);
fview->setFogOptions(fog_opts);
fallback_head_light_intensity_ =
ReadElement(model, "filament.fallback.head_light_intensity",
fallback_head_light_intensity_);
@@ -19,6 +19,7 @@
#include <cstddef>
#include <cstdint>
#include <memory>
#include <string_view>
#include <filament/ColorGrading.h>
#include <filament/LightManager.h>
@@ -43,6 +44,7 @@
#include "experimental/filament/filament/filament_context.h"
#include "experimental/filament/filament/light.h"
#include "experimental/filament/filament/math_util.h"
#include "experimental/filament/filament/model_util.h"
#include "experimental/filament/filament/render_target.h"
#include "experimental/filament/filament/renderable.h"
#include "experimental/filament/filament/texture.h"
@@ -378,6 +380,109 @@ ColorGradingOptions SceneView::GetColorGradingOptions() const {
return color_grading_options_;
}
void SceneView::Configure(const mjModel* model) {
ctx_->SetClearColor(ReadElement(model, "filament.clearColor",
filament::math::float4(0, 0, 0, 1)));
filament::View* view = views_[mjDRAW_MODE_COLOR];
auto cg = color_grading_options_;
cg.exposure = ReadElement(model, "filament.cg.exposure", cg.exposure);
cg.contrast = ReadElement(model, "filament.cg.contrast", cg.contrast);
cg.vibrance = ReadElement(model, "filament.cg.vibrance", cg.vibrance);
cg.saturation = ReadElement(model, "filament.cg.saturation", cg.saturation);
cg.temperature =
ReadElement(model, "filament.cg.temperature", cg.temperature);
cg.tint = ReadElement(model, "filament.cg.tint", cg.tint);
cg.gamut_mapping =
ReadElement(model, "filament.cg.gamut_mapping", cg.gamut_mapping);
cg.luminance_scaling =
ReadElement(model, "filament.cg.luminance_scaling", cg.luminance_scaling);
cg.slope = ReadElement(model, "filament.cg.slope", cg.slope);
cg.offset = ReadElement(model, "filament.cg.offset", cg.offset);
cg.power = ReadElement(model, "filament.cg.power", cg.power);
cg.shadow_gamma =
ReadElement(model, "filament.cg.shadow_gamma", cg.shadow_gamma);
cg.mid_point = ReadElement(model, "filament.cg.mid_point", cg.mid_point);
cg.highlight_scale =
ReadElement(model, "filament.cg.highlight_scale", cg.highlight_scale);
cg.shadows = ReadElement(model, "filament.cg.shadows", cg.shadows);
cg.midtones = ReadElement(model, "filament.cg.midtones", cg.midtones);
cg.highlights = ReadElement(model, "filament.cg.highlights", cg.highlights);
cg.tonal_ranges =
ReadElement(model, "filament.cg.tonal_ranges", cg.tonal_ranges);
auto tone_mapping =
ReadElement<std::string_view>(model, "filament.cg.tone_mapping");
if (tone_mapping == "aces") {
cg.tone_mapper = ToneMapperType::kACES;
} else if (tone_mapping == "aces_legacy") {
cg.tone_mapper = ToneMapperType::kACESLegacy;
} else if (tone_mapping == "filmic") {
cg.tone_mapper = ToneMapperType::kFilmic;
} else if (tone_mapping == "linear") {
cg.tone_mapper = ToneMapperType::kLinear;
} else if (tone_mapping == "pbr_neutral") {
cg.tone_mapper = ToneMapperType::kPBRNeutral;
}
SetColorGradingOptions(cg);
auto ao = view->getAmbientOcclusionOptions();
ao.enabled = ReadElement(model, "filament.ao.enabled", true);
ao.bentNormals = ReadElement(model, "filament.ao.bent_normals", false);
ao.ssct.enabled = ReadElement(model, "filament.ao.ssct", ao.ssct.enabled);
ao.quality =
ReadElement(model, "filament.ao.quality", filament::QualityLevel::ULTRA);
ao.lowPassFilter = ReadElement(model, "filament.ao.low_pass_filter",
filament::QualityLevel::ULTRA);
ao.upsampling = ReadElement(model, "filament.ao.upsampling",
filament::QualityLevel::ULTRA);
ao.bilateralThreshold =
ReadElement(model, "filament.ao.bilateral_threshold", 0.5f);
view->setAmbientOcclusionOptions(ao);
auto msaa = view->getMultiSampleAntiAliasingOptions();
msaa.enabled = ReadElement(model, "filament.msaa.enabled", true);
view->setMultiSampleAntiAliasingOptions(msaa);
auto shadow_type = view->getShadowType();
shadow_type = ReadElement(model, "filament.shadows.type", shadow_type);
view->setShadowType(shadow_type);
auto fog_opts = view->getFogOptions();
fog_opts.enabled =
ReadElement(model, "filament.fog.enabled", fog_opts.enabled);
fog_opts.color = ReadElement(model, "filament.fog.color", fog_opts.color);
fog_opts.distance = ReadElement(
model, "filament.fog.distance", fog_opts.distance);
fog_opts.density = ReadElement(
model, "filament.fog.density", fog_opts.density);
fog_opts.cutOffDistance = ReadElement(
model, "filament.fog.cutOffDistance", fog_opts.cutOffDistance);
fog_opts.maximumOpacity = ReadElement(
model, "filament.fog.maximumOpacity", fog_opts.maximumOpacity);
fog_opts.height = ReadElement(model, "filament.fog.height", fog_opts.height);
fog_opts.heightFalloff = ReadElement(
model, "filament.fog.heightFalloff", fog_opts.heightFalloff);
fog_opts.inScatteringStart = ReadElement(
model, "filament.fog.inScatteringStart", fog_opts.inScatteringStart);
fog_opts.inScatteringSize = ReadElement(
model, "filament.fog.inScatteringSize", fog_opts.inScatteringSize);
view->setFogOptions(fog_opts);
auto bloom = view->getBloomOptions();
bloom.enabled = ReadElement(model, "filament.bloom.enabled", bloom.enabled);
bloom.strength =
ReadElement(model, "filament.bloom.strength", bloom.strength);
bloom.dirtStrength =
ReadElement(model, "filament.bloom.dirt_strength", bloom.dirtStrength);
bloom.quality = ReadElement(model, "filament.bloom.quality", bloom.quality);
bloom.resolution =
ReadElement(model, "filament.bloom.resolution", bloom.resolution);
bloom.levels = ReadElement(model, "filament.bloom.levels", bloom.levels);
view->setBloomOptions(bloom);
}
void DoRender(filament::Renderer* renderer, const mjrRenderRequest& request) {
SceneView::RenderRequest scene_view_request;
scene_view_request.draw_mode = request.draw_mode;
@@ -94,6 +94,10 @@ class SceneView : public mjrScene {
ColorGradingOptions GetColorGradingOptions() const;
void SetColorGradingOptions(const ColorGradingOptions& opts);
// Reads filament-specific settings from the mjModel and configures the
// scene view accordingly.
void Configure(const mjModel* model);
static SceneView* downcast(mjrScene* scene) {
return static_cast<SceneView*>(scene);
}