X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fmapnode.h;h=f19885d87614f6e38e04254ce59bf06c2a94b3d2;hb=bd6d4666abe20247437ede28f73955d413fe5e22;hp=285f197db995bd7a47dac0783b79736808e29d9e;hpb=c0f6395cf09f658eb95365c60f67b8a89104cb23;p=minetest.git diff --git a/src/mapnode.h b/src/mapnode.h index 285f197db..f19885d87 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,61 +34,43 @@ 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 bytes are free */ typedef u16 content_t; -#define MAX_CONTENT 0xfff /* - Ignored node. - - 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. + 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 CONTENT_IGNORE 127 -#define CONTENT_IGNORE_DEFAULT_PARAM 0 +#define MAX_REGISTERED_CONTENT 0x7fffU /* - The common material through which the player can walk and which - is transparent to light -*/ -#define CONTENT_AIR 126 + A solid walkable node with the texture unknown_node.png. -#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) + 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). */ -u8 face_contents(content_t m1, content_t m2, bool *equivalent, - INodeDefManager *nodemgr); -#endif +#define CONTENT_UNKNOWN 125 /* - Packs directions like (1,0,0), (1,-1,0) in six bits. - NOTE: This wastes way too much space for most purposes. + The common material through which the player can walk and which + is transparent to light */ -u8 packDir(v3s16 dir); -v3s16 unpackDir(u8 b); +#define CONTENT_AIR 126 /* - facedir: CPT_FACEDIR_SIMPLE param1 value - dir: The face for which stuff is wanted - return value: The face from which the stuff is actually found - - NOTE: Currently this uses 2 bits for Z-,X-,Z+,X+, should there be Y+ - and Y- too? + 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. */ -v3s16 facedir_rotate(u8 facedir, v3s16 dir); +#define CONTENT_IGNORE 127 enum LightBank { @@ -92,16 +78,36 @@ enum LightBank 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 + /* This is the stuff what the whole world consists of. */ @@ -111,10 +117,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. @@ -122,7 +126,6 @@ struct MapNode stored logarithmically from 0 to LIGHT_MAX. Sunlight is LIGHT_SUN, which is LIGHT_MAX+1. - Contains 2 values, day- and night lighting. Each takes 4 bits. - - Mineral content (should be removed from here) - Uhh... well, most blocks have light or nothing in here. */ u8 param1; @@ -130,7 +133,6 @@ struct MapNode /* 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; @@ -141,12 +143,15 @@ struct MapNode MapNode(content_t content=CONTENT_AIR, u8 a_param1=0, u8 a_param2=0) { + param0 = content; 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); } + + // Create directly from a nodename + // If name is unknown, sets CONTENT_IGNORE + MapNode(INodeDefManager *ndef, const std::string &name, + u8 a_param1=0, u8 a_param2=0); bool operator==(const MapNode &other) { @@ -158,63 +163,77 @@ struct MapNode // 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 + { + return param1; + } + void setParam1(u8 p) + { + param1 = p; + } + u8 getParam2() const + { + return param2; + } + void setParam2(u8 p) + { + param2 = p; } void setLight(enum LightBank bank, u8 a_light, INodeDefManager *nodemgr); u8 getLight(enum LightBank bank, INodeDefManager *nodemgr) const; - u8 getLightBanksWithSource(INodeDefManager *nodemgr) 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 { - u8 l = ((daylight_factor * getLight(LIGHTBANK_DAY, nodemgr) - + (1000-daylight_factor) * getLight(LIGHTBANK_NIGHT, nodemgr)) - )/1000; - u8 max = LIGHT_MAX; - if(getLight(LIGHTBANK_DAY, nodemgr) == LIGHT_SUN) - max = LIGHT_SUN; - if(l > max) - l = max; - return l; + u8 lightday = 0; + u8 lightnight = 0; + getLightBanks(lightday, lightnight, nodemgr); + return blend_light(daylight_factor, lightday, lightnight); } - /*// 0 <= daylight_factor <= 1000 - // 0 <= return value <= 255 - u8 getLightBlend(u32 daylight_factor, INodeDefManager *nodemgr) + + // 0.0 <= daylight_factor <= 1.0 + // 0 <= return value <= LIGHT_SUN + u8 getLightBlendF1(float daylight_factor, INodeDefManager *nodemgr) const { - u8 daylight = decode_light(getLight(LIGHTBANK_DAY, nodemgr)); - u8 nightlight = decode_light(getLight(LIGHTBANK_NIGHT, nodemgr)); - u8 mix = ((daylight_factor * daylight - + (1000-daylight_factor) * nightlight) - )/1000; - return mix; - }*/ + u8 lightday = 0; + u8 lightnight = 0; + getLightBanks(lightday, lightnight, nodemgr); + return blend_light_f1(daylight_factor, lightday, lightnight); + } + + u8 getFaceDir(INodeDefManager *nodemgr) const; + u8 getWallMounted(INodeDefManager *nodemgr) const; + v3s16 getWallMountedDir(INodeDefManager *nodemgr) const; + + void rotateAlongYAxis(INodeDefManager *nodemgr, Rotation rot); /* - Gets mineral content of node, if there is any. - MINERAL_NONE if doesn't contain or isn't able to contain mineral. + Gets list of node boxes (used for rendering (NDT_NODEBOX) + and collision) */ - u8 getMineral(INodeDefManager *nodemgr) const; - + std::vector getNodeBoxes(INodeDefManager *nodemgr) const; + + /* + Gets list of selection boxes + */ + std::vector getSelectionBoxes(INodeDefManager *nodemgr) const; + + /* 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 */ @@ -223,26 +242,24 @@ struct MapNode void serialize(u8 *dest, u8 version); void deSerialize(u8 *source, u8 version); -}; - -/* - Gets lighting value at face of node - - Parameters must consist of air and !air. - Order doesn't matter. + // 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). + // version = serialization version. Must be >= 22 + // content_width = the number of bytes of content per node + // params_width = the number of bytes of params per node + // compressed = true to zlib-compress output + static void serializeBulk(std::ostream &os, int version, + const MapNode *nodes, u32 nodecount, + u8 content_width, u8 params_width, bool compressed); + static void deSerializeBulk(std::istream &is, int version, + MapNode *nodes, u32 nodecount, + u8 content_width, u8 params_width, bool compressed); - 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); +private: + // Deprecated serialization methods + void deSerialize_pre22(u8 *source, u8 version); +}; #endif