mirror of
https://github.com/Relintai/godot_voxel.git
synced 2025-05-01 17:57:55 +02:00
Don't send empty blocks to the updater, so we avoid a copy and unnecessary face extraction
This commit is contained in:
parent
606e131c25
commit
a875b85498
@ -635,6 +635,25 @@ void VoxelTerrain::_process() {
|
|||||||
continue;
|
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<Mesh>(), Ref<World>());
|
||||||
|
_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
|
// Create buffer padded with neighbor voxels
|
||||||
Ref<VoxelBuffer> nbuffer;
|
Ref<VoxelBuffer> nbuffer;
|
||||||
nbuffer.instance();
|
nbuffer.instance();
|
||||||
@ -651,10 +670,7 @@ void VoxelTerrain::_process() {
|
|||||||
iblock.position = block_pos;
|
iblock.position = block_pos;
|
||||||
input.blocks.push_back(iblock);
|
input.blocks.push_back(iblock);
|
||||||
|
|
||||||
VoxelTerrain::BlockDirtyState *state = _dirty_blocks.getptr(block_pos);
|
*block_state = BLOCK_UPDATE_SENT;
|
||||||
CRASH_COND(state == NULL);
|
|
||||||
CRASH_COND(*state != BLOCK_UPDATE_NOT_SENT);
|
|
||||||
*state = BLOCK_UPDATE_SENT;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_block_updater->push(input);
|
_block_updater->push(input);
|
||||||
|
Loading…
Reference in New Issue
Block a user