Browse Source

Merge pull request #4967 from assimp/kimkulling/add_missing_metadatatypes_issue-4959

Add missing pod types.
Kim Kulling 2 years ago
parent
commit
c8a0119e45
3 changed files with 79 additions and 11 deletions
  1. 12 4
      CMakeLists.txt
  2. 37 1
      include/assimp/metadata.h
  3. 30 6
      test/unit/utMetadata.cpp

+ 12 - 4
CMakeLists.txt

@@ -84,10 +84,6 @@ OPTION( ASSIMP_NO_EXPORT
   "Disable Assimp's export functionality."
   OFF
 )
-OPTION( ASSIMP_BUILD_ZLIB
-  "Build your own zlib"
-  OFF
-)
 OPTION( ASSIMP_BUILD_ASSIMP_TOOLS
   "If the supplementary tools for Assimp are built in addition to the library."
   OFF
@@ -134,6 +130,18 @@ OPTION ( ASSIMP_IGNORE_GIT_HASH
    OFF
 )
 
+IF (WIN32)
+  OPTION( ASSIMP_BUILD_ZLIB
+    "Build your own zlib"
+    ON
+  )
+ELSE()
+  OPTION( ASSIMP_BUILD_ZLIB
+    "Build your own zlib"
+    OFF
+  )
+ENDIF()
+
 IF (WIN32)
   # Use subset of Windows.h
   ADD_DEFINITIONS( -DWIN32_LEAN_AND_MEAN )

+ 37 - 1
include/assimp/metadata.h

@@ -56,6 +56,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #include <stdint.h>
 #endif
 
+#include <assimp/quaternion.h>
+
 // -------------------------------------------------------------------------------
 /**
   * Enum used to distinguish data types
@@ -70,7 +72,9 @@ typedef enum aiMetadataType {
     AI_AISTRING = 5,
     AI_AIVECTOR3D = 6,
     AI_AIMETADATA = 7,
-    AI_META_MAX = 8,
+    AI_INT64 = 8,
+    AI_UINT32 = 9,
+    AI_META_MAX = 10,
 
 #ifndef SWIG
     FORCE_32BIT = INT_MAX
@@ -133,6 +137,12 @@ inline aiMetadataType GetAiType(const aiVector3D &) {
 inline aiMetadataType GetAiType(const aiMetadata &) {
     return AI_AIMETADATA;
 }
+inline aiMetadataType GetAiType(int64_t) {
+    return AI_INT64;
+}
+inline aiMetadataType GetAiType(uint32_t) {
+    return AI_UINT32;
+}
 
 #endif // __cplusplus
 
@@ -215,6 +225,16 @@ struct aiMetadata {
                 rhs.Get<aiMetadata>(static_cast<unsigned int>(i), v);
                 mValues[i].mData = new aiMetadata(v);
             } break;
+            case AI_INT64: {
+                int64_t v;
+                ::memcpy(&v, rhs.mValues[i].mData, sizeof(int64_t));
+                mValues[i].mData = new int64_t(v);
+            } break;
+            case AI_UINT32: {
+                uint32_t v;
+                ::memcpy(&v, rhs.mValues[i].mData, sizeof(uint32_t));
+                mValues[i].mData = new uint32_t(v);
+            } break;
 #ifndef SWIG
             case FORCE_32BIT:
 #endif
@@ -267,6 +287,12 @@ struct aiMetadata {
                 case AI_AIMETADATA:
                     delete static_cast<aiMetadata *>(data);
                     break;
+                case AI_INT64:
+                    delete static_cast<int64_t *>(data);
+                    break;
+                case AI_UINT32:
+                    delete static_cast<uint32_t *>(data);
+                    break;
 #ifndef SWIG
                 case FORCE_32BIT:
 #endif
@@ -510,6 +536,16 @@ struct aiMetadata {
                     return false;
                 }
             } break;
+            case AI_INT64: {
+                if (*static_cast<int64_t *>(lhs.mValues[i].mData) != *static_cast<int64_t *>(rhs.mValues[i].mData)) {
+                    return false;
+                }
+            } break;
+            case AI_UINT32: {
+                if (*static_cast<uint32_t *>(lhs.mValues[i].mData) != *static_cast<uint32_t *>(rhs.mValues[i].mData)) {
+                    return false;
+                }
+            } break;
 #ifndef SWIG
             case FORCE_32BIT:
 #endif

+ 30 - 6
test/unit/utMetadata.cpp

@@ -5,8 +5,6 @@ Open Asset Import Library (assimp)
 
 Copyright (c) 2006-2022, assimp team
 
-
-
 All rights reserved.
 
 Redistribution and use of this software in source and binary forms,
@@ -84,7 +82,7 @@ TEST_F( utMetadata, allocTest ) {
 }
 
 TEST_F( utMetadata, get_set_pod_Test ) {
-    m_data = aiMetadata::Alloc( 5 );
+    m_data = aiMetadata::Alloc( 7 );
 
     // int, 32 bit
     unsigned int index( 0 );
@@ -137,6 +135,28 @@ TEST_F( utMetadata, get_set_pod_Test ) {
     EXPECT_TRUE( success );
     EXPECT_DOUBLE_EQ( 3.0, result_double );
 
+    // int64_t
+    index++;
+    const std::string key_int64 = "test_int64";
+    int64_t val_int64 = 64;
+    success = m_data->Set(index, key_int64, val_int64);
+    EXPECT_TRUE(success);
+    int64_t result_int64(0);
+    success = m_data->Get(key_int64, result_int64);
+    EXPECT_TRUE(success);
+    EXPECT_EQ(result_int64, val_int64);
+
+    // uint32
+    index++;
+    const std::string key_uint32 = "test_uint32";
+    int64_t val_uint32 = 32;
+    success = m_data->Set(index, key_uint32, val_uint32);
+    EXPECT_TRUE(success);
+    int64_t result_uint32(0);
+    success = m_data->Get(key_uint32, result_uint32);
+    EXPECT_TRUE(success);
+    EXPECT_EQ(result_uint32, val_uint32);
+
     // error
     int result;
     success = m_data->Get( "bla", result );
@@ -181,6 +201,7 @@ TEST_F( utMetadata, get_set_aiVector3D_Test ) {
     EXPECT_TRUE( success );
 }
 
+
 TEST_F( utMetadata, copy_test ) {
     m_data = aiMetadata::Alloc( AI_META_MAX );
     bool bv = true;
@@ -199,9 +220,12 @@ TEST_F( utMetadata, copy_test ) {
     m_data->Set( 6, "aiVector3D", vecVal );
     aiMetadata metaVal;
     m_data->Set( 7, "aiMetadata", metaVal );
-
-    aiMetadata copy( *m_data );
-    EXPECT_EQ( 8u, copy.mNumProperties );
+    int64_t i64 = 64;
+    m_data->Set(8, "int64_t", i64);
+    uint32_t ui32 = 32;
+    m_data->Set(9, "uint32_t", ui32);
+    aiMetadata copy(*m_data);
+    EXPECT_EQ( 10u, copy.mNumProperties );
 
     // bool test
     {