X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fitemdef.h;h=74c6d0b3e2f3c5548006991cf6aba26aee18266a;hb=91bafceee6606fab79db1bde4cba01b84fed65c7;hp=f993fdbac490181ab7627ea00f680e91f145bb4e;hpb=cba90d4441bd2e81efb262e663e9c53c24322a54;p=minetest.git diff --git a/src/itemdef.h b/src/itemdef.h index f993fdbac..74c6d0b3e 100644 --- a/src/itemdef.h +++ b/src/itemdef.h @@ -25,9 +25,18 @@ with this program; if not, write to the Free Software Foundation, Inc., #include #include #include +#include #include "itemgroup.h" #include "sound.h" +#include "util/container.h" +#include "util/thread.h" + +#ifndef SERVER +#include "client/tile.h" +#endif + class IGameDef; +class INodeDefManager; struct ToolCapabilities; /* @@ -39,7 +48,7 @@ enum ItemType ITEM_NONE, ITEM_NODE, ITEM_CRAFT, - ITEM_TOOL, + ITEM_TOOL }; struct ItemDefinition @@ -57,6 +66,8 @@ struct ItemDefinition std::string inventory_image; // Optional for nodes, mandatory for tools/craftitems std::string wield_image; // If empty, inventory_image or mesh (only nodes) is used v3f wield_scale; + std::string meshname; // name of internal mesh (or meshfile to use TBD) + std::string meshtexture; // meshtexture /* Item stack and interaction properties @@ -68,6 +79,7 @@ struct ItemDefinition ToolCapabilities *tool_capabilities; ItemGroupList groups; SimpleSoundSpec sound_place; + SimpleSoundSpec sound_place_failed; f32 range; // Client shall immediately place this node when player places the item. @@ -156,6 +168,84 @@ class IWritableItemDefManager : public IItemDefManager virtual void processQueue(IGameDef *gamedef)=0; }; + +class CItemDefManager: public IWritableItemDefManager +{ +public: + CItemDefManager(); + virtual ~CItemDefManager(); + virtual const ItemDefinition& get(const std::string &name_) const; + virtual std::string getAlias(const std::string &name) const; + virtual std::set getAll() const; + virtual bool isKnown(const std::string &name_) const; + +#ifndef SERVER + // Get item inventory texture + virtual video::ITexture* getInventoryTexture(const std::string &name, + IGameDef *gamedef) const; + + // Get item wield mesh + virtual scene::IMesh* getWieldMesh(const std::string &name, + IGameDef *gamedef) const; +#endif + void clear(); + + virtual void registerItem(const ItemDefinition &def); + virtual void registerAlias(const std::string &name, + const std::string &convert_to); + void serialize(std::ostream &os, u16 protocol_version); + void deSerialize(std::istream &is); + + void processQueue(IGameDef *gamedef); + +private: + +#ifndef SERVER + struct ClientCached + { + video::ITexture *inventory_texture; + scene::IMesh *wield_mesh; + + ClientCached(); + }; + + void createNodeItemTexture(const std::string& name, + const ItemDefinition& def, INodeDefManager* nodedef, + ClientCached* cc, IGameDef* gamedef, ITextureSource* tsrc) const; + + void createMeshItemTexture(const std::string& name, + const ItemDefinition& def, INodeDefManager* nodedef, + ClientCached* cc, IGameDef* gamedef, ITextureSource* tsrc) const; + + void renderMeshToTexture(const ItemDefinition& def, scene::IMesh* mesh, + ClientCached* cc, ITextureSource* tsrc) const; + + ClientCached* createClientCachedDirect(const std::string &name, + IGameDef *gamedef) const; + + ClientCached* getClientCached(const std::string &name, + IGameDef *gamedef) const; + + // The id of the thread that is allowed to use irrlicht directly + threadid_t m_main_thread; + + // A reference to this can be returned when nothing is found, to avoid NULLs + mutable ClientCached m_dummy_clientcached; + + // Cached textures and meshes + mutable MutexedMap m_clientcached; + + // Queued clientcached fetches (to be processed by the main thread) + mutable RequestQueue m_get_clientcached_queue; +#endif + + // Key is name + std::map m_item_definitions; + + // Aliases + std::map m_aliases; +}; + IWritableItemDefManager* createItemDefManager(); #endif