Fix crashing/not working edition in VoxelLodTerrain

master
Marc Gilleron 2022-06-25 22:48:39 +01:00
parent c51f3d8005
commit 392c335956
4 changed files with 17 additions and 8 deletions

View File

@ -38,7 +38,7 @@ public:
struct VoxelQueryData {
VoxelBufferInternal &voxel_buffer;
Vector3i origin_in_voxels;
uint8_t lod;
uint32_t lod;
};
virtual Result generate_block(VoxelQueryData &input);

View File

@ -338,7 +338,7 @@ void preload_box(VoxelDataLodMap &data, Box3i voxel_box, VoxelGenerator *generat
struct Task {
Vector3i block_pos;
uint8_t lod_index;
uint32_t lod_index;
std::shared_ptr<VoxelBufferInternal> voxels;
};
@ -349,7 +349,7 @@ void preload_box(VoxelDataLodMap &data, Box3i voxel_box, VoxelGenerator *generat
const unsigned int data_block_size = data.lods[0].map.get_block_size();
// Find empty slots
for (uint8_t lod_index = 0; lod_index < data.lod_count; ++lod_index) {
for (unsigned int lod_index = 0; lod_index < data.lod_count; ++lod_index) {
const Box3i block_box = voxel_box.downscaled(data_block_size << lod_index);
ZN_PRINT_VERBOSE(format("Preloading box {} at lod {} synchronously", block_box, lod_index));
@ -411,7 +411,8 @@ void preload_box(VoxelDataLodMap &data, Box3i voxel_box, VoxelGenerator *generat
for (; task_index < end_task_index; ++task_index) {
Task &task = todo[task_index];
ZN_ASSERT(task.lod_index == lod_index);
if (data_lod.map.has_block(task.block_pos)) {
const VoxelDataBlock *prev_block = data_lod.map.get_block(task.block_pos);
if (prev_block != nullptr && prev_block->has_voxels()) {
// Sorry, that block has been set in the meantime by another thread.
// We'll assume the block we just generated is redundant and discard it.
continue;

View File

@ -678,10 +678,15 @@ void VoxelLodTerrain::post_edit_area(Box3i p_box) {
bbox.for_each_cell([this, &data_lod0](Vector3i block_pos_lod0) {
VoxelDataBlock *block = data_lod0.map.get_block(block_pos_lod0);
// We can get null blocks due to the added padding...
//ERR_FAIL_COND(block == nullptr);
if (block == nullptr) {
return;
}
// We can get blocks without voxels in them due to the added padding...
if (!block->has_voxels()) {
return;
}
//RWLockWrite wlock(block->get_voxels_shared()->get_lock());
block->set_modified(true);
@ -689,6 +694,7 @@ void VoxelLodTerrain::post_edit_area(Box3i p_box) {
// TODO That boolean is also modified by the threaded update task (always set to false)
if (!block->get_needs_lodding()) {
block->set_needs_lodding(true);
// This is what indirectly causes remeshing
_update_data->state.blocks_pending_lodding_lod0.push_back(block_pos_lod0);
}

View File

@ -125,9 +125,11 @@ void VoxelLodTerrainUpdateTask::flush_pending_lod_edits(VoxelLodTerrainUpdateDat
}
// The block and its lower LOD indices are expected to be available.
// Otherwise it means the function was called too late
ZN_ASSERT(src_block != nullptr && src_block->has_voxels());
//CRASH_COND(dst_block == nullptr);
// Otherwise it means the function was called too late?
ZN_ASSERT(src_block != nullptr);
//ZN_ASSERT(dst_block != nullptr);
// The block should have voxels if it has been edited or mipped.
ZN_ASSERT(src_block->has_voxels());
{
const Vector3i mesh_block_pos = math::floordiv(dst_bpos, data_to_mesh_factor);
@ -153,7 +155,7 @@ void VoxelLodTerrainUpdateTask::flush_pending_lod_edits(VoxelLodTerrainUpdateDat
// TODO Optimization: try to narrow to edited region instead of taking whole block
{
ZN_PROFILE_SCOPE_NAMED("Downscale");
RWLockWrite lock(src_block->get_voxels().get_lock());
RWLockRead rlock(src_block->get_voxels().get_lock());
src_block->get_voxels().downscale_to(
dst_block->get_voxels(), Vector3i(), src_block->get_voxels_const().get_size(), rel * half_bs);
}