diff --git a/src/experimental/filament/compat/mjr_filament_renderer.cc b/src/experimental/filament/compat/mjr_filament_renderer.cc index fcd8f31e..831b6636 100644 --- a/src/experimental/filament/compat/mjr_filament_renderer.cc +++ b/src/experimental/filament/compat/mjr_filament_renderer.cc @@ -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, diff --git a/src/experimental/filament/compat/scene_bridge.cc b/src/experimental/filament/compat/scene_bridge.cc index bc247649..f47b9316 100644 --- a/src/experimental/filament/compat/scene_bridge.cc +++ b/src/experimental/filament/compat/scene_bridge.cc @@ -90,109 +90,12 @@ SceneBridge::SceneBridge(FilamentContext* ctx, const mjModel* model) scene_view_ = std::make_unique(ctx_, params); model_objects_ = std::make_unique(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(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_); diff --git a/src/experimental/filament/filament/scene_view.cc b/src/experimental/filament/filament/scene_view.cc index 594b842a..8546940b 100644 --- a/src/experimental/filament/filament/scene_view.cc +++ b/src/experimental/filament/filament/scene_view.cc @@ -19,6 +19,7 @@ #include #include #include +#include #include #include @@ -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(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; diff --git a/src/experimental/filament/filament/scene_view.h b/src/experimental/filament/filament/scene_view.h index e64be22e..0187ee0f 100644 --- a/src/experimental/filament/filament/scene_view.h +++ b/src/experimental/filament/filament/scene_view.h @@ -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(scene); }