X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fmapnode.h;h=2f6224f0279073791f23d0369679a33b54be2fbb;hb=b24d21d1ae25c377e14223ee20d9de9158fe916c;hp=1c75f39c57e6361bfcd855e2f4f93907963ce6f9;hpb=157a4cf18cb9c098f465b8baecd7d2cd5705f2dd;p=dragonfireclient.git diff --git a/src/mapnode.h b/src/mapnode.h index 1c75f39c5..2f6224f02 100644 --- a/src/mapnode.h +++ b/src/mapnode.h @@ -1,18 +1,18 @@ /* -Minetest-c55 -Copyright (C) 2010-2011 celeron55, Perttu Ahola +Minetest +Copyright (C) 2010-2013 celeron55, Perttu Ahola This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. +GNU Lesser General Public License for more details. -You should have received a copy of the GNU General Public License along +You should have received a copy of the GNU Lesser General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ @@ -21,7 +21,11 @@ with this program; if not, write to the Free Software Foundation, Inc., #define MAPNODE_HEADER #include "irrlichttypes.h" +#include "irr_v3d.h" +#include "irr_aabb3d.h" #include "light.h" +#include +#include class INodeDefManager; @@ -30,25 +34,25 @@ class INodeDefManager; - Material = irrlicht's Material class - Content = (content_t) content of a node - Tile = TileSpec at some side of a node of some content type - - Content ranges: - 0x000...0x07f: param2 is fully usable - 0x800...0xfff: param2 lower 4 bits are free */ typedef u16 content_t; -#define MAX_CONTENT 0xfff /* - Ignored node. + The maximum node ID that can be registered by mods. This must + be significantly lower than the maximum content_t value, so that + there is enough room for dummy node IDs, which are created when + a MapBlock containing unknown node names is loaded from disk. +*/ +#define MAX_REGISTERED_CONTENT 0x7fffU - Anything that stores MapNodes doesn't have to preserve parameters - associated with this material. - - Doesn't create faces with anything and is considered being - out-of-map in the game map. +/* + A solid walkable node with the texture unknown_node.png. + + For example, used on the client to display unregistered node IDs + (instead of expanding the vector of node definitions each time + such a node is received). */ -#define CONTENT_IGNORE 127 -#define CONTENT_IGNORE_DEFAULT_PARAM 0 +#define CONTENT_UNKNOWN 125 /* The common material through which the player can walk and which @@ -56,22 +60,57 @@ typedef u16 content_t; */ #define CONTENT_AIR 126 +/* + 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. +*/ +#define CONTENT_IGNORE 127 + enum LightBank { LIGHTBANK_DAY, LIGHTBANK_NIGHT }; +/* + Simple rotation enum. +*/ +enum Rotation { + ROTATE_0, + ROTATE_90, + ROTATE_180, + ROTATE_270, + ROTATE_RAND, +}; + /* Masks for MapNode.param2 of flowing liquids */ #define LIQUID_LEVEL_MASK 0x07 #define LIQUID_FLOW_DOWN_MASK 0x08 +//#define LIQUID_LEVEL_MASK 0x3f // better finite water +//#define LIQUID_FLOW_DOWN_MASK 0x40 // not used when finite water + /* maximum amount of liquid in a block */ #define LIQUID_LEVEL_MAX LIQUID_LEVEL_MASK #define LIQUID_LEVEL_SOURCE (LIQUID_LEVEL_MAX+1) +#define LIQUID_INFINITY_MASK 0x80 //0b10000000 + +// mask for param2, now as for liquid +#define LEVELED_MASK 0x3F +#define LEVELED_MAX LEVELED_MASK + + +struct ContentFeatures; + /* This is the stuff what the whole world consists of. */ @@ -81,10 +120,8 @@ struct MapNode { /* Main content - 0x00-0x7f: Short content type - 0x80-0xff: Long content type (param2>>4 makes up low bytes) */ - u8 param0; + u16 param0; /* Misc parameter. Initialized to 0. @@ -95,28 +132,27 @@ 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. - If param0 >= 0x80, bits 0xf0 of this is extended content type data */ u8 param2; + MapNode() + { } + MapNode(const MapNode & n) { *this = n; } - - MapNode(content_t content=CONTENT_AIR, u8 a_param1=0, u8 a_param2=0) - { - param1 = a_param1; - param2 = a_param2; - // Set content (param0 and param2&0xf0)) after other params - // because this needs to override part of param2 - setContent(content); - } - + + MapNode(content_t content, u8 a_param1=0, u8 a_param2=0) + : param0(content), + param1(a_param1), + param2(a_param2) + { } + // Create directly from a nodename // If name is unknown, sets CONTENT_IGNORE MapNode(INodeDefManager *ndef, const std::string &name, @@ -128,29 +164,15 @@ struct MapNode && param1 == other.param1 && param2 == other.param2); } - + // To be used everywhere content_t getContent() const { - if(param0 < 0x80) - return param0; - else - return (param0<<4) + (param2>>4); + return param0; } void setContent(content_t c) { - if(c < 0x80) - { - if(param0 >= 0x80) - param2 &= ~(0xf0); - param0 = c; - } - else - { - param0 = c>>4; - param2 &= ~(0xf0); - param2 |= (c&0x0f)<<4; - } + param0 = c; } u8 getParam1() const { @@ -162,25 +184,43 @@ struct MapNode } u8 getParam2() const { - if(param0 < 0x80) - return param2; - else - return param2 & 0x0f; + return param2; } void setParam2(u8 p) { - if(param0 < 0x80) - param2 = p; - else{ - param2 &= 0xf0; - param2 |= (p&0x0f); - } + param2 = p; } - + 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; + + /** + * This function differs from getLight(enum LightBank bank, INodeDefManager *nodemgr) + * in that the ContentFeatures of the node in question are not retrieved by + * the function itself. Thus, if you have already called nodemgr->get() to + * get the ContentFeatures you pass it to this function instead of the + * function getting ContentFeatures itself. Since INodeDefManager::get() + * is relatively expensive this can lead to significant performance + * improvements in some situations. Call this function if (and only if) + * you have already retrieved the ContentFeatures by calling + * INodeDefManager::get() for the node you're working with and the + * pre-conditions listed are true. + * + * @pre f != NULL + * @pre f->param_type == CPT_LIGHT + */ + u8 getLightNoChecks(LightBank bank, const ContentFeatures *f) const; + bool getLightBanks(u8 &lightday, u8 &lightnight, INodeDefManager *nodemgr) const; - + // 0 <= daylight_factor <= 1000 // 0 <= return value <= LIGHT_SUN u8 getLightBlend(u32 daylight_factor, INodeDefManager *nodemgr) const @@ -195,6 +235,31 @@ struct MapNode u8 getWallMounted(INodeDefManager *nodemgr) const; v3s16 getWallMountedDir(INodeDefManager *nodemgr) const; + void rotateAlongYAxis(INodeDefManager *nodemgr, Rotation rot); + + /* + Gets list of node boxes (used for rendering (NDT_NODEBOX)) + */ + void getNodeBoxes(INodeDefManager *nodemgr, std::vector *boxes, u8 neighbors = 0); + + /* + Gets list of selection boxes + */ + void getSelectionBoxes(INodeDefManager *nodemg, std::vector *boxes, u8 neighbors = 0); + + /* + Gets list of collision boxes + */ + void getCollisionBoxes(INodeDefManager *nodemgr, std::vector *boxes, u8 neighbors = 0); + + /* + 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); + /* Serialization functions */ @@ -202,7 +267,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). @@ -219,49 +284,8 @@ struct MapNode private: // Deprecated serialization methods - void serialize_pre22(u8 *dest, u8 version); void deSerialize_pre22(u8 *source, u8 version); }; - -/* - MapNode helpers for mesh making stuff -*/ - -#ifndef SERVER - -/* - Nodes make a face if contents differ and solidness differs. - Return value: - 0: No face - 1: Face uses m1's content - 2: Face uses m2's content - equivalent: Whether the blocks share the same face (eg. water and glass) -*/ -u8 face_contents(content_t m1, content_t m2, bool *equivalent, - INodeDefManager *nodemgr); - -/* - Gets lighting value at face of node - - Parameters must consist of air and !air. - Order doesn't matter. - - If either of the nodes doesn't exist, light is 0. - - parameters: - daynight_ratio: 0...1000 - n: getNode(p) (uses only the lighting value) - n2: getNode(p + face_dir) (uses only the lighting value) - face_dir: axis oriented unit vector from p to p2 - - returns encoded light value. -*/ -u8 getFaceLight(u32 daynight_ratio, MapNode n, MapNode n2, - v3s16 face_dir, INodeDefManager *nodemgr); - -#endif - - #endif