X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fnodedef.h;h=1392e51d41005cfb93d9d905cf35f62930d65f64;hb=5f489efc69e5e8e31891481d412ad569a6e1bcf8;hp=db36021cfc1fdb6ca09b82626281165e015ed0fe;hpb=47464c9344a1a4817ad6e4c6ec44526df305b1f6;p=oweals%2Fminetest.git diff --git a/src/nodedef.h b/src/nodedef.h index db36021cf..1392e51d4 100644 --- a/src/nodedef.h +++ b/src/nodedef.h @@ -17,23 +17,23 @@ with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef NODEDEF_HEADER -#define NODEDEF_HEADER +#pragma once #include "irrlichttypes_bloated.h" #include #include #include #include -#include "util/numeric.h" #include "mapnode.h" #ifndef SERVER #include "client/tile.h" -#include "shader.h" +#include +class Client; #endif #include "itemgroup.h" #include "sound.h" // SimpleSoundSpec #include "constants.h" // BS +#include "tileanimation.h" class INodeDefManager; class IItemDefManager; @@ -65,6 +65,16 @@ enum ContentParamType2 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, + // Glasslike framed drawtype internal liquid level, param2 values 0 to 63 + CPT2_GLASSLIKE_LIQUID_LEVEL, }; enum LiquidType @@ -80,6 +90,7 @@ enum NodeBoxType 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 @@ -92,6 +103,13 @@ struct NodeBox aabb3f wall_top; aabb3f wall_bottom; aabb3f wall_side; // being at the -X side + // NODEBOX_CONNECTED + std::vector connect_top; + std::vector connect_bottom; + std::vector connect_front; + std::vector connect_left; + std::vector connect_back; + std::vector connect_right; NodeBox() { reset(); } @@ -104,64 +122,110 @@ struct NodeBox struct MapNode; class NodeMetadata; +enum LeavesStyle { + LEAVES_FANCY, + LEAVES_SIMPLE, + LEAVES_OPAQUE, +}; + +class TextureSettings { +public: + LeavesStyle leaves_style; + bool opaque_water; + bool connected_glass; + bool use_normal_texture; + bool enable_mesh_cache; + bool enable_minimap; + + TextureSettings() = default; + + void readSettings(); +}; + enum NodeDrawType { - NDT_NORMAL, // A basic solid block - NDT_AIRLIKE, // Nothing is drawn - NDT_LIQUID, // Do not draw face towards same kind of flowing/source liquid - NDT_FLOWINGLIQUID, // A very special kind of thing - NDT_GLASSLIKE, // Glass-like, don't draw faces towards other glass - NDT_ALLFACES, // Leaves-like, draw all faces no matter what - NDT_ALLFACES_OPTIONAL, // Fancy -> allfaces, fast -> normal + // A basic solid block + NDT_NORMAL, + // Nothing is drawn + NDT_AIRLIKE, + // Do not draw face towards same kind of flowing/source liquid + NDT_LIQUID, + // A very special kind of thing + NDT_FLOWINGLIQUID, + // Glass-like, don't draw faces towards other glass + NDT_GLASSLIKE, + // Leaves-like, draw all faces no matter what + NDT_ALLFACES, + // Enabled -> ndt_allfaces, disabled -> ndt_normal + NDT_ALLFACES_OPTIONAL, + // Single plane perpendicular to a surface NDT_TORCHLIKE, + // Single plane parallel to a surface NDT_SIGNLIKE, + // 2 vertical planes in a 'X' shape diagonal to XZ axes. + // paramtype2 = "meshoptions" allows various forms, sizes and + // vertical and horizontal random offsets. NDT_PLANTLIKE, + // Fenceposts that connect to neighbouring fenceposts with horizontal bars NDT_FENCELIKE, + // Selects appropriate junction texture to connect like rails to + // neighbouring raillikes. NDT_RAILLIKE, + // Custom Lua-definable structure of multiple cuboids NDT_NODEBOX, - NDT_GLASSLIKE_FRAMED, // Glass-like, draw connected frames and all all - // visible faces - // uses 2 textures, one for frames, second for faces - NDT_FIRELIKE, // Draw faces slightly rotated and only on connecting nodes, - NDT_GLASSLIKE_FRAMED_OPTIONAL, // enabled -> connected, disabled -> Glass-like - // uses 2 textures, one for frames, second for faces - NDT_MESH, // Uses static meshes + // Glass-like, draw connected frames and all visible faces. + // param2 > 0 defines 64 levels of internal liquid + // Uses 3 textures, one for frames, second for faces, + // optional third is a 'special tile' for the liquid. + NDT_GLASSLIKE_FRAMED, + // Draw faces slightly rotated and only on neighbouring nodes + NDT_FIRELIKE, + // Enabled -> ndt_glasslike_framed, disabled -> ndt_glasslike + NDT_GLASSLIKE_FRAMED_OPTIONAL, + // Uses static meshes + NDT_MESH, + // Combined plantlike-on-solid + NDT_PLANTLIKE_ROOTED, +}; + +// Mesh options for NDT_PLANTLIKE with CPT2_MESHOPTIONS +static const u8 MO_MASK_STYLE = 0x07; +static const u8 MO_BIT_RANDOM_OFFSET = 0x08; +static const u8 MO_BIT_SCALE_SQRT2 = 0x10; +static const u8 MO_BIT_RANDOM_OFFSET_Y = 0x20; +enum PlantlikeStyle { + PLANT_STYLE_CROSS, + PLANT_STYLE_CROSS2, + PLANT_STYLE_STAR, + PLANT_STYLE_HASH, + PLANT_STYLE_HASH2, }; /* Stand-alone definition of a TileSpec (basically a server-side TileSpec) */ -enum TileAnimationType{ - TAT_NONE=0, - TAT_VERTICAL_FRAMES=1, -}; + 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; + std::string name = ""; + bool backface_culling = true; // Takes effect only in special cases + bool tileable_horizontal = true; + bool tileable_vertical = true; + //! If true, the tile has its own color. + bool has_color = false; + //! The color of the tile. + video::SColor color = video::SColor(0xFFFFFFFF); + + struct TileAnimationParams 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; } void serialize(std::ostream &os, u16 protocol_version) const; - void deSerialize(std::istream &is, const u8 contentfeatures_version, const NodeDrawType drawtype); + void deSerialize(std::istream &is, u8 contentfeatures_version, + NodeDrawType drawtype); }; #define CF_SPECIAL_COUNT 6 @@ -170,7 +234,7 @@ struct ContentFeatures { /* Cached stuff - */ + */ #ifndef SERVER // 0 1 2 3 4 5 // up down right left back front @@ -190,12 +254,19 @@ struct ContentFeatures /* 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 @@ -204,20 +275,41 @@ struct ContentFeatures #endif float visual_scale; // Misc. scale parameter TileDef tiledef[6]; + // These will be drawn over the base tiles. + TileDef tiledef_overlay[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 *palette; + // Used for waving leaves/plants + u8 waving; + // for NDT_CONNECTED pairing + u8 connect_sides; + std::vector connects_to; + std::set 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; @@ -229,12 +321,12 @@ struct ContentFeatures 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. @@ -250,36 +342,48 @@ struct ContentFeatures // 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 */ ContentFeatures(); - ~ContentFeatures(); + ~ContentFeatures() = default; void reset(); void serialize(std::ostream &os, u16 protocol_version) const; 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 longer supported, this method + * adds opacity directly to the texture pixels. + * + * \param tiles array of the tile definitions. + * \param length length of tiles + */ + void correctAlpha(TileDef *tiles, int length); /* Some handy methods @@ -291,35 +395,54 @@ struct ContentFeatures if(!isLiquid() || !f.isLiquid()) return false; return (liquid_alternative_flowing == f.liquid_alternative_flowing); } + + int getGroup(const std::string &group) const + { + return itemgroup_get(groups, group); + } + +#ifndef SERVER + void fillTileAttribs(ITextureSource *tsrc, TileLayer *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 { public: - INodeDefManager(){} - virtual ~INodeDefManager(){} + INodeDefManager() = default; + virtual ~INodeDefManager() = default; + // Get node definition virtual const ContentFeatures &get(content_t c) const=0; virtual const ContentFeatures &get(const MapNode &n) const=0; 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 &result) + // returns false if node name not found, true otherwise + virtual bool getIds(const std::string &name, std::set &result) const=0; virtual const ContentFeatures &get(const std::string &name) const=0; virtual void serialize(std::ostream &os, u16 protocol_version) const=0; - virtual bool getNodeRegistrationStatus() 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 getSelectionBoxIntUnion() const=0; }; class IWritableNodeDefManager : public INodeDefManager { public: - IWritableNodeDefManager(){} - virtual ~IWritableNodeDefManager(){} - virtual IWritableNodeDefManager* clone()=0; + IWritableNodeDefManager() = default; + virtual ~IWritableNodeDefManager() = default; + // Get node definition virtual const ContentFeatures &get(content_t c) const=0; virtual const ContentFeatures &get(const MapNode &n) const=0; @@ -327,7 +450,7 @@ public: // 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 &result) + virtual bool getIds(const std::string &name, std::set &result) const=0; // If not found, returns the features of CONTENT_UNKNOWN virtual const ContentFeatures &get(const std::string &name) const=0; @@ -338,6 +461,8 @@ public: 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. @@ -360,13 +485,14 @@ public: virtual void serialize(std::ostream &os, u16 protocol_version) const=0; virtual void deSerialize(std::istream &is)=0; - virtual bool getNodeRegistrationStatus() const=0; virtual void setNodeRegistrationStatus(bool completed)=0; virtual void pendNodeResolve(NodeResolver *nr)=0; virtual bool cancelNodeResolveCallback(NodeResolver *nr)=0; virtual void runNodeResolveCallbacks()=0; virtual void resetNodeResolveState()=0; + virtual void mapNodeboxConnections()=0; + virtual core::aabbox3d getSelectionBoxIntUnion() const=0; }; IWritableNodeDefManager *createNodeDefManager(); @@ -384,12 +510,10 @@ public: void nodeResolveInternal(); - u32 m_nodenames_idx; - u32 m_nnlistsizes_idx; + u32 m_nodenames_idx = 0; + u32 m_nnlistsizes_idx = 0; std::vector m_nodenames; std::vector m_nnlistsizes; - INodeDefManager *m_ndef; - bool m_resolve_done; + INodeDefManager *m_ndef = nullptr; + bool m_resolve_done = false; }; - -#endif