Properly implement hiding of the terrain node, for LOD it was showing all blocks of all LODs at once

master
Marc Gilleron 2019-08-31 21:46:19 +01:00
parent fa22666ccf
commit 0e6d3873c7
4 changed files with 33 additions and 12 deletions

View File

@ -147,15 +147,30 @@ void VoxelBlock::set_world(World *world) {
} }
void VoxelBlock::set_visible(bool visible) { void VoxelBlock::set_visible(bool visible) {
if (_visible && visible) {
return;
}
_visible = visible;
_set_visible(_visible && _parent_visible);
}
bool VoxelBlock::is_visible() const {
return _visible;
}
void VoxelBlock::_set_visible(bool visible) {
if (_mesh_instance.is_valid()) { if (_mesh_instance.is_valid()) {
_mesh_instance.set_visible(visible); _mesh_instance.set_visible(visible);
} }
if (_static_body.is_valid()) { if (_static_body.is_valid()) {
_static_body.set_shape_enabled(0, visible); _static_body.set_shape_enabled(0, visible);
} }
_visible = visible;
} }
bool VoxelBlock::is_visible() const { void VoxelBlock::set_parent_visible(bool parent_visible) {
return _visible; if (_parent_visible && parent_visible) {
return;
}
_parent_visible = parent_visible;
_set_visible(_visible && _parent_visible);
} }

View File

@ -39,6 +39,8 @@ public:
void set_visible(bool visible); void set_visible(bool visible);
bool is_visible() const; bool is_visible() const;
void set_parent_visible(bool parent_visible);
inline bool is_mesh_update_scheduled() { inline bool is_mesh_update_scheduled() {
return _mesh_state == MESH_UPDATE_NOT_SENT || _mesh_state == MESH_UPDATE_SENT; return _mesh_state == MESH_UPDATE_NOT_SENT || _mesh_state == MESH_UPDATE_SENT;
} }
@ -46,6 +48,8 @@ public:
private: private:
VoxelBlock(); VoxelBlock();
void _set_visible(bool visible);
Vector3i _position_in_voxels; Vector3i _position_in_voxels;
DirectMeshInstance _mesh_instance; DirectMeshInstance _mesh_instance;
@ -53,6 +57,7 @@ private:
int _mesh_update_count = 0; int _mesh_update_count = 0;
bool _visible = true; bool _visible = true;
bool _parent_visible = true;
MeshState _mesh_state = MESH_NEVER_UPDATED; MeshState _mesh_state = MESH_NEVER_UPDATED;
// The mesh might be null, but we don't know if it's actually empty or if it's loading. // The mesh might be null, but we don't know if it's actually empty or if it's loading.

View File

@ -418,12 +418,12 @@ void VoxelLodTerrain::_notification(int p_what) {
} }
}; };
struct SetVisibilityAction { struct SetParentVisibilityAction {
bool visible; bool visible;
SetVisibilityAction(bool v) : SetParentVisibilityAction(bool v) :
visible(v) {} visible(v) {}
void operator()(VoxelBlock *block) { void operator()(VoxelBlock *block) {
block->set_visible(visible); block->set_parent_visible(visible);
} }
}; };
@ -456,8 +456,7 @@ void VoxelLodTerrain::_notification(int p_what) {
} break; } break;
case NOTIFICATION_VISIBILITY_CHANGED: { case NOTIFICATION_VISIBILITY_CHANGED: {
// TODO This is wrong, some blocks NEED to remain hidden SetParentVisibilityAction sva(is_visible());
SetVisibilityAction sva(is_visible());
for_all_blocks(sva); for_all_blocks(sva);
} break; } break;
@ -934,6 +933,7 @@ void VoxelLodTerrain::_process() {
//print_line(String("Adding block {0} at lod {1}").format(varray(eo.block_position.to_vec3(), eo.lod))); //print_line(String("Adding block {0} at lod {1}").format(varray(eo.block_position.to_vec3(), eo.lod)));
// The block will be made visible and meshed only by LodOctree // The block will be made visible and meshed only by LodOctree
block->set_visible(false); block->set_visible(false);
block->set_parent_visible(is_visible());
} }
} }

View File

@ -607,12 +607,12 @@ void VoxelTerrain::_notification(int p_what) {
} }
}; };
struct SetVisibilityAction { struct SetParentVisibilityAction {
bool visible; bool visible;
SetVisibilityAction(bool v) : SetParentVisibilityAction(bool v) :
visible(v) {} visible(v) {}
void operator()(VoxelBlock *block) { void operator()(VoxelBlock *block) {
block->set_visible(visible); block->set_parent_visible(visible);
} }
}; };
@ -646,7 +646,7 @@ void VoxelTerrain::_notification(int p_what) {
case NOTIFICATION_VISIBILITY_CHANGED: case NOTIFICATION_VISIBILITY_CHANGED:
ERR_FAIL_COND(_map.is_null()); ERR_FAIL_COND(_map.is_null());
_map->for_all_blocks(SetVisibilityAction(is_visible())); _map->for_all_blocks(SetParentVisibilityAction(is_visible()));
break; break;
// TODO Listen for transform changes // TODO Listen for transform changes
@ -1062,6 +1062,7 @@ void VoxelTerrain::_process() {
} }
block->set_mesh(mesh, this, _generate_collisions, collidable_surface, get_tree()->is_debugging_collisions_hint()); block->set_mesh(mesh, this, _generate_collisions, collidable_surface, get_tree()->is_debugging_collisions_hint());
block->set_parent_visible(is_visible());
} }
shift_up(_blocks_pending_main_thread_update, queue_index); shift_up(_blocks_pending_main_thread_update, queue_index);