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);