Fix crashing/not working edition in VoxelLodTerrain
parent
c51f3d8005
commit
392c335956
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue