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)
pull/223/head
George Papadopoulos 2014-02-22 13:06:34 +02:00
parent c158638d67
commit 5ef8c09dbb
3 changed files with 34 additions and 18 deletions

View File

@ -223,6 +223,9 @@ private:
name_carrier = nodes_chain.back(); name_carrier = nodes_chain.back();
} }
//setup metadata on newest node
SetupNodeMetadata(*model, *nodes_chain.back());
// link all nodes in a row // link all nodes in a row
aiNode* last_parent = &parent; aiNode* last_parent = &parent;
BOOST_FOREACH(aiNode* prenode, nodes_chain) { BOOST_FOREACH(aiNode* prenode, nodes_chain) {
@ -754,7 +757,28 @@ private:
nd->mTransformation = nd->mTransformation * chain[i]; 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<std::string>(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) void ConvertModel(const Model& model, aiNode& nd, const aiMatrix4x4& node_global_transform)

View File

@ -725,14 +725,14 @@ aiNode* ProcessSpatialStructure(aiNode* parent, const IfcProduct& el, Conversion
if (!properties.empty()) { if (!properties.empty()) {
aiMetadata* data = new aiMetadata(); aiMetadata* data = new aiMetadata();
data->mNumProperties = properties.size(); data->mNumProperties = properties.size();
data->mKeys = new aiString*[data->mNumProperties](); data->mKeys = new aiString[data->mNumProperties]();
data->mValues = new aiString*[data->mNumProperties](); data->mValues = new aiString[data->mNumProperties]();
unsigned int i = 0; unsigned int i = 0;
BOOST_FOREACH(const Metadata::value_type& kv, properties) { 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) { if (kv.second.length() > 0) {
data->mValues[i] = new aiString(kv.second); data->mValues[i].Set(kv.second);
} }
++i; ++i;
} }

View File

@ -62,11 +62,11 @@ struct aiMetadata
unsigned int mNumProperties; unsigned int mNumProperties;
/** Arrays of keys, may not be NULL. Entries in this array may not be NULL as well. */ /** 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 /** Arrays of values, may not be NULL. Entries in this array may be NULL if the
* corresponding property key has no assigned value. */ * corresponding property key has no assigned value. */
C_STRUCT aiString** mValues; C_STRUCT aiString* mValues;
#ifdef __cplusplus #ifdef __cplusplus
@ -83,26 +83,18 @@ struct aiMetadata
/** Destructor */ /** Destructor */
~aiMetadata() ~aiMetadata()
{ {
if (mKeys && mValues) { if (mKeys)
for (unsigned i=0; i<mNumProperties; ++i) {
if (mKeys[i]) {
delete mKeys[i];
}
if (mValues[i]) {
delete mValues[i];
}
}
delete [] mKeys; delete [] mKeys;
if (mValues)
delete [] mValues; delete [] mValues;
}
} }
inline bool Get(const aiString& key, aiString& value) inline bool Get(const aiString& key, aiString& value)
{ {
for (unsigned i=0; i<mNumProperties; ++i) { for (unsigned i=0; i<mNumProperties; ++i) {
if (mKeys[i] && *mKeys[i]==key) { if (mKeys[i]==key) {
value=*mValues[i]; value=mValues[i];
return true; return true;
} }
} }