diff options
Diffstat (limited to 'src/voxel.h')
-rw-r--r-- | src/voxel.h | 203 |
1 files changed, 84 insertions, 119 deletions
diff --git a/src/voxel.h b/src/voxel.h index 16540e595..57a6f20be 100644 --- a/src/voxel.h +++ b/src/voxel.h @@ -61,19 +61,13 @@ 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 @@ -81,35 +75,45 @@ 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(); } @@ -124,63 +128,49 @@ 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 - ); - } - bool contains(s32 i) const - { - return (i >= 0 && i < getVolume()); + 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 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}; } /* @@ -196,70 +186,68 @@ 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); } - } /* @@ -267,31 +255,21 @@ 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 @@ -314,27 +292,24 @@ 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 @@ -373,8 +348,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)]; @@ -400,12 +375,9 @@ 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); @@ -415,15 +387,11 @@ 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) @@ -435,10 +403,7 @@ 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. @@ -448,7 +413,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; @@ -461,7 +426,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); @@ -469,12 +434,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 |