X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fvoxel.h;h=6d1a318f1e9b9f505d1a849d150806664cc67b14;hb=f6bc6621946f019689e099a423e6bfc7bf7e2618;hp=472f0740dda960addcb7193ce7ac6b9e95f08847;hpb=571fb14f9480a0fd70d7cfeb0484c9513153c33a;p=dragonfireclient.git diff --git a/src/voxel.h b/src/voxel.h index 472f0740d..6d1a318f1 100644 --- a/src/voxel.h +++ b/src/voxel.h @@ -25,8 +25,16 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "debug.h" #include "mapnode.h" +// For VC++ +#undef min +#undef max + /* - A fast voxel manipulator class + A fast voxel manipulator class. + + In normal operation, it fetches more map when it is requested. + It can also be used so that all allowed area is fetched at the + start, using ManualMapVoxelManipulator. Not thread-safe. */ @@ -148,6 +156,10 @@ class VoxelArea 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 @@ -258,7 +270,31 @@ class VoxelArea { return index(p.X, p.Y, p.Z); } + + // Translate index in the X coordinate + void add_x(const v3s16 &extent, u32 &i, s16 a) + { + i += a; + } + // Translate index in the Y coordinate + void add_y(const v3s16 &extent, u32 &i, s16 a) + { + i += a * extent.X; + } + // Translate index in the Z coordinate + void add_z(const v3s16 &extent, u32 &i, s16 a) + { + i += a * extent.X*extent.Y; + } + // Translate index in space + void add_p(const v3s16 &extent, u32 &i, v3s16 a) + { + i += a.Z*extent.X*extent.Y + a.Y*extent.X + a.X; + } + /* + Print method for debugging + */ void print(std::ostream &o) const { v3s16 e = getExtent(); @@ -282,16 +318,12 @@ class VoxelArea // Checked as being inexistent in source #define VOXELFLAG_INEXISTENT (1<<1) // Algorithm-dependent -// flowWater: "visited" -#define VOXELFLAG_CHECKED (1<<2) +#define VOXELFLAG_CHECKED1 (1<<2) // Algorithm-dependent -// getWaterPressure: "visited" #define VOXELFLAG_CHECKED2 (1<<3) // Algorithm-dependent -// spreadWaterPressure: "visited" #define VOXELFLAG_CHECKED3 (1<<4) // Algorithm-dependent -// water: "pressure check route node" #define VOXELFLAG_CHECKED4 (1<<5) enum VoxelPrintMode @@ -319,7 +351,11 @@ class VoxelManipulator /*: public NodeContainer*/ emerge(p); return !(m_flags[m_area.index(p)] & VOXELFLAG_INEXISTENT); }*/ - // These are a bit slow and shouldn't be used internally + + /* + These are a bit slow and shouldn't be used internally. + Use m_data[m_area.index(p)] instead. + */ MapNode getNode(v3s16 p) { emerge(p); @@ -337,6 +373,42 @@ class VoxelManipulator /*: public NodeContainer*/ return m_data[m_area.index(p)]; } + MapNode getNodeNoEx(v3s16 p) + { + emerge(p); + + if(m_flags[m_area.index(p)] & VOXELFLAG_INEXISTENT) + { + return MapNode(CONTENT_IGNORE); + } + + return m_data[m_area.index(p)]; + } + MapNode getNodeNoExNoEmerge(v3s16 p) + { + if(m_area.contains(p) == false) + return MapNode(CONTENT_IGNORE); + if(m_flags[m_area.index(p)] & VOXELFLAG_INEXISTENT) + return MapNode(CONTENT_IGNORE); + return m_data[m_area.index(p)]; + } + MapNode & getNodeRef(v3s16 p) + { + emerge(p); + + if(m_flags[m_area.index(p)] & VOXELFLAG_INEXISTENT) + { + dstream<<"EXCEPT: VoxelManipulator::getNode(): " + <<"p=("< &active_nodes, - int recur_count); + void unspreadLight(enum LightBank bank, v3s16 p, u8 oldlight, + core::map & light_sources); + void unspreadLight(enum LightBank bank, + core::map & from_nodes, + core::map & light_sources); - /* - VOXELFLAG_CHECKED3s must usually be cleared before calling. - */ - void updateAreaWaterPressure(VoxelArea a, - core::map &active_nodes, - bool checked3_is_clear=false); + void spreadLight(enum LightBank bank, v3s16 p); + void spreadLight(enum LightBank bank, + core::map & from_nodes); - /* - Returns true if moved something - */ - bool flowWater(v3s16 removed_pos, - core::map &active_nodes, - int recursion_depth=0, - bool debugprint=false, - u32 stoptime=0 - ); - - /* - To flow some water, call this with the target node in - active_nodes - TODO: Make the active_nodes map to contain some vectors - that are properly sorted according to water flow order. - The current order makes water flow strangely if the - first one is always taken. - No, active_nodes should preserve the order stuff is - added to it, in addition to adhering the water flow - order. - */ - void flowWater(core::map &active_nodes, - int recursion_depth=0, - bool debugprint=false, - u32 timelimit=50 - ); - /* Virtual functions */ @@ -506,7 +561,7 @@ class VoxelManipulator /*: public NodeContainer*/ /* Some settings */ - bool m_disable_water_climb; + //bool m_disable_water_climb; private: };