From 5e0c284f3a8debdd9ebb080f80e36dceb7bc4ce2 Mon Sep 17 00:00:00 2001 From: Perttu Ahola Date: Wed, 1 Dec 2010 15:20:12 +0200 Subject: some work-in-progress water stuff --- src/voxel.cpp | 264 +++++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 177 insertions(+), 87 deletions(-) (limited to 'src/voxel.cpp') diff --git a/src/voxel.cpp b/src/voxel.cpp index fc3b4c428..fe176a27a 100644 --- a/src/voxel.cpp +++ b/src/voxel.cpp @@ -21,36 +21,98 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "map.h" VoxelManipulator::VoxelManipulator(): - m_data(NULL) + m_data(NULL), + m_flags(NULL) { } VoxelManipulator::~VoxelManipulator() { + clear(); if(m_data) delete[] m_data; + if(m_flags) + delete[] m_flags; +} + +void VoxelManipulator::clear() +{ + // Reset area to volume=0 + m_area = VoxelArea(); + if(m_data) + delete[] m_data; + m_data = NULL; + if(m_flags) + delete[] m_flags; + m_flags = NULL; +} + +void VoxelManipulator::print(std::ostream &o) +{ + v3s16 em = m_area.getExtent(); + v3s16 of = m_area.MinEdge; + o<<"size: "<=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)]; + char c; + if(f & VOXELFLAG_NOT_LOADED) + c = 'N'; + else if(f & VOXELFLAG_INEXISTENT) + c = 'I'; + else + { + c = 'X'; + u8 m = m_data[m_area.index(x,y,z)].d; + if(m <= 9) + c = m + '0'; + } + o<= 3 && em.Y >= 3) - { - if(y==m_area.MinEdge.Y+0) o<<"y x-> "; - if(y==m_area.MinEdge.Y+1) o<<"| "; - if(y==m_area.MinEdge.Y+2) o<<"V "; - } + /*dstream<<"old_data="<<(int)old_data<<", new_data="<<(int)new_data + <<", old_flags="<<(int)m_flags<<", new_flags="<<(int)new_flags<getNode(p_from + p); - m_data[m_area.index(p_to + p)] = n; - } - catch(InvalidPositionException &e) + p = removed_pos + dirs[i]; + u8 f = m_flags[m_area.index(p)]; + // Inexistent or checked nodes can't move + if(f & (VOXELFLAG_INEXISTENT | VOXELFLAG_CHECKED)) + continue; + MapNode &n = m_data[m_area.index(p)]; + // Only liquid nodes can move + if(material_liquid(n.d) == false) + continue; + // If block is at top, select it always + if(i == 0) { + break; } - - /*v3s16 p(x,y,z); - MapNode n(MATERIAL_IGNORE); - try{ - n = c->getNode(p_from + p); + // If block is at bottom, select it if it has enough pressure + if(i == 5) + { + if(n.pressure >= 3) + break; + continue; } - catch(InvalidPositionException &e) + // Else block is at some side. Select it if it has enough pressure + if(n.pressure >= 2) { + break; } - m_data[m_area.index(p_to + p)] = n;*/ } -} -void VoxelManipulator::blitToNodeContainer - (v3s16 p_from, v3s16 p_to, v3s16 size, NodeContainer *c) -{ - for(s16 z=0; z=0; i--) { - v3s16 p(x,y,z); - try{ - MapNode &n = m_data[m_area.index(p_from + p)]; - if(n.d == MATERIAL_IGNORE) - continue; - c->setNode(p_to + p, n); - } - catch(InvalidPositionException &e) - { - } + p = removed_pos + dirs[i]; + u8 f = m_flags[m_area.index(p)]; + // Water can't move to inexistent nodes + if(f & VOXELFLAG_INEXISTENT) + continue; + MapNode &n = m_data[m_area.index(p)]; + // Water can only move to air + if(n.d != MATERIAL_AIR) + continue; + flowWater(p); } } -#endif /* MapVoxelManipulator @@ -254,12 +336,18 @@ void MapVoxelManipulator::emerge(VoxelArea a) for(s16 x=0; xgetNode(a.MinEdge + p); - m_data[m_area.index(a.MinEdge + p)] = n; + m_data[i] = n; + m_flags[i] = 0; } catch(InvalidPositionException &e) { + m_flags[i] = VOXELFLAG_INEXISTENT; } } } @@ -280,9 +368,11 @@ void MapVoxelManipulator::blitBack { v3s16 p(x,y,z); - MapNode &n = m_data[m_area.index(p)]; - if(n.d == MATERIAL_IGNORE) + u8 f = m_flags[m_area.index(p)]; + if(f & (VOXELFLAG_NOT_LOADED|VOXELFLAG_INEXISTENT)) continue; + + MapNode &n = m_data[m_area.index(p)]; v3s16 blockpos = getNodeBlockPos(p); -- cgit v1.2.3