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
parent
c158638d67
commit
5ef8c09dbb
|
@ -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)
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue