From a875b85498984bb1ab54c80d58035c4fbc94e8f2 Mon Sep 17 00:00:00 2001 From: Marc Gilleron Date: Sat, 29 Sep 2018 21:47:53 +0100 Subject: [PATCH] Don't send empty blocks to the updater, so we avoid a copy and unnecessary face extraction --- voxel_terrain.cpp | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/voxel_terrain.cpp b/voxel_terrain.cpp index ae9bcc6..789fab8 100644 --- a/voxel_terrain.cpp +++ b/voxel_terrain.cpp @@ -635,6 +635,25 @@ void VoxelTerrain::_process() { continue; } + CRASH_COND(block->voxels.is_null()); + + VoxelTerrain::BlockDirtyState *block_state = _dirty_blocks.getptr(block_pos); + CRASH_COND(block_state == NULL); + CRASH_COND(*block_state != BLOCK_UPDATE_NOT_SENT); + + int air_type = 0; + if(block->voxels->is_uniform(Voxel::CHANNEL_TYPE) && block->voxels->get_voxel(0, 0, 0, Voxel::CHANNEL_TYPE) == air_type) { + + // The block contains empty voxels + block->set_mesh(Ref(), Ref()); + _dirty_blocks.erase(block_pos); + + // Optional, but I guess it might spare some memory + block->voxels->clear_channel(Voxel::CHANNEL_TYPE, air_type); + + continue; + } + // Create buffer padded with neighbor voxels Ref nbuffer; nbuffer.instance(); @@ -651,10 +670,7 @@ void VoxelTerrain::_process() { iblock.position = block_pos; input.blocks.push_back(iblock); - VoxelTerrain::BlockDirtyState *state = _dirty_blocks.getptr(block_pos); - CRASH_COND(state == NULL); - CRASH_COND(*state != BLOCK_UPDATE_NOT_SENT); - *state = BLOCK_UPDATE_SENT; + *block_state = BLOCK_UPDATE_SENT; } _block_updater->push(input);