X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fvoxel.h;h=51df18299af620401c58f09e6a466ef32c278e99;hb=163c38e175f7604ae5d1e3de20674f0da5e21b9c;hp=89333159c2b71f66536a2a5a82e53580662388ea;hpb=6e196c2ce4285c0aea2a5c714e842d90c1b84b43;p=dragonfireclient.git diff --git a/src/voxel.h b/src/voxel.h index 89333159c..51df18299 100644 --- a/src/voxel.h +++ b/src/voxel.h @@ -30,7 +30,11 @@ with this program; if not, write to the Free Software Foundation, Inc., #undef max /* - A fast voxel manipulator class + A fast voxel manipulator class. + + In normal operation, it fetches more map when it is requested. + It can also be used so that all allowed area is fetched at the + start, using ManualMapVoxelManipulator. Not thread-safe. */ @@ -152,6 +156,10 @@ class VoxelArea p.Z >= MinEdge.Z && p.Z <= MaxEdge.Z ); } + bool contains(s32 i) const + { + return (i >= 0 && i < getVolume()); + } bool operator==(const VoxelArea &other) const { return (MinEdge == other.MinEdge @@ -310,16 +318,12 @@ class VoxelArea // Checked as being inexistent in source #define VOXELFLAG_INEXISTENT (1<<1) // Algorithm-dependent -// flowWater: "visited" -#define VOXELFLAG_CHECKED (1<<2) +#define VOXELFLAG_CHECKED1 (1<<2) // Algorithm-dependent -// getWaterPressure: "visited" #define VOXELFLAG_CHECKED2 (1<<3) // Algorithm-dependent -// spreadWaterPressure: "visited" #define VOXELFLAG_CHECKED3 (1<<4) // Algorithm-dependent -// water: "pressure check route node" #define VOXELFLAG_CHECKED4 (1<<5) enum VoxelPrintMode @@ -369,6 +373,42 @@ class VoxelManipulator /*: public NodeContainer*/ return m_data[m_area.index(p)]; } + MapNode getNodeNoEx(v3s16 p) + { + emerge(p); + + if(m_flags[m_area.index(p)] & VOXELFLAG_INEXISTENT) + { + return MapNode(CONTENT_IGNORE); + } + + return m_data[m_area.index(p)]; + } + MapNode getNodeNoExNoEmerge(v3s16 p) + { + if(m_area.contains(p) == false) + return MapNode(CONTENT_IGNORE); + if(m_flags[m_area.index(p)] & VOXELFLAG_INEXISTENT) + return MapNode(CONTENT_IGNORE); + return m_data[m_area.index(p)]; + } + MapNode & getNodeRef(v3s16 p) + { + emerge(p); + + if(m_flags[m_area.index(p)] & VOXELFLAG_INEXISTENT) + { + dstream<<"EXCEPT: VoxelManipulator::getNode(): " + <<"p=("<