summaryrefslogtreecommitdiff
path: root/src/voxel.h
diff options
context:
space:
mode:
authorPerttu Ahola <celeron55@gmail.com>2012-01-27 12:58:52 +0200
committerPerttu Ahola <celeron55@gmail.com>2012-03-27 19:01:50 +0300
commit56496ad5d8a7662b0ae5c9f25d1348cb7b677b65 (patch)
tree04d32a83a93833f59de93d4a1b763524f4153764 /src/voxel.h
parente15dca2a9fac70dd4f541f7b37c6f61fcf974ea1 (diff)
downloadminetest-56496ad5d8a7662b0ae5c9f25d1348cb7b677b65.tar.gz
minetest-56496ad5d8a7662b0ae5c9f25d1348cb7b677b65.tar.bz2
minetest-56496ad5d8a7662b0ae5c9f25d1348cb7b677b65.zip
Implement propagateSunlight for VoxelManipulator
Diffstat (limited to 'src/voxel.h')
-rw-r--r--src/voxel.h35
1 files changed, 26 insertions, 9 deletions
diff --git a/src/voxel.h b/src/voxel.h
index 291b51e03..237366756 100644
--- a/src/voxel.h
+++ b/src/voxel.h
@@ -20,7 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#ifndef VOXEL_HEADER
#define VOXEL_HEADER
-#include "common_irrlicht.h"
+#include "irrlichttypes.h"
#include <iostream>
#include "debug.h"
#include "mapnode.h"
@@ -333,6 +333,7 @@ enum VoxelPrintMode
VOXELPRINT_NOTHING,
VOXELPRINT_MATERIAL,
VOXELPRINT_WATERPRESSURE,
+ VOXELPRINT_LIGHT_DAY,
};
class VoxelManipulator /*: public NodeContainer*/
@@ -394,24 +395,37 @@ public:
return MapNode(CONTENT_IGNORE);
return m_data[m_area.index(p)];
}
+ // Stuff explodes if non-emerged area is touched with this.
+ // Emerge first, and check VOXELFLAG_INEXISTENT if appropriate.
+ MapNode & getNodeRefUnsafe(v3s16 p)
+ {
+ return m_data[m_area.index(p)];
+ }
+ u8 & getFlagsRefUnsafe(v3s16 p)
+ {
+ return m_flags[m_area.index(p)];
+ }
+ bool exists(v3s16 p)
+ {
+ return m_area.contains(p) &&
+ !(getFlagsRefUnsafe(p) & VOXELFLAG_INEXISTENT);
+ }
MapNode & getNodeRef(v3s16 p)
{
emerge(p);
-
- if(m_flags[m_area.index(p)] & VOXELFLAG_INEXISTENT)
+ if(getFlagsRefUnsafe(p) & VOXELFLAG_INEXISTENT)
{
/*dstream<<"EXCEPT: VoxelManipulator::getNode(): "
<<"p=("<<p.X<<","<<p.Y<<","<<p.Z<<")"
<<", index="<<m_area.index(p)
- <<", flags="<<(int)m_flags[m_area.index(p)]
+ <<", flags="<<(int)getFlagsRefUnsafe(p)
<<" is inexistent"<<std::endl;*/
throw InvalidPositionException
("VoxelManipulator: getNode: inexistent");
}
-
- return m_data[m_area.index(p)];
+ return getNodeRefUnsafe(p);
}
- void setNode(v3s16 p, MapNode &n)
+ void setNode(v3s16 p, const MapNode &n)
{
emerge(p);
@@ -419,7 +433,8 @@ public:
m_flags[m_area.index(p)] &= ~VOXELFLAG_INEXISTENT;
m_flags[m_area.index(p)] &= ~VOXELFLAG_NOT_LOADED;
}
- void setNodeNoRef(v3s16 p, MapNode n)
+ // TODO: Should be removed and replaced with setNode
+ void setNodeNoRef(v3s16 p, const MapNode &n)
{
setNode(p, n);
}
@@ -498,7 +513,9 @@ public:
*/
void clearFlag(u8 flag);
-
+
+ // TODO: Move to voxelalgorithms.h
+
void unspreadLight(enum LightBank bank, v3s16 p, u8 oldlight,
core::map<v3s16, bool> & light_sources, INodeDefManager *nodemgr);
void unspreadLight(enum LightBank bank,