Fix alpha for liquid nodes (#5494)
[oweals/minetest.git] / src / mapnode.h
index da6e9bdeafadec505f74aec62021e86a67bcd903..9c56a7e170c9b4b73d8b5217041356e27ee328d1 100644 (file)
@@ -20,14 +20,13 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #ifndef MAPNODE_HEADER
 #define MAPNODE_HEADER
 
-#include "irrlichttypes.h"
-#include "irr_v3d.h"
-#include "irr_aabb3d.h"
+#include "irrlichttypes_bloated.h"
 #include "light.h"
 #include <string>
 #include <vector>
 
 class INodeDefManager;
+class Map;
 
 /*
        Naming scheme:
@@ -62,11 +61,11 @@ typedef u16 content_t;
 
 /*
        Ignored node.
-       
+
        Unloaded chunks are considered to consist of this. Several other
        methods return this when an error occurs. Also, during
        map generation this means the node has not been set yet.
-       
+
        Doesn't create faces with anything and is considered being
        out-of-map in the game map.
 */
@@ -132,19 +131,17 @@ struct MapNode
                - Uhh... well, most blocks have light or nothing in here.
        */
        u8 param1;
-       
+
        /*
                The second parameter. Initialized to 0.
                E.g. direction for torches and flowing water.
        */
        u8 param2;
 
-       MapNode(const MapNode & n)
-       {
-               *this = n;
-       }
+       MapNode()
+       { }
 
-       MapNode(content_t content = CONTENT_AIR, u8 a_param1=0, u8 a_param2=0)
+       MapNode(content_t content, u8 a_param1=0, u8 a_param2=0)
                : param0(content),
                  param1(a_param1),
                  param2(a_param2)
@@ -161,7 +158,7 @@ struct MapNode
                                && param1 == other.param1
                                && param2 == other.param2);
        }
-       
+
        // To be used everywhere
        content_t getContent() const
        {
@@ -187,10 +184,35 @@ struct MapNode
        {
                param2 = p;
        }
-       
+
+       /*!
+        * Returns the color of the node.
+        *
+        * \param f content features of this node
+        * \param color output, contains the node's color.
+        */
+       void getColor(const ContentFeatures &f, video::SColor *color) const;
+
+       void setLight(enum LightBank bank, u8 a_light, const ContentFeatures &f);
+
        void setLight(enum LightBank bank, u8 a_light, INodeDefManager *nodemgr);
+
+       /**
+        * Check if the light value for night differs from the light value for day.
+        *
+        * @return If the light values are equal, returns true; otherwise false
+        */
+       bool isLightDayNightEq(INodeDefManager *nodemgr) const;
+
        u8 getLight(enum LightBank bank, INodeDefManager *nodemgr) const;
 
+       /*!
+        * Returns the node's light level from param1.
+        * If the node emits light, it is ignored.
+        * \param f the ContentFeatures of this node.
+        */
+       u8 getLightRaw(enum LightBank bank, const ContentFeatures &f) const;
+
        /**
         * This function differs from getLight(enum LightBank bank, INodeDefManager *nodemgr)
         * in that the ContentFeatures of the node in question are not retrieved by
@@ -206,7 +228,7 @@ struct MapNode
         * @pre f != NULL
         * @pre f->param_type == CPT_LIGHT
         */
-       u8 getLightNoChecks(LightBank bank, const ContentFeatures *f);
+       u8 getLightNoChecks(LightBank bank, const ContentFeatures *f) const;
 
        bool getLightBanks(u8 &lightday, u8 &lightnight, INodeDefManager *nodemgr) const;
 
@@ -223,30 +245,38 @@ struct MapNode
        u8 getFaceDir(INodeDefManager *nodemgr) const;
        u8 getWallMounted(INodeDefManager *nodemgr) const;
        v3s16 getWallMountedDir(INodeDefManager *nodemgr) const;
-       
+
        void rotateAlongYAxis(INodeDefManager *nodemgr, Rotation rot);
 
+       /*!
+        * Checks which neighbors does this node connect to.
+        *
+        * \param p coordinates of the node
+        */
+       u8 getNeighbors(v3s16 p, Map *map);
+
        /*
                Gets list of node boxes (used for rendering (NDT_NODEBOX))
        */
-       std::vector<aabb3f> getNodeBoxes(INodeDefManager *nodemgr) const;
+       void getNodeBoxes(INodeDefManager *nodemgr, std::vector<aabb3f> *boxes, u8 neighbors = 0);
 
        /*
                Gets list of selection boxes
        */
-       std::vector<aabb3f> getSelectionBoxes(INodeDefManager *nodemgr) const;
+       void getSelectionBoxes(INodeDefManager *nodemg, std::vector<aabb3f> *boxes, u8 neighbors = 0);
 
        /*
                Gets list of collision boxes
        */
-       std::vector<aabb3f> getCollisionBoxes(INodeDefManager *nodemgr) const;
+       void getCollisionBoxes(INodeDefManager *nodemgr, std::vector<aabb3f> *boxes, u8 neighbors = 0);
 
-       /* Liquid helpers */
+       /*
+               Liquid helpers
+       */
        u8 getMaxLevel(INodeDefManager *nodemgr) const;
        u8 getLevel(INodeDefManager *nodemgr) const;
        u8 setLevel(INodeDefManager *nodemgr, s8 level = 1);
        u8 addLevel(INodeDefManager *nodemgr, s8 add = 1);
-       void freezeMelt(INodeDefManager *nodemgr);
 
        /*
                Serialization functions
@@ -255,7 +285,7 @@ struct MapNode
        static u32 serializedLength(u8 version);
        void serialize(u8 *dest, u8 version);
        void deSerialize(u8 *source, u8 version);
-       
+
        // Serializes or deserializes a list of nodes in bulk format (first the
        // content of all nodes, then the param1 of all nodes, then the param2
        // of all nodes).