From 0e7eeabe73e2b0e47343575256667a03aebd3575 Mon Sep 17 00:00:00 2001 From: Lars Date: Sat, 31 May 2025 19:59:33 -0700 Subject: [PATCH] allow copy to vmanip directly from a mono-block --- src/client/mapblock_mesh.cpp | 2 +- src/mapblock.cpp | 6 +----- src/voxel.cpp | 10 +++++++--- src/voxel.h | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/client/mapblock_mesh.cpp b/src/client/mapblock_mesh.cpp index 07381b473..ac50f71a6 100644 --- a/src/client/mapblock_mesh.cpp +++ b/src/client/mapblock_mesh.cpp @@ -57,7 +57,7 @@ void MeshMakeData::fillBlockData(const v3s16 &bp, MapNode *data) VoxelArea data_area(v3s16(0,0,0), data_size - v3s16(1,1,1)); v3s16 blockpos_nodes = bp * MAP_BLOCKSIZE; - m_vmanip.copyFrom(data, data_area, v3s16(0,0,0), blockpos_nodes, data_size); + m_vmanip.copyFrom(data, MAP_BLOCKSIZE * MAP_BLOCKSIZE * MAP_BLOCKSIZE, data_area, v3s16(0,0,0), blockpos_nodes, data_size); } void MeshMakeData::fillSingleNode(MapNode data, MapNode padding) diff --git a/src/mapblock.cpp b/src/mapblock.cpp index 5cc4d07ae..e0e4c5c64 100644 --- a/src/mapblock.cpp +++ b/src/mapblock.cpp @@ -212,13 +212,9 @@ void MapBlock::copyTo(VoxelManipulator &dst) v3s16 data_size(MAP_BLOCKSIZE, MAP_BLOCKSIZE, MAP_BLOCKSIZE); VoxelArea data_area(v3s16(0,0,0), data_size - v3s16(1,1,1)); - bool was_mono_block = m_is_mono_block; - deconvertMonoblock(); // Copy from data to VoxelManipulator - dst.copyFrom(data, data_area, v3s16(0,0,0), + dst.copyFrom(data, m_is_mono_block ? 1 : nodecount, data_area, v3s16(0,0,0), getPosRelative(), data_size); - if (was_mono_block) - tryConvertToMonoblock(); } void MapBlock::copyFrom(const VoxelManipulator &src) diff --git a/src/voxel.cpp b/src/voxel.cpp index 5a69b0725..2f6204e8e 100644 --- a/src/voxel.cpp +++ b/src/voxel.cpp @@ -177,7 +177,7 @@ void VoxelManipulator::addArea(const VoxelArea &area) delete[] old_flags; } -void VoxelManipulator::copyFrom(MapNode *src, const VoxelArea& src_area, +void VoxelManipulator::copyFrom(MapNode *src, size_t n_nodes, const VoxelArea& src_area, v3s16 from_pos, v3s16 to_pos, const v3s16 &size) { /* The reason for this optimised code is that we're a member function @@ -216,8 +216,12 @@ void VoxelManipulator::copyFrom(MapNode *src, const VoxelArea& src_area, for (s16 z = 0; z < size.Z; z++) { for (s16 y = 0; y < size.Y; y++) { - memcpy(&m_data[i_local], &src[i_src], size.X * sizeof(*m_data)); - memset(&m_flags[i_local], 0, size.X); + if (n_nodes == 1) { + std::fill(m_data + i_local, m_data + i_local + size.X, src[0]); + } else { + std::copy(src + i_src, src + i_src + size.X, m_data + i_local); + } + std::fill(m_flags + i_local, m_flags + i_local + size.X, 0); i_src += src_step; i_local += dest_step; } diff --git a/src/voxel.h b/src/voxel.h index 7fbaadc28..b9d6bb8ae 100644 --- a/src/voxel.h +++ b/src/voxel.h @@ -482,7 +482,7 @@ public: Copy data and set flags to 0 dst_area.getExtent() <= src_area.getExtent() */ - void copyFrom(MapNode *src, const VoxelArea& src_area, + void copyFrom(MapNode *src, size_t n_nodes, const VoxelArea& src_area, v3s16 from_pos, v3s16 to_pos, const v3s16 &size); // Copy data