From 9a17b65f26eea5b9d7176e7df205f72ed2ff6c0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Blot?= Date: Wed, 26 Jul 2017 07:35:09 +0200 Subject: VoxelManip cleanups (const ref, const move) + function removal (#6169) * VoxelManip cleanups (const ref, const move) permitting to improve a little bit performance * VoxelArea: precalculate extent (performance enhancement) This permits to reduce extend high cost to zero and drop many v3s16 object creation/removal to calculate extent It rebalance the client thread update to updateFastFaceRow instead of MapBlockMesh generation This will also benefits to mapgen --- src/voxel.h | 168 +++++++++++++++++------------------------------------------- 1 file changed, 47 insertions(+), 121 deletions(-) (limited to 'src/voxel.h') diff --git a/src/voxel.h b/src/voxel.h index 8a7ad30ae..88e2edcc7 100644 --- a/src/voxel.h +++ b/src/voxel.h @@ -28,7 +28,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "mapnode.h" #include #include -#include +#include "util/basic_macros.h" class INodeDefManager; @@ -62,15 +62,18 @@ public: // Starts as zero sized VoxelArea() {} - VoxelArea(v3s16 min_edge, v3s16 max_edge): + VoxelArea(const v3s16 &min_edge, const v3s16 &max_edge): MinEdge(min_edge), MaxEdge(max_edge) { + cacheExtent(); } - VoxelArea(v3s16 p): + + VoxelArea(const v3s16 &p): MinEdge(p), MaxEdge(p) { + cacheExtent(); } /* @@ -90,13 +93,16 @@ public: 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()) { MinEdge = p; MaxEdge = p; + cacheExtent(); return; } if(p.X < MinEdge.X) MinEdge.X = p.X; @@ -105,6 +111,7 @@ public: 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(); } // Pad with d nodes @@ -114,25 +121,13 @@ public: MaxEdge += d; } - /*void operator+=(v3s16 off) - { - MinEdge += off; - MaxEdge += off; - } - - void operator-=(v3s16 off) - { - MinEdge -= off; - MaxEdge -= off; - }*/ - /* const methods */ - v3s16 getExtent() const + const v3s16 &getExtent() const { - return MaxEdge - MinEdge + v3s16(1,1,1); + return m_cache_extent; } /* Because MaxEdge and MinEdge are included in the voxel area an empty extent @@ -145,9 +140,9 @@ public: s32 getVolume() const { - v3s16 e = getExtent(); - return (s32)e.X * (s32)e.Y * (s32)e.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 @@ -179,12 +174,12 @@ public: && MaxEdge == other.MaxEdge); } - VoxelArea operator+(v3s16 off) const + VoxelArea operator+(const v3s16 &off) const { return VoxelArea(MinEdge+off, MaxEdge+off); } - VoxelArea operator-(v3s16 off) const + VoxelArea operator-(const v3s16 &off) const { return VoxelArea(MinEdge-off, MaxEdge-off); } @@ -273,10 +268,9 @@ public: */ s32 index(s16 x, s16 y, s16 z) const { - v3s16 em = getExtent(); - v3s16 off = MinEdge; - s32 i = (s32)(z-off.Z)*em.Y*em.X + (y-off.Y)*em.X + (x-off.X); - //dstream<<" i("< & light_sources, INodeDefManager *nodemgr); - void unspreadLight(enum LightBank bank, - std::map & from_nodes, - std::set & light_sources, INodeDefManager *nodemgr); void spreadLight(enum LightBank bank, v3s16 p, INodeDefManager *nodemgr); void spreadLight(enum LightBank bank, std::set & from_nodes, INodeDefManager *nodemgr); - /* - Virtual functions - */ - /* Member variables */ -- cgit v1.2.3