diff options
Diffstat (limited to 'src/voxel.h')
-rw-r--r-- | src/voxel.h | 203 |
1 files changed, 119 insertions, 84 deletions
diff --git a/src/voxel.h b/src/voxel.h index 57a6f20be..16540e595 100644 --- a/src/voxel.h +++ b/src/voxel.h @@ -61,13 +61,19 @@ public: // Starts as zero sized VoxelArea() = default; - VoxelArea(const v3s16 &min_edge, const v3s16 &max_edge) : - MinEdge(min_edge), MaxEdge(max_edge) + VoxelArea(const v3s16 &min_edge, const v3s16 &max_edge): + MinEdge(min_edge), + MaxEdge(max_edge) { cacheExtent(); } - VoxelArea(const v3s16 &p) : MinEdge(p), MaxEdge(p) { cacheExtent(); } + VoxelArea(const v3s16 &p): + MinEdge(p), + MaxEdge(p) + { + cacheExtent(); + } /* Modifying methods @@ -75,45 +81,35 @@ public: void addArea(const VoxelArea &a) { - if (hasEmptyExtent()) { + if (hasEmptyExtent()) + { *this = a; return; } - if (a.MinEdge.X < MinEdge.X) - MinEdge.X = a.MinEdge.X; - if (a.MinEdge.Y < MinEdge.Y) - MinEdge.Y = a.MinEdge.Y; - if (a.MinEdge.Z < MinEdge.Z) - MinEdge.Z = a.MinEdge.Z; - if (a.MaxEdge.X > MaxEdge.X) - MaxEdge.X = a.MaxEdge.X; - if (a.MaxEdge.Y > MaxEdge.Y) - MaxEdge.Y = a.MaxEdge.Y; - if (a.MaxEdge.Z > MaxEdge.Z) - MaxEdge.Z = a.MaxEdge.Z; + if(a.MinEdge.X < MinEdge.X) MinEdge.X = a.MinEdge.X; + if(a.MinEdge.Y < MinEdge.Y) MinEdge.Y = a.MinEdge.Y; + if(a.MinEdge.Z < MinEdge.Z) MinEdge.Z = a.MinEdge.Z; + if(a.MaxEdge.X > MaxEdge.X) MaxEdge.X = a.MaxEdge.X; + if(a.MaxEdge.Y > MaxEdge.Y) MaxEdge.Y = a.MaxEdge.Y; + if(a.MaxEdge.Z > MaxEdge.Z) MaxEdge.Z = a.MaxEdge.Z; cacheExtent(); } void addPoint(const v3s16 &p) { - if (hasEmptyExtent()) { + if(hasEmptyExtent()) + { MinEdge = p; MaxEdge = p; cacheExtent(); return; } - if (p.X < MinEdge.X) - MinEdge.X = p.X; - if (p.Y < MinEdge.Y) - MinEdge.Y = p.Y; - if (p.Z < MinEdge.Z) - MinEdge.Z = p.Z; - if (p.X > MaxEdge.X) - MaxEdge.X = p.X; - if (p.Y > MaxEdge.Y) - MaxEdge.Y = p.Y; - if (p.Z > MaxEdge.Z) - MaxEdge.Z = p.Z; + if(p.X < MinEdge.X) MinEdge.X = p.X; + if(p.Y < MinEdge.Y) MinEdge.Y = p.Y; + if(p.Z < MinEdge.Z) MinEdge.Z = p.Z; + if(p.X > MaxEdge.X) MaxEdge.X = p.X; + if(p.Y > MaxEdge.Y) MaxEdge.Y = p.Y; + if(p.Z > MaxEdge.Z) MaxEdge.Z = p.Z; cacheExtent(); } @@ -128,49 +124,63 @@ public: const methods */ - const v3s16 &getExtent() const { return m_cache_extent; } + const v3s16 &getExtent() const + { + return m_cache_extent; + } /* Because MaxEdge and MinEdge are included in the voxel area an empty extent * is not represented by (0, 0, 0), but instead (-1, -1, -1) */ - bool hasEmptyExtent() const { return MaxEdge - MinEdge == v3s16(-1, -1, -1); } + bool hasEmptyExtent() const + { + return MaxEdge - MinEdge == v3s16(-1, -1, -1); + } s32 getVolume() const { - return (s32)m_cache_extent.X * (s32)m_cache_extent.Y * - (s32)m_cache_extent.Z; + return (s32)m_cache_extent.X * (s32)m_cache_extent.Y * (s32)m_cache_extent.Z; } bool contains(const VoxelArea &a) const { // No area contains an empty area // NOTE: Algorithms depend on this, so do not change. - if (a.hasEmptyExtent()) + if(a.hasEmptyExtent()) return false; - return (a.MinEdge.X >= MinEdge.X && a.MaxEdge.X <= MaxEdge.X && - a.MinEdge.Y >= MinEdge.Y && a.MaxEdge.Y <= MaxEdge.Y && - a.MinEdge.Z >= MinEdge.Z && a.MaxEdge.Z <= MaxEdge.Z); + return( + a.MinEdge.X >= MinEdge.X && a.MaxEdge.X <= MaxEdge.X && + a.MinEdge.Y >= MinEdge.Y && a.MaxEdge.Y <= MaxEdge.Y && + a.MinEdge.Z >= MinEdge.Z && a.MaxEdge.Z <= MaxEdge.Z + ); } bool contains(v3s16 p) const { - return (p.X >= MinEdge.X && p.X <= MaxEdge.X && p.Y >= MinEdge.Y && - p.Y <= MaxEdge.Y && p.Z >= MinEdge.Z && p.Z <= MaxEdge.Z); + return( + p.X >= MinEdge.X && p.X <= MaxEdge.X && + p.Y >= MinEdge.Y && p.Y <= MaxEdge.Y && + p.Z >= MinEdge.Z && p.Z <= MaxEdge.Z + ); + } + bool contains(s32 i) const + { + return (i >= 0 && i < getVolume()); } - bool contains(s32 i) const { return (i >= 0 && i < getVolume()); } bool operator==(const VoxelArea &other) const { - return (MinEdge == other.MinEdge && MaxEdge == other.MaxEdge); + return (MinEdge == other.MinEdge + && MaxEdge == other.MaxEdge); } VoxelArea operator+(const v3s16 &off) const { - return {MinEdge + off, MaxEdge + off}; + return {MinEdge+off, MaxEdge+off}; } VoxelArea operator-(const v3s16 &off) const { - return {MinEdge - off, MaxEdge - off}; + return {MinEdge-off, MaxEdge-off}; } /* @@ -186,68 +196,70 @@ public: */ // If a is an empty area, return the current area as a whole - if (a.getExtent() == v3s16(0, 0, 0)) { + if(a.getExtent() == v3s16(0,0,0)) + { VoxelArea b = *this; - if (b.getVolume() != 0) + if(b.getVolume() != 0) result.push_back(b); return; } - assert(contains(a)); // pre-condition + assert(contains(a)); // pre-condition // Take back area, XY inclusive { - v3s16 min(MinEdge.X, MinEdge.Y, a.MaxEdge.Z + 1); + v3s16 min(MinEdge.X, MinEdge.Y, a.MaxEdge.Z+1); v3s16 max(MaxEdge.X, MaxEdge.Y, MaxEdge.Z); VoxelArea b(min, max); - if (b.getVolume() != 0) + if(b.getVolume() != 0) result.push_back(b); } // Take front area, XY inclusive { v3s16 min(MinEdge.X, MinEdge.Y, MinEdge.Z); - v3s16 max(MaxEdge.X, MaxEdge.Y, a.MinEdge.Z - 1); + v3s16 max(MaxEdge.X, MaxEdge.Y, a.MinEdge.Z-1); VoxelArea b(min, max); - if (b.getVolume() != 0) + if(b.getVolume() != 0) result.push_back(b); } // Take top area, X inclusive { - v3s16 min(MinEdge.X, a.MaxEdge.Y + 1, a.MinEdge.Z); + v3s16 min(MinEdge.X, a.MaxEdge.Y+1, a.MinEdge.Z); v3s16 max(MaxEdge.X, MaxEdge.Y, a.MaxEdge.Z); VoxelArea b(min, max); - if (b.getVolume() != 0) + if(b.getVolume() != 0) result.push_back(b); } // Take bottom area, X inclusive { v3s16 min(MinEdge.X, MinEdge.Y, a.MinEdge.Z); - v3s16 max(MaxEdge.X, a.MinEdge.Y - 1, a.MaxEdge.Z); + v3s16 max(MaxEdge.X, a.MinEdge.Y-1, a.MaxEdge.Z); VoxelArea b(min, max); - if (b.getVolume() != 0) + if(b.getVolume() != 0) result.push_back(b); } // Take left area, non-inclusive { v3s16 min(MinEdge.X, a.MinEdge.Y, a.MinEdge.Z); - v3s16 max(a.MinEdge.X - 1, a.MaxEdge.Y, a.MaxEdge.Z); + v3s16 max(a.MinEdge.X-1, a.MaxEdge.Y, a.MaxEdge.Z); VoxelArea b(min, max); - if (b.getVolume() != 0) + if(b.getVolume() != 0) result.push_back(b); } // Take right area, non-inclusive { - v3s16 min(a.MaxEdge.X + 1, a.MinEdge.Y, a.MinEdge.Z); + v3s16 min(a.MaxEdge.X+1, a.MinEdge.Y, a.MinEdge.Z); v3s16 max(MaxEdge.X, a.MaxEdge.Y, a.MaxEdge.Z); VoxelArea b(min, max); - if (b.getVolume() != 0) + if(b.getVolume() != 0) result.push_back(b); } + } /* @@ -255,21 +267,31 @@ public: */ s32 index(s16 x, s16 y, s16 z) const { - s32 i = (s32)(z - MinEdge.Z) * m_cache_extent.Y * m_cache_extent.X + - (y - MinEdge.Y) * m_cache_extent.X + (x - MinEdge.X); + s32 i = (s32)(z - MinEdge.Z) * m_cache_extent.Y * m_cache_extent.X + + (y - MinEdge.Y) * m_cache_extent.X + + (x - MinEdge.X); return i; } - s32 index(v3s16 p) const { return index(p.X, p.Y, p.Z); } + s32 index(v3s16 p) const + { + return index(p.X, p.Y, p.Z); + } /** * Translate index in the X coordinate */ - static void add_x(const v3s16 &extent, u32 &i, s16 a) { i += a; } + static void add_x(const v3s16 &extent, u32 &i, s16 a) + { + i += a; + } /** * Translate index in the Y coordinate */ - static void add_y(const v3s16 &extent, u32 &i, s16 a) { i += a * extent.X; } + static void add_y(const v3s16 &extent, u32 &i, s16 a) + { + i += a * extent.X; + } /** * Translate index in the Z coordinate @@ -292,24 +314,27 @@ public: */ void print(std::ostream &o) const { - o << PP(MinEdge) << PP(MaxEdge) << "=" << m_cache_extent.X << "x" - << m_cache_extent.Y << "x" << m_cache_extent.Z << "=" << getVolume(); + o << PP(MinEdge) << PP(MaxEdge) << "=" + << m_cache_extent.X << "x" << m_cache_extent.Y << "x" << m_cache_extent.Z + << "=" << getVolume(); } // Edges are inclusive - v3s16 MinEdge = v3s16(1, 1, 1); + v3s16 MinEdge = v3s16(1,1,1); v3s16 MaxEdge; - private: - void cacheExtent() { m_cache_extent = MaxEdge - MinEdge + v3s16(1, 1, 1); } + void cacheExtent() + { + m_cache_extent = MaxEdge - MinEdge + v3s16(1,1,1); + } - v3s16 m_cache_extent = v3s16(0, 0, 0); + v3s16 m_cache_extent = v3s16(0,0,0); }; // unused -#define VOXELFLAG_UNUSED (1 << 0) +#define VOXELFLAG_UNUSED (1 << 0) // no data about that node -#define VOXELFLAG_NO_DATA (1 << 1) +#define VOXELFLAG_NO_DATA (1 << 1) // Algorithm-dependent #define VOXELFLAG_CHECKED1 (1 << 2) // Algorithm-dependent @@ -348,8 +373,8 @@ public: <<", index="<<m_area.index(p) <<", flags="<<(int)m_flags[m_area.index(p)] <<" is inexistent"<<std::endl;*/ - throw InvalidPositionException( - "VoxelManipulator: getNode: inexistent"); + throw InvalidPositionException + ("VoxelManipulator: getNode: inexistent"); } return m_data[m_area.index(p)]; @@ -375,9 +400,12 @@ public: } // Stuff explodes if non-emerged area is touched with this. // Emerge first, and check VOXELFLAG_NO_DATA if appropriate. - MapNode &getNodeRefUnsafe(const v3s16 &p) { return m_data[m_area.index(p)]; } + MapNode & getNodeRefUnsafe(const v3s16 &p) + { + return m_data[m_area.index(p)]; + } - const MapNode &getNodeRefUnsafeCheckFlags(const v3s16 &p) + const MapNode & getNodeRefUnsafeCheckFlags(const v3s16 &p) { s32 index = m_area.index(p); @@ -387,11 +415,15 @@ public: return m_data[index]; } - u8 &getFlagsRefUnsafe(const v3s16 &p) { return m_flags[m_area.index(p)]; } + u8 & getFlagsRefUnsafe(const v3s16 &p) + { + return m_flags[m_area.index(p)]; + } bool exists(const v3s16 &p) { - return m_area.contains(p) && !(getFlagsRefUnsafe(p) & VOXELFLAG_NO_DATA); + return m_area.contains(p) && + !(getFlagsRefUnsafe(p) & VOXELFLAG_NO_DATA); } void setNode(const v3s16 &p, const MapNode &n) @@ -403,7 +435,10 @@ public: m_flags[m_area.index(p)] &= ~VOXELFLAG_NO_DATA; } // TODO: Should be removed and replaced with setNode - void setNodeNoRef(const v3s16 &p, const MapNode &n) { setNode(p, n); } + void setNodeNoRef(const v3s16 &p, const MapNode &n) + { + setNode(p, n); + } /* Set stuff if available without an emerge. @@ -413,7 +448,7 @@ public: */ bool setNodeNoEmerge(const v3s16 &p, MapNode n) { - if (!m_area.contains(p)) + if(!m_area.contains(p)) return false; m_data[m_area.index(p)] = n; return true; @@ -426,7 +461,7 @@ public: virtual void clear(); void print(std::ostream &o, const NodeDefManager *nodemgr, - VoxelPrintMode mode = VOXELPRINT_MATERIAL); + VoxelPrintMode mode=VOXELPRINT_MATERIAL); void addArea(const VoxelArea &area); @@ -434,12 +469,12 @@ public: Copy data and set flags to 0 dst_area.getExtent() <= src_area.getExtent() */ - void copyFrom(MapNode *src, const VoxelArea &src_area, v3s16 from_pos, - v3s16 to_pos, const v3s16 &size); + void copyFrom(MapNode *src, const VoxelArea& src_area, + v3s16 from_pos, v3s16 to_pos, const v3s16 &size); // Copy data - void copyTo(MapNode *dst, const VoxelArea &dst_area, v3s16 dst_pos, - v3s16 from_pos, const v3s16 &size); + void copyTo(MapNode *dst, const VoxelArea& dst_area, + v3s16 dst_pos, v3s16 from_pos, const v3s16 &size); /* Algorithms |