From 1f2af270ea76dfff38e98391f2c444c4bf0e47e4 Mon Sep 17 00:00:00 2001 From: Laurent Senta Date: Sun, 26 Jan 2025 09:59:21 +0100 Subject: [PATCH] fix: update part --- src/terrain_3d_instancer.cpp | 41 +++++++++++++++++++----------------- src/terrain_3d_instancer.h | 1 + 2 files changed, 23 insertions(+), 19 deletions(-) diff --git a/src/terrain_3d_instancer.cpp b/src/terrain_3d_instancer.cpp index 058afe7f..473eaedc 100644 --- a/src/terrain_3d_instancer.cpp +++ b/src/terrain_3d_instancer.cpp @@ -88,8 +88,6 @@ void Terrain3DInstancer::_update_mmis(const Vector2i &p_region_loc, const int p_ MeshMMIDict &mesh_mmi_dict = _mmi_nodes[region_loc]; int max_lod = ma->get_maximum_lod(); - int shadow_lod = ma->get_shadow_lod(); - real_t visibility_margin = ma->get_visibility_margin(); for (int lod = 0; lod <= max_lod; lod++) { Vector2i mesh_key(mesh_id, lod); @@ -110,23 +108,6 @@ void Terrain3DInstancer::_update_mmis(const Vector2i &p_region_loc, const int p_ String cstring = "_C" + Util::location_to_string(cell).trim_prefix("_"); mmi->set_name("MMI3D" + cstring + "_M" + String::num_int64(mesh_id)); mmi->set_as_top_level(true); - mmi->set_visibility_range_begin(ma->get_lod_visibility_range_begin(lod)); - - real_t lod_end = ma->get_lod_visibility_range_end(lod); - if (lod_end >= 0.0f) { - mmi->set_visibility_range_end(lod_end); - } - - if (lod <= shadow_lod) { - mmi->set_cast_shadows_setting(ma->get_cast_shadows()); - } else { - mmi->set_cast_shadows_setting(GeometryInstance3D::SHADOW_CASTING_SETTING_OFF); - } - - if (visibility_margin > 0.0f) { - mmi->set_visibility_range_begin_margin(visibility_margin); - mmi->set_visibility_range_end_margin(visibility_margin); - } cell_mmi_dict[cell] = mmi; //Attach to tree @@ -148,6 +129,8 @@ void Terrain3DInstancer::_update_mmis(const Vector2i &p_region_loc, const int p_ mmi = cell_mmi_dict[cell]; mmi->set_multimesh(_create_multimesh(mesh_id, lod, xforms, colors)); + _setup_mmi_lod(mmi, ma, lod); + // Reposition the MMIs to their region location Transform3D t = Transform3D(); int region_size = region->get_region_size(); @@ -164,6 +147,26 @@ void Terrain3DInstancer::_update_mmis(const Vector2i &p_region_loc, const int p_ } } +void Terrain3DInstancer::_setup_mmi_lod(MultiMeshInstance3D *p_mmi, const Ref &p_ma, const int p_lod) { + p_mmi->set_visibility_range_begin(p_ma->get_lod_visibility_range_begin(p_lod)); + + real_t lod_end = p_ma->get_lod_visibility_range_end(p_lod); + if (lod_end >= 0.0f) { + p_mmi->set_visibility_range_end(lod_end); + } + + int shadow_lod = p_ma->get_shadow_lod(); + real_t visibility_margin = p_ma->get_visibility_margin(); + + // This will be the entry point to work on shadow lod + p_mmi->set_cast_shadows_setting(p_ma->get_cast_shadows()); + + if (visibility_margin > 0.0f) { + p_mmi->set_visibility_range_begin_margin(visibility_margin); + p_mmi->set_visibility_range_end_margin(visibility_margin); + } +} + void Terrain3DInstancer::_update_vertex_spacing(const real_t p_vertex_spacing) { IS_DATA_INIT(VOID); Array region_locations = _terrain->get_data()->get_region_locations(); diff --git a/src/terrain_3d_instancer.h b/src/terrain_3d_instancer.h index 805fca30..094f1e0c 100644 --- a/src/terrain_3d_instancer.h +++ b/src/terrain_3d_instancer.h @@ -49,6 +49,7 @@ class Terrain3DInstancer : public Object { void _backup_region(const Ref &p_region); Ref _create_multimesh(const int p_mesh_id, const int lod, const TypedArray &p_xforms = TypedArray(), const PackedColorArray &p_colors = PackedColorArray()) const; Vector2i _get_cell(const Vector3 &p_global_position, const int p_region_size); + void _setup_mmi_lod(MultiMeshInstance3D *p_mmi, const Ref &p_ma, const int p_lod); public: Terrain3DInstancer() {}