+
+ VoxelArea operator+(v3s16 off) const
+ {
+ return VoxelArea(MinEdge+off, MaxEdge+off);
+ }
+
+ VoxelArea operator-(v3s16 off) const
+ {
+ return VoxelArea(MinEdge-off, MaxEdge-off);
+ }
+
+ /*
+ Returns 0-6 non-overlapping areas that can be added to
+ a to make up this area.
+
+ a: area inside *this
+ */
+ void diff(const VoxelArea &a, core::list<VoxelArea> &result)
+ {
+ /*
+ This can result in a maximum of 6 areas
+ */
+
+ // If a is an empty area, return the current area as a whole
+ if(a.getExtent() == v3s16(0,0,0))
+ {
+ VoxelArea b = *this;
+ if(b.getVolume() != 0)
+ result.push_back(b);
+ return;
+ }
+
+ assert(contains(a));
+
+ // Take back area, XY inclusive
+ {
+ 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)
+ 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);
+ VoxelArea b(min, max);
+ 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 max(MaxEdge.X, MaxEdge.Y, a.MaxEdge.Z);
+ VoxelArea b(min, max);
+ 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);
+ VoxelArea b(min, max);
+ 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);
+ VoxelArea b(min, max);
+ 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 max(MaxEdge.X, a.MaxEdge.Y, a.MaxEdge.Z);
+ VoxelArea b(min, max);
+ if(b.getVolume() != 0)
+ result.push_back(b);
+ }
+
+ }