From 82218be9914fce5c6093b2929eec333014bb7ffb Mon Sep 17 00:00:00 2001 From: Relintai <relintai@relintai.net> Date: Tue, 8 Apr 2025 08:58:21 +0200 Subject: [PATCH] Fix visibility toggling in TerrainChunkDefault even if lods are disabled. --- .../world/default/terrain_chunk_default.cpp | 46 +++++++++++++++---- modules/terraman/world/terrain_chunk.cpp | 4 ++ 2 files changed, 40 insertions(+), 10 deletions(-) diff --git a/modules/terraman/world/default/terrain_chunk_default.cpp b/modules/terraman/world/default/terrain_chunk_default.cpp index d7242e639..69d79f503 100644 --- a/modules/terraman/world/default/terrain_chunk_default.cpp +++ b/modules/terraman/world/default/terrain_chunk_default.cpp @@ -82,32 +82,38 @@ int TerrainChunkDefault::get_current_lod_level() const { void TerrainChunkDefault::set_current_lod_level(const int value) { _current_lod_level = value; - if ((_build_flags & BUILD_FLAG_CREATE_LODS) == 0) + if ((_build_flags & BUILD_FLAG_CREATE_LODS) == 0) { return; + } - if (_current_lod_level < 0) + if (_current_lod_level < 0) { _current_lod_level = 0; + } int lod_num = mesh_rid_get_count(MESH_INDEX_TERRAIN, MESH_TYPE_INDEX_MESH_INSTANCE); - if (_current_lod_level > lod_num) + if (_current_lod_level > lod_num) { _current_lod_level = lod_num; + } for (int i = 0; i < lod_num; ++i) { bool vis = false; - if (i == _current_lod_level) + if (i == _current_lod_level) { vis = true; + } RID rid = mesh_rid_get_index(MESH_INDEX_TERRAIN, MESH_TYPE_INDEX_MESH_INSTANCE, i); - if (rid != RID()) + if (rid != RID()) { RenderingServer::get_singleton()->instance_set_visible(rid, vis); + } rid = mesh_rid_get_index(MESH_INDEX_PROP, MESH_TYPE_INDEX_MESH_INSTANCE, i); - if (rid != RID()) + if (rid != RID()) { RenderingServer::get_singleton()->instance_set_visible(rid, vis); + } } } @@ -713,7 +719,24 @@ void TerrainChunkDefault::draw_debug_mdr_colliders() { void TerrainChunkDefault::_visibility_changed(bool visible) { if (visible) { - set_current_lod_level(_current_lod_level); + if ((_build_flags & BUILD_FLAG_CREATE_LODS) == 0) { + RID rid = mesh_rid_get_index(MESH_INDEX_TERRAIN, MESH_TYPE_INDEX_MESH_INSTANCE, 0); + + if (rid != RID()) { + RenderingServer::get_singleton()->instance_set_visible(rid, true); + } + + rid = mesh_rid_get_index(MESH_INDEX_PROP, MESH_TYPE_INDEX_MESH_INSTANCE, 0); + + if (rid != RID()) { + RenderingServer::get_singleton()->instance_set_visible(rid, true); + } + + return; + } else { + set_current_lod_level(_current_lod_level); + } + return; } @@ -722,18 +745,21 @@ void TerrainChunkDefault::_visibility_changed(bool visible) { for (int i = 0; i < lod_num; ++i) { RID rid = mesh_rid_get_index(MESH_INDEX_TERRAIN, MESH_TYPE_INDEX_MESH_INSTANCE, i); - if (rid != RID()) + if (rid != RID()) { RenderingServer::get_singleton()->instance_set_visible(rid, false); + } rid = mesh_rid_get_index(MESH_INDEX_LIQUID, MESH_TYPE_INDEX_MESH_INSTANCE, i); - if (rid != RID()) + if (rid != RID()) { RenderingServer::get_singleton()->instance_set_visible(rid, false); + } rid = mesh_rid_get_index(MESH_INDEX_PROP, MESH_TYPE_INDEX_MESH_INSTANCE, i); - if (rid != RID()) + if (rid != RID()) { RenderingServer::get_singleton()->instance_set_visible(rid, false); + } } } diff --git a/modules/terraman/world/terrain_chunk.cpp b/modules/terraman/world/terrain_chunk.cpp index 0d54ecf12..9dc31ca54 100644 --- a/modules/terraman/world/terrain_chunk.cpp +++ b/modules/terraman/world/terrain_chunk.cpp @@ -73,6 +73,10 @@ bool TerrainChunk::get_visible() const { return _is_visible; } void TerrainChunk::set_visible(const bool value) { + if (_is_visible == value) { + return; + } + _is_visible = value; visibility_changed(value);