#ifndef SERVER
#include "client/tile.h"
#include "shader.h"
+class Client;
#endif
#include "itemgroup.h"
#include "sound.h" // SimpleSoundSpec
#include "constants.h" // BS
+#include "tileanimation.h"
class INodeDefManager;
class IItemDefManager;
CPT2_LEVELED,
// 2D rotation for things like plants
CPT2_DEGROTATE,
+ // Mesh options for plants
+ CPT2_MESHOPTIONS,
+ // Index for palette
+ CPT2_COLOR,
+ // 3 bits of palette index, then facedir
+ CPT2_COLORED_FACEDIR,
+ // 5 bits of palette index, then wallmounted
+ CPT2_COLORED_WALLMOUNTED
};
enum LiquidType
NODEBOX_FIXED, // Static separately defined box(es)
NODEBOX_WALLMOUNTED, // Box for wall mounted nodes; (top, bottom, side)
NODEBOX_LEVELED, // Same as fixed, but with dynamic height from param2. for snow, ...
+ NODEBOX_CONNECTED, // optionally draws nodeboxes if a neighbor node attaches
};
struct NodeBox
aabb3f wall_top;
aabb3f wall_bottom;
aabb3f wall_side; // being at the -X side
+ // NODEBOX_CONNECTED
+ std::vector<aabb3f> connect_top;
+ std::vector<aabb3f> connect_bottom;
+ std::vector<aabb3f> connect_front;
+ std::vector<aabb3f> connect_left;
+ std::vector<aabb3f> connect_back;
+ std::vector<aabb3f> connect_right;
NodeBox()
{ reset(); }
struct MapNode;
class NodeMetadata;
-/*
- Stand-alone definition of a TileSpec (basically a server-side TileSpec)
-*/
-enum TileAnimationType{
- TAT_NONE=0,
- TAT_VERTICAL_FRAMES=1,
+enum LeavesStyle {
+ LEAVES_FANCY,
+ LEAVES_SIMPLE,
+ LEAVES_OPAQUE,
};
-struct TileDef
-{
- std::string name;
- bool backface_culling; // Takes effect only in special cases
- bool tileable_horizontal;
- bool tileable_vertical;
- struct{
- enum TileAnimationType type;
- int aspect_w; // width for aspect ratio
- int aspect_h; // height for aspect ratio
- float length; // seconds
- } animation;
- TileDef()
- {
- name = "";
- backface_culling = true;
- tileable_horizontal = true;
- tileable_vertical = true;
- animation.type = TAT_NONE;
- animation.aspect_w = 1;
- animation.aspect_h = 1;
- animation.length = 1.0;
- }
+class TextureSettings {
+public:
+ LeavesStyle leaves_style;
+ bool opaque_water;
+ bool connected_glass;
+ bool use_normal_texture;
+ bool enable_mesh_cache;
+ bool enable_minimap;
- void serialize(std::ostream &os, u16 protocol_version) const;
- void deSerialize(std::istream &is, bool culling_ignore);
+ TextureSettings() {}
+
+ void readSettings();
};
enum NodeDrawType
NDT_MESH, // Uses static meshes
};
+/*
+ Stand-alone definition of a TileSpec (basically a server-side TileSpec)
+*/
+
+struct TileDef
+{
+ std::string name;
+ bool backface_culling; // Takes effect only in special cases
+ bool tileable_horizontal;
+ bool tileable_vertical;
+ //! If true, the tile has its own color.
+ bool has_color;
+ //! The color of the tile.
+ video::SColor color;
+
+ struct TileAnimationParams animation;
+
+ TileDef()
+ {
+ name = "";
+ backface_culling = true;
+ tileable_horizontal = true;
+ tileable_vertical = true;
+ has_color = false;
+ color = video::SColor(0xFFFFFFFF);
+ animation.type = TAT_NONE;
+ }
+
+ void serialize(std::ostream &os, u16 protocol_version) const;
+ void deSerialize(std::istream &is, const u8 contentfeatures_version, const NodeDrawType drawtype);
+};
+
#define CF_SPECIAL_COUNT 6
struct ContentFeatures
{
/*
Cached stuff
- */
+ */
#ifndef SERVER
// 0 1 2 3 4 5
// up down right left back front
/*
Actual data
- */
+ */
+
+ // --- GENERAL PROPERTIES ---
std::string name; // "" = undefined node
ItemGroupList groups; // Same as in itemdef
+ // Type of MapNode::param1
+ ContentParamType param_type;
+ // Type of MapNode::param2
+ ContentParamType2 param_type_2;
+
+ // --- VISUAL PROPERTIES ---
- // Visual definition
enum NodeDrawType drawtype;
std::string mesh;
#ifndef SERVER
float visual_scale; // Misc. scale parameter
TileDef tiledef[6];
TileDef tiledef_special[CF_SPECIAL_COUNT]; // eg. flowing liquid
+ // If 255, the node is opaque.
+ // Otherwise it uses texture alpha.
u8 alpha;
-
+ // The color of the node.
+ video::SColor color;
+ std::string palette_name;
+ std::vector<video::SColor> *palette;
+ // Used for waving leaves/plants
+ u8 waving;
+ // for NDT_CONNECTED pairing
+ u8 connect_sides;
+ std::vector<std::string> connects_to;
+ std::set<content_t> connects_to_ids;
// Post effect color, drawn when the camera is inside the node.
video::SColor post_effect_color;
+ // Flowing liquid or snow, value = default level
+ u8 leveled;
+
+ // --- LIGHTING-RELATED ---
- // Type of MapNode::param1
- ContentParamType param_type;
- // Type of MapNode::param2
- ContentParamType2 param_type_2;
- // True for all ground-like things like stone and mud, false for eg. trees
- bool is_ground_content;
bool light_propagates;
bool sunlight_propagates;
+ // Amount of light the node emits
+ u8 light_source;
+
+ // --- MAP GENERATION ---
+
+ // True for all ground-like things like stone and mud, false for eg. trees
+ bool is_ground_content;
+
+ // --- INTERACTION PROPERTIES ---
+
// This is used for collision detection.
// Also for general solidness queries.
bool walkable;
bool climbable;
// Player can build on these
bool buildable_to;
- // Liquids flow into and replace node
- bool floodable;
// Player cannot build to these (placement prediction disabled)
bool rightclickable;
- // Flowing liquid or snow, value = default level
- u8 leveled;
+ u32 damage_per_second;
+
+ // --- LIQUID PROPERTIES ---
+
// Whether the node is non-liquid, source liquid or flowing liquid
enum LiquidType liquid_type;
// If the content is liquid, this is the flowing version of the liquid.
// Number of flowing liquids surrounding source
u8 liquid_range;
u8 drowning;
- // Amount of light the node emits
- u8 light_source;
- u32 damage_per_second;
+ // Liquids flow into and replace node
+ bool floodable;
+
+ // --- NODEBOXES ---
+
NodeBox node_box;
NodeBox selection_box;
NodeBox collision_box;
- // Used for waving leaves/plants
- u8 waving;
+
+ // --- SOUND PROPERTIES ---
+
+ SimpleSoundSpec sound_footstep;
+ SimpleSoundSpec sound_dig;
+ SimpleSoundSpec sound_dug;
+
+ // --- LEGACY ---
+
// Compatibility with old maps
// Set to true if paramtype used to be 'facedir_simple'
bool legacy_facedir_simple;
// Set to true if wall_mounted used to be set to true
bool legacy_wallmounted;
- // Sound properties
- SimpleSoundSpec sound_footstep;
- SimpleSoundSpec sound_dig;
- SimpleSoundSpec sound_dug;
-
/*
Methods
*/
void deSerialize(std::istream &is);
void serializeOld(std::ostream &os, u16 protocol_version) const;
void deSerializeOld(std::istream &is, int version);
+ /*!
+ * Since vertex alpha is no lnger supported, this method
+ * adds instructions to the texture names to blend alpha there.
+ *
+ * tiledef, tiledef_special and alpha must be initialized
+ * before calling this.
+ */
+ void correctAlpha();
/*
Some handy methods
if(!isLiquid() || !f.isLiquid()) return false;
return (liquid_alternative_flowing == f.liquid_alternative_flowing);
}
+
+#ifndef SERVER
+ void fillTileAttribs(ITextureSource *tsrc, TileSpec *tile, TileDef *tiledef,
+ u32 shader_id, bool use_normal_texture, bool backface_culling,
+ u8 material_type);
+ void updateTextures(ITextureSource *tsrc, IShaderSource *shdsrc,
+ scene::IMeshManipulator *meshmanip, Client *client, const TextureSettings &tsettings);
+#endif
};
class INodeDefManager {
virtual bool getId(const std::string &name, content_t &result) const=0;
virtual content_t getId(const std::string &name) const=0;
// Allows "group:name" in addition to regular node names
- virtual void getIds(const std::string &name, std::set<content_t> &result)
+ // returns false if node name not found, true otherwise
+ virtual bool getIds(const std::string &name, std::set<content_t> &result)
const=0;
virtual const ContentFeatures &get(const std::string &name) const=0;
virtual void pendNodeResolve(NodeResolver *nr)=0;
virtual bool cancelNodeResolveCallback(NodeResolver *nr)=0;
+ virtual bool nodeboxConnects(const MapNode from, const MapNode to, u8 connect_face)=0;
+ /*!
+ * Returns the smallest box in node coordinates that
+ * contains all nodes' selection boxes.
+ */
+ virtual core::aabbox3d<s16> getSelectionBoxIntUnion() const=0;
};
class IWritableNodeDefManager : public INodeDefManager {
// If not found, returns CONTENT_IGNORE
virtual content_t getId(const std::string &name) const=0;
// Allows "group:name" in addition to regular node names
- virtual void getIds(const std::string &name, std::set<content_t> &result)
+ virtual bool getIds(const std::string &name, std::set<content_t> &result)
const=0;
// If not found, returns the features of CONTENT_UNKNOWN
virtual const ContentFeatures &get(const std::string &name) const=0;
const ContentFeatures &def)=0;
// If returns CONTENT_IGNORE, could not allocate id
virtual content_t allocateDummy(const std::string &name)=0;
+ // Remove a node
+ virtual void removeNode(const std::string &name)=0;
/*
Update item alias mapping.
virtual bool cancelNodeResolveCallback(NodeResolver *nr)=0;
virtual void runNodeResolveCallbacks()=0;
virtual void resetNodeResolveState()=0;
+ virtual void mapNodeboxConnections()=0;
+ virtual core::aabbox3d<s16> getSelectionBoxIntUnion() const=0;
};
IWritableNodeDefManager *createNodeDefManager();