diff options
author | kwolekr <kwolekr@minetest.net> | 2015-04-16 04:12:26 -0400 |
---|---|---|
committer | kwolekr <kwolekr@minetest.net> | 2015-04-16 16:27:05 -0400 |
commit | 479f38973e13680d6a39d9c2a7f29fd330b67d41 (patch) | |
tree | c6719cf37bfbc44f98cc33b9b2693542b8fdd8cc /src/nodedef.h | |
parent | 0c634a97197d50f2ca58825f1b215d0407397ac6 (diff) | |
download | minetest-479f38973e13680d6a39d9c2a7f29fd330b67d41.tar.gz minetest-479f38973e13680d6a39d9c2a7f29fd330b67d41.tar.bz2 minetest-479f38973e13680d6a39d9c2a7f29fd330b67d41.zip |
Schematics: Refactor NodeResolver and add NodeResolveMethod
NodeResolver name lists now belong to the NodeResolver object instead of
the associated NodeDefManager. In addition to minimizing unnecessary
abstraction and overhead, this move permits NodeResolvers to look up nodes
that they had previously set pending for resolution. So far, this
functionality has been used in the case of schematics for
serialization/deserialization.
Diffstat (limited to 'src/nodedef.h')
-rw-r--r-- | src/nodedef.h | 93 |
1 files changed, 29 insertions, 64 deletions
diff --git a/src/nodedef.h b/src/nodedef.h index dfd0f4f99..d9829c495 100644 --- a/src/nodedef.h +++ b/src/nodedef.h @@ -34,10 +34,12 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "sound.h" // SimpleSoundSpec #include "constants.h" // BS +class INodeDefManager; class IItemDefManager; class ITextureSource; class IShaderSource; class IGameDef; +class NodeResolver; typedef std::list<std::pair<content_t, int> > GroupItems; @@ -280,38 +282,10 @@ struct ContentFeatures } }; -class NodeResolver; -class INodeDefManager; - -struct NodeListInfo { - NodeListInfo(u32 len) - { - length = len; - all_required = false; - c_fallback = CONTENT_IGNORE; - } - - NodeListInfo(u32 len, content_t fallback) - { - length = len; - all_required = true; - c_fallback = fallback; - } - - u32 length; - bool all_required; - content_t c_fallback; -}; - -struct NodeResolveInfo { - NodeResolveInfo(NodeResolver *nr) - { - resolver = nr; - } - - std::list<std::string> nodenames; - std::list<NodeListInfo> nodelistinfo; - NodeResolver *resolver; +enum NodeResolveMethod { + NODE_RESOLVE_NONE, + NODE_RESOLVE_DIRECT, + NODE_RESOLVE_DEFERRED, }; class INodeDefManager @@ -334,14 +308,9 @@ public: virtual bool getNodeRegistrationStatus() const=0; virtual void setNodeRegistrationStatus(bool completed)=0; - virtual void pendNodeResolve(NodeResolveInfo *nri)=0; - virtual void cancelNodeResolve(NodeResolver *resolver)=0; - virtual void runNodeResolverCallbacks()=0; - - virtual bool getIdFromResolveInfo(NodeResolveInfo *nri, - const std::string &node_alt, content_t c_fallback, content_t &result)=0; - virtual bool getIdsFromResolveInfo(NodeResolveInfo *nri, - std::vector<content_t> &result)=0; + virtual void pendNodeResolve(NodeResolver *nr, NodeResolveMethod how)=0; + virtual bool cancelNodeResolveCallback(NodeResolver *nr)=0; + virtual void runNodeResolveCallbacks()=0; }; class IWritableNodeDefManager : public INodeDefManager @@ -388,38 +357,34 @@ public: virtual bool getNodeRegistrationStatus() const=0; virtual void setNodeRegistrationStatus(bool completed)=0; - virtual void pendNodeResolve(NodeResolveInfo *nri)=0; - virtual void cancelNodeResolve(NodeResolver *resolver)=0; - virtual void runNodeResolverCallbacks()=0; - - virtual bool getIdFromResolveInfo(NodeResolveInfo *nri, - const std::string &node_alt, content_t c_fallback, content_t &result)=0; - virtual bool getIdsFromResolveInfo(NodeResolveInfo *nri, - std::vector<content_t> &result)=0; + virtual void pendNodeResolve(NodeResolver *nr, NodeResolveMethod how)=0; + virtual bool cancelNodeResolveCallback(NodeResolver *nr)=0; + virtual void runNodeResolveCallbacks()=0; }; IWritableNodeDefManager *createNodeDefManager(); class NodeResolver { public: - NodeResolver() - { - m_lookup_done = false; - m_ndef = NULL; - } - - virtual ~NodeResolver() - { - if (!m_lookup_done && m_ndef) - m_ndef->cancelNodeResolve(this); - } - - virtual void resolveNodeNames(NodeResolveInfo *nri) = 0; - - bool m_lookup_done; + 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<content_t> *result_out, + bool all_required=false, content_t c_fallback=CONTENT_IGNORE); + const std::string &getNodeName(content_t c) const; + + void nodeResolveInternal(); + + u32 m_nodenames_idx; + u32 m_nnlistsizes_idx; + std::vector<std::string> m_nodenames; + std::vector<size_t> m_nnlistsizes; INodeDefManager *m_ndef; + bool m_resolve_done; }; - #endif |