From a3a6e4af78160a3d3793a4ff9065d83455967998 Mon Sep 17 00:00:00 2001 From: Kearwood Gilbert Date: Sun, 24 Aug 2014 22:18:04 -0700 Subject: [PATCH] Behaviours can now be serialized in from the scene graph xml --- KREngine/kraken/KRBehavior.cpp | 22 +++++++++++++++++++++- KREngine/kraken/KRBehavior.h | 8 ++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/KREngine/kraken/KRBehavior.cpp b/KREngine/kraken/KRBehavior.cpp index 7830959..cfd77cc 100644 --- a/KREngine/kraken/KRBehavior.cpp +++ b/KREngine/kraken/KRBehavior.cpp @@ -9,6 +9,8 @@ #include "KRBehavior.h" #include "KRNode.h" +KRBehaviorFactoryFunctionMap m_factoryFunctions; + KRBehavior::KRBehavior() { __node = NULL; @@ -42,5 +44,23 @@ KRBehavior *KRBehavior::LoadXML(KRNode *node, tinyxml2::XMLElement *e) attributes[attribute->Name()] = attribute->Value(); } - return NULL; + const char *szElementName = e->Attribute("type"); + if(szElementName == NULL) { + return NULL; + } + KRBehaviorFactoryFunctionMap::const_iterator itr = m_factoryFunctions.find(szElementName); + if(itr == m_factoryFunctions.end()) { + return NULL; + } + return (*itr->second)(attributes); +} + +void KRBehavior::RegisterFactoryCTOR(std::string behaviorName, KRBehaviorFactoryFunction fnFactory) +{ + m_factoryFunctions[behaviorName] = fnFactory; +} + +void KRBehavior::UnregisterFactoryCTOR(std::string behaviorName) +{ + m_factoryFunctions.erase(behaviorName); } diff --git a/KREngine/kraken/KRBehavior.h b/KREngine/kraken/KRBehavior.h index d7cd91f..a1719f9 100644 --- a/KREngine/kraken/KRBehavior.h +++ b/KREngine/kraken/KRBehavior.h @@ -10,6 +10,7 @@ #define KRBEHAVIOR_H #include "tinyxml2.h" +#include /* @@ -17,11 +18,18 @@ */ +class KRBehavior; class KRNode; +typedef KRBehavior *(*KRBehaviorFactoryFunction)(std::map attributes); +typedef std::map KRBehaviorFactoryFunctionMap; + class KRBehavior { public: + static void RegisterFactoryCTOR(std::string behaviorName, KRBehaviorFactoryFunction fnFactory); + static void UnregisterFactoryCTOR(std::string behaviorName); + KRBehavior(); virtual ~KRBehavior(); KRNode *getNode() const;