Fix visibility toggling in TerrainChunkDefault even if lods are disabled.

This commit is contained in:
Relintai 2025-04-08 08:58:21 +02:00
parent 97380e3f53
commit 82218be991
2 changed files with 40 additions and 10 deletions

View File

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

View File

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