From 5ef8c09dbbf2e7c1529282035f4d90121461dad2 Mon Sep 17 00:00:00 2001 From: George Papadopoulos Date: Sat, 22 Feb 2014 13:06:34 +0200 Subject: [PATCH] Use AiNode's metadata to keep per-node(and per-instance) FBX (3dsmax) UserDefinedProperties Also simplify metadata structure to avoid unnecessary allocations (and make it easier for wrappers like AssimpNET to read it) --- code/FBXConverter.cpp | 24 ++++++++++++++++++++++++ code/IFCLoader.cpp | 8 ++++---- include/assimp/metadata.h | 20 ++++++-------------- 3 files changed, 34 insertions(+), 18 deletions(-) diff --git a/code/FBXConverter.cpp b/code/FBXConverter.cpp index aed4603f1..e9d680a0c 100644 --- a/code/FBXConverter.cpp +++ b/code/FBXConverter.cpp @@ -223,6 +223,9 @@ private: name_carrier = nodes_chain.back(); } + //setup metadata on newest node + SetupNodeMetadata(*model, *nodes_chain.back()); + // link all nodes in a row aiNode* last_parent = &parent; BOOST_FOREACH(aiNode* prenode, nodes_chain) { @@ -754,7 +757,28 @@ private: nd->mTransformation = nd->mTransformation * chain[i]; } } + + // ------------------------------------------------------------------------------------------------ + void SetupNodeMetadata(const Model& model, aiNode& nd) + { + const PropertyTable& props = model.Props(); + + // find user defined properties + const std::string& userProps = PropertyGet(props, "UDP3DSMAX", ""); + + //setup metadata //TODO: make metadata more friendly (eg. have Add()/Remove() functions to be easier to use) + aiMetadata* data = new aiMetadata(); + data->mNumProperties = 1; + data->mKeys = new aiString[data->mNumProperties](); + data->mValues = new aiString[data->mNumProperties](); + + //add user properties + data->mKeys[0].Set("UserProperties"); + data->mValues[0].Set(userProps); + + nd.mMetaData = data; + } // ------------------------------------------------------------------------------------------------ void ConvertModel(const Model& model, aiNode& nd, const aiMatrix4x4& node_global_transform) diff --git a/code/IFCLoader.cpp b/code/IFCLoader.cpp index 0af15228c..4c8feeab1 100644 --- a/code/IFCLoader.cpp +++ b/code/IFCLoader.cpp @@ -725,14 +725,14 @@ aiNode* ProcessSpatialStructure(aiNode* parent, const IfcProduct& el, Conversion if (!properties.empty()) { aiMetadata* data = new aiMetadata(); data->mNumProperties = properties.size(); - data->mKeys = new aiString*[data->mNumProperties](); - data->mValues = new aiString*[data->mNumProperties](); + data->mKeys = new aiString[data->mNumProperties](); + data->mValues = new aiString[data->mNumProperties](); unsigned int i = 0; BOOST_FOREACH(const Metadata::value_type& kv, properties) { - data->mKeys[i] = new aiString(kv.first); + data->mKeys[i].Set(kv.first); if (kv.second.length() > 0) { - data->mValues[i] = new aiString(kv.second); + data->mValues[i].Set(kv.second); } ++i; } diff --git a/include/assimp/metadata.h b/include/assimp/metadata.h index c5dc0638f..942029ae6 100644 --- a/include/assimp/metadata.h +++ b/include/assimp/metadata.h @@ -62,11 +62,11 @@ struct aiMetadata unsigned int mNumProperties; /** Arrays of keys, may not be NULL. Entries in this array may not be NULL as well. */ - C_STRUCT aiString** mKeys; + C_STRUCT aiString* mKeys; /** Arrays of values, may not be NULL. Entries in this array may be NULL if the * corresponding property key has no assigned value. */ - C_STRUCT aiString** mValues; + C_STRUCT aiString* mValues; #ifdef __cplusplus @@ -83,26 +83,18 @@ struct aiMetadata /** Destructor */ ~aiMetadata() { - if (mKeys && mValues) { - for (unsigned i=0; i