aboutsummaryrefslogtreecommitdiff
path: root/src/mapnode.h
diff options
context:
space:
mode:
authorPerttu Ahola <celeron55@gmail.com>2011-11-13 10:57:55 +0200
committerPerttu Ahola <celeron55@gmail.com>2011-11-29 19:13:40 +0200
commit64996422c00ddb70cfc8aee7da7b62485b8b0416 (patch)
treefdaa59ba3c52069f8935cf5d8d1cd63752edb149 /src/mapnode.h
parentf8c9b703798873c6e958560341105069dca8f86c (diff)
downloadminetest-64996422c00ddb70cfc8aee7da7b62485b8b0416.tar.gz
minetest-64996422c00ddb70cfc8aee7da7b62485b8b0416.tar.bz2
minetest-64996422c00ddb70cfc8aee7da7b62485b8b0416.zip
Move ContentFeatures to mapnode_contentfeatures.{h,cpp} and clean stuff
Diffstat (limited to 'src/mapnode.h')
-rw-r--r--src/mapnode.h463
1 files changed, 19 insertions, 444 deletions
diff --git a/src/mapnode.h b/src/mapnode.h
index 51bee0587..a93589c41 100644
--- a/src/mapnode.h
+++ b/src/mapnode.h
@@ -44,20 +44,6 @@ typedef u16 content_t;
#define MAX_CONTENT 0xfff
/*
- Initializes all kind of stuff in here.
- Many things depend on this.
-
- This accesses g_texturesource; if it is non-NULL, textures are set.
-
- Client first calls this with g_texturesource=NULL to run some
- unit tests and stuff, then it runs this again with g_texturesource
- defined to get the textures.
-
- Server only calls this once with g_texturesource=NULL.
-*/
-void init_mapnode();
-
-/*
Ignored node.
Anything that stores MapNodes doesn't have to preserve parameters
@@ -66,7 +52,6 @@ void init_mapnode();
Doesn't create faces with anything and is considered being
out-of-map in the game map.
*/
-//#define CONTENT_IGNORE 255
#define CONTENT_IGNORE 127
#define CONTENT_IGNORE_DEFAULT_PARAM 0
@@ -74,306 +59,9 @@ void init_mapnode();
The common material through which the player can walk and which
is transparent to light
*/
-//#define CONTENT_AIR 254
#define CONTENT_AIR 126
/*
- Content feature list
-*/
-
-enum ContentParamType
-{
- CPT_NONE,
- CPT_LIGHT,
- CPT_MINERAL,
- // Direction for chests and furnaces and such
- CPT_FACEDIR_SIMPLE
-};
-
-enum LiquidType
-{
- LIQUID_NONE,
- LIQUID_FLOWING,
- LIQUID_SOURCE
-};
-
-struct MapNode;
-class NodeMetadata;
-
-struct ContentFeatures
-{
-#ifndef SERVER
- /*
- 0: up
- 1: down
- 2: right
- 3: left
- 4: back
- 5: front
- */
- TileSpec tiles[6];
-
- video::ITexture *inventory_texture;
-
- // Used currently for flowing liquids
- u8 vertex_alpha;
- // Post effect color, drawn when the camera is inside the node.
- video::SColor post_effect_color;
- // Special irrlicht material, used sometimes
- video::SMaterial *special_material;
- video::SMaterial *special_material2;
- AtlasPointer *special_atlas;
-#endif
-
- // List of all block textures that have been used (value is dummy)
- // Exists on server too for cleaner code in content_mapnode.cpp
- core::map<std::string, bool> used_texturenames;
-
- // Type of MapNode::param1
- ContentParamType param_type;
- // True for all ground-like things like stone and mud, false for eg. trees
- bool is_ground_content;
- bool light_propagates;
- bool sunlight_propagates;
- u8 solidness; // Used when choosing which face is drawn
- u8 visual_solidness; // When solidness=0, this tells how it looks like
- // This is used for collision detection.
- // Also for general solidness queries.
- bool walkable;
- // Player can point to these
- bool pointable;
- // Player can dig these
- bool diggable;
- // Player can climb these
- bool climbable;
- // Player can build on these
- bool buildable_to;
- // Whether the node has no liquid, source liquid or flowing liquid
- enum LiquidType liquid_type;
- // If true, param2 is set to direction when placed. Used for torches.
- // NOTE: the direction format is quite inefficient and should be changed
- bool wall_mounted;
- // If true, node is equivalent to air. Torches are, air is. Water is not.
- // Is used for example to check whether a mud block can have grass on.
- bool air_equivalent;
- // Whether this content type often contains mineral.
- // Used for texture atlas creation.
- // Currently only enabled for CONTENT_STONE.
- bool often_contains_mineral;
-
- // Inventory item string as which the node appears in inventory when dug.
- // Mineral overrides this.
- std::string dug_item;
-
- // Extra dug item and its rarity
- std::string extra_dug_item;
- s32 extra_dug_item_rarity;
-
- // Initial metadata is cloned from this
- NodeMetadata *initial_metadata;
-
- // If the content is liquid, this is the flowing version of the liquid.
- // If content is liquid, this is the same content.
- content_t liquid_alternative_flowing;
- // If the content is liquid, this is the source version of the liquid.
- content_t liquid_alternative_source;
- // Viscosity for fluid flow, ranging from 1 to 7, with
- // 1 giving almost instantaneous propagation and 7 being
- // the slowest possible
- u8 liquid_viscosity;
-
- // Amount of light the node emits
- u8 light_source;
-
- // Digging properties for different tools
- DiggingPropertiesList digging_properties;
-
- u32 damage_per_second;
-
- // NOTE: Move relevant properties to here from elsewhere
-
- void reset()
- {
-#ifndef SERVER
- inventory_texture = NULL;
-
- vertex_alpha = 255;
- post_effect_color = video::SColor(0, 0, 0, 0);
- special_material = NULL;
- special_material2 = NULL;
- special_atlas = NULL;
-#endif
- param_type = CPT_NONE;
- is_ground_content = false;
- light_propagates = false;
- sunlight_propagates = false;
- solidness = 2;
- visual_solidness = 0;
- walkable = true;
- pointable = true;
- diggable = true;
- climbable = false;
- buildable_to = false;
- liquid_type = LIQUID_NONE;
- wall_mounted = false;
- air_equivalent = false;
- often_contains_mineral = false;
- dug_item = "";
- initial_metadata = NULL;
- liquid_alternative_flowing = CONTENT_IGNORE;
- liquid_alternative_source = CONTENT_IGNORE;
- liquid_viscosity = 0;
- light_source = 0;
- digging_properties.clear();
- damage_per_second = 0;
- }
-
- ContentFeatures()
- {
- reset();
- }
-
- ~ContentFeatures();
-
- /*
- Quickhands for simple materials
- */
-
-#ifdef SERVER
- void setTexture(u16 i, std::string name, u8 alpha=255)
- {}
- void setAllTextures(std::string name, u8 alpha=255)
- {}
-#else
- void setTexture(u16 i, std::string name, u8 alpha=255);
-
- void setAllTextures(std::string name, u8 alpha=255)
- {
- for(u16 i=0; i<6; i++)
- {
- setTexture(i, name, alpha);
- }
- // Force inventory texture too
- setInventoryTexture(name);
- }
-#endif
-
-#ifndef SERVER
- void setTile(u16 i, const TileSpec &tile)
- {
- tiles[i] = tile;
- }
- void setAllTiles(const TileSpec &tile)
- {
- for(u16 i=0; i<6; i++)
- {
- setTile(i, tile);
- }
- }
-#endif
-
-#ifdef SERVER
- void setInventoryTexture(std::string imgname)
- {}
- void setInventoryTextureCube(std::string top,
- std::string left, std::string right)
- {}
-#else
- void setInventoryTexture(std::string imgname);
-
- void setInventoryTextureCube(std::string top,
- std::string left, std::string right);
-#endif
-};
-
-/*
- Call this to access the ContentFeature list
-*/
-ContentFeatures & content_features(content_t i);
-ContentFeatures & content_features(MapNode &n);
-
-/*
- Here is a bunch of DEPRECATED functions.
-*/
-
-/*
- If true, the material allows light propagation and brightness is stored
- in param.
- NOTE: Don't use, use "content_features(m).whatever" instead
-*/
-inline bool light_propagates_content(content_t m)
-{
- return content_features(m).light_propagates;
-}
-/*
- If true, the material allows lossless sunlight propagation.
- NOTE: It doesn't seem to go through torches regardlessly of this
- NOTE: Don't use, use "content_features(m).whatever" instead
-*/
-inline bool sunlight_propagates_content(content_t m)
-{
- return content_features(m).sunlight_propagates;
-}
-/*
- On a node-node surface, the material of the node with higher solidness
- is used for drawing.
- 0: Invisible
- 1: Transparent
- 2: Opaque
- NOTE: Don't use, use "content_features(m).whatever" instead
-*/
-inline u8 content_solidness(content_t m)
-{
- return content_features(m).solidness;
-}
-// Objects collide with walkable contents
-// NOTE: Don't use, use "content_features(m).whatever" instead
-inline bool content_walkable(content_t m)
-{
- return content_features(m).walkable;
-}
-// NOTE: Don't use, use "content_features(m).whatever" instead
-inline bool content_liquid(content_t m)
-{
- return content_features(m).liquid_type != LIQUID_NONE;
-}
-// NOTE: Don't use, use "content_features(m).whatever" instead
-inline bool content_flowing_liquid(content_t m)
-{
- return content_features(m).liquid_type == LIQUID_FLOWING;
-}
-// NOTE: Don't use, use "content_features(m).whatever" instead
-inline bool content_liquid_source(content_t m)
-{
- return content_features(m).liquid_type == LIQUID_SOURCE;
-}
-// CONTENT_WATER || CONTENT_WATERSOURCE -> CONTENT_WATER
-// CONTENT_LAVA || CONTENT_LAVASOURCE -> CONTENT_LAVA
-// NOTE: Don't use, use "content_features(m).whatever" instead
-inline content_t make_liquid_flowing(content_t m)
-{
- u8 c = content_features(m).liquid_alternative_flowing;
- assert(c != CONTENT_IGNORE);
- return c;
-}
-// Pointable contents can be pointed to in the map
-// NOTE: Don't use, use "content_features(m).whatever" instead
-inline bool content_pointable(content_t m)
-{
- return content_features(m).pointable;
-}
-// NOTE: Don't use, use "content_features(m).whatever" instead
-inline bool content_diggable(content_t m)
-{
- return content_features(m).diggable;
-}
-// NOTE: Don't use, use "content_features(m).whatever" instead
-inline bool content_buildable_to(content_t m)
-{
- return content_features(m).buildable_to;
-}
-
-/*
Nodes make a face if contents differ and solidness differs.
Return value:
0: No face
@@ -384,50 +72,11 @@ inline bool content_buildable_to(content_t m)
u8 face_contents(content_t m1, content_t m2, bool *equivalent);
/*
- Packs directions like (1,0,0), (1,-1,0)
+ Packs directions like (1,0,0), (1,-1,0) in six bits.
+ NOTE: This wastes way too much space for most purposes.
*/
-inline u8 packDir(v3s16 dir)
-{
- u8 b = 0;
-
- if(dir.X > 0)
- b |= (1<<0);
- else if(dir.X < 0)
- b |= (1<<1);
-
- if(dir.Y > 0)
- b |= (1<<2);
- else if(dir.Y < 0)
- b |= (1<<3);
-
- if(dir.Z > 0)
- b |= (1<<4);
- else if(dir.Z < 0)
- b |= (1<<5);
-
- return b;
-}
-inline v3s16 unpackDir(u8 b)
-{
- v3s16 d(0,0,0);
-
- if(b & (1<<0))
- d.X = 1;
- else if(b & (1<<1))
- d.X = -1;
-
- if(b & (1<<2))
- d.Y = 1;
- else if(b & (1<<3))
- d.Y = -1;
-
- if(b & (1<<4))
- d.Z = 1;
- else if(b & (1<<5))
- d.Z = -1;
-
- return d;
-}
+u8 packDir(v3s16 dir);
+v3s16 unpackDir(u8 b);
/*
facedir: CPT_FACEDIR_SIMPLE param1 value
@@ -467,11 +116,7 @@ struct MapNode
0x00-0x7f: Short content type
0x80-0xff: Long content type (param2>>4 makes up low bytes)
*/
- union
- {
- u8 param0;
- //u8 d;
- };
+ u8 param0;
/*
Misc parameter. Initialized to 0.
@@ -482,22 +127,14 @@ struct MapNode
- Mineral content (should be removed from here)
- Uhh... well, most blocks have light or nothing in here.
*/
- union
- {
- u8 param1;
- //s8 param;
- };
+ 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
*/
- union
- {
- u8 param2;
- //u8 dir;
- };
+ u8 param2;
MapNode(const MapNode & n)
{
@@ -506,10 +143,10 @@ struct MapNode
MapNode(content_t content=CONTENT_AIR, u8 a_param1=0, u8 a_param2=0)
{
- //param0 = a_param0;
param1 = a_param1;
param2 = a_param2;
- // Set after other params because this needs to override part of param2
+ // Set content (param0 and (param2&0xf0)) after other params
+ // because this needs to override part of param2
setContent(content);
}
@@ -547,57 +184,14 @@ struct MapNode
/*
These four are DEPRECATED I guess. -c55
*/
- bool light_propagates()
- {
- return light_propagates_content(getContent());
- }
- bool sunlight_propagates()
- {
- return sunlight_propagates_content(getContent());
- }
- u8 solidness()
- {
- return content_solidness(getContent());
- }
- u8 light_source()
- {
- return content_features(*this).light_source;
- }
-
- u8 getLightBanksWithSource()
- {
- // Select the brightest of [light source, propagated light]
- u8 lightday = 0;
- u8 lightnight = 0;
- if(content_features(*this).param_type == CPT_LIGHT)
- {
- lightday = param1 & 0x0f;
- lightnight = (param1>>4)&0x0f;
- }
- if(light_source() > lightday)
- lightday = light_source();
- if(light_source() > lightnight)
- lightnight = light_source();
- return (lightday&0x0f) | ((lightnight<<4)&0xf0);
- }
-
- u8 getLight(enum LightBank bank)
- {
- // Select the brightest of [light source, propagated light]
- u8 light = 0;
- if(content_features(*this).param_type == CPT_LIGHT)
- {
- if(bank == LIGHTBANK_DAY)
- light = param1 & 0x0f;
- else if(bank == LIGHTBANK_NIGHT)
- light = (param1>>4)&0x0f;
- else
- assert(0);
- }
- if(light_source() > light)
- light = light_source();
- return light;
- }
+ bool light_propagates();
+ bool sunlight_propagates();
+ u8 solidness();
+ u8 light_source();
+
+ void setLight(enum LightBank bank, u8 a_light);
+ u8 getLight(enum LightBank bank);
+ u8 getLightBanksWithSource();
// 0 <= daylight_factor <= 1000
// 0 <= return value <= LIGHT_SUN
@@ -625,25 +219,6 @@ struct MapNode
return mix;
}*/
- void setLight(enum LightBank bank, u8 a_light)
- {
- // If node doesn't contain light data, ignore this
- if(content_features(*this).param_type != CPT_LIGHT)
- return;
- if(bank == LIGHTBANK_DAY)
- {
- param1 &= 0xf0;
- param1 |= a_light & 0x0f;
- }
- else if(bank == LIGHTBANK_NIGHT)
- {
- param1 &= 0x0f;
- param1 |= (a_light & 0x0f)<<4;
- }
- else
- assert(0);
- }
-
// In mapnode.cpp
#ifndef SERVER
/*
@@ -681,8 +256,8 @@ struct MapNode
parameters:
daynight_ratio: 0...1000
- n: getNodeParent(p)
- n2: getNodeParent(p + face_dir)
+ 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.