X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fmapnode.h;h=f19885d87614f6e38e04254ce59bf06c2a94b3d2;hb=41bc24477b732b74bd18839a9742d32bd85d1b44;hp=37826dcdec545ea5450ab47454e5208a633cc697;hpb=037b2591971d752e67fa7d47095b996b3f56da5a;p=minetest.git diff --git a/src/mapnode.h b/src/mapnode.h index 37826dcde..f19885d87 100644 --- a/src/mapnode.h +++ b/src/mapnode.h @@ -1,6 +1,6 @@ /* -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 Lesser General Public License as published by @@ -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,54 @@ 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 + /* This is the stuff what the whole world consists of. */ @@ -81,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. @@ -99,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; @@ -110,11 +143,9 @@ 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 @@ -132,25 +163,11 @@ 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 { @@ -162,19 +179,11 @@ 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); @@ -191,9 +200,39 @@ struct MapNode return blend_light(daylight_factor, lightday, lightnight); } + // 0.0 <= daylight_factor <= 1.0 + // 0 <= return value <= LIGHT_SUN + u8 getLightBlendF1(float daylight_factor, INodeDefManager *nodemgr) const + { + 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 list of node boxes (used for rendering (NDT_NODEBOX) + and collision) + */ + 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 @@ -219,7 +258,6 @@ struct MapNode private: // Deprecated serialization methods - void serialize_pre22(u8 *dest, u8 version); void deSerialize_pre22(u8 *source, u8 version); };