Browse Source

assimp: Support custom object properties as tags

rdb 3 years ago
parent
commit
2044861597
1 changed files with 39 additions and 0 deletions
  1. 39 0
      pandatool/src/assimp/assimpLoader.cxx

+ 39 - 0
pandatool/src/assimp/assimpLoader.cxx

@@ -39,6 +39,7 @@
 #include "pvector.h"
 #include "cmath.h"
 #include "deg_2_rad.h"
+#include "string_utils.h"
 
 #include "pandaIOSystem.h"
 #include "pandaLogger.h"
@@ -1040,6 +1041,44 @@ load_node(const aiNode &node, PandaNode *parent) {
     parent->add_child(pnode);
   }
 
+  if (node.mMetaData != nullptr) {
+    for (unsigned i = 0; i < node.mMetaData->mNumProperties; ++i) {
+      const aiMetadataEntry &entry = node.mMetaData->mValues[i];
+      std::string value;
+      switch (entry.mType) {
+      //case AI_BOOL:
+      //  value = (*static_cast<bool *>(entry.mData)) ? "1" : "";
+      //  break;
+      case (aiMetadataType)1: // AI_INT32
+        value = format_string(*static_cast<int32_t *>(entry.mData));
+        break;
+      case AI_UINT64:
+        value = format_string(*static_cast<uint64_t *>(entry.mData));
+        break;
+      case AI_FLOAT:
+        value = format_string(*static_cast<float *>(entry.mData));
+        break;
+      case AI_AISTRING:
+        {
+          const aiString *str = static_cast<const aiString *>(entry.mData);
+          value = std::string(str->data, str->length);
+        }
+        break;
+      default:
+        // Special case because AI_DOUBLE was added in Assimp 4.0 with the same
+        // value as AI_AISTRING. Defined as if so that we don't get a duplicate
+        // case error with moder ncompilers.
+        if (entry.mType == (aiMetadataType)4) {
+          value = format_string(*static_cast<double *>(entry.mData));
+          break;
+        }
+        continue;
+      }
+      const aiString &key = node.mMetaData->mKeys[i];
+      pnode->set_tag(std::string(key.data, key.length), std::move(value));
+    }
+  }
+
   // Load in the transformation matrix.
   const aiMatrix4x4 &t = node.mTransformation;
   if (!t.IsIdentity()) {