X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fvoxel.h;h=88e2edcc76b4e6e04eadaaa04187a19452651cb0;hb=e44f13aecb39e778d5b67c0894077cba2157742b;hp=c2a5efb4b7de6b1289c490e92d32ca59ef2062bc;hpb=f9a8efb99235c86eb61b6deb2bc034d5618e45ea;p=dragonfireclient.git diff --git a/src/voxel.h b/src/voxel.h index c2a5efb4b..88e2edcc7 100644 --- a/src/voxel.h +++ b/src/voxel.h @@ -1,6 +1,6 @@ /* -Minetest-c55 -Copyright (C) 2010 celeron55, Perttu Ahola +Minetest +Copyright (C) 2013 celeron55, Perttu Ahola This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by @@ -22,10 +22,13 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "irrlichttypes.h" #include "irr_v3d.h" -#include #include #include "debug.h" +#include "exceptions.h" #include "mapnode.h" +#include +#include +#include "util/basic_macros.h" class INodeDefManager; @@ -46,8 +49,8 @@ class INodeDefManager; /* Debug stuff */ -extern u32 emerge_time; -extern u32 emerge_load_time; +extern u64 emerge_time; +extern u64 emerge_load_time; /* This class resembles aabbox3d a lot, but has inclusive @@ -57,29 +60,29 @@ class VoxelArea { public: // Starts as zero sized - VoxelArea(): - MinEdge(1,1,1), - MaxEdge(0,0,0) - { - } - VoxelArea(v3s16 min_edge, v3s16 max_edge): + VoxelArea() {} + + 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(); } /* Modifying methods */ - void addArea(VoxelArea &a) + void addArea(const VoxelArea &a) { - if(getExtent() == v3s16(0,0,0)) + if (hasEmptyExtent()) { *this = a; return; @@ -90,13 +93,16 @@ class VoxelArea 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(v3s16 p) + + void addPoint(const v3s16 &p) { - if(getExtent() == v3s16(0,0,0)) + if(hasEmptyExtent()) { MinEdge = p; MaxEdge = p; + cacheExtent(); return; } if(p.X < MinEdge.X) MinEdge.X = p.X; @@ -105,45 +111,43 @@ class VoxelArea 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 - void pad(v3s16 d) + void pad(const v3s16 &d) { MinEdge -= d; 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 + * 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(); - 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 // NOTE: Algorithms depend on this, so do not change. - if(a.getExtent() == v3s16(0,0,0)) + if(a.hasEmptyExtent()) return false; return( @@ -170,12 +174,12 @@ class VoxelArea && 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); } @@ -186,7 +190,7 @@ class VoxelArea a: area inside *this */ - void diff(const VoxelArea &a, core::list &result) + void diff(const VoxelArea &a, std::list &result) { /* This can result in a maximum of 6 areas @@ -201,7 +205,7 @@ class VoxelArea return; } - assert(contains(a)); + assert(contains(a)); // pre-condition // Take back area, XY inclusive { @@ -264,10 +268,9 @@ class VoxelArea */ 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, - core::map & from_nodes, - core::map & light_sources, INodeDefManager *nodemgr); + std::set & light_sources, INodeDefManager *nodemgr); void spreadLight(enum LightBank bank, v3s16 p, INodeDefManager *nodemgr); void spreadLight(enum LightBank bank, - core::map & from_nodes, INodeDefManager *nodemgr); - - /* - Virtual functions - */ - - /* - Get the contents of the requested area from somewhere. - Shall touch only nodes that have VOXELFLAG_NOT_LOADED - Shall reset VOXELFLAG_NOT_LOADED - - If not found from source, add with VOXELFLAG_INEXISTENT - */ - virtual void emerge(VoxelArea a, s32 caller_id=-1) - { - //dstream<<"emerge p=("< & from_nodes, INodeDefManager *nodemgr); /* Member variables @@ -567,27 +493,17 @@ class VoxelManipulator /*: public NodeContainer*/ VoxelArea m_area; /* - NULL if data size is 0 (extent (0,0,0)) + nullptr if data size is 0 (extent (0,0,0)) Data is stored as [z*h*w + y*h + x] */ - MapNode *m_data; + MapNode *m_data = nullptr; /* Flags of all nodes */ - u8 *m_flags; - - //TODO: Use these or remove them - //TODO: Would these make any speed improvement? - //bool m_pressure_route_valid; - //v3s16 m_pressure_route_surface; + u8 *m_flags = nullptr; - /* - Some settings - */ - //bool m_disable_water_climb; - -private: + static const MapNode ContentIgnoreNode; }; #endif