diff --git a/KREngine/kraken/KRLocator.cpp b/KREngine/kraken/KRLocator.cpp index 1794062..694cbe2 100644 --- a/KREngine/kraken/KRLocator.cpp +++ b/KREngine/kraken/KRLocator.cpp @@ -33,3 +33,8 @@ void KRLocator::loadXML(tinyxml2::XMLElement *e) { KRNode::loadXML(e); } + +unordered_map > &KRLocator::getUserAttributes() +{ + return m_userAttributes; +} \ No newline at end of file diff --git a/KREngine/kraken/KRLocator.h b/KREngine/kraken/KRLocator.h index 19e6f22..b2c0a64 100644 --- a/KREngine/kraken/KRLocator.h +++ b/KREngine/kraken/KRLocator.h @@ -13,6 +13,8 @@ #include "KRNode.h" #include "KRTexture.h" +#include "boost/variant.hpp" + class KRLocator : public KRNode { public: KRLocator(KRScene &scene, std::string name); @@ -20,7 +22,10 @@ public: virtual std::string getElementName(); virtual tinyxml2::XMLElement *saveXML( tinyxml2::XMLNode *parent); virtual void loadXML(tinyxml2::XMLElement *e); - + unordered_map > &getUserAttributes(); + +private: + unordered_map > m_userAttributes; }; diff --git a/KREngine/kraken/KRResource+fbx.cpp b/KREngine/kraken/KRResource+fbx.cpp index 98cecab..ed68086 100644 --- a/KREngine/kraken/KRResource+fbx.cpp +++ b/KREngine/kraken/KRResource+fbx.cpp @@ -9,6 +9,7 @@ #include "KREngine-common.h" #include #include +#include #include @@ -1610,6 +1611,40 @@ KRNode *LoadLocator(KRNode *parent_node, FbxScene* pFbxScene, FbxNode* pNode) { KRLocator *new_locator = new KRLocator(parent_node->getScene(), name.c_str()); + // Enumerate fbx properties so client code can convert locators into application-specific objects + FbxProperty fbx_property = pNode->GetFirstProperty(); + while(fbx_property.IsValid()) { + std::string property_name = fbx_property.GetNameAsCStr(); + boost::variant property_value = ""; + switch(fbx_property.GetPropertyDataType().GetType()) { + case eFbxInt: + property_value = fbx_property.Get(); + break; + case eFbxDouble: + property_value = fbx_property.Get(); + break; + case eFbxBool: + property_value = fbx_property.Get(); + break; + case eFbxFloat: + property_value = fbx_property.Get(); + break; + case eFbxString: + property_value = std::string(fbx_property.Get().Buffer()); + break; + default: + { + fprintf(stderr, "FBX property not imported due to unsupported data type: %s.%s\n", name.c_str(), property_name.c_str()); + } + break; + } + + std::transform(property_name.begin(), property_name.end(), property_name.begin(), ::tolower); + + new_locator->getUserAttributes()[property_name] = property_value; + } + + //static bool GetBindPoseContaining(FbxScene* pScene, FbxNode* pNode, PoseList& pPoseList, FbxArray& pIndex); // PoseList pose_list; // FbxArray pose_indices;