From abdea379af7b609a92a7aab0107d0b80eecedbbd Mon Sep 17 00:00:00 2001 From: Haroon Qureshi Date: Wed, 25 Feb 2026 08:33:59 -0800 Subject: [PATCH] Allow the shadow type and map size to be configured in data. PiperOrigin-RevId: 875179785 Change-Id: I638c8c8c9e45dd58f393684a09f2ab4871911f7a --- src/experimental/filament/filament/light.cc | 1 + src/experimental/filament/filament/light.h | 2 ++ src/experimental/filament/filament/model_util.h | 3 +++ src/experimental/filament/filament/scene_view.cc | 9 +++++++++ src/experimental/filament/filament/scene_view.h | 1 + 5 files changed, 16 insertions(+) diff --git a/src/experimental/filament/filament/light.cc b/src/experimental/filament/filament/light.cc index 50f75388..d26fd370 100644 --- a/src/experimental/filament/filament/light.cc +++ b/src/experimental/filament/filament/light.cc @@ -71,6 +71,7 @@ Light::Light(ObjectManager* object_mgr, const Params& params) opts.shadowCascades = type == filament::LightManager::Type::DIRECTIONAL ? 4 : 1; opts.shadowBulbRadius = params.bulbradius; + opts.mapSize = params.shadow_map_size; builder.shadowOptions(opts); entity_ = utils::EntityManager::get().create(); diff --git a/src/experimental/filament/filament/light.h b/src/experimental/filament/filament/light.h index b1f0930e..64dc0b8c 100644 --- a/src/experimental/filament/filament/light.h +++ b/src/experimental/filament/filament/light.h @@ -43,6 +43,8 @@ class Light { float spot_cone_angle = 180.f; // The radius of the bulb used for soft shadows. float bulbradius = 0.0f; + // The size of the shadow map. + int shadow_map_size = 2048; // Whether or not the light is a headlight. bool headlight = false; }; diff --git a/src/experimental/filament/filament/model_util.h b/src/experimental/filament/filament/model_util.h index b1dcbd90..46f9beec 100644 --- a/src/experimental/filament/filament/model_util.h +++ b/src/experimental/filament/filament/model_util.h @@ -79,6 +79,9 @@ T ReadElement(const mjModel* model, const char* name, T default_value = T()) { } else if constexpr (std::is_arithmetic_v) { const mjtNum* ptr = model->numeric_data + model->numeric_adr[id]; return static_cast(*ptr); + } else if constexpr (std::is_enum_v) { + const mjtNum* ptr = model->numeric_data + model->numeric_adr[id]; + return static_cast(static_cast(*ptr)); } else if constexpr (std::is_same_v) { const mjtNum* ptr = model->numeric_data + model->numeric_adr[id]; if (model->numeric_size[id] != 2) mju_error("Invalid numeric size."); diff --git a/src/experimental/filament/filament/scene_view.cc b/src/experimental/filament/filament/scene_view.cc index 2fdd6d14..3b25faaf 100644 --- a/src/experimental/filament/filament/scene_view.cc +++ b/src/experimental/filament/filament/scene_view.cc @@ -132,6 +132,13 @@ SceneView::SceneView(filament::Engine* engine, ObjectManager* object_mgr) msaa.enabled = ReadElement(m, "filament.msaa.enabled", true); views_[kNormalIndex]->setMultiSampleAntiAliasingOptions(msaa); + default_shadow_map_size_ = ReadElement( + m, "filament.shadows.map_size", default_shadow_map_size_); + + auto shadow_type = views_[kNormalIndex]->getShadowType(); + shadow_type = ReadElement(m, "filament.shadows.type", shadow_type); + views_[kNormalIndex]->setShadowType(shadow_type); + // Disable post processing for the depth and segmentation views to preserve // the values. views_[kDepthIndex]->setPostProcessingEnabled(false); @@ -290,9 +297,11 @@ void SceneView::PrepareLights() { params.bulbradius = model->light_bulbradius[i]; params.range = model->light_range[i]; params.intensity = model->light_intensity[i]; + params.shadow_map_size = default_shadow_map_size_; if (params.type == mjLIGHT_SPOT) { params.spot_cone_angle = model->light_cutoff[i]; } + auto light_obj = std::make_unique(object_mgr_, params); #ifndef __EMSCRIPTEN__ // TODO(b/458045799): Re-enable when lights work on glinux and chromebook. diff --git a/src/experimental/filament/filament/scene_view.h b/src/experimental/filament/filament/scene_view.h index d805bcfd..94d1ac9a 100644 --- a/src/experimental/filament/filament/scene_view.h +++ b/src/experimental/filament/filament/scene_view.h @@ -100,6 +100,7 @@ class SceneView { ColorGradingOptions color_grading_options_; DrawMode active_mode_ = DrawMode::kNumDrawModes; float aspect_ratio_ = 1.0f; + int default_shadow_map_size_ = 2048; float fallback_head_light_intensity_ = 0.f; float fallback_scene_light_intensity_ = 80'000.f; float fallback_environment_light_intensity_ = 5'000.f;