Răsfoiți Sursa

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)
George Papadopoulos 11 ani în urmă
părinte
comite
5ef8c09dbb
3 a modificat fișierele cu 34 adăugiri și 18 ștergeri
  1. 24 0
      code/FBXConverter.cpp
  2. 4 4
      code/IFCLoader.cpp
  3. 6 14
      include/assimp/metadata.h

+ 24 - 0
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<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)

+ 4 - 4
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;
 			}

+ 6 - 14
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<mNumProperties; ++i) {
-				if (mKeys[i]) {
-					delete mKeys[i];
-				}
-				if (mValues[i]) {
-					delete mValues[i];
-				}
-			}
+		if (mKeys)
 			delete [] mKeys;
+		if (mValues)
 			delete [] mValues;
-		}
 	}
 
 
 	inline bool Get(const aiString& key, aiString& value)
 	{
 		for (unsigned i=0; i<mNumProperties; ++i) {
-			if (mKeys[i] && *mKeys[i]==key) {
-				value=*mValues[i];
+			if (mKeys[i]==key) {
+				value=mValues[i];
 				return true;
 			}
 		}