diff --git a/storage/voxel_data_map.cpp b/storage/voxel_data_map.cpp index ddbdae54..c8f1577e 100644 --- a/storage/voxel_data_map.cpp +++ b/storage/voxel_data_map.cpp @@ -317,114 +317,4 @@ bool VoxelDataMap::is_area_fully_loaded(const Box3i voxels_box) const { }); } -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/* -void preload_box(VoxelDataLodMap &data, Box3i voxel_box, VoxelGenerator *generator, bool is_streaming) { - ZN_PROFILE_SCOPE(); - //ERR_FAIL_COND_MSG(_full_load_mode == false, nullptr, "This function can only be used in full load mode"); - - struct Task { - Vector3i block_pos; - uint32_t lod_index; - std::shared_ptr voxels; - }; - - std::vector todo; - // We'll pack tasks per LOD so we'll have less locking to do - std::vector count_per_lod; - - const unsigned int data_block_size = data.lods[0].map.get_block_size(); - - // Find empty slots - 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)); - - VoxelDataLodMap::Lod &data_lod = data.lods[lod_index]; - const unsigned int prev_size = todo.size(); - - { - RWLockRead rlock(data_lod.map_lock); - block_box.for_each_cell([&data_lod, lod_index, &todo, is_streaming](Vector3i block_pos) { - // We don't check "loading blocks", because this function wants to complete the task right now. - const VoxelDataBlock *block = data_lod.map.get_block(block_pos); - if (is_streaming) { - // Non-resident blocks must not be touched because we don't know what's in them. - // We can generate caches if resident ones have no voxel data. - if (block != nullptr && !block->has_voxels()) { - todo.push_back(Task{ block_pos, lod_index, nullptr }); - } - } else { - // We can generate anywhere voxel data is not in memory - if (block == nullptr || !block->has_voxels()) { - todo.push_back(Task{ block_pos, lod_index, nullptr }); - } - } - }); - } - - count_per_lod.push_back(todo.size() - prev_size); - } - - const Vector3i block_size = Vector3iUtil::create(data_block_size); - - // Generate - for (unsigned int i = 0; i < todo.size(); ++i) { - Task &task = todo[i]; - task.voxels = make_shared_instance(); - task.voxels->create(block_size); - // TODO Format? - if (generator != nullptr) { - ZN_PROFILE_SCOPE_NAMED("Generate"); - VoxelGenerator::VoxelQueryData q{ *task.voxels, task.block_pos * (data_block_size << task.lod_index), - task.lod_index }; - generator->generate_block(q); - data.modifiers.apply(q.voxel_buffer, AABB(q.origin_in_voxels, q.voxel_buffer.get_size() << q.lod)); - } - } - - // Populate slots - unsigned int task_index = 0; - for (unsigned int lod_index = 0; lod_index < data.lod_count; ++lod_index) { - ZN_ASSERT(lod_index < count_per_lod.size()); - const unsigned int count = count_per_lod[lod_index]; - - if (count > 0) { - const unsigned int end_task_index = task_index + count; - - VoxelDataLodMap::Lod &data_lod = data.lods[lod_index]; - RWLockWrite wlock(data_lod.map_lock); - - for (; task_index < end_task_index; ++task_index) { - Task &task = todo[task_index]; - ZN_ASSERT(task.lod_index == lod_index); - 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; - } - data_lod.map.set_block_buffer(task.block_pos, task.voxels, true); - } - } - } -} - -void clear_cached_blocks_in_voxel_area(VoxelDataLodMap &data, Box3i p_voxel_box) { - for (unsigned int lod_index = 0; lod_index < data.lod_count; ++lod_index) { - VoxelDataLodMap::Lod &lod = data.lods[lod_index]; - RWLockRead rlock(lod.map_lock); - - const Box3i blocks_box = p_voxel_box.downscaled(lod.map.get_block_size() << lod_index); - blocks_box.for_each_cell_zxy([&lod](const Vector3i bpos) { - VoxelDataBlock *block = lod.map.get_block(bpos); - if (block == nullptr || block->is_edited() || block->is_modified()) { - return; - } - block->clear_voxels(); - }); - } -} -*/ } // namespace zylann::voxel diff --git a/storage/voxel_data_map.h b/storage/voxel_data_map.h index c9c4fe5c..1b589766 100644 --- a/storage/voxel_data_map.h +++ b/storage/voxel_data_map.h @@ -206,29 +206,6 @@ private: unsigned int _lod_index = 0; }; -/*struct VoxelDataLodMap { - struct Lod { - VoxelDataMap map; - // This lock should be locked in write mode only when the map gets modified (adding or removing blocks). - // Otherwise it may be locked in read mode. - // It is possible to unlock it after we are done querying the map. - RWLock map_lock; - }; - // Each LOD works in a set of coordinates spanning 2x more voxels the higher their index is - FixedArray lods; - unsigned int lod_count = 1; - VoxelModifierStack modifiers; -}; - -// Generates all non-present blocks in preparation for an edit. -// Every block intersecting with the box at every LOD will be checked. -// This function runs sequentially and should be thread-safe. May be used if blocks are immediately needed. -// It will block if other threads are accessing the same data. -void preload_box(VoxelDataLodMap &data, Box3i voxel_box, VoxelGenerator *generator, bool is_streaming); - -// Clears voxel data from blocks that are pure results of generators and modifiers. -void clear_cached_blocks_in_voxel_area(VoxelDataLodMap &data, Box3i p_voxel_box);*/ - } // namespace zylann::voxel #endif // VOXEL_MAP_H