X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fvoxel.cpp;h=e6d4bdcd22587d5bad6895f61e337f8df029f9bf;hb=00fc0babe0c6c5464fa9ffbc5a257b1e2aa93111;hp=13711d1a19d58f3e6a2777561a476149d00f20a6;hpb=d406ac994b8092c5bd2dc32eda1a2eafbf95a30c;p=oweals%2Fminetest.git diff --git a/src/voxel.cpp b/src/voxel.cpp index 13711d1a1..e6d4bdcd2 100644 --- a/src/voxel.cpp +++ b/src/voxel.cpp @@ -224,13 +224,48 @@ void VoxelManipulator::addArea(const VoxelArea &area) void VoxelManipulator::copyFrom(MapNode *src, const VoxelArea& src_area, v3s16 from_pos, v3s16 to_pos, v3s16 size) { - for(s16 z=0; z|'''''' dest mod '''''''' + * dest <---------------------------------------------> + * + * dest_mod (it's essentially a modulus) is added to the destination index + * after every full iteration of the y span. + * + * This method falls under the category "linear array and incrementing + * index". + */ + + s32 src_step = src_area.getExtent().X; + s32 dest_step = m_area.getExtent().X; + s32 dest_mod = m_area.index(to_pos.X, to_pos.Y, to_pos.Z + 1) + - m_area.index(to_pos.X, to_pos.Y, to_pos.Z) + - dest_step * size.Y; + + s32 i_src = src_area.index(from_pos.X, from_pos.Y, from_pos.Z); + s32 i_local = m_area.index(to_pos.X, to_pos.Y, to_pos.Z); + + 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); + i_src += src_step; + i_local += dest_step; + } + i_local += dest_mod; } }