diff options
Diffstat (limited to 'src/voxel.cpp')
-rw-r--r-- | src/voxel.cpp | 168 |
1 files changed, 91 insertions, 77 deletions
diff --git a/src/voxel.cpp b/src/voxel.cpp index ffedbd583..1f1d25373 100644 --- a/src/voxel.cpp +++ b/src/voxel.cpp @@ -23,7 +23,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "nodedef.h" #include "util/directiontables.h" #include "util/timetaker.h" -#include <cstring> // memcpy, memset +#include <cstring> // memcpy, memset /* Debug stuff @@ -48,71 +48,81 @@ void VoxelManipulator::clear() m_flags = nullptr; } -void VoxelManipulator::print( - std::ostream &o, const NodeDefManager *ndef, VoxelPrintMode mode) +void VoxelManipulator::print(std::ostream &o, const NodeDefManager *ndef, + VoxelPrintMode mode) { const v3s16 &em = m_area.getExtent(); v3s16 of = m_area.MinEdge; - o << "size: " << em.X << "x" << em.Y << "x" << em.Z << " offset: (" << of.X << "," - << of.Y << "," << of.Z << ")" << std::endl; - - for (s32 y = m_area.MaxEdge.Y; y >= m_area.MinEdge.Y; y--) { - if (em.X >= 3 && em.Y >= 3) { - if (y == m_area.MinEdge.Y + 2) - o << "^ "; - else if (y == m_area.MinEdge.Y + 1) - o << "| "; - else if (y == m_area.MinEdge.Y + 0) - o << "y x-> "; - else - o << " "; + o<<"size: "<<em.X<<"x"<<em.Y<<"x"<<em.Z + <<" offset: ("<<of.X<<","<<of.Y<<","<<of.Z<<")"<<std::endl; + + for(s32 y=m_area.MaxEdge.Y; y>=m_area.MinEdge.Y; y--) + { + if(em.X >= 3 && em.Y >= 3) + { + if (y==m_area.MinEdge.Y+2) o<<"^ "; + else if(y==m_area.MinEdge.Y+1) o<<"| "; + else if(y==m_area.MinEdge.Y+0) o<<"y x-> "; + else o<<" "; } - for (s32 z = m_area.MinEdge.Z; z <= m_area.MaxEdge.Z; z++) { - for (s32 x = m_area.MinEdge.X; x <= m_area.MaxEdge.X; x++) { - u8 f = m_flags[m_area.index(x, y, z)]; + for(s32 z=m_area.MinEdge.Z; z<=m_area.MaxEdge.Z; z++) + { + for(s32 x=m_area.MinEdge.X; x<=m_area.MaxEdge.X; x++) + { + u8 f = m_flags[m_area.index(x,y,z)]; char c; - if (f & VOXELFLAG_NO_DATA) + if(f & VOXELFLAG_NO_DATA) c = 'N'; - else { + else + { c = 'X'; - MapNode n = m_data[m_area.index(x, y, z)]; + MapNode n = m_data[m_area.index(x,y,z)]; content_t m = n.getContent(); u8 pr = n.param2; - if (mode == VOXELPRINT_MATERIAL) { - if (m <= 9) + if(mode == VOXELPRINT_MATERIAL) + { + if(m <= 9) c = m + '0'; - } else if (mode == VOXELPRINT_WATERPRESSURE) { - if (ndef->get(m).isLiquid()) { + } + else if(mode == VOXELPRINT_WATERPRESSURE) + { + if(ndef->get(m).isLiquid()) + { c = 'w'; - if (pr <= 9) + if(pr <= 9) c = pr + '0'; - } else if (m == CONTENT_AIR) { + } + else if(m == CONTENT_AIR) + { c = ' '; - } else { + } + else + { c = '#'; } - } else if (mode == VOXELPRINT_LIGHT_DAY) { - if (ndef->get(m).light_source != 0) + } + else if(mode == VOXELPRINT_LIGHT_DAY) + { + if(ndef->get(m).light_source != 0) c = 'S'; - else if (!ndef->get(m).light_propagates) + else if(!ndef->get(m).light_propagates) c = 'X'; - else { - u8 light = n.getLight( - LIGHTBANK_DAY, - ndef); - if (light < 10) + else + { + u8 light = n.getLight(LIGHTBANK_DAY, ndef); + if(light < 10) c = '0' + light; else - c = 'a' + (light - 10); + c = 'a' + (light-10); } } } - o << c; + o<<c; } - o << ' '; + o<<' '; } - o << std::endl; + o<<std::endl; } } @@ -123,7 +133,7 @@ void VoxelManipulator::addArea(const VoxelArea &area) return; // Cancel if m_area already contains the requested area - if (m_area.contains(area)) + if(m_area.contains(area)) return; TimeTaker timer("addArea", &addarea_time); @@ -131,11 +141,13 @@ void VoxelManipulator::addArea(const VoxelArea &area) // Calculate new area VoxelArea new_area; // New area is the requested area if m_area has zero volume - if (m_area.hasEmptyExtent()) { + if(m_area.hasEmptyExtent()) + { new_area = area; } // Else add requested area to m_area - else { + else + { new_area = m_area; new_area.addArea(area); } @@ -160,16 +172,17 @@ void VoxelManipulator::addArea(const VoxelArea &area) // Copy old data s32 old_x_width = m_area.MaxEdge.X - m_area.MinEdge.X + 1; - for (s32 z = m_area.MinEdge.Z; z <= m_area.MaxEdge.Z; z++) - for (s32 y = m_area.MinEdge.Y; y <= m_area.MaxEdge.Y; y++) { - unsigned int old_index = m_area.index(m_area.MinEdge.X, y, z); - unsigned int new_index = new_area.index(m_area.MinEdge.X, y, z); - - memcpy(&new_data[new_index], &m_data[old_index], - old_x_width * sizeof(MapNode)); - memcpy(&new_flags[new_index], &m_flags[old_index], - old_x_width * sizeof(u8)); - } + for(s32 z=m_area.MinEdge.Z; z<=m_area.MaxEdge.Z; z++) + for(s32 y=m_area.MinEdge.Y; y<=m_area.MaxEdge.Y; y++) + { + unsigned int old_index = m_area.index(m_area.MinEdge.X,y,z); + unsigned int new_index = new_area.index(m_area.MinEdge.X,y,z); + + memcpy(&new_data[new_index], &m_data[old_index], + old_x_width * sizeof(MapNode)); + memcpy(&new_flags[new_index], &m_flags[old_index], + old_x_width * sizeof(u8)); + } // Replace area, data and flags @@ -187,11 +200,11 @@ void VoxelManipulator::addArea(const VoxelArea &area) delete[] old_data; delete[] old_flags; - // dstream<<"addArea done"<<std::endl; + //dstream<<"addArea done"<<std::endl; } -void VoxelManipulator::copyFrom(MapNode *src, const VoxelArea &src_area, v3s16 from_pos, - v3s16 to_pos, const v3s16 &size) +void VoxelManipulator::copyFrom(MapNode *src, 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 * and the data type/layout of m_data is know to us: it's stored as @@ -220,8 +233,9 @@ void VoxelManipulator::copyFrom(MapNode *src, const VoxelArea &src_area, v3s16 f 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 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); @@ -237,22 +251,21 @@ void VoxelManipulator::copyFrom(MapNode *src, const VoxelArea &src_area, v3s16 f } } -void VoxelManipulator::copyTo(MapNode *dst, const VoxelArea &dst_area, v3s16 dst_pos, - v3s16 from_pos, const v3s16 &size) +void VoxelManipulator::copyTo(MapNode *dst, const VoxelArea& dst_area, + v3s16 dst_pos, v3s16 from_pos, const v3s16 &size) { - for (s16 z = 0; z < size.Z; z++) - for (s16 y = 0; y < size.Y; y++) { - s32 i_dst = dst_area.index( - dst_pos.X, dst_pos.Y + y, dst_pos.Z + z); - s32 i_local = m_area.index( - from_pos.X, from_pos.Y + y, from_pos.Z + z); - for (s16 x = 0; x < size.X; x++) { - if (m_data[i_local].getContent() != CONTENT_IGNORE) - dst[i_dst] = m_data[i_local]; - i_dst++; - i_local++; - } + for(s16 z=0; z<size.Z; z++) + for(s16 y=0; y<size.Y; y++) + { + s32 i_dst = dst_area.index(dst_pos.X, dst_pos.Y+y, dst_pos.Z+z); + s32 i_local = m_area.index(from_pos.X, from_pos.Y+y, from_pos.Z+z); + for (s16 x = 0; x < size.X; x++) { + if (m_data[i_local].getContent() != CONTENT_IGNORE) + dst[i_dst] = m_data[i_local]; + i_dst++; + i_local++; } + } } /* @@ -265,13 +278,13 @@ void VoxelManipulator::clearFlag(u8 flags) // 0-1ms on moderate area TimeTaker timer("clearFlag", &clearflag_time); - // v3s16 s = m_area.getExtent(); + //v3s16 s = m_area.getExtent(); /*dstream<<"clearFlag clearing area of size " <<""<<s.X<<"x"<<s.Y<<"x"<<s.Z<<"" <<std::endl;*/ - // s32 count = 0; + //s32 count = 0; /*for(s32 z=m_area.MinEdge.Z; z<=m_area.MaxEdge.Z; z++) for(s32 y=m_area.MinEdge.Y; y<=m_area.MaxEdge.Y; y++) @@ -284,7 +297,8 @@ void VoxelManipulator::clearFlag(u8 flags) }*/ s32 volume = m_area.getVolume(); - for (s32 i = 0; i < volume; i++) { + for(s32 i=0; i<volume; i++) + { m_flags[i] &= ~flags; } @@ -303,4 +317,4 @@ void VoxelManipulator::clearFlag(u8 flags) const MapNode VoxelManipulator::ContentIgnoreNode = MapNode(CONTENT_IGNORE); -// END +//END |