void addArea(const VoxelArea &a)
{
- if(getExtent() == v3s16(0,0,0))
+ if (hasEmptyExtent())
{
*this = a;
return;
}
void addPoint(const v3s16 &p)
{
- if(getExtent() == v3s16(0,0,0))
+ if(hasEmptyExtent())
{
MinEdge = p;
MaxEdge = p;
{
return MaxEdge - MinEdge + v3s16(1,1,1);
}
+
+ /* 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);
+ }
+
s32 getVolume() const
{
v3s16 e = getExtent();
{
// No area contains an empty area
// NOTE: Algorithms depend on this, so do not change.
- if(a.getExtent() == v3s16(0,0,0))
+ if(a.hasEmptyExtent())
return false;
return(
return;
}
- assert(contains(a));
+ assert(contains(a)); // pre-condition
// Take back area, XY inclusive
{
}
// Stuff explodes if non-emerged area is touched with this.
// Emerge first, and check VOXELFLAG_NO_DATA if appropriate.
- MapNode & getNodeRefUnsafe(v3s16 p)
+ MapNode & getNodeRefUnsafe(const v3s16 &p)
{
return m_data[m_area.index(p)];
}
+
+ const MapNode & getNodeRefUnsafeCheckFlags(const v3s16 &p)
+ {
+ s32 index = m_area.index(p);
+
+ if (m_flags[index] & VOXELFLAG_NO_DATA)
+ return ContentIgnoreNode;
+
+ return m_data[index];
+ }
+
u8 & getFlagsRefUnsafe(v3s16 p)
{
return m_flags[m_area.index(p)];
*/
u8 *m_flags;
+ static const MapNode ContentIgnoreNode;
+
//TODO: Use these or remove them
//TODO: Would these make any speed improvement?
//bool m_pressure_route_valid;