X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fnodedef.h;h=4a9908ecc0d62b2396bfff164a0ac93faa8cde33;hb=e70e15134c95d37241bb6f6124105c0f1c08ab8a;hp=f41017f63ec22f054aae382eb8bef69219be588a;hpb=1cb6ea6346f568cd068380c5af52f7be269e3490;p=oweals%2Fminetest.git diff --git a/src/nodedef.h b/src/nodedef.h index f41017f63..4a9908ecc 100644 --- a/src/nodedef.h +++ b/src/nodedef.h @@ -25,19 +25,24 @@ with this program; if not, write to the Free Software Foundation, Inc., #include #include #include +#include "util/numeric.h" #include "mapnode.h" #ifndef SERVER -#include "tile.h" +#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; class ITextureSource; class IShaderSource; class IGameDef; +class NodeResolver; typedef std::list > GroupItems; @@ -60,6 +65,16 @@ enum ContentParamType2 CPT2_WALLMOUNTED, // Block level like FLOWINGLIQUID 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 @@ -75,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 @@ -87,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(); } @@ -99,36 +122,24 @@ struct NodeBox 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 - 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; - 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); + TextureSettings() {} + + void readSettings(); }; enum NodeDrawType @@ -155,16 +166,61 @@ enum NodeDrawType NDT_MESH, // Uses static meshes }; +// 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) +*/ + +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 + // up down right left back front TileSpec tiles[6]; // Special tiles // - Currently used for flowing liquids @@ -181,32 +237,60 @@ 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 scene::IMesh *mesh_ptr[24]; -#endif + video::SColor minimap_color; +#endif 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 *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; - // 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; + // Flowing liquid or snow, value = default level + u8 leveled; + + // --- LIGHTING-RELATED --- + 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; @@ -220,8 +304,10 @@ struct ContentFeatures bool buildable_to; // 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. @@ -234,41 +320,51 @@ struct ContentFeatures u8 liquid_viscosity; // Is liquid renewable (new liquid source will be created between 2 existing) bool liquid_renewable; - // Ice for water, water for ice - std::string freezemelt; // 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(); void reset(); - void serialize(std::ostream &os, u16 protocol_version); + void serialize(std::ostream &os, u16 protocol_version) const; void deSerialize(std::istream &is); - void serializeOld(std::ostream &os, u16 protocol_version); + 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 @@ -280,165 +376,66 @@ struct ContentFeatures if(!isLiquid() || !f.isLiquid()) return false; return (liquid_alternative_flowing == f.liquid_alternative_flowing); } -}; - -struct NodeResolveInfo { - std::string n_wanted; - std::string n_alt; - content_t c_fallback; - content_t *output; -}; - -#define NR_STATUS_FAILURE 0 -#define NR_STATUS_PENDING 1 -#define NR_STATUS_SUCCESS 2 - -/** - NodeResolver - - NodeResolver attempts to resolve node names to content ID integers. If the - node registration phase has not yet finished at the time the resolution - request is placed, the request is marked as pending and added to an internal - queue. The name resolution request is later satisfied by writing directly - to the output location when the node registration phase has been completed. - - This is primarily intended to be used for objects registered during script - initialization (i.e. while nodes are being registered) that reference - particular nodes. -*/ -class NodeResolver { -public: - NodeResolver(INodeDefManager *ndef); - ~NodeResolver(); - - /** - Add a request to resolve the node n_wanted and set *content to the - result, or alternatively, n_alt if n_wanted is not found. If n_alt - cannot be found either, or has not been specified, *content is set - to c_fallback. - - If node registration is complete, the request is finished immediately - and NR_STATUS_SUCCESS is returned (or NR_STATUS_FAILURE if no node can - be found). Otherwise, NR_STATUS_PENDING is returned and the resolution - request is queued. - - N.B. If the memory in which content is located has been deallocated - before the pending request had been satisfied, cancelNode() must be - called. - - @param n_wanted Name of node that is wanted. - @param n_alt Name of node in case n_wanted could not be found. Blank - if no alternative node is desired. - @param c_fallback Content ID that content is set to in case of node - resolution failure (should be CONTENT_AIR, CONTENT_IGNORE, etc.) - @param content Pointer to content_t that receives the result of the - node name resolution. - @return Status of node resolution request. - */ - int addNode(std::string n_wanted, std::string n_alt, - content_t c_fallback, content_t *content); - - /** - Add a request to resolve the node(s) specified by nodename. - If node registration is complete, the request is finished immediately - and NR_STATUS_SUCCESS is returned if at least one node is resolved; if - zero were resolved, NR_STATUS_FAILURE. Otherwise, NR_STATUS_PENDING is - returned and the resolution request is queued. - - N.B. If the memory in which content_vec is located has been deallocated - before the pending request had been satisfied, cancelNodeList() must be - called. - - @param nodename Name of node (or node group) to be resolved. - @param content_vec Pointer to content_t vector onto which the results - are added. - - @return Status of node resolution request. - */ - int addNodeList(const char *nodename, std::vector *content_vec); - - /** - Removes all pending requests from the resolution queue to be satisfied - to content. - - @param content Location of the content ID for the request being - cancelled. - @return Number of pending requests cancelled. - */ - bool cancelNode(content_t *content); - - /** - Removes all pending requests from the resolution queue to be satisfied - to content_vec. - - @param content_vec Location of the content ID vector for requests being - cancelled. - @return Number of pending requests cancelled. - */ - int cancelNodeList(std::vector *content_vec); - - /** - Carries out all pending node resolution requests. Call this when the - node registration phase has completed. - - Internally marks node registration as complete. - - @return Number of failed pending requests. - */ - int resolveNodes(); - - /** - Returns the status of the node registration phase. - - @return Boolean of whether the registration phase is complete. - */ - bool isNodeRegFinished() { return m_is_node_registration_complete; } + int getGroup(const std::string &group) const + { + return itemgroup_get(groups, group); + } -private: - INodeDefManager *m_ndef; - bool m_is_node_registration_complete; - std::list m_pending_contents; - std::list *> > m_pending_content_vecs; +#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 -{ +class INodeDefManager { public: INodeDefManager(){} virtual ~INodeDefManager(){} // Get node definition - virtual const ContentFeatures& get(content_t c) const=0; - virtual const ContentFeatures& get(const MapNode &n) const=0; + 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)=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 NodeResolver *getResolver()=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 -{ +class IWritableNodeDefManager : public INodeDefManager { public: IWritableNodeDefManager(){} virtual ~IWritableNodeDefManager(){} virtual IWritableNodeDefManager* clone()=0; // Get node definition - virtual const ContentFeatures& get(content_t c) const=0; - virtual const ContentFeatures& get(const MapNode &n) const=0; + 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; // 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) - const=0; + 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; + virtual const ContentFeatures &get(const std::string &name) const=0; // Register node definition by name (allocate an id) // If returns CONTENT_IGNORE, could not allocate id @@ -446,6 +443,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. @@ -453,18 +452,53 @@ public: */ virtual void updateAliases(IItemDefManager *idef)=0; + /* + Override textures from servers with ones specified in texturepack/override.txt + */ + virtual void applyTextureOverrides(const std::string &override_filepath)=0; + /* Update tile textures to latest return values of TextueSource. */ - virtual void updateTextures(IGameDef *gamedef)=0; + virtual void updateTextures(IGameDef *gamedef, + void (*progress_cbk)(void *progress_args, u32 progress, u32 max_progress), + void *progress_cbk_args)=0; - virtual void serialize(std::ostream &os, u16 protocol_version)=0; + virtual void serialize(std::ostream &os, u16 protocol_version) const=0; virtual void deSerialize(std::istream &is)=0; - virtual NodeResolver *getResolver()=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(); -#endif +class NodeResolver { +public: + NodeResolver(); + virtual ~NodeResolver(); + virtual void resolveNodeNames() = 0; + + bool getIdFromNrBacklog(content_t *result_out, + const std::string &node_alt, content_t c_fallback); + bool getIdsFromNrBacklog(std::vector *result_out, + bool all_required=false, content_t c_fallback=CONTENT_IGNORE); + + void nodeResolveInternal(); + u32 m_nodenames_idx; + u32 m_nnlistsizes_idx; + std::vector m_nodenames; + std::vector m_nnlistsizes; + INodeDefManager *m_ndef; + bool m_resolve_done; +}; + +#endif