summaryrefslogtreecommitdiff
path: root/libs/assimp/test/unit
diff options
context:
space:
mode:
Diffstat (limited to 'libs/assimp/test/unit')
-rw-r--r--libs/assimp/test/unit/AbstractImportExportBase.cpp49
-rw-r--r--libs/assimp/test/unit/AbstractImportExportBase.h75
-rw-r--r--libs/assimp/test/unit/AssimpAPITest.cpp62
-rw-r--r--libs/assimp/test/unit/AssimpAPITest_aiMatrix3x3.cpp151
-rw-r--r--libs/assimp/test/unit/AssimpAPITest_aiMatrix4x4.cpp259
-rw-r--r--libs/assimp/test/unit/AssimpAPITest_aiQuaternion.cpp135
-rw-r--r--libs/assimp/test/unit/AssimpAPITest_aiVector2D.cpp140
-rw-r--r--libs/assimp/test/unit/AssimpAPITest_aiVector3D.cpp185
-rw-r--r--libs/assimp/test/unit/CCompilerTest.c9
-rw-r--r--libs/assimp/test/unit/Common/uiScene.cpp109
-rw-r--r--libs/assimp/test/unit/Common/utAssertHandler.cpp110
-rw-r--r--libs/assimp/test/unit/Common/utBase64.cpp72
-rw-r--r--libs/assimp/test/unit/Common/utLineSplitter.cpp71
-rw-r--r--libs/assimp/test/unit/Common/utMesh.cpp97
-rw-r--r--libs/assimp/test/unit/Common/utSpatialSort.cpp120
-rw-r--r--libs/assimp/test/unit/Common/utStandardShapes.cpp57
-rw-r--r--libs/assimp/test/unit/Common/utXmlParser.cpp86
-rw-r--r--libs/assimp/test/unit/ImportExport/Assxml/utAssxmlImportExport.cpp76
-rw-r--r--libs/assimp/test/unit/ImportExport/IRR/utIrrImportExport.cpp66
-rw-r--r--libs/assimp/test/unit/ImportExport/MDL/MDLHL1TestFiles.h57
-rw-r--r--libs/assimp/test/unit/ImportExport/MDL/utMDLImporter_HL1_ImportSettings.cpp228
-rw-r--r--libs/assimp/test/unit/ImportExport/MDL/utMDLImporter_HL1_Materials.cpp134
-rw-r--r--libs/assimp/test/unit/ImportExport/MDL/utMDLImporter_HL1_Nodes.cpp455
-rw-r--r--libs/assimp/test/unit/ImportExport/RAW/utRAWImportExport.cpp64
-rw-r--r--libs/assimp/test/unit/ImportExport/Terragen/utTerragenImportExport.cpp60
-rw-r--r--libs/assimp/test/unit/ImportExport/utAssjsonImportExport.cpp80
-rw-r--r--libs/assimp/test/unit/ImportExport/utCOBImportExport.cpp99
-rw-r--r--libs/assimp/test/unit/ImportExport/utExporter.cpp107
-rw-r--r--libs/assimp/test/unit/ImportExport/utMD2Importer.cpp78
-rw-r--r--libs/assimp/test/unit/ImportExport/utMD3Importer.cpp67
-rw-r--r--libs/assimp/test/unit/ImportExport/utMD5Importer.cpp72
-rw-r--r--libs/assimp/test/unit/ImportExport/utMDLImporter.cpp80
-rw-r--r--libs/assimp/test/unit/ImportExport/utNFFImportExport.cpp60
-rw-r--r--libs/assimp/test/unit/ImportExport/utOFFImportExport.cpp60
-rw-r--r--libs/assimp/test/unit/ImportExport/utOgreImportExport.cpp61
-rw-r--r--libs/assimp/test/unit/ImportExport/utQ3BSPFileImportExport.cpp61
-rw-r--r--libs/assimp/test/unit/ImportExport/utXGLImportExport.cpp94
-rw-r--r--libs/assimp/test/unit/Main.cpp33
-rw-r--r--libs/assimp/test/unit/MathTest.cpp56
-rw-r--r--libs/assimp/test/unit/MathTest.h103
-rw-r--r--libs/assimp/test/unit/RandomNumberGeneration.h82
-rw-r--r--libs/assimp/test/unit/SceneDiffer.cpp374
-rw-r--r--libs/assimp/test/unit/SceneDiffer.h75
-rw-r--r--libs/assimp/test/unit/TestIOStream.h62
-rw-r--r--libs/assimp/test/unit/TestIOSystem.h84
-rw-r--r--libs/assimp/test/unit/TestModelFactory.h105
-rw-r--r--libs/assimp/test/unit/UTLogStream.h64
-rw-r--r--libs/assimp/test/unit/UnitTestFileGenerator.h76
-rw-r--r--libs/assimp/test/unit/UnitTestPCH.h59
-rw-r--r--libs/assimp/test/unit/ut3DImportExport.cpp67
-rw-r--r--libs/assimp/test/unit/ut3DSImportExport.cpp72
-rw-r--r--libs/assimp/test/unit/utACImportExport.cpp114
-rw-r--r--libs/assimp/test/unit/utAMFImportExport.cpp67
-rw-r--r--libs/assimp/test/unit/utASEImportExport.cpp65
-rw-r--r--libs/assimp/test/unit/utAnim.cpp107
-rw-r--r--libs/assimp/test/unit/utArmaturePopulate.cpp79
-rw-r--r--libs/assimp/test/unit/utAssbinImportExport.cpp69
-rw-r--r--libs/assimp/test/unit/utB3DImportExport.cpp61
-rw-r--r--libs/assimp/test/unit/utBVHImportExport.cpp60
-rw-r--r--libs/assimp/test/unit/utBatchLoader.cpp81
-rw-r--r--libs/assimp/test/unit/utBlendImportAreaLight.cpp109
-rw-r--r--libs/assimp/test/unit/utBlendImportMaterials.cpp146
-rw-r--r--libs/assimp/test/unit/utBlenderImportExport.cpp218
-rw-r--r--libs/assimp/test/unit/utBlenderIntermediate.cpp80
-rw-r--r--libs/assimp/test/unit/utBlenderWork.cpp73
-rw-r--r--libs/assimp/test/unit/utCSMImportExport.cpp60
-rw-r--r--libs/assimp/test/unit/utColladaExport.cpp225
-rw-r--r--libs/assimp/test/unit/utColladaImportExport.cpp410
-rw-r--r--libs/assimp/test/unit/utD3MFImportExport.cpp99
-rw-r--r--libs/assimp/test/unit/utDXFImporterExporter.cpp73
-rw-r--r--libs/assimp/test/unit/utDefaultIOStream.cpp83
-rw-r--r--libs/assimp/test/unit/utExport.cpp84
-rw-r--r--libs/assimp/test/unit/utFBXImporterExporter.cpp425
-rw-r--r--libs/assimp/test/unit/utFastAtof.cpp190
-rw-r--r--libs/assimp/test/unit/utFindDegenerates.cpp208
-rw-r--r--libs/assimp/test/unit/utFindInvalidData.cpp145
-rw-r--r--libs/assimp/test/unit/utFixInfacingNormals.cpp43
-rw-r--r--libs/assimp/test/unit/utGenBoundingBoxesProcess.cpp93
-rw-r--r--libs/assimp/test/unit/utGenNormals.cpp86
-rw-r--r--libs/assimp/test/unit/utHMPImportExport.cpp60
-rw-r--r--libs/assimp/test/unit/utIFCImportExport.cpp80
-rw-r--r--libs/assimp/test/unit/utIOStreamBuffer.cpp146
-rw-r--r--libs/assimp/test/unit/utIOSystem.cpp79
-rw-r--r--libs/assimp/test/unit/utImporter.cpp363
-rw-r--r--libs/assimp/test/unit/utImproveCacheLocality.cpp42
-rw-r--r--libs/assimp/test/unit/utIssues.cpp83
-rw-r--r--libs/assimp/test/unit/utJoinVertices.cpp142
-rw-r--r--libs/assimp/test/unit/utLWOImportExport.cpp77
-rw-r--r--libs/assimp/test/unit/utLWSImportExport.cpp138
-rw-r--r--libs/assimp/test/unit/utLimitBoneWeights.cpp136
-rw-r--r--libs/assimp/test/unit/utM3DImportExport.cpp84
-rw-r--r--libs/assimp/test/unit/utMDCImportExport.cpp62
-rw-r--r--libs/assimp/test/unit/utMaterialSystem.cpp137
-rw-r--r--libs/assimp/test/unit/utMatrix3x3.cpp99
-rw-r--r--libs/assimp/test/unit/utMatrix4x4.cpp92
-rw-r--r--libs/assimp/test/unit/utMetadata.cpp272
-rw-r--r--libs/assimp/test/unit/utNoBoostTest.cpp112
-rw-r--r--libs/assimp/test/unit/utObjImportExport.cpp479
-rw-r--r--libs/assimp/test/unit/utObjTools.cpp116
-rw-r--r--libs/assimp/test/unit/utOpenGEXImportExport.cpp72
-rw-r--r--libs/assimp/test/unit/utPLYImportExport.cpp182
-rw-r--r--libs/assimp/test/unit/utPMXImporter.cpp62
-rw-r--r--libs/assimp/test/unit/utPretransformVertices.cpp157
-rw-r--r--libs/assimp/test/unit/utProfiler.cpp77
-rw-r--r--libs/assimp/test/unit/utQ3DImportExport.cpp61
-rw-r--r--libs/assimp/test/unit/utRemoveComments.cpp92
-rw-r--r--libs/assimp/test/unit/utRemoveComponent.cpp208
-rw-r--r--libs/assimp/test/unit/utRemoveRedundantMaterials.cpp177
-rw-r--r--libs/assimp/test/unit/utRemoveVCProcess.cpp76
-rw-r--r--libs/assimp/test/unit/utSIBImporter.cpp73
-rw-r--r--libs/assimp/test/unit/utSMDImportExport.cpp77
-rw-r--r--libs/assimp/test/unit/utSTLImportExport.cpp170
-rw-r--r--libs/assimp/test/unit/utScaleProcess.cpp71
-rw-r--r--libs/assimp/test/unit/utScene.cpp64
-rw-r--r--libs/assimp/test/unit/utSceneCombiner.cpp77
-rw-r--r--libs/assimp/test/unit/utScenePreprocessor.cpp197
-rw-r--r--libs/assimp/test/unit/utSharedPPData.cpp124
-rw-r--r--libs/assimp/test/unit/utSimd.cpp62
-rw-r--r--libs/assimp/test/unit/utSortByPType.cpp204
-rw-r--r--libs/assimp/test/unit/utSplitLargeMeshes.cpp155
-rw-r--r--libs/assimp/test/unit/utStringUtils.cpp77
-rw-r--r--libs/assimp/test/unit/utTargetAnimation.cpp43
-rw-r--r--libs/assimp/test/unit/utTextureTransform.cpp43
-rw-r--r--libs/assimp/test/unit/utTriangulate.cpp137
-rw-r--r--libs/assimp/test/unit/utTypes.cpp77
-rw-r--r--libs/assimp/test/unit/utValidateDataStructure.cpp199
-rw-r--r--libs/assimp/test/unit/utVector3.cpp69
-rw-r--r--libs/assimp/test/unit/utVersion.cpp77
-rw-r--r--libs/assimp/test/unit/utVertexTriangleAdjacency.cpp210
-rw-r--r--libs/assimp/test/unit/utX3DImportExport.cpp61
-rw-r--r--libs/assimp/test/unit/utXImporterExporter.cpp126
-rw-r--r--libs/assimp/test/unit/utglTF2ImportExport.cpp834
-rw-r--r--libs/assimp/test/unit/utglTFImportExport.cpp111
133 files changed, 16012 insertions, 0 deletions
diff --git a/libs/assimp/test/unit/AbstractImportExportBase.cpp b/libs/assimp/test/unit/AbstractImportExportBase.cpp
new file mode 100644
index 0000000..31402f4
--- /dev/null
+++ b/libs/assimp/test/unit/AbstractImportExportBase.cpp
@@ -0,0 +1,49 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "AbstractImportExportBase.h"
+
+using namespace ::Assimp;
+
+AbstractImportExportBase::~AbstractImportExportBase() {
+ // empty
+}
diff --git a/libs/assimp/test/unit/AbstractImportExportBase.h b/libs/assimp/test/unit/AbstractImportExportBase.h
new file mode 100644
index 0000000..7651d2e
--- /dev/null
+++ b/libs/assimp/test/unit/AbstractImportExportBase.h
@@ -0,0 +1,75 @@
+/*
+---------------------------------------------------------------------------
+Open Asset Import Library (assimp)
+---------------------------------------------------------------------------
+
+Copyright (c) 2006-2020, assimp team
+
+All rights reserved.
+
+Redistribution and use of this software in source and binary forms,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#pragma once
+#ifndef AI_ABSTRACTIMPORTEXPORTBASE_H_INC
+#define AI_ABSTRACTIMPORTEXPORTBASE_H_INC
+
+#include "UnitTestPCH.h"
+
+// ---------------------------------------------------------------------------
+/** Abstract base class to test import and export
+ */
+ // ---------------------------------------------------------------------------
+class AbstractImportExportBase : public ::testing::Test {
+public:
+ /// @brief The class destructor.
+ virtual ~AbstractImportExportBase();
+
+ /// @brief The importer-test, will return true for successful import.
+ /// @return true for success, false for failure.
+ virtual bool importerTest();
+
+ /// @brief The exporter-test, will return true for successful import.
+ /// @return true for success, false for failure.
+ virtual bool exporterTest();
+};
+
+inline
+bool AbstractImportExportBase::importerTest() {
+ return true;
+}
+
+inline
+bool AbstractImportExportBase::exporterTest() {
+ return true;
+}
+
+#endif // AI_ABSTRACTIMPORTEXPORTBASE_H_INC
diff --git a/libs/assimp/test/unit/AssimpAPITest.cpp b/libs/assimp/test/unit/AssimpAPITest.cpp
new file mode 100644
index 0000000..b8739b0
--- /dev/null
+++ b/libs/assimp/test/unit/AssimpAPITest.cpp
@@ -0,0 +1,62 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "UnitTestPCH.h"
+#include <assimp/importerdesc.h>
+
+using namespace Assimp;
+
+class AssimpAPITest : public ::testing::Test {
+ // empty
+};
+
+TEST_F( AssimpAPITest, aiGetImporterDescTest ) {
+ const aiImporterDesc *desc( nullptr );
+ desc = aiGetImporterDesc(nullptr);
+ EXPECT_EQ(nullptr, desc);
+
+ desc = aiGetImporterDesc( "obj" );
+ EXPECT_TRUE(nullptr != desc);
+}
+
+TEST_F( AssimpAPITest, aiGetLastErrorTest ) {
+ const char *error = aiGetErrorString();
+ EXPECT_NE(nullptr, error);
+}
diff --git a/libs/assimp/test/unit/AssimpAPITest_aiMatrix3x3.cpp b/libs/assimp/test/unit/AssimpAPITest_aiMatrix3x3.cpp
new file mode 100644
index 0000000..90976ba
--- /dev/null
+++ b/libs/assimp/test/unit/AssimpAPITest_aiMatrix3x3.cpp
@@ -0,0 +1,151 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "UnitTestPCH.h"
+#include "MathTest.h"
+
+using namespace Assimp;
+
+class AssimpAPITest_aiMatrix3x3 : public AssimpMathTest {
+protected:
+ virtual void SetUp() {
+ result_c = result_cpp = aiMatrix3x3();
+ }
+
+ aiMatrix3x3 result_c, result_cpp;
+};
+
+TEST_F(AssimpAPITest_aiMatrix3x3, aiIdentityMatrix3Test) {
+ // Force a non-identity matrix.
+ result_c = aiMatrix3x3(0,0,0,0,0,0,0,0,0);
+ aiIdentityMatrix3(&result_c);
+ EXPECT_EQ(result_cpp, result_c);
+}
+
+TEST_F(AssimpAPITest_aiMatrix3x3, aiMatrix3FromMatrix4Test) {
+ const auto m = random_mat4();
+ result_cpp = aiMatrix3x3(m);
+ aiMatrix3FromMatrix4(&result_c, &m);
+ EXPECT_EQ(result_cpp, result_c);
+}
+
+TEST_F(AssimpAPITest_aiMatrix3x3, aiMatrix3FromQuaternionTest) {
+ const auto q = random_quat();
+ result_cpp = q.GetMatrix();
+ aiMatrix3FromQuaternion(&result_c, &q);
+ EXPECT_EQ(result_cpp, result_c);
+}
+
+TEST_F(AssimpAPITest_aiMatrix3x3, aiMatrix3AreEqualTest) {
+ result_c = result_cpp = random_mat3();
+ EXPECT_EQ(result_cpp == result_c,
+ (bool)aiMatrix3AreEqual(&result_cpp, &result_c));
+}
+
+TEST_F(AssimpAPITest_aiMatrix3x3, aiMatrix3AreEqualEpsilonTest) {
+ result_c = result_cpp = random_mat3();
+ EXPECT_EQ(result_cpp.Equal(result_c, Epsilon),
+ (bool)aiMatrix3AreEqualEpsilon(&result_cpp, &result_c, Epsilon));
+}
+
+TEST_F(AssimpAPITest_aiMatrix3x3, aiMultiplyMatrix3Test) {
+ const auto m = random_mat3();
+ result_c = result_cpp = random_mat3();
+ result_cpp *= m;
+ aiMultiplyMatrix3(&result_c, &m);
+ EXPECT_EQ(result_cpp, result_c);
+}
+
+TEST_F(AssimpAPITest_aiMatrix3x3, aiTransposeMatrix3Test) {
+ result_c = result_cpp = random_mat3();
+ result_cpp.Transpose();
+ aiTransposeMatrix3(&result_c);
+ EXPECT_EQ(result_cpp, result_c);
+}
+
+TEST_F(AssimpAPITest_aiMatrix3x3, aiMatrix3InverseTest) {
+ // Use a predetermined matrix to prevent arbitrary
+ // cases where it could have a null determinant.
+ result_c = result_cpp = aiMatrix3x3(
+ 5, 2, 7,
+ 4, 6, 9,
+ 1, 8, 3);
+ result_cpp.Inverse();
+ aiMatrix3Inverse(&result_c);
+ EXPECT_EQ(result_cpp, result_c);
+}
+
+TEST_F(AssimpAPITest_aiMatrix3x3, aiMatrix3DeterminantTest) {
+ result_c = result_cpp = random_mat3();
+ EXPECT_EQ(result_cpp.Determinant(),
+ aiMatrix3Determinant(&result_c));
+}
+
+TEST_F(AssimpAPITest_aiMatrix3x3, aiMatrix3RotationZTest) {
+ const float angle(RandPI.next());
+ aiMatrix3x3::RotationZ(angle, result_cpp);
+ aiMatrix3RotationZ(&result_c, angle);
+ EXPECT_EQ(result_cpp, result_c);
+}
+
+TEST_F(AssimpAPITest_aiMatrix3x3, aiMatrix3FromRotationAroundAxisTest) {
+ const float angle(RandPI.next());
+ const auto axis = random_unit_vec3();
+ aiMatrix3x3::Rotation(angle, axis, result_cpp);
+ aiMatrix3FromRotationAroundAxis(&result_c, &axis, angle);
+ EXPECT_EQ(result_cpp, result_c);
+}
+
+TEST_F(AssimpAPITest_aiMatrix3x3, aiMatrix3TranslationTest) {
+ const auto axis = random_vec2();
+ aiMatrix3x3::Translation(axis, result_cpp);
+ aiMatrix3Translation(&result_c, &axis);
+ EXPECT_EQ(result_cpp, result_c);
+}
+
+TEST_F(AssimpAPITest_aiMatrix3x3, aiMatrix3FromToTest) {
+ // Use predetermined vectors to prevent running into division by zero.
+ const auto from = aiVector3D(1,2,1).Normalize(), to = aiVector3D(-1,1,1).Normalize();
+ aiMatrix3x3::FromToMatrix(from, to, result_cpp);
+ aiMatrix3FromTo(&result_c, &from, &to);
+ EXPECT_EQ(result_cpp, result_c);
+}
diff --git a/libs/assimp/test/unit/AssimpAPITest_aiMatrix4x4.cpp b/libs/assimp/test/unit/AssimpAPITest_aiMatrix4x4.cpp
new file mode 100644
index 0000000..9372bd9
--- /dev/null
+++ b/libs/assimp/test/unit/AssimpAPITest_aiMatrix4x4.cpp
@@ -0,0 +1,259 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "UnitTestPCH.h"
+#include "MathTest.h"
+
+using namespace Assimp;
+
+class AssimpAPITest_aiMatrix4x4 : public AssimpMathTest {
+protected:
+ virtual void SetUp() {
+ result_c = result_cpp = aiMatrix4x4();
+ }
+
+ /* Generates a predetermined transformation matrix to use
+ for the aiDecompose functions to prevent running into
+ division by zero. */
+ aiMatrix4x4 get_predetermined_transformation_matrix_for_decomposition() const {
+ aiMatrix4x4 t, r;
+ aiMatrix4x4::Translation(aiVector3D(14,-25,-8), t);
+ aiMatrix4x4::Rotation(Math::aiPi<float>() / 4.0f, aiVector3D(1).Normalize(), r);
+ return t * r;
+ }
+
+ aiMatrix4x4 result_c, result_cpp;
+};
+
+TEST_F(AssimpAPITest_aiMatrix4x4, aiIdentityMatrix4Test) {
+ // Force a non-identity matrix.
+ result_c = aiMatrix4x4(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+ aiIdentityMatrix4(&result_c);
+ EXPECT_EQ(result_cpp, result_c);
+}
+
+TEST_F(AssimpAPITest_aiMatrix4x4, aiMatrix4FromMatrix3Test) {
+ aiMatrix3x3 m = random_mat3();
+ result_cpp = aiMatrix4x4(m);
+ aiMatrix4FromMatrix3(&result_c, &m);
+ EXPECT_EQ(result_cpp, result_c);
+}
+
+TEST_F(AssimpAPITest_aiMatrix4x4, aiMatrix4FromScalingQuaternionPositionTest) {
+ const aiVector3D s = random_vec3();
+ const aiQuaternion q = random_quat();
+ const aiVector3D t = random_vec3();
+ result_cpp = aiMatrix4x4(s, q, t);
+ aiMatrix4FromScalingQuaternionPosition(&result_c, &s, &q, &t);
+ EXPECT_EQ(result_cpp, result_c);
+}
+
+TEST_F(AssimpAPITest_aiMatrix4x4, aiMatrix4AddTest) {
+ const aiMatrix4x4 temp = random_mat4();
+ result_c = result_cpp = random_mat4();
+ result_cpp = result_cpp + temp;
+ aiMatrix4Add(&result_c, &temp);
+ EXPECT_EQ(result_cpp, result_c);
+}
+
+TEST_F(AssimpAPITest_aiMatrix4x4, aiMatrix4AreEqualTest) {
+ result_c = result_cpp = random_mat4();
+ EXPECT_EQ(result_cpp == result_c,
+ (bool)aiMatrix4AreEqual(&result_cpp, &result_c));
+}
+
+TEST_F(AssimpAPITest_aiMatrix4x4, aiMatrix4AreEqualEpsilonTest) {
+ result_c = result_cpp = random_mat4();
+ EXPECT_EQ(result_cpp.Equal(result_c, Epsilon),
+ (bool)aiMatrix4AreEqualEpsilon(&result_cpp, &result_c, Epsilon));
+}
+
+TEST_F(AssimpAPITest_aiMatrix4x4, aiMultiplyMatrix4Test) {
+ const auto m = random_mat4();
+ result_c = result_cpp = random_mat4();
+ result_cpp *= m;
+ aiMultiplyMatrix4(&result_c, &m);
+ EXPECT_EQ(result_cpp, result_c);
+}
+
+TEST_F(AssimpAPITest_aiMatrix4x4, aiTransposeMatrix4Test) {
+ result_c = result_cpp = random_mat4();
+ result_cpp.Transpose();
+ aiTransposeMatrix4(&result_c);
+ EXPECT_EQ(result_cpp, result_c);
+}
+
+TEST_F(AssimpAPITest_aiMatrix4x4, aiMatrix4InverseTest) {
+ // Use a predetermined matrix to prevent arbitrary
+ // cases where it could have a null determinant.
+ result_c = result_cpp = aiMatrix4x4(
+ 6, 10, 15, 3,
+ 14, 2, 12, 8,
+ 9, 13, 5, 16,
+ 4, 7, 11, 1);
+ result_cpp.Inverse();
+ aiMatrix4Inverse(&result_c);
+ EXPECT_EQ(result_cpp, result_c);
+}
+
+TEST_F(AssimpAPITest_aiMatrix4x4, aiMatrix4DeterminantTest) {
+ result_c = result_cpp = random_mat4();
+ EXPECT_EQ(result_cpp.Determinant(),
+ aiMatrix4Determinant(&result_c));
+}
+
+TEST_F(AssimpAPITest_aiMatrix4x4, aiMatrix4IsIdentityTest) {
+ EXPECT_EQ(result_cpp.IsIdentity(),
+ (bool)aiMatrix4IsIdentity(&result_c));
+}
+
+TEST_F(AssimpAPITest_aiMatrix4x4, aiDecomposeMatrixTest) {
+ aiVector3D scaling_c, scaling_cpp,
+ position_c, position_cpp;
+ aiQuaternion rotation_c, rotation_cpp;
+
+ result_c = result_cpp = get_predetermined_transformation_matrix_for_decomposition();
+ result_cpp.Decompose(scaling_cpp, rotation_cpp, position_cpp);
+ aiDecomposeMatrix(&result_c, &scaling_c, &rotation_c, &position_c);
+ EXPECT_EQ(scaling_cpp, scaling_c);
+ EXPECT_EQ(position_cpp, position_c);
+ EXPECT_EQ(rotation_cpp, rotation_c);
+}
+
+TEST_F(AssimpAPITest_aiMatrix4x4, aiMatrix4DecomposeIntoScalingEulerAnglesPositionTest) {
+ aiVector3D scaling_c, scaling_cpp,
+ rotation_c, rotation_cpp,
+ position_c, position_cpp;
+
+ result_c = result_cpp = get_predetermined_transformation_matrix_for_decomposition();
+ result_cpp.Decompose(scaling_cpp, rotation_cpp, position_cpp);
+ aiMatrix4DecomposeIntoScalingEulerAnglesPosition(&result_c, &scaling_c, &rotation_c, &position_c);
+ EXPECT_EQ(scaling_cpp, scaling_c);
+ EXPECT_EQ(position_cpp, position_c);
+ EXPECT_EQ(rotation_cpp, rotation_c);
+}
+
+TEST_F(AssimpAPITest_aiMatrix4x4, aiMatrix4DecomposeIntoScalingAxisAnglePositionTest) {
+ aiVector3D scaling_c, scaling_cpp,
+ axis_c, axis_cpp,
+ position_c, position_cpp;
+ ai_real angle_c, angle_cpp;
+
+ result_c = result_cpp = get_predetermined_transformation_matrix_for_decomposition();
+ result_cpp.Decompose(scaling_cpp, axis_cpp, angle_cpp, position_cpp);
+ aiMatrix4DecomposeIntoScalingAxisAnglePosition(&result_c, &scaling_c, &axis_c, &angle_c, &position_c);
+ EXPECT_EQ(scaling_cpp, scaling_c);
+ EXPECT_EQ(axis_cpp, axis_c);
+ EXPECT_EQ(angle_cpp, angle_c);
+ EXPECT_EQ(position_cpp, position_c);
+}
+
+TEST_F(AssimpAPITest_aiMatrix4x4, aiMatrix4DecomposeNoScalingTest) {
+ aiVector3D position_c, position_cpp;
+ aiQuaternion rotation_c, rotation_cpp;
+
+ result_c = result_cpp = get_predetermined_transformation_matrix_for_decomposition();
+ result_cpp.DecomposeNoScaling(rotation_cpp, position_cpp);
+ aiMatrix4DecomposeNoScaling(&result_c, &rotation_c, &position_c);
+ EXPECT_EQ(position_cpp, position_c);
+ EXPECT_EQ(rotation_cpp, rotation_c);
+}
+
+TEST_F(AssimpAPITest_aiMatrix4x4, aiMatrix4FromEulerAnglesTest) {
+ const float x(RandPI.next()),
+ y(RandPI.next()),
+ z(RandPI.next());
+ result_cpp.FromEulerAnglesXYZ(x, y, z);
+ aiMatrix4FromEulerAngles(&result_c, x, y, z);
+ EXPECT_EQ(result_cpp, result_c);
+}
+
+TEST_F(AssimpAPITest_aiMatrix4x4, aiMatrix4RotationXTest) {
+ const float angle(RandPI.next());
+ aiMatrix4x4::RotationX(angle, result_cpp);
+ aiMatrix4RotationX(&result_c, angle);
+ EXPECT_EQ(result_cpp, result_c);
+}
+
+TEST_F(AssimpAPITest_aiMatrix4x4, aiMatrix4RotationYTest) {
+ const float angle(RandPI.next());
+ aiMatrix4x4::RotationY(angle, result_cpp);
+ aiMatrix4RotationY(&result_c, angle);
+ EXPECT_EQ(result_cpp, result_c);
+}
+
+TEST_F(AssimpAPITest_aiMatrix4x4, aiMatrix4RotationZTest) {
+ const float angle(RandPI.next());
+ aiMatrix4x4::RotationZ(angle, result_cpp);
+ aiMatrix4RotationZ(&result_c, angle);
+ EXPECT_EQ(result_cpp, result_c);
+}
+
+TEST_F(AssimpAPITest_aiMatrix4x4, aiMatrix4FromRotationAroundAxisTest) {
+ const float angle(RandPI.next());
+ const auto axis = random_unit_vec3();
+ aiMatrix4x4::Rotation(angle, axis, result_cpp);
+ aiMatrix4FromRotationAroundAxis(&result_c, &axis, angle);
+ EXPECT_EQ(result_cpp, result_c);
+}
+
+TEST_F(AssimpAPITest_aiMatrix4x4, aiMatrix4TranslationTest) {
+ const auto axis = random_vec3();
+ aiMatrix4x4::Translation(axis, result_cpp);
+ aiMatrix4Translation(&result_c, &axis);
+ EXPECT_EQ(result_cpp, result_c);
+}
+
+TEST_F(AssimpAPITest_aiMatrix4x4, aiMatrix4ScalingTest) {
+ const auto scaling = random_vec3();
+ aiMatrix4x4::Scaling(scaling, result_cpp);
+ aiMatrix4Scaling(&result_c, &scaling);
+ EXPECT_EQ(result_cpp, result_c);
+}
+
+TEST_F(AssimpAPITest_aiMatrix4x4, aiMatrix4FromToTest) {
+ // Use predetermined vectors to prevent running into division by zero.
+ const auto from = aiVector3D(1,2,1).Normalize(), to = aiVector3D(-1,1,1).Normalize();
+ aiMatrix4x4::FromToMatrix(from, to, result_cpp);
+ aiMatrix4FromTo(&result_c, &from, &to);
+ EXPECT_EQ(result_cpp, result_c);
+}
diff --git a/libs/assimp/test/unit/AssimpAPITest_aiQuaternion.cpp b/libs/assimp/test/unit/AssimpAPITest_aiQuaternion.cpp
new file mode 100644
index 0000000..8f57bc5
--- /dev/null
+++ b/libs/assimp/test/unit/AssimpAPITest_aiQuaternion.cpp
@@ -0,0 +1,135 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "UnitTestPCH.h"
+#include "MathTest.h"
+
+using namespace Assimp;
+
+class AssimpAPITest_aiQuaternion : public AssimpMathTest {
+protected:
+ virtual void SetUp() {
+ result_c = result_cpp = aiQuaternion();
+ }
+
+ aiQuaternion result_c, result_cpp;
+};
+
+TEST_F(AssimpAPITest_aiQuaternion, aiCreateQuaternionFromMatrixTest) {
+ // Use a predetermined transformation matrix
+ // to prevent running into division by zero.
+ aiMatrix3x3 m, r;
+ aiMatrix3x3::Translation(aiVector2D(14,-25), m);
+ aiMatrix3x3::RotationZ(Math::aiPi<float>() / 4.0f, r);
+ m = m * r;
+
+ result_cpp = aiQuaternion(m);
+ aiCreateQuaternionFromMatrix(&result_c, &m);
+ EXPECT_EQ(result_cpp, result_c);
+}
+
+TEST_F(AssimpAPITest_aiQuaternion, aiQuaternionFromEulerAnglesTest) {
+ const float x(RandPI.next()),
+ y(RandPI.next()),
+ z(RandPI.next());
+ result_cpp = aiQuaternion(x, y, z);
+ aiQuaternionFromEulerAngles(&result_c, x, y, z);
+ EXPECT_EQ(result_cpp, result_c);
+}
+
+TEST_F(AssimpAPITest_aiQuaternion, aiQuaternionFromAxisAngleTest) {
+ const float angle(RandPI.next());
+ const aiVector3D axis(random_unit_vec3());
+ result_cpp = aiQuaternion(axis, angle);
+ aiQuaternionFromAxisAngle(&result_c, &axis, angle);
+ EXPECT_EQ(result_cpp, result_c);
+}
+
+TEST_F(AssimpAPITest_aiQuaternion, aiQuaternionFromNormalizedQuaternionTest) {
+ const auto qvec3 = random_unit_vec3();
+ result_cpp = aiQuaternion(qvec3);
+ aiQuaternionFromNormalizedQuaternion(&result_c, &qvec3);
+ EXPECT_EQ(result_cpp, result_c);
+}
+
+TEST_F(AssimpAPITest_aiQuaternion, aiQuaternionAreEqualTest) {
+ result_c = result_cpp = random_quat();
+ EXPECT_EQ(result_cpp == result_c,
+ (bool)aiQuaternionAreEqual(&result_cpp, &result_c));
+}
+
+TEST_F(AssimpAPITest_aiQuaternion, aiQuaternionAreEqualEpsilonTest) {
+ result_c = result_cpp = random_quat();
+ EXPECT_EQ(result_cpp.Equal(result_c, Epsilon),
+ (bool)aiQuaternionAreEqualEpsilon(&result_cpp, &result_c, Epsilon));
+}
+
+TEST_F(AssimpAPITest_aiQuaternion, aiQuaternionNormalizeTest) {
+ result_c = result_cpp = random_quat();
+ aiQuaternionNormalize(&result_c);
+ EXPECT_EQ(result_cpp.Normalize(), result_c);
+}
+
+TEST_F(AssimpAPITest_aiQuaternion, aiQuaternionConjugateTest) {
+ result_c = result_cpp = random_quat();
+ aiQuaternionConjugate(&result_c);
+ EXPECT_EQ(result_cpp.Conjugate(), result_c);
+}
+
+TEST_F(AssimpAPITest_aiQuaternion, aiQuaternionMultiplyTest) {
+ const aiQuaternion temp = random_quat();
+ result_c = result_cpp = random_quat();
+ result_cpp = result_cpp * temp;
+ aiQuaternionMultiply(&result_c, &temp);
+ EXPECT_EQ(result_cpp, result_c);
+}
+
+TEST_F(AssimpAPITest_aiQuaternion, aiQuaternionInterpolateTest) {
+ // Use predetermined quaternions to prevent division by zero
+ // during slerp calculations.
+ const float INTERPOLATION(0.5f);
+ const auto q1 = aiQuaternion(aiVector3D(-1,1,1).Normalize(), Math::aiPi<float>() / 4.0f);
+ const auto q2 = aiQuaternion(aiVector3D(1,2,1).Normalize(), Math::aiPi<float>() / 2.0f);
+ aiQuaternion::Interpolate(result_cpp, q1, q2, INTERPOLATION);
+ aiQuaternionInterpolate(&result_c, &q1, &q2, INTERPOLATION);
+ EXPECT_EQ(result_cpp, result_c);
+}
diff --git a/libs/assimp/test/unit/AssimpAPITest_aiVector2D.cpp b/libs/assimp/test/unit/AssimpAPITest_aiVector2D.cpp
new file mode 100644
index 0000000..44bb34a
--- /dev/null
+++ b/libs/assimp/test/unit/AssimpAPITest_aiVector2D.cpp
@@ -0,0 +1,140 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "UnitTestPCH.h"
+#include "MathTest.h"
+
+using namespace Assimp;
+
+class AssimpAPITest_aiVector2D : public AssimpMathTest {
+protected:
+ virtual void SetUp() {
+ result_c = result_cpp = aiVector2D();
+ temp = random_vec2(); // Generates a random 2D vector != null vector.
+ }
+
+ aiVector2D result_c, result_cpp, temp;
+};
+
+TEST_F(AssimpAPITest_aiVector2D, aiVector2AreEqualTest) {
+ result_c = result_cpp = random_vec2();
+ EXPECT_EQ(result_cpp == result_c,
+ (bool)aiVector2AreEqual(&result_cpp, &result_c));
+}
+
+TEST_F(AssimpAPITest_aiVector2D, aiVector2AreEqualEpsilonTest) {
+ result_c = result_cpp = random_vec2();
+ EXPECT_EQ(result_cpp.Equal(result_c, Epsilon),
+ (bool)aiVector2AreEqualEpsilon(&result_cpp, &result_c, Epsilon));
+}
+
+TEST_F(AssimpAPITest_aiVector2D, aiVector2AddTest) {
+ result_c = result_cpp = random_vec2();
+ result_cpp += temp;
+ aiVector2Add(&result_c, &temp);
+ EXPECT_EQ(result_cpp, result_c);
+}
+
+TEST_F(AssimpAPITest_aiVector2D, aiVector2SubtractTest) {
+ result_c = result_cpp = random_vec2();
+ result_cpp -= temp;
+ aiVector2Subtract(&result_c, &temp);
+ EXPECT_EQ(result_cpp, result_c);
+}
+
+TEST_F(AssimpAPITest_aiVector2D, aiVector2ScaleTest) {
+ const float FACTOR = RandNonZero.next();
+ result_c = result_cpp = random_vec2();
+ result_cpp *= FACTOR;
+ aiVector2Scale(&result_c, FACTOR);
+ EXPECT_EQ(result_cpp, result_c);
+}
+
+TEST_F(AssimpAPITest_aiVector2D, aiVector2SymMulTest) {
+ result_c = result_cpp = random_vec2();
+ result_cpp = result_cpp.SymMul(temp);
+ aiVector2SymMul(&result_c, &temp);
+ EXPECT_EQ(result_cpp, result_c);
+}
+
+TEST_F(AssimpAPITest_aiVector2D, aiVector2DivideByScalarTest) {
+ const float DIVISOR = RandNonZero.next();
+ result_c = result_cpp = random_vec2();
+ result_cpp /= DIVISOR;
+ aiVector2DivideByScalar(&result_c, DIVISOR);
+ EXPECT_EQ(result_cpp, result_c);
+}
+
+TEST_F(AssimpAPITest_aiVector2D, aiVector2DivideByVectorTest) {
+ result_c = result_cpp = random_vec2();
+ result_cpp = result_cpp / temp;
+ aiVector2DivideByVector(&result_c, &temp);
+ EXPECT_EQ(result_cpp, result_c);
+}
+
+TEST_F(AssimpAPITest_aiVector2D, aiVector2LengthTest) {
+ result_c = result_cpp = random_vec2();
+ EXPECT_EQ(result_cpp.Length(), aiVector2Length(&result_c));
+}
+
+TEST_F(AssimpAPITest_aiVector2D, aiVector2SquareLengthTest) {
+ result_c = result_cpp = random_vec2();
+ EXPECT_EQ(result_cpp.SquareLength(), aiVector2SquareLength(&result_c));
+}
+
+TEST_F(AssimpAPITest_aiVector2D, aiVector2NegateTest) {
+ result_c = result_cpp = random_vec2();
+ aiVector2Negate(&result_c);
+ EXPECT_EQ(-result_cpp, result_c);
+}
+
+TEST_F(AssimpAPITest_aiVector2D, aiVector2DotProductTest) {
+ result_c = result_cpp = random_vec2();
+ EXPECT_EQ(result_cpp * result_c,
+ aiVector2DotProduct(&result_cpp, &result_c));
+}
+
+TEST_F(AssimpAPITest_aiVector2D, aiVector2NormalizeTest) {
+ result_c = result_cpp = random_vec2();
+ aiVector2Normalize(&result_c);
+ EXPECT_EQ(result_cpp.Normalize(), result_c);
+}
diff --git a/libs/assimp/test/unit/AssimpAPITest_aiVector3D.cpp b/libs/assimp/test/unit/AssimpAPITest_aiVector3D.cpp
new file mode 100644
index 0000000..c752116
--- /dev/null
+++ b/libs/assimp/test/unit/AssimpAPITest_aiVector3D.cpp
@@ -0,0 +1,185 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "UnitTestPCH.h"
+#include "MathTest.h"
+
+using namespace Assimp;
+
+class AssimpAPITest_aiVector3D : public AssimpMathTest {
+protected:
+ virtual void SetUp() {
+ result_c = result_cpp = aiVector3D();
+ temp = random_vec3(); // Generates a random 3D vector != null vector.
+ }
+
+ aiVector3D result_c, result_cpp, temp;
+};
+
+TEST_F(AssimpAPITest_aiVector3D, aiVector3AreEqualTest) {
+ result_c = result_cpp = random_vec3();
+ EXPECT_EQ(result_cpp == result_c,
+ (bool)aiVector3AreEqual(&result_cpp, &result_c));
+}
+
+TEST_F(AssimpAPITest_aiVector3D, aiVector3AreEqualEpsilonTest) {
+ result_c = result_cpp = random_vec3();
+ EXPECT_EQ(result_cpp.Equal(result_c, Epsilon),
+ (bool)aiVector3AreEqualEpsilon(&result_cpp, &result_c, Epsilon));
+}
+
+TEST_F(AssimpAPITest_aiVector3D, aiVector3LessThanTest) {
+ result_c = result_cpp = random_vec3();
+ EXPECT_EQ(result_cpp < temp,
+ (bool)aiVector3LessThan(&result_c, &temp));
+}
+
+TEST_F(AssimpAPITest_aiVector3D, aiVector3AddTest) {
+ result_c = result_cpp = random_vec3();
+ result_cpp += temp;
+ aiVector3Add(&result_c, &temp);
+ EXPECT_EQ(result_cpp, result_c);
+}
+
+TEST_F(AssimpAPITest_aiVector3D, aiVector3SubtractTest) {
+ result_c = result_cpp = random_vec3();
+ result_cpp -= temp;
+ aiVector3Subtract(&result_c, &temp);
+ EXPECT_EQ(result_cpp, result_c);
+}
+
+TEST_F(AssimpAPITest_aiVector3D, aiVector3ScaleTest) {
+ const float FACTOR = RandNonZero.next();
+ result_c = result_cpp = random_vec3();
+ result_cpp *= FACTOR;
+ aiVector3Scale(&result_c, FACTOR);
+ EXPECT_EQ(result_cpp, result_c);
+}
+
+TEST_F(AssimpAPITest_aiVector3D, aiVector3SymMulTest) {
+ result_c = result_cpp = random_vec3();
+ result_cpp = result_cpp.SymMul(temp);
+ aiVector3SymMul(&result_c, &temp);
+ EXPECT_EQ(result_cpp, result_c);
+}
+
+TEST_F(AssimpAPITest_aiVector3D, aiVector3DivideByScalarTest) {
+ const float DIVISOR = RandNonZero.next();
+ result_c = result_cpp = random_vec3();
+ result_cpp /= DIVISOR;
+ aiVector3DivideByScalar(&result_c, DIVISOR);
+ EXPECT_EQ(result_cpp, result_c);
+}
+
+TEST_F(AssimpAPITest_aiVector3D, aiVector3DivideByVectorTest) {
+ result_c = result_cpp = random_vec3();
+ result_cpp = result_cpp / temp;
+ aiVector3DivideByVector(&result_c, &temp);
+ EXPECT_EQ(result_cpp, result_c);
+}
+
+TEST_F(AssimpAPITest_aiVector3D, aiVector3LengthTest) {
+ result_c = result_cpp = random_vec3();
+ EXPECT_EQ(result_cpp.Length(), aiVector3Length(&result_c));
+}
+
+TEST_F(AssimpAPITest_aiVector3D, aiVector3SquareLengthTest) {
+ result_c = result_cpp = random_vec3();
+ EXPECT_EQ(result_cpp.SquareLength(), aiVector3SquareLength(&result_c));
+}
+
+TEST_F(AssimpAPITest_aiVector3D, aiVector3NegateTest) {
+ result_c = result_cpp = random_vec3();
+ aiVector3Negate(&result_c);
+ EXPECT_EQ(-result_cpp, result_c);
+}
+
+TEST_F(AssimpAPITest_aiVector3D, aiVector3DotProductTest) {
+ result_c = result_cpp = random_vec3();
+ EXPECT_EQ(result_cpp * result_c,
+ aiVector3DotProduct(&result_cpp, &result_c));
+}
+
+TEST_F(AssimpAPITest_aiVector3D, aiVector3CrossProductTest) {
+ result_c = result_cpp = random_vec3();
+ result_cpp = result_cpp ^ temp;
+ aiVector3CrossProduct(&result_c, &result_c, &temp);
+ EXPECT_EQ(result_cpp, result_c);
+}
+
+TEST_F(AssimpAPITest_aiVector3D, aiVector3NormalizeTest) {
+ result_c = result_cpp = random_vec3();
+ aiVector3Normalize(&result_c);
+ EXPECT_EQ(result_cpp.Normalize(), result_c);
+}
+
+TEST_F(AssimpAPITest_aiVector3D, aiVector3NormalizeSafeTest) {
+ result_c = result_cpp = random_vec3();
+ aiVector3NormalizeSafe(&result_c);
+ EXPECT_EQ(result_cpp.NormalizeSafe(), result_c);
+}
+
+TEST_F(AssimpAPITest_aiVector3D, aiVector3RotateByQuaternionTest) {
+ aiVector3D v_c, v_cpp;
+ v_c = v_cpp = random_vec3();
+ const auto q = random_quat();
+ aiVector3RotateByQuaternion(&v_c, &q);
+ EXPECT_EQ(q.Rotate(v_cpp), v_c);
+}
+
+TEST_F(AssimpAPITest_aiVector3D, aiTransformVecByMatrix3Test) {
+ const auto m = random_mat3();
+ aiVector3D v_c, v_cpp;
+ v_c = v_cpp = random_vec3();
+ v_cpp *= m;
+ aiTransformVecByMatrix3(&v_c, &m);
+ EXPECT_EQ(v_cpp, v_c);
+}
+
+TEST_F(AssimpAPITest_aiVector3D, aiTransformVecByMatrix4Test) {
+ const auto m = random_mat4();
+ aiVector3D v_c, v_cpp;
+ v_c = v_cpp = random_vec3();
+ v_cpp *= m;
+ aiTransformVecByMatrix4(&v_c, &m);
+ EXPECT_EQ(v_cpp, v_c);
+}
diff --git a/libs/assimp/test/unit/CCompilerTest.c b/libs/assimp/test/unit/CCompilerTest.c
new file mode 100644
index 0000000..68dfdf0
--- /dev/null
+++ b/libs/assimp/test/unit/CCompilerTest.c
@@ -0,0 +1,9 @@
+
+/* This is just a small test to check whether Assimp's API compiles from C */
+
+#include <assimp/postprocess.h>
+#include <assimp/scene.h>
+#include <assimp/version.h>
+#include <assimp/config.h>
+#include <assimp/cimport.h>
+#include <assimp/cexport.h>
diff --git a/libs/assimp/test/unit/Common/uiScene.cpp b/libs/assimp/test/unit/Common/uiScene.cpp
new file mode 100644
index 0000000..87001ce
--- /dev/null
+++ b/libs/assimp/test/unit/Common/uiScene.cpp
@@ -0,0 +1,109 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+
+#include "UnitTestPCH.h"
+
+#include <assimp/scene.h>
+#include <assimp/SceneCombiner.h>
+
+using namespace Assimp;
+
+class utScene : public ::testing::Test {
+protected:
+ aiScene *scene;
+
+ void SetUp() override {
+ scene = new aiScene;
+ }
+
+ void TearDown() override {
+ delete scene;
+ scene = nullptr;
+ }
+};
+
+TEST_F(utScene, findNodeTest) {
+ scene->mRootNode = new aiNode();
+ scene->mRootNode->mName.Set("test");
+ aiNode *child = new aiNode;
+ child->mName.Set("child");
+ scene->mRootNode->addChildren(1, &child);
+ aiNode *found = scene->mRootNode->FindNode("child");
+ EXPECT_EQ(child, found);
+}
+
+TEST_F(utScene, sceneHasContentTest) {
+ EXPECT_FALSE(scene->HasAnimations());
+ EXPECT_FALSE(scene->HasMaterials());
+ EXPECT_FALSE(scene->HasMeshes());
+ EXPECT_FALSE(scene->HasCameras());
+ EXPECT_FALSE(scene->HasLights());
+ EXPECT_FALSE(scene->HasTextures());
+}
+
+TEST_F(utScene, getShortFilenameTest) {
+ std::string long_filename1 = "foo_bar/name";
+ const char *name1 = scene->GetShortFilename(long_filename1.c_str());
+ EXPECT_NE(nullptr, name1);
+
+ std::string long_filename2 = "foo_bar\\name";
+ const char *name2 = scene->GetShortFilename(long_filename2.c_str());
+ EXPECT_NE(nullptr, name2);
+}
+
+TEST_F(utScene, deepCopyTest) {
+ scene->mRootNode = new aiNode();
+
+ scene->mNumMeshes = 1;
+ scene->mMeshes = new aiMesh *[scene->mNumMeshes] ();
+ scene->mMeshes[0] = new aiMesh ();
+
+ scene->mMeshes[0]->SetTextureCoordsName (0, aiString ("test"));
+
+ {
+ aiScene* copied = nullptr;
+ SceneCombiner::CopyScene(&copied,scene);
+ delete copied;
+ }
+}
+
+TEST_F(utScene, getEmbeddedTextureTest) {
+}
diff --git a/libs/assimp/test/unit/Common/utAssertHandler.cpp b/libs/assimp/test/unit/Common/utAssertHandler.cpp
new file mode 100644
index 0000000..a2585fe
--- /dev/null
+++ b/libs/assimp/test/unit/Common/utAssertHandler.cpp
@@ -0,0 +1,110 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+
+#include "UnitTestPCH.h"
+
+/// Ensure this test has asserts on, even if the build type doesn't have asserts by default.
+#if !defined(ASSIMP_BUILD_DEBUG)
+#define ASSIMP_BUILD_DEBUG
+#endif
+
+#include <assimp/ai_assert.h>
+#include <code/Common/AssertHandler.h>
+
+namespace
+{
+ /// An exception which is thrown by the testAssertHandler
+ struct TestAssertException
+ {
+ TestAssertException(const char* failedExpression, const char* file, int line)
+ : m_failedExpression(failedExpression)
+ , m_file(file)
+ , m_line(line)
+ {
+ }
+
+ std::string m_failedExpression;
+ std::string m_file;
+ int m_line;
+ };
+
+ /// Swap the default handler, which aborts, by one which throws.
+ void testAssertHandler(const char* failedExpression, const char* file, int line)
+ {
+ throw TestAssertException(failedExpression, file, line);
+ }
+
+ /// Ensure that the default assert handler is restored after the test is finished.
+ struct ReplaceHandlerScope
+ {
+ ReplaceHandlerScope()
+ {
+ Assimp::setAiAssertHandler(testAssertHandler);
+ }
+
+ ~ReplaceHandlerScope()
+ {
+ Assimp::setAiAssertHandler(Assimp::defaultAiAssertHandler);
+ }
+ };
+}
+
+TEST(utAssertHandler, replaceWithThrow)
+{
+ ReplaceHandlerScope scope;
+
+ try
+ {
+ ai_assert((2 + 2 == 5) && "Sometimes people put messages here");
+ EXPECT_TRUE(false);
+ }
+ catch(const TestAssertException& e)
+ {
+ EXPECT_STREQ(e.m_failedExpression.c_str(), "(2 + 2 == 5) && \"Sometimes people put messages here\"");
+ EXPECT_STREQ(e.m_file.c_str(), __FILE__);
+ EXPECT_GT(e.m_line, 0);
+ EXPECT_LT(e.m_line, __LINE__);
+ }
+ catch(...)
+ {
+ EXPECT_TRUE(false);
+ }
+}
diff --git a/libs/assimp/test/unit/Common/utBase64.cpp b/libs/assimp/test/unit/Common/utBase64.cpp
new file mode 100644
index 0000000..8b0a60e
--- /dev/null
+++ b/libs/assimp/test/unit/Common/utBase64.cpp
@@ -0,0 +1,72 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+
+#include "UnitTestPCH.h"
+#include "TestIOSystem.h"
+
+#include <assimp/Base64.hpp>
+
+using namespace std;
+using namespace Assimp;
+
+class Base64Test : public ::testing::Test {
+public:
+ virtual void SetUp() {
+ }
+
+ virtual void TearDown() {
+ }
+};
+
+static const std::vector<uint8_t> assimpStringBinary = { 97, 115, 115, 105, 109, 112 };
+static const std::string assimpStringEncoded = "YXNzaW1w";
+
+TEST_F( Base64Test, encodeTest ) {
+ EXPECT_EQ( "", Base64::Encode (std::vector<uint8_t>{}) );
+ EXPECT_EQ( "Vg==", Base64::Encode (std::vector<uint8_t>{ 86 }) );
+ EXPECT_EQ( assimpStringEncoded, Base64::Encode (assimpStringBinary) );
+}
+
+TEST_F( Base64Test, decodeTest ) {
+ EXPECT_EQ( std::vector<uint8_t> {}, Base64::Decode ("") );
+ EXPECT_EQ( std::vector<uint8_t> { 86 }, Base64::Decode ("Vg==") );
+ EXPECT_EQ( assimpStringBinary, Base64::Decode (assimpStringEncoded) );
+}
diff --git a/libs/assimp/test/unit/Common/utLineSplitter.cpp b/libs/assimp/test/unit/Common/utLineSplitter.cpp
new file mode 100644
index 0000000..0a97f72
--- /dev/null
+++ b/libs/assimp/test/unit/Common/utLineSplitter.cpp
@@ -0,0 +1,71 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "UnitTestPCH.h"
+
+#include <assimp/LineSplitter.h>
+#include <assimp/DefaultIOSystem.h>
+#include <string>
+
+using namespace Assimp;
+
+class utLineSplitter : public ::testing::Test {
+ // empty
+};
+
+TEST_F(utLineSplitter, tokenizetest) {
+ DefaultIOSystem fs;
+ IOStream* file = fs.Open(ASSIMP_TEST_MODELS_DIR"/ParsingFiles/linesplitter_tokenizetest.txt", "rb");
+
+ StreamReaderLE stream(file);
+ LineSplitter myLineSplitter(stream);
+}
+
+TEST_F( utLineSplitter, issue212Test) {
+ DefaultIOSystem fs;
+ IOStream* file = fs.Open(ASSIMP_TEST_MODELS_DIR"/ParsingFiles/linesplitter_emptyline_test.txt", "rb");
+
+ StreamReaderLE stream(file);
+ LineSplitter myLineSplitter(stream);
+ myLineSplitter++;
+ EXPECT_THROW( myLineSplitter++, std::logic_error );
+}
diff --git a/libs/assimp/test/unit/Common/utMesh.cpp b/libs/assimp/test/unit/Common/utMesh.cpp
new file mode 100644
index 0000000..77a7113
--- /dev/null
+++ b/libs/assimp/test/unit/Common/utMesh.cpp
@@ -0,0 +1,97 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+
+#include "UnitTestPCH.h"
+
+#include <assimp/mesh.h>
+
+using namespace Assimp;
+
+class utMesh : public ::testing::Test {
+protected:
+ aiMesh* mesh = nullptr;
+
+ void SetUp() override {
+ mesh = new aiMesh;
+ }
+
+ void TearDown() override {
+ delete mesh;
+ mesh = nullptr;
+ }
+};
+
+TEST_F(utMesh, emptyMeshHasNoContentTest) {
+ EXPECT_EQ(0u, mesh->mName.length);
+ EXPECT_FALSE(mesh->HasPositions());
+ EXPECT_FALSE(mesh->HasFaces());
+ EXPECT_FALSE(mesh->HasNormals());
+ EXPECT_FALSE(mesh->HasTangentsAndBitangents());
+ EXPECT_FALSE(mesh->HasVertexColors(0));
+ EXPECT_FALSE(mesh->HasVertexColors(AI_MAX_NUMBER_OF_COLOR_SETS));
+ EXPECT_FALSE(mesh->HasTextureCoords(0));
+ EXPECT_FALSE(mesh->HasTextureCoords(AI_MAX_NUMBER_OF_TEXTURECOORDS));
+ EXPECT_EQ(0u, mesh->GetNumUVChannels());
+ EXPECT_EQ(0u, mesh->GetNumColorChannels());
+ EXPECT_FALSE(mesh->HasBones());
+ EXPECT_FALSE(mesh->HasTextureCoordsName(0));
+ EXPECT_FALSE(mesh->HasTextureCoordsName(AI_MAX_NUMBER_OF_TEXTURECOORDS));
+}
+
+TEST_F(utMesh, setTextureCoordsName) {
+ EXPECT_FALSE(mesh->HasTextureCoordsName(0));
+ const aiString texcoords_name("texcoord_name");
+ mesh->SetTextureCoordsName(0, texcoords_name);
+ EXPECT_TRUE(mesh->HasTextureCoordsName(0u));
+ EXPECT_FALSE(mesh->HasTextureCoordsName(1u));
+ ASSERT_NE(nullptr, mesh->mTextureCoordsNames);
+ ASSERT_NE(nullptr, mesh->mTextureCoordsNames[0]);
+ EXPECT_STREQ(texcoords_name.C_Str(), mesh->mTextureCoordsNames[0]->C_Str());
+ EXPECT_STREQ(texcoords_name.C_Str(), mesh->GetTextureCoordsName(0)->C_Str());
+
+ // Now clear the name
+ mesh->SetTextureCoordsName(0, aiString());
+ EXPECT_FALSE(mesh->HasTextureCoordsName(0));
+ ASSERT_NE(nullptr, mesh->mTextureCoordsNames);
+ EXPECT_EQ(nullptr, mesh->mTextureCoordsNames[0]);
+ EXPECT_EQ(nullptr, mesh->GetTextureCoordsName(0));
+}
+
diff --git a/libs/assimp/test/unit/Common/utSpatialSort.cpp b/libs/assimp/test/unit/Common/utSpatialSort.cpp
new file mode 100644
index 0000000..0684e83
--- /dev/null
+++ b/libs/assimp/test/unit/Common/utSpatialSort.cpp
@@ -0,0 +1,120 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "UnitTestPCH.h"
+
+#include <assimp/SpatialSort.h>
+
+using namespace Assimp;
+
+class utSpatialSort : public ::testing::Test {
+public
+ :
+ aiVector3D *vecs;
+
+protected:
+ void SetUp() override {
+ ::srand(static_cast<unsigned>(time(0)));
+ vecs = new aiVector3D[100];
+ for (size_t i = 0; i < 100; ++i) {
+ vecs[i].x = static_cast<float>(rand()) / (static_cast<float>(RAND_MAX / 100));
+ vecs[i].y = static_cast<float>(rand()) / (static_cast<float>(RAND_MAX / 100));
+ vecs[i].z = static_cast<float>(rand()) / (static_cast<float>(RAND_MAX / 100));
+ }
+ }
+
+ void TearDown() override {
+ delete[] vecs;
+ }
+};
+
+TEST_F( utSpatialSort, findIdenticalsTest ) {
+ SpatialSort sSort;
+ sSort.Fill(vecs, 100, sizeof(aiVector3D));
+
+ std::vector<unsigned int> indices;
+ sSort.FindIdenticalPositions(vecs[0], indices);
+ EXPECT_EQ(1u, indices.size());
+}
+
+TEST_F(utSpatialSort, findPositionsTest) {
+ SpatialSort sSort;
+ sSort.Fill(vecs, 100, sizeof(aiVector3D));
+
+ std::vector<unsigned int> indices;
+ sSort.FindPositions(vecs[0], 0.01f, indices);
+ EXPECT_EQ(1u, indices.size());
+}
+
+TEST_F(utSpatialSort, highlyDisplacedPositionsTest) {
+ // Make a cube of positions, and then query it using the SpatialSort object.
+ constexpr unsigned int verticesPerAxis = 10;
+ constexpr ai_real step = 0.001f;
+ // Note the large constant offset here.
+ constexpr ai_real offset = 5000.0f - (0.5f * verticesPerAxis * step);
+ constexpr unsigned int totalNumPositions = verticesPerAxis * verticesPerAxis * verticesPerAxis;
+ aiVector3D* positions = new aiVector3D[totalNumPositions];
+ for (unsigned int x = 0; x < verticesPerAxis; ++x) {
+ for (unsigned int y = 0; y < verticesPerAxis; ++y) {
+ for (unsigned int z = 0; z < verticesPerAxis; ++z) {
+ const unsigned int index = (x * verticesPerAxis * verticesPerAxis) + (y * verticesPerAxis) + z;
+ positions[index] = aiVector3D(offset + (x * step), offset + (y * step), offset + (z * step));
+ }
+ }
+ }
+
+ SpatialSort sSort;
+ sSort.Fill(positions, totalNumPositions, sizeof(aiVector3D));
+
+ // Enough to find a point and its 6 immediate neighbors, but not any other point.
+ const ai_real epsilon = 1.1f * step;
+ std::vector<unsigned int> indices;
+ // Iterate through the _interior_ points of the cube.
+ for (unsigned int x = 1; x < verticesPerAxis - 1; ++x) {
+ for (unsigned int y = 1; y < verticesPerAxis - 1; ++y) {
+ for (unsigned int z = 1; z < verticesPerAxis - 1; ++z) {
+ const unsigned int index = (x * verticesPerAxis * verticesPerAxis) + (y * verticesPerAxis) + z;
+ sSort.FindPositions(positions[index], epsilon, indices);
+ ASSERT_EQ(7u, indices.size());
+ }
+ }
+ }
+ delete[] positions;
+}
diff --git a/libs/assimp/test/unit/Common/utStandardShapes.cpp b/libs/assimp/test/unit/Common/utStandardShapes.cpp
new file mode 100644
index 0000000..d7e6d21
--- /dev/null
+++ b/libs/assimp/test/unit/Common/utStandardShapes.cpp
@@ -0,0 +1,57 @@
+/*
+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,
+with or without modification, are permitted provided that the
+following conditions are met:
+* Redistributions of source code must retain the above
+ copyright notice, this list of conditions and the
+ following disclaimer.
+* Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the
+ following disclaimer in the documentation and/or other
+ materials provided with the distribution.
+* Neither the name of the assimp team, nor the names of its
+ contributors may be used to endorse or promote products
+ derived from this software without specific prior
+ written permission of the assimp team.
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+----------------------------------------------------------------------
+*/
+#include "UnitTestPCH.h"
+#include <assimp/mesh.h>
+#include <assimp/StandardShapes.h>
+
+using namespace Assimp;
+
+class utStandardShapes : public ::testing::Test {
+ // empty
+};
+
+TEST_F( utStandardShapes, testMakeMesh ) {
+ // Make sphere positions
+ std::vector<aiVector3D> positions;
+ Assimp::StandardShapes::MakeSphere(1, positions);
+
+ // Make mesh
+ const auto numIndicesPerPrimitive = 3u;
+ aiMesh *aiMeshPtr = Assimp::StandardShapes::MakeMesh(positions, numIndicesPerPrimitive);
+
+ // The mNumIndices member of the second face is now incorrect
+ const auto& face = aiMeshPtr->mFaces[0];
+ EXPECT_EQ(face.mNumIndices, numIndicesPerPrimitive);
+ delete aiMeshPtr;
+}
+
diff --git a/libs/assimp/test/unit/Common/utXmlParser.cpp b/libs/assimp/test/unit/Common/utXmlParser.cpp
new file mode 100644
index 0000000..2db78e3
--- /dev/null
+++ b/libs/assimp/test/unit/Common/utXmlParser.cpp
@@ -0,0 +1,86 @@
+/*-------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-------------------------------------------------------------------------*/
+#include "UnitTestPCH.h"
+#include <assimp/XmlParser.h>
+#include <assimp/DefaultIOStream.h>
+#include <assimp/DefaultIOSystem.h>
+
+using namespace Assimp;
+
+class utXmlParser : public ::testing::Test {
+public:
+ utXmlParser() :
+ Test(),
+ mIoSystem() {
+ // empty
+ }
+
+protected:
+ DefaultIOSystem mIoSystem;
+};
+
+TEST_F(utXmlParser, parse_xml_test) {
+ XmlParser parser;
+ std::string filename = ASSIMP_TEST_MODELS_DIR "/X3D/ComputerKeyboard.x3d";
+ std::unique_ptr<IOStream> stream(mIoSystem.Open(filename.c_str(), "rb"));
+ EXPECT_NE(stream.get(), nullptr);
+ bool result = parser.parse(stream.get());
+ EXPECT_TRUE(result);
+}
+
+TEST_F(utXmlParser, parse_xml_and_traverse_test) {
+ XmlParser parser;
+ std::string filename = ASSIMP_TEST_MODELS_DIR "/X3D/ComputerKeyboard.x3d";
+ std::unique_ptr<IOStream> stream(mIoSystem.Open(filename.c_str(), "rb"));
+ EXPECT_NE(stream.get(), nullptr);
+ bool result = parser.parse(stream.get());
+ EXPECT_TRUE(result);
+ XmlNode root = parser.getRootNode();
+
+ XmlNodeIterator nodeIt(root, XmlNodeIterator::PreOrderMode);
+ const size_t numNodes = nodeIt.size();
+ bool empty = nodeIt.isEmpty();
+ EXPECT_FALSE(empty);
+ EXPECT_NE(numNodes, 0U);
+ XmlNode node;
+ while (nodeIt.getNext(node)) {
+ const std::string nodeName = node.name();
+ EXPECT_FALSE(nodeName.empty());
+ }
+}
diff --git a/libs/assimp/test/unit/ImportExport/Assxml/utAssxmlImportExport.cpp b/libs/assimp/test/unit/ImportExport/Assxml/utAssxmlImportExport.cpp
new file mode 100644
index 0000000..c10d91b
--- /dev/null
+++ b/libs/assimp/test/unit/ImportExport/Assxml/utAssxmlImportExport.cpp
@@ -0,0 +1,76 @@
+/*
+---------------------------------------------------------------------------
+Open Asset Import Library (assimp)
+---------------------------------------------------------------------------
+
+Copyright (c) 2006-2019, assimp team
+
+All rights reserved.
+
+Redistribution and use of this software in source and binary forms,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+
+#include "AbstractImportExportBase.h"
+#include "SceneDiffer.h"
+#include "UnitTestPCH.h"
+
+#include <assimp/postprocess.h>
+#include <assimp/Importer.hpp>
+#include <assimp/Exporter.hpp>
+
+using namespace Assimp;
+
+class utAssxmlImportExport : public AbstractImportExportBase {
+public:
+ bool importerTest() override {
+ return true;
+ }
+
+#ifndef ASSIMP_BUILD_NO_EXPORT
+ bool exporterTest() override {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/OBJ/spider.obj", aiProcess_ValidateDataStructure);
+ EXPECT_NE(scene, nullptr );
+
+ ::Assimp::Exporter exporter;
+ return AI_SUCCESS == exporter.Export(scene, "assxml", ASSIMP_TEST_MODELS_DIR "/OBJ/spider_out.assxml");
+ }
+#endif
+};
+
+#ifndef ASSIMP_BUILD_NO_EXPORT
+
+TEST_F(utAssxmlImportExport, exportAssxmlTest) {
+ EXPECT_TRUE(exporterTest());
+}
+
+#endif
diff --git a/libs/assimp/test/unit/ImportExport/IRR/utIrrImportExport.cpp b/libs/assimp/test/unit/ImportExport/IRR/utIrrImportExport.cpp
new file mode 100644
index 0000000..eaa4c8f
--- /dev/null
+++ b/libs/assimp/test/unit/ImportExport/IRR/utIrrImportExport.cpp
@@ -0,0 +1,66 @@
+/*
+---------------------------------------------------------------------------
+Open Asset Import Library (assimp)
+---------------------------------------------------------------------------
+
+Copyright (c) 2006-2020, assimp team
+
+All rights reserved.
+
+Redistribution and use of this software in source and binary forms,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "AbstractImportExportBase.h"
+#include "UnitTestPCH.h"
+#include <assimp/postprocess.h>
+#include <assimp/scene.h>
+#include <assimp/Importer.hpp>
+
+using namespace Assimp;
+
+class utIrrImportExport : public AbstractImportExportBase {
+public:
+ virtual bool importerTest() {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/IRR/box.irr", aiProcess_ValidateDataStructure);
+ return nullptr != scene;
+ }
+};
+
+TEST_F(utIrrImportExport, importSimpleIrrTest) {
+ EXPECT_TRUE(importerTest());
+}
+
+TEST_F(utIrrImportExport, importSGIrrTest) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/IRR/dawfInCellar_SameHierarchy.irr", aiProcess_ValidateDataStructure);
+ EXPECT_NE( nullptr,scene);
+}
diff --git a/libs/assimp/test/unit/ImportExport/MDL/MDLHL1TestFiles.h b/libs/assimp/test/unit/ImportExport/MDL/MDLHL1TestFiles.h
new file mode 100644
index 0000000..3c0630f
--- /dev/null
+++ b/libs/assimp/test/unit/ImportExport/MDL/MDLHL1TestFiles.h
@@ -0,0 +1,57 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+
+/** @file MDLHL1TestFiles.h
+ * @brief Definitions for Half-Life 1 MDL loader tests.
+ */
+
+#ifndef AI_MDLHL1TESTFILES_INCLUDED
+#define AI_MDLHL1TESTFILES_INCLUDED
+
+#ifndef ASSIMP_TEST_MDL_HL1_MODELS_DIR
+#define ASSIMP_TEST_MDL_HL1_MODELS_DIR ASSIMP_TEST_MODELS_DIR"/MDL/MDL (HL1)/"
+#endif
+
+#ifndef MDL_HL1_FILE_MAN
+#define MDL_HL1_FILE_MAN ASSIMP_TEST_MDL_HL1_MODELS_DIR "man.mdl"
+#endif
+
+#endif // AI_MDLHL1TESTFILES_INCLUDED
diff --git a/libs/assimp/test/unit/ImportExport/MDL/utMDLImporter_HL1_ImportSettings.cpp b/libs/assimp/test/unit/ImportExport/MDL/utMDLImporter_HL1_ImportSettings.cpp
new file mode 100644
index 0000000..02969e1
--- /dev/null
+++ b/libs/assimp/test/unit/ImportExport/MDL/utMDLImporter_HL1_ImportSettings.cpp
@@ -0,0 +1,228 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+
+/** @file utMDLImporter_HL1_ImportSettings.cpp
+ * @brief Half-Life 1 MDL loader import settings tests.
+ */
+
+#include "AbstractImportExportBase.h"
+#include "AssetLib/MDL/HalfLife/HL1ImportDefinitions.h"
+#include "MDLHL1TestFiles.h"
+#include "UnitTestPCH.h"
+#include <assimp/postprocess.h>
+#include <assimp/scene.h>
+#include <assimp/Importer.hpp>
+#include <functional>
+#include <initializer_list>
+
+using namespace Assimp;
+
+class utMDLImporter_HL1_ImportSettings : public ::testing::Test {
+
+public:
+ // Test various import settings scenarios.
+
+ void importSettings() {
+
+ /* Verify that animations are *NOT* imported when
+ 'Read animations' is disabled. */
+ load_with_import_setting_bool(
+ MDL_HL1_FILE_MAN,
+ AI_CONFIG_IMPORT_MDL_HL1_READ_ANIMATIONS,
+ false, // Set config value to false.
+ [&](const aiScene *scene) {
+ EXPECT_EQ(0u, scene->mNumAnimations);
+ EXPECT_EQ(nullptr, scene->mRootNode->FindNode(AI_MDL_HL1_NODE_SEQUENCE_INFOS));
+ EXPECT_EQ(nullptr, scene->mRootNode->FindNode(AI_MDL_HL1_NODE_SEQUENCE_GROUPS));
+ EXPECT_EQ(nullptr, scene->mRootNode->FindNode(AI_MDL_HL1_NODE_SEQUENCE_TRANSITION_GRAPH));
+
+ expect_global_info_eq<int>(scene, { { 0, "NumSequences" },
+ { 0, "NumTransitionNodes" } });
+ });
+
+ /* Verify that blend controllers info is *NOT* imported when
+ 'Read blend controllers' is disabled. */
+ load_with_import_setting_bool(
+ MDL_HL1_FILE_MAN,
+ AI_CONFIG_IMPORT_MDL_HL1_READ_BLEND_CONTROLLERS,
+ false, // Set config value to false.
+ [&](const aiScene *scene) {
+ EXPECT_NE(0u, scene->mNumAnimations);
+
+ const aiNode *sequence_infos = scene->mRootNode->FindNode(AI_MDL_HL1_NODE_SEQUENCE_INFOS);
+ EXPECT_NE(nullptr, sequence_infos);
+
+ for (unsigned int i = 0; i < sequence_infos->mNumChildren; ++i)
+ EXPECT_EQ(nullptr, sequence_infos->mChildren[i]->FindNode(AI_MDL_HL1_NODE_BLEND_CONTROLLERS));
+
+ expect_global_info_eq(scene, 0, "NumBlendControllers");
+ });
+
+ /* Verify that animation events are *NOT* imported when
+ 'Read animation events' is disabled. */
+ load_with_import_setting_bool(
+ MDL_HL1_FILE_MAN,
+ AI_CONFIG_IMPORT_MDL_HL1_READ_ANIMATION_EVENTS,
+ false, // Set config value to false.
+ [&](const aiScene *scene) {
+ EXPECT_NE(0u, scene->mNumAnimations);
+
+ const aiNode *sequence_infos = scene->mRootNode->FindNode(AI_MDL_HL1_NODE_SEQUENCE_INFOS);
+ EXPECT_NE(nullptr, sequence_infos);
+
+ for (unsigned int i = 0; i < sequence_infos->mNumChildren; ++i)
+ EXPECT_EQ(nullptr, sequence_infos->mChildren[i]->FindNode(AI_MDL_HL1_NODE_ANIMATION_EVENTS));
+ });
+
+ /* Verify that sequence transitions info is read when
+ 'Read sequence transitions' is enabled. */
+ load_with_import_setting_bool(
+ ASSIMP_TEST_MDL_HL1_MODELS_DIR "sequence_transitions.mdl",
+ AI_CONFIG_IMPORT_MDL_HL1_READ_SEQUENCE_TRANSITIONS,
+ true, // Set config value to true.
+ [&](const aiScene *scene) {
+ EXPECT_NE(nullptr, scene->mRootNode->FindNode(AI_MDL_HL1_NODE_SEQUENCE_TRANSITION_GRAPH));
+ expect_global_info_eq(scene, 4, "NumTransitionNodes");
+ });
+
+ /* Verify that sequence transitions info is *NOT* read when
+ 'Read sequence transitions' is disabled. */
+ load_with_import_setting_bool(
+ ASSIMP_TEST_MDL_HL1_MODELS_DIR "sequence_transitions.mdl",
+ AI_CONFIG_IMPORT_MDL_HL1_READ_SEQUENCE_TRANSITIONS,
+ false, // Set config value to false.
+ [&](const aiScene *scene) {
+ EXPECT_EQ(nullptr, scene->mRootNode->FindNode(AI_MDL_HL1_NODE_SEQUENCE_TRANSITION_GRAPH));
+ expect_global_info_eq(scene, 0, "NumTransitionNodes");
+ });
+
+ /* Verify that bone controllers info is *NOT* read when
+ 'Read bone controllers' is disabled. */
+ load_with_import_setting_bool(
+ MDL_HL1_FILE_MAN,
+ AI_CONFIG_IMPORT_MDL_HL1_READ_BONE_CONTROLLERS,
+ false, // Set config value to false.
+ [&](const aiScene *scene) {
+ EXPECT_EQ(nullptr, scene->mRootNode->FindNode(AI_MDL_HL1_NODE_BONE_CONTROLLERS));
+ expect_global_info_eq(scene, 0, "NumBoneControllers");
+ });
+
+ /* Verify that attachments info is *NOT* read when
+ 'Read attachments' is disabled. */
+ load_with_import_setting_bool(
+ MDL_HL1_FILE_MAN,
+ AI_CONFIG_IMPORT_MDL_HL1_READ_ATTACHMENTS,
+ false, // Set config value to false.
+ [&](const aiScene *scene) {
+ EXPECT_EQ(nullptr, scene->mRootNode->FindNode(AI_MDL_HL1_NODE_ATTACHMENTS));
+ expect_global_info_eq(scene, 0, "NumAttachments");
+ });
+
+ /* Verify that hitboxes info is *NOT* read when
+ 'Read hitboxes' is disabled. */
+ load_with_import_setting_bool(
+ MDL_HL1_FILE_MAN,
+ AI_CONFIG_IMPORT_MDL_HL1_READ_HITBOXES,
+ false, // Set config value to false.
+ [&](const aiScene *scene) {
+ EXPECT_EQ(nullptr, scene->mRootNode->FindNode(AI_MDL_HL1_NODE_HITBOXES));
+ expect_global_info_eq(scene, 0, "NumHitboxes");
+ });
+
+ /* Verify that misc global info is *NOT* read when
+ 'Read misc global info' is disabled. */
+ load_with_import_setting_bool(
+ MDL_HL1_FILE_MAN,
+ AI_CONFIG_IMPORT_MDL_HL1_READ_MISC_GLOBAL_INFO,
+ false, // Set config value to false.
+ [&](const aiScene *scene) {
+ aiNode *global_info = get_global_info(scene);
+ EXPECT_NE(nullptr, global_info);
+ aiVector3D temp;
+ EXPECT_FALSE(global_info->mMetaData->Get("EyePosition", temp));
+ });
+ }
+
+private:
+ void load_with_import_setting_bool(
+ const char *file_path,
+ const char *setting_key,
+ bool setting_value,
+ std::function<void(const aiScene *)> &&func) {
+ Assimp::Importer importer;
+ importer.SetPropertyBool(setting_key, setting_value);
+ const aiScene *scene = importer.ReadFile(file_path, aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+ func(scene);
+ }
+
+ inline static aiNode *get_global_info(const aiScene *scene) {
+ return scene->mRootNode->FindNode(AI_MDL_HL1_NODE_GLOBAL_INFO);
+ }
+
+ template <typename T>
+ static void expect_global_info_eq(
+ const aiScene *scene,
+ T expected_value,
+ const char *key_name) {
+ aiNode *global_info = get_global_info(scene);
+ EXPECT_NE(nullptr, global_info);
+ T temp;
+ EXPECT_TRUE(global_info->mMetaData->Get(key_name, temp));
+ EXPECT_EQ(expected_value, temp);
+ }
+
+ template <typename T>
+ static void expect_global_info_eq(const aiScene *scene,
+ std::initializer_list<std::pair<T, const char *>> p_kv) {
+ aiNode *global_info = get_global_info(scene);
+ EXPECT_NE(nullptr, global_info);
+ for (auto it = p_kv.begin(); it != p_kv.end(); ++it) {
+ T temp;
+ EXPECT_TRUE(global_info->mMetaData->Get(it->second, temp));
+ EXPECT_EQ(it->first, temp);
+ }
+ }
+};
+
+TEST_F(utMDLImporter_HL1_ImportSettings, importSettings) {
+ importSettings();
+}
diff --git a/libs/assimp/test/unit/ImportExport/MDL/utMDLImporter_HL1_Materials.cpp b/libs/assimp/test/unit/ImportExport/MDL/utMDLImporter_HL1_Materials.cpp
new file mode 100644
index 0000000..c47667e
--- /dev/null
+++ b/libs/assimp/test/unit/ImportExport/MDL/utMDLImporter_HL1_Materials.cpp
@@ -0,0 +1,134 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+
+/** @file utMDLImporter_HL1_Materials.cpp
+ * @brief Half-Life 1 MDL loader materials tests.
+ */
+
+#include "AbstractImportExportBase.h"
+#include "AssetLib/MDL/HalfLife/HL1ImportDefinitions.h"
+#include "MDLHL1TestFiles.h"
+#include "UnitTestPCH.h"
+#include <assimp/postprocess.h>
+#include <assimp/scene.h>
+#include <assimp/Importer.hpp>
+
+using namespace Assimp;
+
+class utMDLImporter_HL1_Materials : public ::testing::Test {
+
+public:
+ /* Given an MDL model with a texture flagged as flatshade,
+ verify that the imported model has a flat shading model. */
+ void flatShadeTexture() {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MDL_HL1_MODELS_DIR "chrome_sphere.mdl", aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+ EXPECT_NE(nullptr, scene->mMaterials);
+
+ aiShadingMode shading_mode;
+ scene->mMaterials[0]->Get(AI_MATKEY_SHADING_MODEL, shading_mode);
+ EXPECT_EQ(aiShadingMode_Flat, shading_mode);
+ }
+
+ /* Given an MDL model with a chrome texture, verify that
+ the imported model has a chrome material. */
+ void chromeTexture() {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MDL_HL1_MODELS_DIR "chrome_sphere.mdl", aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+ EXPECT_NE(nullptr, scene->mMaterials);
+
+ int chrome;
+ scene->mMaterials[0]->Get(AI_MDL_HL1_MATKEY_CHROME(aiTextureType_DIFFUSE, 0), chrome);
+ EXPECT_EQ(1, chrome);
+ }
+
+ /* Given an MDL model with an additive texture, verify that
+ the imported model has an additive material. */
+ void additiveBlendTexture() {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MDL_HL1_MODELS_DIR "blend_additive.mdl", aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+ EXPECT_NE(nullptr, scene->mMaterials);
+
+ aiBlendMode blend_mode;
+ scene->mMaterials[0]->Get(AI_MATKEY_BLEND_FUNC, blend_mode);
+ EXPECT_EQ(aiBlendMode_Additive, blend_mode);
+ }
+
+ /* Given an MDL model with a color masked texture, verify that
+ the imported model has a color masked material. Ensure too
+ that the transparency color is the correct one. */
+ void textureWithColorMask() {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MDL_HL1_MODELS_DIR "alpha_test.mdl", aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+ EXPECT_NE(nullptr, scene->mMaterials);
+
+ int texture_flags;
+ scene->mMaterials[0]->Get(AI_MATKEY_TEXFLAGS_DIFFUSE(0), texture_flags);
+ EXPECT_EQ(aiTextureFlags_UseAlpha, texture_flags);
+
+ // The model has only one texture, a 256 color bitmap with
+ // a palette. Pure blue is the last color in the palette,
+ // and should be the transparency color.
+ aiColor3D transparency_color;
+ scene->mMaterials[0]->Get(AI_MATKEY_COLOR_TRANSPARENT, transparency_color);
+ EXPECT_EQ(aiColor3D(0, 0, 255), transparency_color);
+ }
+};
+
+TEST_F(utMDLImporter_HL1_Materials, flatShadeTexture) {
+ flatShadeTexture();
+}
+
+TEST_F(utMDLImporter_HL1_Materials, chromeTexture) {
+ chromeTexture();
+}
+
+TEST_F(utMDLImporter_HL1_Materials, additiveBlendTexture) {
+ additiveBlendTexture();
+}
+
+TEST_F(utMDLImporter_HL1_Materials, textureWithColorMask) {
+ textureWithColorMask();
+}
diff --git a/libs/assimp/test/unit/ImportExport/MDL/utMDLImporter_HL1_Nodes.cpp b/libs/assimp/test/unit/ImportExport/MDL/utMDLImporter_HL1_Nodes.cpp
new file mode 100644
index 0000000..4420727
--- /dev/null
+++ b/libs/assimp/test/unit/ImportExport/MDL/utMDLImporter_HL1_Nodes.cpp
@@ -0,0 +1,455 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+
+/** @file utMDLImporter_HL1_Nodes.cpp
+ * @brief Half-Life 1 MDL loader nodes tests.
+ */
+
+#include "AbstractImportExportBase.h"
+#include "AssetLib/MDL/HalfLife/HL1ImportDefinitions.h"
+#include "MDLHL1TestFiles.h"
+#include "UnitTestPCH.h"
+#include <assimp/postprocess.h>
+#include <assimp/scene.h>
+#include <assimp/Importer.hpp>
+
+using namespace Assimp;
+
+class utMDLImporter_HL1_Nodes : public ::testing::Test {
+
+public:
+ /**
+ * @note The following tests require a basic understanding
+ * of the SMD format. For more information about SMD format,
+ * please refer to the SMD importer or go to VDC
+ * (Valve Developer Community).
+ */
+
+ /* Given a model with bones that have empty names,
+ verify that all the bones of the imported model
+ have unique and no empty names.
+
+ "" <----+---- empty names
+ "" <----+
+ "" <----+
+ "Bone_3" |
+ "" <----+
+ "Bone_2" |
+ "Bone_5" |
+ "" <----+
+ "" <----+
+ */
+ void emptyBonesNames() {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MDL_HL1_MODELS_DIR "unnamed_bones.mdl", aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+
+ const std::vector<std::string> expected_bones_names = {
+ "Bone",
+ "Bone_0",
+ "Bone_1",
+ "Bone_3",
+ "Bone_4",
+ "Bone_2",
+ "Bone_5",
+ "Bone_6",
+ "Bone_7"
+ };
+
+ expect_named_children(scene, AI_MDL_HL1_NODE_BONES, expected_bones_names);
+ }
+
+ /* Given a model with bodyparts that have empty names,
+ verify that the imported model contains bodyparts with
+ unique and no empty names.
+
+ $body "" <----+---- empty names
+ $body "Bodypart_1" |
+ $body "Bodypart_5" |
+ $body "Bodypart_6" |
+ $body "" <----+
+ $body "Bodypart_2" |
+ $body "" <----+
+ $body "Bodypart_3" |
+ $body "" <----+
+ */
+ void emptyBodypartsNames() {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MDL_HL1_MODELS_DIR "unnamed_bodyparts.mdl", aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+
+ const std::vector<std::string> expected_bodyparts_names = {
+ "Bodypart",
+ "Bodypart_1",
+ "Bodypart_5",
+ "Bodypart_6",
+ "Bodypart_0",
+ "Bodypart_2",
+ "Bodypart_4",
+ "Bodypart_3",
+ "Bodypart_7"
+ };
+
+ expect_named_children(scene, AI_MDL_HL1_NODE_BODYPARTS, expected_bodyparts_names);
+ }
+
+ /* Given a model with bodyparts that have duplicate names,
+ verify that the imported model contains bodyparts with
+ unique and no duplicate names.
+
+ $body "Bodypart" <-----+
+ $body "Bodypart_1" <--+ |
+ $body "Bodypart_2" | |
+ $body "Bodypart1" | |
+ $body "Bodypart" ---|--+
+ $body "Bodypart_1" ---+ |
+ $body "Bodypart2" |
+ $body "Bodypart" ------+
+ $body "Bodypart_4"
+ */
+ void duplicateBodypartsNames() {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MDL_HL1_MODELS_DIR "duplicate_bodyparts.mdl", aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+
+ const std::vector<std::string> expected_bodyparts_names = {
+ "Bodypart",
+ "Bodypart_1",
+ "Bodypart_2",
+ "Bodypart1",
+ "Bodypart_0",
+ "Bodypart_1_0",
+ "Bodypart2",
+ "Bodypart_3",
+ "Bodypart_4"
+ };
+
+ expect_named_children(scene, AI_MDL_HL1_NODE_BODYPARTS, expected_bodyparts_names);
+ }
+
+ /* Given a model with several bodyparts that contains multiple
+ sub models with the same file name, verify for each bodypart
+ sub model of the imported model that they have a unique name.
+
+ $bodygroup "first_bodypart"
+ {
+ studio "triangle" <------+ duplicate file names.
+ studio "triangle" -------+
+ } |
+ |
+ $bodygroup "second_bodypart" |
+ { |
+ studio "triangle" -------+ same as first bodypart, but with same file.
+ studio "triangle" -------+
+ }
+
+ $bodygroup "last_bodypart"
+ {
+ studio "triangle2" <------+ duplicate names.
+ studio "triangle2" -------+
+ }
+ */
+ void duplicateSubModelsNames() {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MDL_HL1_MODELS_DIR "duplicate_submodels.mdl", aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+
+ const std::vector<std::vector<std::string>> expected_bodypart_sub_models_names = {
+ {
+ "triangle",
+ "triangle_0",
+ },
+ {
+ "triangle_1",
+ "triangle_2",
+ },
+ {
+ "triangle2",
+ "triangle2_0",
+ }
+ };
+
+ const aiNode *bodyparts_node = scene->mRootNode->FindNode(AI_MDL_HL1_NODE_BODYPARTS);
+ EXPECT_NE(nullptr, bodyparts_node);
+ EXPECT_EQ(3u, bodyparts_node->mNumChildren);
+ for (unsigned int i = 0; i < bodyparts_node->mNumChildren; ++i) {
+ expect_named_children(bodyparts_node->mChildren[i],
+ expected_bodypart_sub_models_names[i]);
+ }
+ }
+
+ /* Given a model with sequences that have duplicate names, verify
+ that each sequence from the imported model has a unique
+ name.
+
+ $sequence "idle_1" <-------+
+ $sequence "idle" <----+ |
+ $sequence "idle_2" | |
+ $sequence "idle" -----+ |
+ $sequence "idle_0" | |
+ $sequence "idle_1" -----|--+
+ $sequence "idle_3" |
+ $sequence "idle" -----+
+ $sequence "idle_7"
+ */
+ void duplicateSequenceNames() {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MDL_HL1_MODELS_DIR "duplicate_sequences.mdl", aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+
+ const std::vector<std::string> expected_sequence_names = {
+ "idle_1",
+ "idle",
+ "idle_2",
+ "idle_4",
+ "idle_0",
+ "idle_1_0",
+ "idle_3",
+ "idle_5",
+ "idle_7"
+ };
+
+ expect_named_children(scene, AI_MDL_HL1_NODE_SEQUENCE_INFOS, expected_sequence_names);
+ }
+
+ /* Given a model with sequences that have empty names, verify
+ that each sequence from the imported model has a unique
+ name.
+
+ $sequence "" <----+---- empty names
+ $sequence "Sequence_1" |
+ $sequence "" <----+
+ $sequence "Sequence_4" |
+ $sequence "" <----+
+ $sequence "Sequence_8" |
+ $sequence "" <----+
+ $sequence "Sequence_2" |
+ $sequence "" <----+
+ */
+ void emptySequenceNames() {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MDL_HL1_MODELS_DIR "unnamed_sequences.mdl", aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+
+ const std::vector<std::string> expected_sequence_names = {
+ "Sequence",
+ "Sequence_1",
+ "Sequence_0",
+ "Sequence_4",
+ "Sequence_3",
+ "Sequence_8",
+ "Sequence_5",
+ "Sequence_2",
+ "Sequence_6"
+ };
+
+ expect_named_children(scene, AI_MDL_HL1_NODE_SEQUENCE_INFOS, expected_sequence_names);
+ }
+
+ /* Given a model with sequence groups that have duplicate names,
+ verify that each sequence group from the imported model has
+ a unique name.
+
+ "default"
+ $sequencegroup "SequenceGroup" <----+
+ $sequencegroup "SequenceGroup_1" |
+ $sequencegroup "SequenceGroup_5" <----|--+
+ $sequencegroup "SequenceGroup" -----+ |
+ $sequencegroup "SequenceGroup_0" | |
+ $sequencegroup "SequenceGroup" -----+ |
+ $sequencegroup "SequenceGroup_5" --------+
+ $sequencegroup "SequenceGroup_6"
+ $sequencegroup "SequenceGroup_2"
+ */
+ void duplicateSequenceGroupNames() {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MDL_HL1_MODELS_DIR "duplicate_sequence_groups/duplicate_sequence_groups.mdl", aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+
+ const std::vector<std::string> expected_sequence_names = {
+ "default",
+ "SequenceGroup",
+ "SequenceGroup_1",
+ "SequenceGroup_5",
+ "SequenceGroup_3",
+ "SequenceGroup_0",
+ "SequenceGroup_4",
+ "SequenceGroup_5_0",
+ "SequenceGroup_6",
+ "SequenceGroup_2"
+ };
+
+ expect_named_children(scene, AI_MDL_HL1_NODE_SEQUENCE_GROUPS, expected_sequence_names);
+ }
+
+ /* Given a model with sequence groups that have empty names,
+ verify that each sequence group from the imported model has
+ a unique name.
+
+ "default"
+ $sequencegroup "" <----+---- empty names
+ $sequencegroup "SequenceGroup_2" |
+ $sequencegroup "SequenceGroup_6" |
+ $sequencegroup "" <----+
+ $sequencegroup "" <----+
+ $sequencegroup "SequenceGroup_1" |
+ $sequencegroup "SequenceGroup_5" |
+ $sequencegroup "" <----+
+ $sequencegroup "SequenceGroup_4"
+ */
+ void emptySequenceGroupNames() {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MDL_HL1_MODELS_DIR "unnamed_sequence_groups/unnamed_sequence_groups.mdl", aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+
+ const std::vector<std::string> expected_sequence_names = {
+ "default",
+ "SequenceGroup",
+ "SequenceGroup_2",
+ "SequenceGroup_6",
+ "SequenceGroup_0",
+ "SequenceGroup_3",
+ "SequenceGroup_1",
+ "SequenceGroup_5",
+ "SequenceGroup_7",
+ "SequenceGroup_4"
+ };
+
+ expect_named_children(scene, AI_MDL_HL1_NODE_SEQUENCE_GROUPS, expected_sequence_names);
+ }
+
+ /* Verify that mOffsetMatrix applies the correct
+ inverse bind pose transform. */
+ void offsetMatrixUnappliesTransformations() {
+
+ const float TOLERANCE = 0.01f;
+
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(MDL_HL1_FILE_MAN, aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+
+ aiNode *scene_bones_node = scene->mRootNode->FindNode(AI_MDL_HL1_NODE_BONES);
+
+ const aiMatrix4x4 identity_matrix;
+
+ for (unsigned int i = 0; i < scene->mNumMeshes; ++i) {
+ aiMesh *scene_mesh = scene->mMeshes[i];
+ for (unsigned int j = 0; j < scene_mesh->mNumBones; ++j) {
+ aiBone *scene_mesh_bone = scene_mesh->mBones[j];
+
+ // Store local node transforms.
+ aiNode *n = scene_bones_node->FindNode(scene_mesh_bone->mName);
+ std::vector<aiMatrix4x4> bone_matrices = { n->mTransformation };
+ while (n->mParent != scene->mRootNode) {
+ n = n->mParent;
+ bone_matrices.push_back(n->mTransformation);
+ }
+
+ // Compute absolute node transform.
+ aiMatrix4x4 transform;
+ for (auto it = bone_matrices.rbegin(); it != bone_matrices.rend(); ++it)
+ transform *= *it;
+
+ // Unapply the transformation using the offset matrix.
+ aiMatrix4x4 unapplied_transform = scene_mesh_bone->mOffsetMatrix * transform;
+
+ // Ensure that we have, approximately, the identity matrix.
+ expect_equal_matrices(identity_matrix, unapplied_transform, TOLERANCE);
+ }
+ }
+ }
+
+private:
+ void expect_named_children(const aiNode *parent_node, const std::vector<std::string> &expected_names) {
+ EXPECT_NE(nullptr, parent_node);
+ EXPECT_EQ(expected_names.size(), parent_node->mNumChildren);
+
+ for (unsigned int i = 0; i < parent_node->mNumChildren; ++i)
+ EXPECT_EQ(expected_names[i], parent_node->mChildren[i]->mName.C_Str());
+ }
+
+ void expect_named_children(const aiScene *scene, const char *node_name, const std::vector<std::string> &expected_names) {
+ expect_named_children(scene->mRootNode->FindNode(node_name), expected_names);
+ }
+
+ void expect_equal_matrices(const aiMatrix4x4 &expected, const aiMatrix4x4 &actual, float abs_error) {
+ for (int i = 0; i < 4; ++i) {
+ for (int j = 0; j < 4; ++j)
+ EXPECT_NEAR(expected[i][j], actual[i][j], abs_error);
+ }
+ }
+};
+
+TEST_F(utMDLImporter_HL1_Nodes, emptyBonesNames) {
+ emptyBonesNames();
+}
+
+TEST_F(utMDLImporter_HL1_Nodes, emptyBodypartsNames) {
+ emptyBodypartsNames();
+}
+
+TEST_F(utMDLImporter_HL1_Nodes, duplicateBodypartsNames) {
+ duplicateBodypartsNames();
+}
+
+TEST_F(utMDLImporter_HL1_Nodes, duplicateSubModelsNames) {
+ duplicateSubModelsNames();
+}
+
+TEST_F(utMDLImporter_HL1_Nodes, emptySequenceNames) {
+ emptySequenceNames();
+}
+
+TEST_F(utMDLImporter_HL1_Nodes, duplicateSequenceNames) {
+ duplicateSequenceNames();
+}
+
+TEST_F(utMDLImporter_HL1_Nodes, emptySequenceGroupNames) {
+ emptySequenceGroupNames();
+}
+
+TEST_F(utMDLImporter_HL1_Nodes, duplicateSequenceGroupNames) {
+ duplicateSequenceGroupNames();
+}
+
+TEST_F(utMDLImporter_HL1_Nodes, offsetMatrixUnappliesTransformations) {
+ offsetMatrixUnappliesTransformations();
+}
diff --git a/libs/assimp/test/unit/ImportExport/RAW/utRAWImportExport.cpp b/libs/assimp/test/unit/ImportExport/RAW/utRAWImportExport.cpp
new file mode 100644
index 0000000..bdd7f85
--- /dev/null
+++ b/libs/assimp/test/unit/ImportExport/RAW/utRAWImportExport.cpp
@@ -0,0 +1,64 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "AbstractImportExportBase.h"
+#include "UnitTestPCH.h"
+#include <assimp/postprocess.h>
+#include <assimp/scene.h>
+#include <assimp/Importer.hpp>
+
+using namespace Assimp;
+
+class utRAWImportExport : public AbstractImportExportBase {
+public:
+ virtual bool importerTest() {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/RAW/Wuson.raw", aiProcess_ValidateDataStructure);
+#ifndef ASSIMP_BUILD_NO_RAW_IMPORTER
+ return nullptr != scene;
+#else
+ return nullptr == scene;
+#endif
+ }
+};
+
+TEST_F(utRAWImportExport, importSimpleRAWTest) {
+ EXPECT_TRUE(importerTest());
+}
diff --git a/libs/assimp/test/unit/ImportExport/Terragen/utTerragenImportExport.cpp b/libs/assimp/test/unit/ImportExport/Terragen/utTerragenImportExport.cpp
new file mode 100644
index 0000000..6432dbf
--- /dev/null
+++ b/libs/assimp/test/unit/ImportExport/Terragen/utTerragenImportExport.cpp
@@ -0,0 +1,60 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+
+#include "AbstractImportExportBase.h"
+#include "UnitTestPCH.h"
+
+#include <assimp/postprocess.h>
+#include <assimp/Importer.hpp>
+
+class utTerragenImportExport : public AbstractImportExportBase {
+public:
+ virtual bool importerTest() {
+ /*Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/TER/RealisticTerrain.ter", aiProcess_ValidateDataStructure);
+ return nullptr != scene;*/
+ return true;
+ }
+};
+
+TEST_F(utTerragenImportExport, importX3DFromFileTest) {
+ EXPECT_TRUE(importerTest());
+}
diff --git a/libs/assimp/test/unit/ImportExport/utAssjsonImportExport.cpp b/libs/assimp/test/unit/ImportExport/utAssjsonImportExport.cpp
new file mode 100644
index 0000000..3470874
--- /dev/null
+++ b/libs/assimp/test/unit/ImportExport/utAssjsonImportExport.cpp
@@ -0,0 +1,80 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "AbstractImportExportBase.h"
+#include "UnitTestPCH.h"
+
+#include <assimp/postprocess.h>
+#include <assimp/scene.h>
+#include <assimp/Exporter.hpp>
+#include <assimp/Importer.hpp>
+
+using namespace Assimp;
+
+#ifndef ASSIMP_BUILD_NO_EXPORT
+
+class utAssjsonImportExport : public AbstractImportExportBase {
+public:
+ bool exporterTest() override {
+ Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/OBJ/spider.obj", aiProcess_ValidateDataStructure);
+
+ Exporter exporter;
+ aiReturn res = exporter.Export(scene, "assjson", "./spider_test.json");
+ if (aiReturn_SUCCESS != res) {
+ return false;
+ }
+
+ Assimp::ExportProperties exportProperties;
+ exportProperties.SetPropertyBool("JSON_SKIP_WHITESPACES", true);
+ aiReturn resNoWhitespace = exporter.Export(scene, "assjson", "./spider_test_nowhitespace.json", 0u, &exportProperties);
+ if (aiReturn_SUCCESS != resNoWhitespace) {
+ return false;
+ }
+
+ return true;
+ }
+};
+
+TEST_F(utAssjsonImportExport, exportTest) {
+ EXPECT_TRUE(exporterTest());
+}
+
+#endif // ASSIMP_BUILD_NO_EXPORT
diff --git a/libs/assimp/test/unit/ImportExport/utCOBImportExport.cpp b/libs/assimp/test/unit/ImportExport/utCOBImportExport.cpp
new file mode 100644
index 0000000..187f16e
--- /dev/null
+++ b/libs/assimp/test/unit/ImportExport/utCOBImportExport.cpp
@@ -0,0 +1,99 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+
+#include "UnitTestPCH.h"
+
+#include <assimp/postprocess.h>
+#include <assimp/Importer.hpp>
+
+using namespace Assimp;
+
+TEST(utCOBImporter, importDwarfASCII) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/COB/dwarf_ascii.cob", aiProcess_ValidateDataStructure);
+ // FIXME: this is wrong, it should succeed
+ // change to ASSERT_NE after it's been fixed
+ ASSERT_EQ(nullptr, scene);
+}
+
+TEST(utCOBImporter, importDwarf) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/COB/dwarf.cob", aiProcess_ValidateDataStructure);
+ ASSERT_NE(nullptr, scene);
+}
+
+TEST(utCOBImporter, importMoleculeASCII) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/COB/molecule_ascii.cob", aiProcess_ValidateDataStructure);
+ // FIXME: this is wrong, it should succeed
+ // change to ASSERT_NE after it's been fixed
+ ASSERT_EQ(nullptr, scene);
+}
+
+TEST(utCOBImporter, importMolecule) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/COB/molecule.cob", aiProcess_ValidateDataStructure);
+ ASSERT_NE(nullptr, scene);
+}
+
+TEST(utCOBImporter, importSpider43ASCII) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/COB/spider_4_3_ascii.cob", aiProcess_ValidateDataStructure);
+ ASSERT_NE(nullptr, scene);
+}
+
+TEST(utCOBImporter, importSpider43) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/COB/spider_4_3.cob", aiProcess_ValidateDataStructure);
+ ASSERT_NE(nullptr, scene);
+}
+
+TEST(utCOBImporter, importSpider66ASCII) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/COB/spider_6_6_ascii.cob", aiProcess_ValidateDataStructure);
+ ASSERT_NE(nullptr, scene);
+}
+
+TEST(utCOBImporter, importSpider66) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/COB/spider_6_6.cob", aiProcess_ValidateDataStructure);
+ ASSERT_NE(nullptr, scene);
+}
diff --git a/libs/assimp/test/unit/ImportExport/utExporter.cpp b/libs/assimp/test/unit/ImportExport/utExporter.cpp
new file mode 100644
index 0000000..9c5ca1c
--- /dev/null
+++ b/libs/assimp/test/unit/ImportExport/utExporter.cpp
@@ -0,0 +1,107 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "UnitTestPCH.h"
+
+#include <assimp/Exporter.hpp>
+#include <assimp/ProgressHandler.hpp>
+
+using namespace Assimp;
+
+#ifndef ASSIMP_BUILD_NO_EXPORT
+
+class TestProgressHandler : public ProgressHandler {
+public:
+ TestProgressHandler() :
+ ProgressHandler(),
+ mPercentage(0.f) {
+ // empty
+ }
+
+ virtual ~TestProgressHandler() {
+ // empty
+ }
+
+ bool Update(float percentage = -1.f) override {
+ mPercentage = percentage;
+ return true;
+ }
+ float mPercentage;
+};
+
+class ExporterTest : public ::testing::Test {
+ // empty
+};
+
+TEST_F(ExporterTest, ProgressHandlerTest) {
+ Exporter exporter;
+ TestProgressHandler *ph(new TestProgressHandler);
+ exporter.SetProgressHandler(ph);
+}
+
+// Make sure all the registered exporters have useful descriptions
+TEST_F(ExporterTest, ExporterIdTest) {
+ Exporter exporter;
+ size_t exportFormatCount = exporter.GetExportFormatCount();
+ EXPECT_NE(0u, exportFormatCount) << "No registered exporters";
+ typedef std::map<std::string, const aiExportFormatDesc *> ExportIdMap;
+ ExportIdMap exporterMap;
+ for (size_t i = 0; i < exportFormatCount; ++i) {
+ // Check that the exporter description exists and makes sense
+ const aiExportFormatDesc *desc = exporter.GetExportFormatDescription(i);
+ ASSERT_NE(nullptr, desc) << "Missing aiExportFormatDesc at index " << i;
+ EXPECT_NE(nullptr, desc->id) << "Null exporter ID at index " << i;
+ EXPECT_STRNE("", desc->id) << "Empty exporter ID at index " << i;
+ EXPECT_NE(nullptr, desc->description) << "Null exporter description at index " << i;
+ EXPECT_STRNE("", desc->description) << "Empty exporter description at index " << i;
+ EXPECT_NE(nullptr, desc->fileExtension) << "Null exporter file extension at index " << i;
+ EXPECT_STRNE("", desc->fileExtension) << "Empty exporter file extension at index " << i;
+
+ // Check the ID is unique
+ std::string key(desc->id);
+ std::pair<ExportIdMap::iterator, bool> result = exporterMap.emplace(key, desc);
+ EXPECT_TRUE(result.second) << "Duplicate exported id: '" << key << "' " << desc->description << " *." << desc->fileExtension << " at index " << i;
+ }
+
+ const aiExportFormatDesc *desc = exporter.GetExportFormatDescription(exportFormatCount);
+ EXPECT_EQ(nullptr, desc) << "More exporters than claimed";
+}
+
+#endif \ No newline at end of file
diff --git a/libs/assimp/test/unit/ImportExport/utMD2Importer.cpp b/libs/assimp/test/unit/ImportExport/utMD2Importer.cpp
new file mode 100644
index 0000000..0fcf76b
--- /dev/null
+++ b/libs/assimp/test/unit/ImportExport/utMD2Importer.cpp
@@ -0,0 +1,78 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+
+#include "UnitTestPCH.h"
+
+#include <assimp/postprocess.h>
+#include <assimp/scene.h>
+#include <assimp/Importer.hpp>
+
+using namespace Assimp;
+
+TEST(utMD2Importer, importFaerie) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/MD2/faerie.md2", aiProcess_ValidateDataStructure);
+ ASSERT_NE(nullptr, scene);
+}
+
+TEST(utMD2Importer, importSydney) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/MD2/sydney.md2", aiProcess_ValidateDataStructure);
+ ASSERT_NE(nullptr, scene);
+}
+
+TEST(utMD2Importer, importDolphin) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_NONBSD_DIR "/MD2/dolphin.md2", aiProcess_ValidateDataStructure);
+ ASSERT_NE(nullptr, scene);
+}
+
+TEST(utMD2Importer, importFlag) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_NONBSD_DIR "/MD2/flag.md2", aiProcess_ValidateDataStructure);
+ ASSERT_NE(nullptr, scene);
+}
+
+TEST(utMD2Importer, importHorse) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_NONBSD_DIR "/MD2/horse.md2", aiProcess_ValidateDataStructure);
+ ASSERT_NE(nullptr, scene);
+}
diff --git a/libs/assimp/test/unit/ImportExport/utMD3Importer.cpp b/libs/assimp/test/unit/ImportExport/utMD3Importer.cpp
new file mode 100644
index 0000000..ab7c418
--- /dev/null
+++ b/libs/assimp/test/unit/ImportExport/utMD3Importer.cpp
@@ -0,0 +1,67 @@
+/*
+---------------------------------------------------------------------------
+Open Asset Import Library (assimp)
+---------------------------------------------------------------------------
+
+Copyright (c) 2006-2021, assimp team
+
+All rights reserved.
+
+Redistribution and use of this software in source and binary forms,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+
+#include "UnitTestPCH.h"
+
+#include <assimp/postprocess.h>
+#include <assimp/scene.h>
+#include <assimp/Importer.hpp>
+
+
+using namespace Assimp;
+
+TEST(utMD3Importer, importWatercan) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_NONBSD_DIR "/MD3/watercan.md3", aiProcess_ValidateDataStructure);
+ ASSERT_NE(nullptr, scene);
+}
+
+TEST(utMD3Importer, importWatercan_dmg) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_NONBSD_DIR "/MD3/watercan_dmg.md3", aiProcess_ValidateDataStructure);
+ ASSERT_NE(nullptr, scene);
+}
+
+TEST(utMD3Importer, importEuropean_fnt_v2) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_NONBSD_DIR "/MD3/q3root/models/mapobjects/kt_kubalwagon/european_fnt_v2.md3", aiProcess_ValidateDataStructure);
+ ASSERT_NE(nullptr, scene);
+}
diff --git a/libs/assimp/test/unit/ImportExport/utMD5Importer.cpp b/libs/assimp/test/unit/ImportExport/utMD5Importer.cpp
new file mode 100644
index 0000000..0821219
--- /dev/null
+++ b/libs/assimp/test/unit/ImportExport/utMD5Importer.cpp
@@ -0,0 +1,72 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+
+#include "UnitTestPCH.h"
+
+#include <assimp/postprocess.h>
+#include <assimp/scene.h>
+#include <assimp/Importer.hpp>
+
+using namespace Assimp;
+
+TEST(utMD5Importer, importEmpty) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/MD5/invalid/empty.md5mesh", aiProcess_ValidateDataStructure);
+ ASSERT_EQ(nullptr, scene);
+}
+
+TEST(utMD5Importer, importSimpleCube) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/MD5/SimpleCube.md5mesh", aiProcess_ValidateDataStructure);
+ ASSERT_NE(nullptr, scene);
+}
+
+TEST(utMD5Importer, importBoarMan) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_NONBSD_DIR "/MD5/BoarMan.md5mesh", aiProcess_ValidateDataStructure);
+ ASSERT_NE(nullptr, scene);
+}
+
+TEST(utMD5Importer, importBob) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_NONBSD_DIR "/MD5/Bob.md5mesh", aiProcess_ValidateDataStructure);
+ ASSERT_NE(nullptr, scene);
+}
diff --git a/libs/assimp/test/unit/ImportExport/utMDLImporter.cpp b/libs/assimp/test/unit/ImportExport/utMDLImporter.cpp
new file mode 100644
index 0000000..c896060
--- /dev/null
+++ b/libs/assimp/test/unit/ImportExport/utMDLImporter.cpp
@@ -0,0 +1,80 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+
+#include "UnitTestPCH.h"
+
+#include "AbstractImportExportBase.h"
+#include <assimp/postprocess.h>
+#include <assimp/scene.h>
+#include <assimp/Importer.hpp>
+
+#include "MDL/MDLHL1TestFiles.h"
+
+using namespace Assimp;
+
+class utMDLImporter : public AbstractImportExportBase {
+public:
+ virtual bool importerTest() {
+
+ Assimp::Importer importer;
+ importerTest_HL1(&importer);
+
+ // Add further MDL tests...
+
+ return true;
+ }
+
+private:
+ void importerTest_HL1(Assimp::Importer *const importer) {
+ const aiScene *scene = importer->ReadFile(MDL_HL1_FILE_MAN, 0);
+ EXPECT_NE(nullptr, scene);
+
+ // Test that the importer can directly load an HL1 MDL external texture file.
+ scene = importer->ReadFile(ASSIMP_TEST_MDL_HL1_MODELS_DIR "manT.mdl", aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+ EXPECT_NE(0u, scene->mNumTextures);
+ EXPECT_NE(0u, scene->mNumMaterials);
+ }
+};
+
+TEST_F(utMDLImporter, importMDLFromFileTest) {
+ EXPECT_TRUE(importerTest());
+}
diff --git a/libs/assimp/test/unit/ImportExport/utNFFImportExport.cpp b/libs/assimp/test/unit/ImportExport/utNFFImportExport.cpp
new file mode 100644
index 0000000..621324a
--- /dev/null
+++ b/libs/assimp/test/unit/ImportExport/utNFFImportExport.cpp
@@ -0,0 +1,60 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+
+#include "AbstractImportExportBase.h"
+#include "UnitTestPCH.h"
+#include <assimp/postprocess.h>
+#include <assimp/Importer.hpp>
+
+using namespace Assimp;
+
+class utNFFImportExport : public AbstractImportExportBase {
+public:
+ virtual bool importerTest() {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/NFF/NFF/ManyEarthsNotJustOne.nff", 0);
+ return nullptr != scene;
+ }
+};
+
+TEST_F(utNFFImportExport, importNFFFromFileTest) {
+ EXPECT_TRUE(importerTest());
+}
diff --git a/libs/assimp/test/unit/ImportExport/utOFFImportExport.cpp b/libs/assimp/test/unit/ImportExport/utOFFImportExport.cpp
new file mode 100644
index 0000000..78ae4ac
--- /dev/null
+++ b/libs/assimp/test/unit/ImportExport/utOFFImportExport.cpp
@@ -0,0 +1,60 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+
+#include "AbstractImportExportBase.h"
+#include "UnitTestPCH.h"
+#include <assimp/postprocess.h>
+#include <assimp/scene.h>
+#include <assimp/Exporter.hpp>
+#include <assimp/Importer.hpp>
+
+class utOFFImportExport : public AbstractImportExportBase {
+protected:
+ virtual bool importerTest() {
+ ::Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/OFF/Cube.off", aiProcess_ValidateDataStructure);
+ return nullptr != scene;
+ }
+};
+
+TEST_F(utOFFImportExport, importOFFFromFileTest) {
+ EXPECT_TRUE(importerTest());
+}
diff --git a/libs/assimp/test/unit/ImportExport/utOgreImportExport.cpp b/libs/assimp/test/unit/ImportExport/utOgreImportExport.cpp
new file mode 100644
index 0000000..7312d6b
--- /dev/null
+++ b/libs/assimp/test/unit/ImportExport/utOgreImportExport.cpp
@@ -0,0 +1,61 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+
+#include "AbstractImportExportBase.h"
+#include "UnitTestPCH.h"
+
+#include <assimp/postprocess.h>
+#include <assimp/Importer.hpp>
+
+using namespace Assimp;
+
+class utOgreImportExport : public AbstractImportExportBase {
+public:
+ virtual bool importerTest() {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/Ogre/TheThing/Mesh.mesh.xml", aiProcess_ValidateDataStructure);
+ return nullptr != scene;
+ }
+};
+
+TEST_F(utOgreImportExport, importerTest) {
+ EXPECT_TRUE(importerTest());
+}
diff --git a/libs/assimp/test/unit/ImportExport/utQ3BSPFileImportExport.cpp b/libs/assimp/test/unit/ImportExport/utQ3BSPFileImportExport.cpp
new file mode 100644
index 0000000..f5694d2
--- /dev/null
+++ b/libs/assimp/test/unit/ImportExport/utQ3BSPFileImportExport.cpp
@@ -0,0 +1,61 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+
+#include "AbstractImportExportBase.h"
+#include "UnitTestPCH.h"
+
+#include <assimp/postprocess.h>
+#include <assimp/Importer.hpp>
+
+using namespace Assimp;
+
+class utQ3BSPImportExport : public AbstractImportExportBase {
+public:
+ virtual bool importerTest() {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_NONBSD_DIR "/PK3/SGDTT3.pk3", 0);
+ return nullptr != scene;
+ }
+};
+
+TEST_F(utQ3BSPImportExport, importerTest) {
+ EXPECT_TRUE(importerTest());
+}
diff --git a/libs/assimp/test/unit/ImportExport/utXGLImportExport.cpp b/libs/assimp/test/unit/ImportExport/utXGLImportExport.cpp
new file mode 100644
index 0000000..8199806
--- /dev/null
+++ b/libs/assimp/test/unit/ImportExport/utXGLImportExport.cpp
@@ -0,0 +1,94 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+
+#include "UnitTestPCH.h"
+#include <assimp/postprocess.h>
+#include <assimp/Importer.hpp>
+
+using namespace Assimp;
+
+TEST(utXGLImporter, importBCN_Epileptic) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/XGL/BCN_Epileptic.zgl", aiProcess_ValidateDataStructure);
+ ASSERT_NE(nullptr, scene);
+}
+
+TEST(utXGLImporter, importCubesWithAlpha) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/XGL/cubes_with_alpha.zgl", aiProcess_ValidateDataStructure);
+ ASSERT_NE(nullptr, scene);
+}
+
+TEST(utXGLImporter, importSample_official) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/XGL/sample_official.xgl", aiProcess_ValidateDataStructure);
+ ASSERT_NE(nullptr, scene);
+}
+
+TEST(utXGLImporter, importSample_official_asxml) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/XGL/sample_official_asxml.xml", aiProcess_ValidateDataStructure);
+ ASSERT_NE(nullptr, scene);
+}
+
+TEST(utXGLImporter, importSphereWithMatGloss) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/XGL/sphere_with_mat_gloss_10pc.zgl", aiProcess_ValidateDataStructure);
+ ASSERT_NE(nullptr, scene);
+}
+
+TEST(utXGLImporter, importSpiderASCII) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/XGL/Spider_ascii.zgl", aiProcess_ValidateDataStructure);
+ ASSERT_NE(nullptr, scene);
+}
+
+TEST(utXGLImporter, importWuson) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/XGL/Wuson.zgl", aiProcess_ValidateDataStructure);
+ ASSERT_NE(nullptr, scene);
+}
+
+TEST(utXGLImporter, importWusonDXF) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/XGL/wuson_dxf.zgl", aiProcess_ValidateDataStructure);
+ ASSERT_NE(nullptr, scene);
+}
diff --git a/libs/assimp/test/unit/Main.cpp b/libs/assimp/test/unit/Main.cpp
new file mode 100644
index 0000000..d5049fa
--- /dev/null
+++ b/libs/assimp/test/unit/Main.cpp
@@ -0,0 +1,33 @@
+#include "../../include/assimp/DefaultLogger.hpp"
+#include "UnitTestPCH.h"
+
+#include <math.h>
+#include <time.h>
+
+int main(int argc, char *argv[]) {
+ ::testing::InitGoogleTest(&argc, argv);
+
+ // seed the randomizer with the current system time
+ time_t t;
+ time(&t);
+ srand((unsigned int)t);
+
+ // ............................................................................
+
+ // create a logger from both CPP
+ Assimp::DefaultLogger::create("AssimpLog_Cpp.txt", Assimp::Logger::VERBOSE,
+ aiDefaultLogStream_STDOUT | aiDefaultLogStream_DEBUGGER | aiDefaultLogStream_FILE);
+
+ // .. and C. They should smoothly work together
+ aiEnableVerboseLogging(AI_TRUE);
+ aiLogStream logstream = aiGetPredefinedLogStream(aiDefaultLogStream_FILE, "AssimpLog_C.txt");
+ aiAttachLogStream(&logstream);
+
+ int result = RUN_ALL_TESTS();
+
+ // ............................................................................
+ // but shutdown must be done from C to ensure proper deallocation
+ aiDetachAllLogStreams();
+
+ return result;
+}
diff --git a/libs/assimp/test/unit/MathTest.cpp b/libs/assimp/test/unit/MathTest.cpp
new file mode 100644
index 0000000..ff870ff
--- /dev/null
+++ b/libs/assimp/test/unit/MathTest.cpp
@@ -0,0 +1,56 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "MathTest.h"
+
+namespace Assimp {
+
+// Initialize epsilon value.
+const float AssimpMathTest::Epsilon = Math::getEpsilon<float>();
+
+// Initialize with an interval of [1,100].
+RandomUniformFloatGenerator AssimpMathTest::RandNonZero(1.0f, 100.0f);
+
+// Initialize with an interval of [-PI,PI] inclusively.
+RandomUniformFloatGenerator AssimpMathTest::RandPI(-Math::aiPi<float>(), Math::aiPi<float>());
+
+}
diff --git a/libs/assimp/test/unit/MathTest.h b/libs/assimp/test/unit/MathTest.h
new file mode 100644
index 0000000..08411e8
--- /dev/null
+++ b/libs/assimp/test/unit/MathTest.h
@@ -0,0 +1,103 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+
+#ifndef ASSIMP_MATH_TEST_H
+#define ASSIMP_MATH_TEST_H
+
+#include "UnitTestPCH.h"
+#include <assimp/types.h>
+#include "RandomNumberGeneration.h"
+
+namespace Assimp {
+
+/** Custom test class providing several math related utilities. */
+class AssimpMathTest : public ::testing::Test {
+public:
+ /** Return a random non-null 2D vector. */
+ inline static aiVector2D random_vec2() {
+ return aiVector2D(RandNonZero.next(), RandNonZero.next());
+ }
+
+ /** Return a random non-null 3D vector. */
+ inline static aiVector3D random_vec3() {
+ return aiVector3D(RandNonZero.next(), RandNonZero.next(),RandNonZero.next());
+ }
+
+ /** Return a random unit 3D vector. */
+ inline static aiVector3D random_unit_vec3() {
+ return random_vec3().NormalizeSafe();
+ }
+
+ /** Return a quaternion with random orientation and
+ * rotation angle around axis. */
+ inline static aiQuaternion random_quat() {
+ return aiQuaternion(random_unit_vec3(), RandPI.next());
+ }
+
+ /** Return a random non-null 3x3 matrix. */
+ inline static aiMatrix3x3 random_mat3() {
+ return aiMatrix3x3(
+ RandNonZero.next(), RandNonZero.next(),RandNonZero.next(),
+ RandNonZero.next(), RandNonZero.next(),RandNonZero.next(),
+ RandNonZero.next(), RandNonZero.next(),RandNonZero.next());
+ }
+
+ /** Return a random non-null 4x4 matrix. */
+ inline static aiMatrix4x4 random_mat4() {
+ return aiMatrix4x4(
+ RandNonZero.next(), RandNonZero.next(),RandNonZero.next(), RandNonZero.next(),
+ RandNonZero.next(), RandNonZero.next(),RandNonZero.next(), RandNonZero.next(),
+ RandNonZero.next(), RandNonZero.next(),RandNonZero.next(), RandNonZero.next(),
+ RandNonZero.next(), RandNonZero.next(),RandNonZero.next(), RandNonZero.next());
+ }
+
+ /** Epsilon value to use in tests. */
+ static const float Epsilon;
+
+ /** Random number generators. */
+ static RandomUniformFloatGenerator RandNonZero, RandPI;
+};
+
+}
+
+#endif // ASSIMP_MATH_TEST_H
diff --git a/libs/assimp/test/unit/RandomNumberGeneration.h b/libs/assimp/test/unit/RandomNumberGeneration.h
new file mode 100644
index 0000000..95ba5b4
--- /dev/null
+++ b/libs/assimp/test/unit/RandomNumberGeneration.h
@@ -0,0 +1,82 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+
+#ifndef ASSIMP_RANDOM_NUMBER_GENERATION_H
+#define ASSIMP_RANDOM_NUMBER_GENERATION_H
+
+#include <random>
+
+namespace Assimp {
+
+/** Helper class to use for generating pseudo-random
+ * real numbers, with a uniform distribution. */
+template<typename T>
+class RandomUniformRealGenerator {
+public:
+ RandomUniformRealGenerator() :
+ dist_(),
+ rd_(),
+ re_(rd_()) {
+ // empty
+ }
+
+ RandomUniformRealGenerator(T min, T max) :
+ dist_(min, max),
+ rd_(),
+ re_(rd_()) {
+ // empty
+ }
+
+ inline T next() {
+ return dist_(re_);
+ }
+
+private:
+ std::uniform_real_distribution<T> dist_;
+ std::random_device rd_;
+ std::default_random_engine re_;
+};
+
+using RandomUniformFloatGenerator = RandomUniformRealGenerator<float>;
+
+}
+
+#endif // ASSIMP_RANDOM_NUMBER_GENERATION_H
diff --git a/libs/assimp/test/unit/SceneDiffer.cpp b/libs/assimp/test/unit/SceneDiffer.cpp
new file mode 100644
index 0000000..0918530
--- /dev/null
+++ b/libs/assimp/test/unit/SceneDiffer.cpp
@@ -0,0 +1,374 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "SceneDiffer.h"
+#include <assimp/scene.h>
+#include <assimp/mesh.h>
+#include <assimp/material.h>
+#include <sstream>
+
+namespace Assimp {
+
+SceneDiffer::SceneDiffer()
+: m_diffs() {
+ // empty
+}
+
+SceneDiffer::~SceneDiffer() {
+ // empty
+}
+
+bool SceneDiffer::isEqual( const aiScene *expected, const aiScene *toCompare ) {
+ if ( expected == toCompare ) {
+ return true;
+ }
+
+ if ( nullptr == expected ) {
+ return false;
+ }
+
+ if ( nullptr == toCompare ) {
+ return false;
+ }
+
+ // meshes
+ if ( expected->mNumMeshes != toCompare->mNumMeshes ) {
+ std::stringstream stream;
+ stream << "Number of meshes not equal ( expected: " << expected->mNumMeshes << ", found : " << toCompare->mNumMeshes << " )\n";
+ addDiff( stream.str() );
+ return false;
+ }
+
+ for ( unsigned int i = 0; i < expected->mNumMeshes; i++ ) {
+ aiMesh *expMesh( expected->mMeshes[ i ] );
+ aiMesh *toCompMesh( toCompare->mMeshes[ i ] );
+ if ( !compareMesh( expMesh, toCompMesh ) ) {
+ std::stringstream stream;
+ stream << "Meshes are not equal, index : " << i << "\n";
+ addDiff( stream.str() );
+ }
+ }
+
+ // materials
+ /*if ( expected->mNumMaterials != toCompare->mNumMaterials ) {
+ std::stringstream stream;
+ stream << "Number of materials not equal ( expected: " << expected->mNumMaterials << ", found : " << toCompare->mNumMaterials << " )\n";
+ addDiff( stream.str() );
+ return false;
+ }
+
+ if ( expected->mNumMaterials > 0 ) {
+ if ( nullptr == expected->mMaterials || nullptr == toCompare->mMaterials ) {
+ addDiff( "Number of materials > 0 and mat pointer is nullptr" );
+ return false;
+ }
+ }
+
+ for ( unsigned int i = 0; i < expected->mNumMaterials; i++ ) {
+ aiMaterial *expectedMat( expected->mMaterials[ i ] );
+ aiMaterial *toCompareMat( expected->mMaterials[ i ] );
+ if ( !compareMaterial( expectedMat, toCompareMat ) ) {
+ std::stringstream stream;
+ stream << "Materials are not equal, index : " << i << "\n";
+ addDiff( stream.str() );
+ return false;
+ }
+ }*/
+
+ return true;
+}
+
+void SceneDiffer::showReport() {
+ if ( m_diffs.empty() ) {
+ return;
+ }
+
+ for ( std::vector<std::string>::iterator it = m_diffs.begin(); it != m_diffs.end(); ++it ) {
+ std::cout << *it << "\n";
+ }
+
+ std::cout << std::endl;
+}
+
+void SceneDiffer::reset() {
+ m_diffs.resize( 0 );
+}
+
+void SceneDiffer::addDiff( const std::string &diff ) {
+ if ( diff.empty() ) {
+ return;
+ }
+ m_diffs.push_back( diff );
+}
+
+static std::string dumpVector3( const aiVector3D &toDump ) {
+ std::stringstream stream;
+ stream << "( " << toDump.x << ", " << toDump.y << ", " << toDump.z << ")";
+ return stream.str();
+}
+
+/*static std::string dumpColor4D( const aiColor4D &toDump ) {
+ std::stringstream stream;
+ stream << "( " << toDump.r << ", " << toDump.g << ", " << toDump.b << ", " << toDump.a << ")";
+ return stream.str();
+}*/
+
+static std::string dumpFace( const aiFace &face ) {
+ std::stringstream stream;
+ for ( unsigned int i = 0; i < face.mNumIndices; i++ ) {
+ stream << face.mIndices[ i ];
+ if ( i < face.mNumIndices - 1 ) {
+ stream << ", ";
+ }
+ else {
+ stream << "\n";
+ }
+ }
+ return stream.str();
+}
+
+bool SceneDiffer::compareMesh( aiMesh *expected, aiMesh *toCompare ) {
+ if ( expected == toCompare ) {
+ return true;
+ }
+
+ if ( nullptr == expected || nullptr == toCompare ) {
+ return false;
+ }
+
+ if ( expected->mName != toCompare->mName ) {
+ std::stringstream stream;
+ stream << "Mesh name not equal ( expected: " << expected->mName.C_Str() << ", found : " << toCompare->mName.C_Str() << " )\n";
+ addDiff( stream.str() );
+ }
+
+ if ( expected->mNumVertices != toCompare->mNumVertices ) {
+ std::stringstream stream;
+ stream << "Number of vertices not equal ( expected: " << expected->mNumVertices << ", found : " << toCompare->mNumVertices << " )\n";
+ addDiff( stream.str() );
+ return false;
+ }
+
+ // positions
+ if ( expected->HasPositions() != toCompare->HasPositions() ) {
+ addDiff( "Expected are vertices, toCompare does not have any." );
+ return false;
+ }
+
+ bool vertEqual( true );
+ for ( unsigned int i = 0; i < expected->mNumVertices; i++ ) {
+ aiVector3D &expVert( expected->mVertices[ i ] );
+ aiVector3D &toCompVert( toCompare->mVertices[ i ] );
+ if ( !expVert.Equal( toCompVert ) ) {
+ std::cout << "index = " << i << dumpVector3( toCompVert ) << "\n";
+ std::stringstream stream;
+ stream << "Vertex not equal ( expected: " << dumpVector3( toCompVert ) << ", found: " << dumpVector3( toCompVert ) << "\n";
+ addDiff( stream.str() );
+ vertEqual = false;
+ }
+ }
+ if ( !vertEqual ) {
+ return false;
+ }
+
+ // normals
+ if ( expected->HasNormals() != toCompare->HasNormals() ) {
+ addDiff( "Expected are normals, toCompare does not have any." );
+ return false;
+ }
+
+ // return true;
+
+ //ToDo!
+ /*bool normalEqual( true );
+ for ( unsigned int i = 0; i < expected->mNumVertices; i++ ) {
+ aiVector3D &expNormal( expected->mNormals[ i ] );
+ aiVector3D &toCompNormal( toCompare->mNormals[ i ] );
+ if ( expNormal.Equal( toCompNormal ) ) {
+ std::stringstream stream;
+ stream << "Normal not equal ( expected: " << dumpVector3( expNormal ) << ", found: " << dumpVector3( toCompNormal ) << "\n";
+ addDiff( stream.str() );
+ normalEqual = false;
+ }
+ }
+ if ( !normalEqual ) {
+ return false;
+ }
+
+ // vertex colors
+ bool vertColEqual( true );
+ for ( unsigned int a = 0; a < AI_MAX_NUMBER_OF_COLOR_SETS; a++ ) {
+ if ( expected->HasVertexColors(a) != toCompare->HasVertexColors(a) ) {
+ addDiff( "Expected are normals, toCompare does not have any." );
+ return false;
+ }
+ for ( unsigned int i = 0; i < expected->mNumVertices; i++ ) {
+ aiColor4D &expColor4D( expected->mColors[ a ][ i ] );
+ aiColor4D &toCompColor4D( toCompare->mColors[ a ][ i ] );
+ if ( expColor4D != toCompColor4D ) {
+ std::stringstream stream;
+ stream << "Color4D not equal ( expected: " << dumpColor4D( expColor4D ) << ", found: " << dumpColor4D( toCompColor4D ) << "\n";
+ addDiff( stream.str() );
+ vertColEqual = false;
+ }
+ }
+ if ( !vertColEqual ) {
+ return false;
+ }
+ }
+
+ // texture coords
+ bool texCoordsEqual( true );
+ for ( unsigned int a = 0; a < AI_MAX_NUMBER_OF_TEXTURECOORDS; a++ ) {
+ if ( expected->HasTextureCoords( a ) != toCompare->HasTextureCoords( a ) ) {
+ addDiff( "Expected are texture coords, toCompare does not have any." );
+ return false;
+ }
+ for ( unsigned int i = 0; i < expected->mNumVertices; i++ ) {
+ aiVector3D &expTexCoord( expected->mTextureCoords[ a ][ i ] );
+ aiVector3D &toCompTexCoord( toCompare->mTextureCoords[ a ][ i ] );
+ if ( expTexCoord.Equal( toCompTexCoord ) ) {
+ std::stringstream stream;
+ stream << "Texture coords not equal ( expected: " << dumpVector3( expTexCoord ) << ", found: " << dumpVector3( toCompTexCoord ) << "\n";
+ addDiff( stream.str() );
+ vertColEqual = false;
+ }
+ }
+ if ( !vertColEqual ) {
+ return false;
+ }
+ }
+
+ // tangents and bi-tangents
+ if ( expected->HasTangentsAndBitangents() != toCompare->HasTangentsAndBitangents() ) {
+ addDiff( "Expected are tangents and bi-tangents, toCompare does not have any." );
+ return false;
+ }
+ bool tangentsEqual( true );
+ for ( unsigned int i = 0; i < expected->mNumVertices; i++ ) {
+ aiVector3D &expTangents( expected->mTangents[ i ] );
+ aiVector3D &toCompTangents( toCompare->mTangents[ i ] );
+ if ( expTangents.Equal( toCompTangents ) ) {
+ std::stringstream stream;
+ stream << "Tangents not equal ( expected: " << dumpVector3( expTangents ) << ", found: " << dumpVector3( toCompTangents ) << "\n";
+ addDiff( stream.str() );
+ tangentsEqual = false;
+ }
+
+ aiVector3D &expBiTangents( expected->mBitangents[ i ] );
+ aiVector3D &toCompBiTangents( toCompare->mBitangents[ i ] );
+ if ( expBiTangents.Equal( toCompBiTangents ) ) {
+ std::stringstream stream;
+ stream << "Tangents not equal ( expected: " << dumpVector3( expBiTangents ) << ", found: " << dumpVector3( toCompBiTangents ) << " )\n";
+ addDiff( stream.str() );
+ tangentsEqual = false;
+ }
+ }
+ if ( !tangentsEqual ) {
+ return false;
+ }*/
+
+ // faces
+ if ( expected->mNumFaces != toCompare->mNumFaces ) {
+ std::stringstream stream;
+ stream << "Number of faces are not equal, ( expected: " << expected->mNumFaces << ", found: " << toCompare->mNumFaces << ")\n";
+ addDiff( stream.str() );
+ return false;
+ }
+ bool facesEqual( true );
+ for ( unsigned int i = 0; i < expected->mNumFaces; i++ ) {
+ aiFace &expFace( expected->mFaces[ i ] );
+ aiFace &toCompareFace( toCompare->mFaces[ i ] );
+ if ( !compareFace( &expFace, &toCompareFace ) ) {
+ addDiff( "Faces are not equal\n" );
+ addDiff( dumpFace( expFace ) );
+ addDiff( dumpFace( toCompareFace ) );
+ facesEqual = false;
+ }
+ }
+ if ( !facesEqual ) {
+ return false;
+ }
+
+ return true;
+}
+
+bool SceneDiffer::compareFace( aiFace *expected, aiFace *toCompare ) {
+ if ( nullptr == expected ) {
+ return false;
+ }
+ if ( nullptr == toCompare ) {
+ return false;
+ }
+
+ // same instance
+ if ( expected == toCompare ) {
+ return true;
+ }
+
+ // using compare operator
+ if ( *expected == *toCompare ) {
+ return true;
+ }
+
+ return false;
+}
+
+bool SceneDiffer::compareMaterial( aiMaterial *expected, aiMaterial *toCompare ) {
+ if ( nullptr == expected ) {
+ return false;
+ }
+ if ( nullptr == toCompare ) {
+ return false;
+ }
+
+ // same instance
+ if ( expected == toCompare ) {
+ return true;
+ }
+
+ // todo!
+
+ return true;
+}
+
+}
diff --git a/libs/assimp/test/unit/SceneDiffer.h b/libs/assimp/test/unit/SceneDiffer.h
new file mode 100644
index 0000000..2ac429b
--- /dev/null
+++ b/libs/assimp/test/unit/SceneDiffer.h
@@ -0,0 +1,75 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#pragma once
+
+#include "UnitTestPCH.h"
+#include <assimp/fast_atof.h>
+#include <vector>
+#include <string>
+
+struct aiScene;
+struct aiMesh;
+struct aiMaterial;
+struct aiFace;
+
+namespace Assimp {
+
+class SceneDiffer {
+public:
+ SceneDiffer();
+ ~SceneDiffer();
+ bool isEqual( const aiScene *expected, const aiScene *toCompare );
+ void showReport();
+ void reset();
+
+protected:
+ void addDiff( const std::string &diff );
+ bool compareMesh( aiMesh *expected, aiMesh *toCompare );
+ bool compareFace( aiFace *expected, aiFace *toCompare );
+ bool compareMaterial( aiMaterial *expected, aiMaterial *toCompare );
+
+private:
+ std::vector<std::string> m_diffs;
+};
+
+}
diff --git a/libs/assimp/test/unit/TestIOStream.h b/libs/assimp/test/unit/TestIOStream.h
new file mode 100644
index 0000000..2f7280e
--- /dev/null
+++ b/libs/assimp/test/unit/TestIOStream.h
@@ -0,0 +1,62 @@
+/*
+Open Asset Import Library (assimp)
+----------------------------------------------------------------------
+
+Copyright (c) 2006-2020, assimp team
+All rights reserved.
+
+Redistribution and use of this software in source and binary forms,
+with or without modification, are permitted provided that the
+following conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+----------------------------------------------------------------------
+*/
+#pragma once
+
+#include <assimp/DefaultIOStream.h>
+
+using namespace ::Assimp;
+
+class TestDefaultIOStream : public DefaultIOStream {
+public:
+ TestDefaultIOStream()
+ : DefaultIOStream() {
+ // empty
+ }
+
+ TestDefaultIOStream( FILE* pFile, const std::string &strFilename )
+ : DefaultIOStream( pFile, strFilename ) {
+ // empty
+ }
+
+ virtual ~TestDefaultIOStream() {
+ // empty
+ }
+};
+
diff --git a/libs/assimp/test/unit/TestIOSystem.h b/libs/assimp/test/unit/TestIOSystem.h
new file mode 100644
index 0000000..b43e65b
--- /dev/null
+++ b/libs/assimp/test/unit/TestIOSystem.h
@@ -0,0 +1,84 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#pragma once
+
+#include "UnitTestPCH.h"
+
+#include <assimp/IOSystem.hpp>
+
+using namespace std;
+
+namespace Assimp {
+
+static const string Sep = "/";
+
+class TestIOSystem : public IOSystem {
+public:
+ TestIOSystem()
+ : IOSystem() {
+ // empty
+ }
+
+ virtual ~TestIOSystem() {
+ // empty
+ }
+
+ virtual bool Exists( const char* ) const {
+ return true;
+ }
+
+ virtual char getOsSeparator() const {
+ return Sep[ 0 ];
+ }
+
+ virtual IOStream* Open( const char* pFile, const char* pMode = "rb" ) {
+ EXPECT_NE( nullptr, pFile );
+ EXPECT_NE( nullptr, pMode );
+ return NULL;
+ }
+
+ virtual void Close( IOStream* pFile ) {
+ EXPECT_NE( nullptr, pFile );
+ }
+};
+
+} // Namespace Assimp
diff --git a/libs/assimp/test/unit/TestModelFactory.h b/libs/assimp/test/unit/TestModelFactory.h
new file mode 100644
index 0000000..d0f43d7
--- /dev/null
+++ b/libs/assimp/test/unit/TestModelFactory.h
@@ -0,0 +1,105 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#pragma once
+
+#include "UnitTestPCH.h"
+#include <assimp/scene.h>
+#include <assimp/mesh.h>
+#include <assimp/material.h>
+
+namespace Assimp {
+
+class TestModelFacttory {
+public:
+ TestModelFacttory() {
+ // empty
+ }
+
+ ~TestModelFacttory() {
+ // empty
+ }
+
+ static aiScene *createDefaultTestModel( float &opacity ) {
+ aiScene *scene( new aiScene );
+ scene->mNumMaterials = 1;
+ scene->mMaterials = new aiMaterial*[scene->mNumMaterials];
+ scene->mMaterials[ 0 ] = new aiMaterial;
+ aiColor3D color( 1, 0, 0 );
+ EXPECT_EQ( AI_SUCCESS, scene->mMaterials[ 0 ]->AddProperty( &color, 1, AI_MATKEY_COLOR_DIFFUSE ) );
+
+ ::srand( static_cast< unsigned int >( ::time( NULL ) ) );
+ opacity = float( rand() ) / float( RAND_MAX );
+ EXPECT_EQ( AI_SUCCESS, scene->mMaterials[ 0 ]->AddProperty( &opacity, 1, AI_MATKEY_OPACITY ) );
+
+ scene->mNumMeshes = 1;
+ scene->mMeshes = new aiMesh*[scene->mNumMeshes];
+ scene->mMeshes[ 0 ] = new aiMesh;
+ scene->mMeshes[ 0 ]->mMaterialIndex = 0;
+ scene->mMeshes[ 0 ]->mPrimitiveTypes = aiPrimitiveType_TRIANGLE;
+ scene->mMeshes[ 0 ]->mNumVertices = 3;
+ scene->mMeshes[ 0 ]->mVertices = new aiVector3D[ 3 ];
+ scene->mMeshes[ 0 ]->mVertices[ 0 ] = aiVector3D( 1, 0, 0 );
+ scene->mMeshes[ 0 ]->mVertices[ 1 ] = aiVector3D( 0, 1, 0 );
+ scene->mMeshes[ 0 ]->mVertices[ 2 ] = aiVector3D( 0, 0, 1 );
+ scene->mMeshes[ 0 ]->mNumFaces = 1;
+ scene->mMeshes[ 0 ]->mFaces = new aiFace[scene->mMeshes[ 0 ]->mNumFaces];
+ scene->mMeshes[ 0 ]->mFaces[ 0 ].mNumIndices = 3;
+ scene->mMeshes[ 0 ]->mFaces[ 0 ].mIndices = new unsigned int[ 3 ];
+ scene->mMeshes[ 0 ]->mFaces[ 0 ].mIndices[ 0 ] = 0;
+ scene->mMeshes[ 0 ]->mFaces[ 0 ].mIndices[ 1 ] = 1;
+ scene->mMeshes[ 0 ]->mFaces[ 0 ].mIndices[ 2 ] = 2;
+
+ scene->mRootNode = new aiNode();
+ scene->mRootNode->mNumMeshes = 1;
+ scene->mRootNode->mMeshes = new unsigned int[1]{ 0 };
+
+ return scene;
+ }
+
+ static void releaseDefaultTestModel( aiScene **scene ) {
+ delete *scene;
+ *scene = nullptr;
+ }
+};
+
+}
diff --git a/libs/assimp/test/unit/UTLogStream.h b/libs/assimp/test/unit/UTLogStream.h
new file mode 100644
index 0000000..70cb3f8
--- /dev/null
+++ b/libs/assimp/test/unit/UTLogStream.h
@@ -0,0 +1,64 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#pragma once
+
+#include <assimp/LogStream.hpp>
+
+class UTLogStream : public Assimp::LogStream {
+public:
+ UTLogStream()
+ : LogStream() {
+ // empty
+ }
+
+ virtual ~UTLogStream() {
+ // empty
+ }
+
+ virtual void write(const char* message) {
+ if ( nullptr != message ) {
+ m_messages.push_back( std::string( message ) );
+ }
+ }
+
+ std::vector<std::string> m_messages;
+};
diff --git a/libs/assimp/test/unit/UnitTestFileGenerator.h b/libs/assimp/test/unit/UnitTestFileGenerator.h
new file mode 100644
index 0000000..2166c69
--- /dev/null
+++ b/libs/assimp/test/unit/UnitTestFileGenerator.h
@@ -0,0 +1,76 @@
+/*
+---------------------------------------------------------------------------
+Open Asset Import Library (assimp)
+---------------------------------------------------------------------------
+
+Copyright (c) 2006-2020, assimp team
+
+All rights reserved.
+
+Redistribution and use of this software in source and binary forms,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#pragma once
+
+#include <cstdio>
+#include <cstdlib>
+#include <gtest/gtest.h>
+
+#if defined(_MSC_VER)
+#include <io.h>
+#define TMP_PATH "./"
+inline FILE* MakeTmpFile(char* tmplate)
+{
+ auto pathtemplate = _mktemp(tmplate);
+ EXPECT_NE(pathtemplate, nullptr);
+ if(pathtemplate == nullptr)
+ {
+ return nullptr;
+ }
+ auto* fs = std::fopen(pathtemplate, "w+");
+ EXPECT_NE(fs, nullptr);
+ return fs;
+}
+#elif defined(__GNUC__) || defined(__clang__)
+#define TMP_PATH "/tmp/"
+inline FILE* MakeTmpFile(char* tmplate)
+{
+ auto fd = mkstemp(tmplate);
+ EXPECT_NE(-1, fd);
+ if(fd == -1)
+ {
+ return nullptr;
+ }
+ auto fs = fdopen(fd, "w+");
+ EXPECT_NE(nullptr, fs);
+ return fs;
+}
+#endif
diff --git a/libs/assimp/test/unit/UnitTestPCH.h b/libs/assimp/test/unit/UnitTestPCH.h
new file mode 100644
index 0000000..4570dce
--- /dev/null
+++ b/libs/assimp/test/unit/UnitTestPCH.h
@@ -0,0 +1,59 @@
+/*
+---------------------------------------------------------------------------
+Open Asset Import Library (assimp)
+---------------------------------------------------------------------------
+
+Copyright (c) 2006-2020, assimp team
+
+All rights reserved.
+
+Redistribution and use of this software in source and binary forms,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#pragma once
+
+// We need to be sure to have the same STL settings as Assimp
+
+#include <assimp/cimport.h>
+#ifdef _MSC_VER
+# pragma warning(push)
+# pragma warning(disable : 4389)
+#endif
+#include <gtest/gtest.h>
+#ifdef _MSC_VER
+# pragma warning(pop)
+#endif
+#include <memory>
+#include <math.h>
+#include "UTLogStream.h"
+
+#undef min
+#undef max
diff --git a/libs/assimp/test/unit/ut3DImportExport.cpp b/libs/assimp/test/unit/ut3DImportExport.cpp
new file mode 100644
index 0000000..5ff1d79
--- /dev/null
+++ b/libs/assimp/test/unit/ut3DImportExport.cpp
@@ -0,0 +1,67 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+
+#include "UnitTestPCH.h"
+
+#include <assimp/Importer.hpp>
+#include <assimp/postprocess.h>
+
+using namespace Assimp;
+
+TEST(ut3DImportExport, importBoxA) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/3D/box_a.3d", aiProcess_ValidateDataStructure);
+ ASSERT_NE(nullptr, scene);
+}
+
+
+TEST(ut3DImportExport, importBoxD) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/3D/box_d.3d", aiProcess_ValidateDataStructure);
+ ASSERT_NE(nullptr, scene);
+}
+
+
+TEST(ut3DImportExport, importBoxUC) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/3D/box.uc", aiProcess_ValidateDataStructure);
+ ASSERT_NE(nullptr, scene);
+}
diff --git a/libs/assimp/test/unit/ut3DSImportExport.cpp b/libs/assimp/test/unit/ut3DSImportExport.cpp
new file mode 100644
index 0000000..0140636
--- /dev/null
+++ b/libs/assimp/test/unit/ut3DSImportExport.cpp
@@ -0,0 +1,72 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+
+#include "AbstractImportExportBase.h"
+#include "UnitTestPCH.h"
+
+#include <assimp/postprocess.h>
+#include <assimp/Importer.hpp>
+
+using namespace Assimp;
+
+class ut3DSImportExport : public AbstractImportExportBase {
+public:
+ bool importerTest() override {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/3DS/fels.3ds", aiProcess_ValidateDataStructure);
+#ifndef ASSIMP_BUILD_NO_3DS_IMPORTER
+ return nullptr != scene;
+#else
+ return nullptr == scene;
+#endif // ASSIMP_BUILD_NO_3DS_IMPORTER
+ }
+};
+
+TEST_F(ut3DSImportExport, import3DSFromFileTest) {
+ EXPECT_TRUE(importerTest());
+}
+
+TEST_F(ut3DSImportExport, import3DSformatdetection) {
+ ::Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/3DS/testFormatDetection", aiProcess_ValidateDataStructure);
+
+ EXPECT_NE(nullptr, scene);
+}
diff --git a/libs/assimp/test/unit/utACImportExport.cpp b/libs/assimp/test/unit/utACImportExport.cpp
new file mode 100644
index 0000000..9615a3a
--- /dev/null
+++ b/libs/assimp/test/unit/utACImportExport.cpp
@@ -0,0 +1,114 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+
+#include "UnitTestPCH.h"
+
+#include <assimp/postprocess.h>
+#include <assimp/Importer.hpp>
+
+using namespace Assimp;
+
+TEST(utACImportExport, importClosedLine) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/AC/closedLine.ac", aiProcess_ValidateDataStructure);
+ ASSERT_NE(nullptr, scene);
+}
+
+TEST(utACImportExport, importNoSurfaces) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/AC/nosurfaces.ac", aiProcess_ValidateDataStructure);
+ ASSERT_NE(nullptr, scene);
+}
+
+TEST(utACImportExport, importOpenLine) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/AC/openLine.ac", aiProcess_ValidateDataStructure);
+ ASSERT_NE(nullptr, scene);
+}
+
+TEST(utACImportExport, importSampleSubdiv) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/AC/sample_subdiv.ac", aiProcess_ValidateDataStructure);
+ ASSERT_NE(nullptr, scene);
+}
+
+TEST(utACImportExport, importSphereWithLight) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/AC/SphereWithLight.ac", aiProcess_ValidateDataStructure);
+ ASSERT_NE(nullptr, scene);
+}
+
+TEST(utACImportExport, importSphereWithLightUTF16) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/AC/SphereWithLight_UTF16LE.ac", aiProcess_ValidateDataStructure);
+ // FIXME: this is probably wrong, loading the file should succeed
+ ASSERT_EQ(nullptr, scene);
+}
+
+TEST(utACImportExport, importSphereWithLightUTF8BOM) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/AC/SphereWithLight_UTF8BOM.ac", aiProcess_ValidateDataStructure);
+ ASSERT_NE(nullptr, scene);
+}
+
+TEST(utACImportExport, importSphereWithLightUvScaling4X) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/AC/SphereWithLightUvScaling4X.ac", aiProcess_ValidateDataStructure);
+ ASSERT_NE(nullptr, scene);
+}
+
+TEST(utACImportExport, importWuson) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/AC/Wuson.ac", aiProcess_ValidateDataStructure);
+ ASSERT_NE(nullptr, scene);
+}
+
+TEST(utACImportExport, importWusonACC) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/AC/Wuson.acc", aiProcess_ValidateDataStructure);
+ ASSERT_NE(nullptr, scene);
+}
+
+TEST(utACImportExport, testFormatDetection) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/AC/TestFormatDetection", aiProcess_ValidateDataStructure);
+ ASSERT_NE(nullptr, scene);
+}
diff --git a/libs/assimp/test/unit/utAMFImportExport.cpp b/libs/assimp/test/unit/utAMFImportExport.cpp
new file mode 100644
index 0000000..78309a1
--- /dev/null
+++ b/libs/assimp/test/unit/utAMFImportExport.cpp
@@ -0,0 +1,67 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+
+#include "AbstractImportExportBase.h"
+#include "UnitTestPCH.h"
+
+#include <assimp/postprocess.h>
+#include <assimp/Importer.hpp>
+
+using namespace Assimp;
+
+class utAMFImportExport : public AbstractImportExportBase {
+public:
+ bool importerTest() override {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/AMF/test1.amf", aiProcess_ValidateDataStructure);
+ return nullptr != scene;
+ }
+};
+
+TEST_F(utAMFImportExport, importAMFFromFileTest) {
+ EXPECT_TRUE(importerTest());
+}
+
+TEST_F(utAMFImportExport, importAMFWithMatFromFileTest) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/AMF/test_with_mat.amf", aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+}
diff --git a/libs/assimp/test/unit/utASEImportExport.cpp b/libs/assimp/test/unit/utASEImportExport.cpp
new file mode 100644
index 0000000..8014cbb
--- /dev/null
+++ b/libs/assimp/test/unit/utASEImportExport.cpp
@@ -0,0 +1,65 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+
+#include "AbstractImportExportBase.h"
+#include "UnitTestPCH.h"
+
+#include <assimp/postprocess.h>
+#include <assimp/Importer.hpp>
+
+using namespace Assimp;
+
+class utASEImportExport : public AbstractImportExportBase {
+public:
+ bool importerTest() override {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/ASE/ThreeCubesGreen.ASE", aiProcess_ValidateDataStructure);
+#ifndef ASSIMP_BUILD_NO_3DS_IMPORTER
+ return nullptr != scene;
+#else
+ return nullptr == scene;
+#endif // ASSIMP_BUILD_NO_3DS_IMPORTER
+ }
+};
+
+TEST_F(utASEImportExport, importACFromFileTest) {
+ EXPECT_TRUE(importerTest());
+}
diff --git a/libs/assimp/test/unit/utAnim.cpp b/libs/assimp/test/unit/utAnim.cpp
new file mode 100644
index 0000000..956810d
--- /dev/null
+++ b/libs/assimp/test/unit/utAnim.cpp
@@ -0,0 +1,107 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "UnitTestPCH.h"
+
+#include <assimp/anim.h>
+
+using namespace Assimp;
+
+class utAnim : public ::testing::Test {
+ // empty
+};
+
+TEST_F( utAnim, aiVectorKeyCreationTest ) {
+ aiVectorKey defaultConstTest;
+ EXPECT_DOUBLE_EQ( 0.0, defaultConstTest.mTime );
+
+ aiVector3D v( 1, 2, 3 );
+ aiVectorKey constrWithValuesTest( 1, v );
+ EXPECT_DOUBLE_EQ( 1.0, constrWithValuesTest.mTime );
+ EXPECT_EQ( v, constrWithValuesTest.mValue );
+
+ EXPECT_NE( defaultConstTest, constrWithValuesTest );
+ EXPECT_TRUE( defaultConstTest != constrWithValuesTest );
+ defaultConstTest.mTime = 1;
+ constrWithValuesTest.mTime = 2;
+ EXPECT_TRUE( defaultConstTest < constrWithValuesTest );
+}
+
+TEST_F( utAnim, aiQuatKeyTest ) {
+ aiQuatKey defaultConstrTest;
+ EXPECT_DOUBLE_EQ( 0.0, defaultConstrTest.mTime );
+
+ aiQuaternion q;
+ aiQuatKey constrWithValuesTest( 1.0, q );
+ EXPECT_DOUBLE_EQ( 1.0, constrWithValuesTest.mTime );
+ EXPECT_EQ( q, constrWithValuesTest.mValue );
+}
+
+TEST_F( utAnim, aiNodeAnimTest ) {
+ bool ok( true );
+ try {
+ aiNodeAnim myAnim;
+ EXPECT_EQ( aiAnimBehaviour_DEFAULT, myAnim.mPreState );
+ EXPECT_EQ( aiAnimBehaviour_DEFAULT, myAnim.mPostState );
+ } catch ( ... ) {
+ ok = false;
+ }
+ EXPECT_TRUE( ok );
+}
+
+TEST_F( utAnim, aiMeshAnimTest ) {
+ bool ok( true );
+ try {
+ aiMeshAnim myMeshAnim;
+ } catch ( ... ) {
+ ok = false;
+ }
+ EXPECT_TRUE( ok );
+}
+
+TEST_F( utAnim, aiAnimationTest ) {
+ bool ok( true );
+ try {
+ aiAnimation myAnimation;
+ } catch ( ... ) {
+ ok = false;
+ }
+ EXPECT_TRUE( ok );
+}
diff --git a/libs/assimp/test/unit/utArmaturePopulate.cpp b/libs/assimp/test/unit/utArmaturePopulate.cpp
new file mode 100644
index 0000000..0acea7b
--- /dev/null
+++ b/libs/assimp/test/unit/utArmaturePopulate.cpp
@@ -0,0 +1,79 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "TestModelFactory.h"
+#include "UnitTestPCH.h"
+
+#include "AbstractImportExportBase.h"
+
+#include <assimp/material.h>
+#include <assimp/postprocess.h>
+#include <assimp/scene.h>
+#include <assimp/types.h>
+#include <assimp/Importer.hpp>
+
+#include "PostProcessing/ArmaturePopulate.h"
+
+namespace Assimp {
+namespace UnitTest {
+
+class utArmaturePopulate : public ::testing::Test {
+ // empty
+};
+
+TEST_F(utArmaturePopulate, importCheckForArmatureTest) {
+ Assimp::Importer importer;
+ unsigned int mask = aiProcess_PopulateArmatureData | aiProcess_ValidateDataStructure;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/FBX/huesitos.fbx", mask);
+ EXPECT_NE(nullptr, scene);
+ EXPECT_EQ(scene->mNumMeshes, 1u);
+ aiMesh *mesh = scene->mMeshes[0];
+ EXPECT_EQ(mesh->mNumFaces, 68u);
+ EXPECT_EQ(mesh->mNumVertices, 256u);
+ EXPECT_GT(mesh->mNumBones, 0u);
+
+ aiBone *exampleBone = mesh->mBones[0];
+ EXPECT_NE(exampleBone, nullptr);
+ EXPECT_NE(exampleBone->mArmature, nullptr);
+ EXPECT_NE(exampleBone->mNode, nullptr);
+}
+
+} // Namespace UnitTest
+} // Namespace Assimp
diff --git a/libs/assimp/test/unit/utAssbinImportExport.cpp b/libs/assimp/test/unit/utAssbinImportExport.cpp
new file mode 100644
index 0000000..437a0a5
--- /dev/null
+++ b/libs/assimp/test/unit/utAssbinImportExport.cpp
@@ -0,0 +1,69 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "AbstractImportExportBase.h"
+#include "UnitTestPCH.h"
+#include <assimp/postprocess.h>
+#include <assimp/Exporter.hpp>
+#include <assimp/Importer.hpp>
+
+using namespace Assimp;
+
+#ifndef ASSIMP_BUILD_NO_EXPORT
+
+class utAssbinImportExport : public AbstractImportExportBase {
+public:
+ bool importerTest() override {
+ Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/OBJ/spider.obj", aiProcess_ValidateDataStructure);
+
+ Exporter exporter;
+ EXPECT_EQ(aiReturn_SUCCESS, exporter.Export(scene, "assbin", ASSIMP_TEST_MODELS_DIR "/OBJ/spider_out.assbin"));
+ const aiScene *newScene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/OBJ/spider_out.assbin", aiProcess_ValidateDataStructure);
+
+ return newScene != nullptr;
+ }
+};
+
+TEST_F(utAssbinImportExport, import3ExportAssbinDFromFileTest) {
+ EXPECT_TRUE(importerTest());
+}
+
+#endif // #ifndef ASSIMP_BUILD_NO_EXPORT
diff --git a/libs/assimp/test/unit/utB3DImportExport.cpp b/libs/assimp/test/unit/utB3DImportExport.cpp
new file mode 100644
index 0000000..9672aa0
--- /dev/null
+++ b/libs/assimp/test/unit/utB3DImportExport.cpp
@@ -0,0 +1,61 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+
+#include "AbstractImportExportBase.h"
+#include "UnitTestPCH.h"
+
+#include <assimp/postprocess.h>
+#include <assimp/Importer.hpp>
+
+using namespace Assimp;
+
+class utB3DImportExport : public AbstractImportExportBase {
+public:
+ virtual bool importerTest() {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/B3D/WusonBlitz.b3d", aiProcess_ValidateDataStructure);
+ return nullptr != scene;
+ }
+};
+
+TEST_F(utB3DImportExport, importACFromFileTest) {
+ EXPECT_TRUE(importerTest());
+}
diff --git a/libs/assimp/test/unit/utBVHImportExport.cpp b/libs/assimp/test/unit/utBVHImportExport.cpp
new file mode 100644
index 0000000..d69ac79
--- /dev/null
+++ b/libs/assimp/test/unit/utBVHImportExport.cpp
@@ -0,0 +1,60 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "AbstractImportExportBase.h"
+#include "UnitTestPCH.h"
+
+#include <assimp/postprocess.h>
+#include <assimp/Importer.hpp>
+
+using namespace Assimp;
+
+class utBVHImportExport : public AbstractImportExportBase {
+public:
+ bool importerTest() override {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/BVH/01_01.bvh", aiProcess_ValidateDataStructure);
+ return nullptr != scene;
+ }
+};
+
+TEST_F(utBVHImportExport, importBlenFromFileTest) {
+ EXPECT_TRUE(importerTest());
+}
diff --git a/libs/assimp/test/unit/utBatchLoader.cpp b/libs/assimp/test/unit/utBatchLoader.cpp
new file mode 100644
index 0000000..df6aa79
--- /dev/null
+++ b/libs/assimp/test/unit/utBatchLoader.cpp
@@ -0,0 +1,81 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "UnitTestPCH.h"
+#include "Common/Importer.h"
+#include "TestIOSystem.h"
+
+using namespace ::Assimp;
+
+class BatchLoaderTest : public ::testing::Test {
+public:
+ virtual void SetUp() {
+ m_io = new TestIOSystem();
+ }
+
+ virtual void TearDown() {
+ delete m_io;
+ }
+
+protected:
+ TestIOSystem* m_io;
+};
+
+TEST_F( BatchLoaderTest, createTest ) {
+ bool ok( true );
+ try {
+ BatchLoader loader( m_io );
+ } catch ( ... ) {
+ ok = false;
+ }
+ EXPECT_TRUE( ok );
+}
+
+TEST_F( BatchLoaderTest, validateAccessTest ) {
+ BatchLoader loader1( m_io );
+ EXPECT_FALSE( loader1.getValidation() );
+ loader1.setValidation( true );
+ EXPECT_TRUE( loader1.getValidation() );
+
+ BatchLoader loader2( m_io, true );
+ EXPECT_TRUE( loader2.getValidation() );
+}
diff --git a/libs/assimp/test/unit/utBlendImportAreaLight.cpp b/libs/assimp/test/unit/utBlendImportAreaLight.cpp
new file mode 100644
index 0000000..5378874
--- /dev/null
+++ b/libs/assimp/test/unit/utBlendImportAreaLight.cpp
@@ -0,0 +1,109 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "UnitTestPCH.h"
+
+#include <assimp/cexport.h>
+#include <assimp/postprocess.h>
+#include <assimp/scene.h>
+#include <assimp/Exporter.hpp>
+#include <assimp/Importer.hpp>
+
+class BlendImportAreaLight : public ::testing::Test {
+public:
+ void SetUp() override {
+ im = new Assimp::Importer();
+ }
+
+ void TearDown() override {
+ delete im;
+ }
+
+protected:
+ Assimp::Importer *im;
+};
+
+// ------------------------------------------------------------------------------------------------
+TEST_F(BlendImportAreaLight, testImportLight) {
+ const aiScene *pTest = im->ReadFile(ASSIMP_TEST_MODELS_DIR "/BLEND/AreaLight_269.blend", aiProcess_ValidateDataStructure);
+ ASSERT_TRUE(pTest != nullptr);
+ ASSERT_TRUE(pTest->HasLights());
+
+ std::vector<std::pair<std::string, size_t>> lightNames;
+
+ for (size_t i = 0; i < pTest->mNumLights; i++) {
+ lightNames.push_back(std::make_pair(pTest->mLights[i]->mName.C_Str(), i));
+ }
+
+ std::sort(lightNames.begin(), lightNames.end());
+
+ std::vector<aiLight> lights;
+
+ for (size_t i = 0; i < pTest->mNumLights; ++i) {
+ lights.push_back(*pTest->mLights[lightNames[i].second]);
+ }
+
+ ASSERT_STREQ(lights[0].mName.C_Str(), "Bar");
+ ASSERT_STREQ(lights[1].mName.C_Str(), "Baz");
+ ASSERT_STREQ(lights[2].mName.C_Str(), "Foo");
+
+ ASSERT_EQ(lights[0].mType, aiLightSource_AREA);
+ ASSERT_EQ(lights[1].mType, aiLightSource_POINT);
+ ASSERT_EQ(lights[2].mType, aiLightSource_AREA);
+
+ EXPECT_FLOAT_EQ(lights[0].mSize.x, 0.5f);
+ EXPECT_FLOAT_EQ(lights[0].mSize.y, 2.0f);
+ EXPECT_FLOAT_EQ(lights[2].mSize.x, 1.0f);
+ EXPECT_FLOAT_EQ(lights[2].mSize.y, 1.0f);
+
+ EXPECT_FLOAT_EQ(lights[0].mColorDiffuse.r, 42.0f);
+ EXPECT_FLOAT_EQ(lights[0].mColorDiffuse.g, 42.0f);
+ EXPECT_FLOAT_EQ(lights[0].mColorDiffuse.b, 42.0f);
+ EXPECT_FLOAT_EQ(lights[2].mColorDiffuse.r, 1.0f);
+ EXPECT_FLOAT_EQ(lights[2].mColorDiffuse.g, 1.0f);
+ EXPECT_FLOAT_EQ(lights[2].mColorDiffuse.b, 1.0f);
+
+ EXPECT_FLOAT_EQ(lights[0].mDirection.x, 0.0f);
+ EXPECT_FLOAT_EQ(lights[0].mDirection.y, 0.0f);
+ EXPECT_FLOAT_EQ(lights[0].mDirection.z, -1.0f);
+ EXPECT_FLOAT_EQ(lights[2].mDirection.x, 0.0f);
+ EXPECT_FLOAT_EQ(lights[2].mDirection.y, 0.0f);
+ EXPECT_FLOAT_EQ(lights[2].mDirection.z, -1.0f);
+}
diff --git a/libs/assimp/test/unit/utBlendImportMaterials.cpp b/libs/assimp/test/unit/utBlendImportMaterials.cpp
new file mode 100644
index 0000000..582d47e
--- /dev/null
+++ b/libs/assimp/test/unit/utBlendImportMaterials.cpp
@@ -0,0 +1,146 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "UnitTestPCH.h"
+
+#include <assimp/cexport.h>
+#include <assimp/postprocess.h>
+#include <assimp/scene.h>
+#include <assimp/Importer.hpp>
+
+class BlendImportMaterials : public ::testing::Test {
+public:
+ void SetUp() override {
+ im = new Assimp::Importer();
+ }
+
+ void TearDown() override {
+ delete im;
+ }
+
+protected:
+ Assimp::Importer *im;
+};
+
+// ------------------------------------------------------------------------------------------------
+TEST_F(BlendImportMaterials, testImportMaterial) {
+ const aiScene *pTest = im->ReadFile(ASSIMP_TEST_MODELS_DIR "/BLEND/BlenderMaterial_269.blend", aiProcess_ValidateDataStructure);
+ ASSERT_TRUE(pTest != NULL);
+ ASSERT_TRUE(pTest->HasMaterials());
+
+ ASSERT_EQ(1U, pTest->mNumMaterials);
+
+ auto alpha = pTest->mMaterials[0];
+
+#define ASSERT_PROPERTY_EQ(expected, key, var) \
+ auto var = expected; \
+ ASSERT_EQ(aiReturn_SUCCESS, alpha->Get("$mat.blend." key, 0, 0, var)); \
+ ASSERT_EQ(expected, var);
+
+#define ASSERT_PROPERTY_FLOAT_EQ(expected, key, var) \
+ auto var = expected; \
+ ASSERT_EQ(aiReturn_SUCCESS, alpha->Get("$mat.blend." key, 0, 0, var)); \
+ ASSERT_FLOAT_EQ(expected, var);
+
+ ASSERT_PROPERTY_EQ(aiColor3D(0.1f, 0.2f, 0.3f), "diffuse.color", diffuseColor);
+ ASSERT_PROPERTY_EQ(0.4f, "diffuse.intensity", diffuseIntensity);
+ ASSERT_PROPERTY_EQ(1, "diffuse.shader", diffuseShader);
+ ASSERT_PROPERTY_EQ(0, "diffuse.ramp", diffuseRamp);
+
+ ASSERT_PROPERTY_EQ(aiColor3D(0.5f, 0.6f, 0.7f), "specular.color", specularColor);
+ ASSERT_PROPERTY_EQ(0.8f, "specular.intensity", specularIntensity);
+ ASSERT_PROPERTY_EQ(1, "specular.shader", specularShader);
+ ASSERT_PROPERTY_EQ(0, "specular.ramp", specularRamp);
+ ASSERT_PROPERTY_EQ(9, "specular.hardness", specularHardness);
+
+ ASSERT_PROPERTY_EQ(1, "transparency.use", transparencyUse);
+ ASSERT_PROPERTY_EQ(2, "transparency.method", transparencyMethod);
+ ASSERT_PROPERTY_EQ(0.01f, "transparency.alpha", transparencyAlpha);
+ ASSERT_PROPERTY_EQ(0.02f, "transparency.specular", transparencySpecular);
+ ASSERT_PROPERTY_EQ(0.03f, "transparency.fresnel", transparencyFresnel);
+ ASSERT_PROPERTY_EQ(3.14f, "transparency.blend", transparencyBlend);
+ ASSERT_PROPERTY_EQ(0.85f, "transparency.ior", transparencyIor);
+ ASSERT_PROPERTY_FLOAT_EQ(0.128f, "transparency.filter", transparencyFilter);
+ ASSERT_PROPERTY_FLOAT_EQ(1.298f, "transparency.falloff", transparencyFalloff);
+ ASSERT_PROPERTY_FLOAT_EQ(0.2376f, "transparency.limit", transparencyLimit);
+ ASSERT_PROPERTY_EQ(7, "transparency.depth", transparencyDepth);
+ ASSERT_PROPERTY_FLOAT_EQ(0.678f, "transparency.glossAmount", transparencyGlossAmount);
+ ASSERT_PROPERTY_FLOAT_EQ(0.208f, "transparency.glossThreshold", transparencyGlossThreshold);
+ ASSERT_PROPERTY_EQ(17, "transparency.glossSamples", transparencyGlossSamples);
+
+ ASSERT_PROPERTY_EQ(1, "mirror.use", mirrorUse);
+ ASSERT_PROPERTY_FLOAT_EQ(0.28f, "mirror.reflectivity", mirrorReflectivity);
+ ASSERT_PROPERTY_EQ(aiColor3D(0.25f, 0.5f, 0.128f), "mirror.color", mirrorColor);
+ ASSERT_PROPERTY_FLOAT_EQ(0.256f, "mirror.fresnel", mirrorFresnel);
+ ASSERT_PROPERTY_FLOAT_EQ(1.61f, "mirror.blend", mirrorBlend);
+ ASSERT_PROPERTY_EQ(12, "mirror.depth", mirrorDepth);
+ ASSERT_PROPERTY_FLOAT_EQ(0.4f, "mirror.maxDist", mirrorMaxDist);
+ ASSERT_PROPERTY_EQ(1, "mirror.fadeTo", mirrorFadeTo);
+ ASSERT_PROPERTY_FLOAT_EQ(0.512f, "mirror.glossAmount", mirrorGlossAmount);
+ ASSERT_PROPERTY_FLOAT_EQ(0.18f, "mirror.glossThreshold", mirrorGlossThreshold);
+ ASSERT_PROPERTY_EQ(61, "mirror.glossSamples", mirrorGlossSamples);
+ ASSERT_PROPERTY_FLOAT_EQ(0.87f, "mirror.glossAnisotropic", mirrorGlossAnisotropic);
+}
+
+TEST_F(BlendImportMaterials, testImportMaterialwith2texturesAnd2TexCoordMappings) {
+ const aiScene *pTest = im->ReadFile(ASSIMP_TEST_MODELS_DIR "/BLEND/plane_2_textures_2_texcoords_279.blend", aiProcess_ValidateDataStructure);
+ ASSERT_TRUE(pTest != NULL);
+
+ // material has 2 diffuse textures
+ ASSERT_TRUE(pTest->HasMaterials());
+ EXPECT_EQ(1u, pTest->mNumMaterials);
+ const aiMaterial *pMat = pTest->mMaterials[0];
+ ASSERT_TRUE(nullptr != pMat);
+ ASSERT_EQ(2u, pMat->GetTextureCount(aiTextureType_DIFFUSE));
+ aiString aPath;
+ aiTextureMapping tm = aiTextureMapping::aiTextureMapping_OTHER;
+ aiReturn result = pMat->GetTexture(aiTextureType_DIFFUSE, 0, &aPath, &tm);
+ ASSERT_EQ(aiReturn_SUCCESS, result);
+ result = pMat->GetTexture(aiTextureType_DIFFUSE, 1, &aPath, &tm);
+ ASSERT_EQ(aiReturn_SUCCESS, result);
+
+ // mesh has 2 texturecoord sets
+ ASSERT_TRUE(pTest->HasMeshes());
+ EXPECT_EQ(1u, pTest->mNumMeshes);
+ const aiMesh *pMesh = pTest->mMeshes[0];
+ ASSERT_TRUE(nullptr != pMesh);
+ ASSERT_TRUE(pMesh->HasTextureCoords(0));
+ ASSERT_TRUE(pMesh->HasTextureCoords(1));
+}
diff --git a/libs/assimp/test/unit/utBlenderImportExport.cpp b/libs/assimp/test/unit/utBlenderImportExport.cpp
new file mode 100644
index 0000000..2970986
--- /dev/null
+++ b/libs/assimp/test/unit/utBlenderImportExport.cpp
@@ -0,0 +1,218 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "AbstractImportExportBase.h"
+#include "UnitTestPCH.h"
+
+#include <assimp/postprocess.h>
+#include <assimp/Importer.hpp>
+
+using namespace Assimp;
+
+class utBlenderImporterExporter : public AbstractImportExportBase {
+public:
+ virtual bool importerTest() {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/BLEND/box.blend", aiProcess_ValidateDataStructure);
+ return nullptr != scene;
+ }
+};
+
+TEST_F(utBlenderImporterExporter, importBlenFromFileTest) {
+ EXPECT_TRUE(importerTest());
+}
+
+TEST(utBlenderImporter, import4cubes) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/BLEND/4Cubes4Mats_248.blend", aiProcess_ValidateDataStructure);
+ // FIXME: this is probably not right, loading this should succeed
+ ASSERT_EQ(nullptr, scene);
+}
+
+TEST(utBlenderImporter, import269_regress1) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/BLEND/blender_269_regress1.blend", aiProcess_ValidateDataStructure);
+ ASSERT_NE(nullptr, scene);
+}
+
+TEST(utBlenderImporter, importBlenderDefault248) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/BLEND/BlenderDefault_248.blend", aiProcess_ValidateDataStructure);
+ // FIXME: this is probably not right, loading this should succeed
+ ASSERT_EQ(nullptr, scene);
+}
+
+TEST(utBlenderImporter, importBlenderDefault250) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/BLEND/BlenderDefault_250.blend", aiProcess_ValidateDataStructure);
+ // FIXME: this is probably not right, loading this should succeed
+ ASSERT_EQ(nullptr, scene);
+}
+
+TEST(utBlenderImporter, importBlenderDefault250Compressed) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/BLEND/BlenderDefault_250_Compressed.blend", aiProcess_ValidateDataStructure);
+ // FIXME: this is probably not right, loading this should succeed
+ ASSERT_EQ(nullptr, scene);
+}
+
+TEST(utBlenderImporter, importBlenderDefault262) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/BLEND/BlenderDefault_262.blend", aiProcess_ValidateDataStructure);
+ // FIXME: this is probably not right, loading this should succeed
+ ASSERT_EQ(nullptr, scene);
+}
+
+TEST(utBlenderImporter, importBlenderDefault269) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/BLEND/BlenderDefault_269.blend", aiProcess_ValidateDataStructure);
+ ASSERT_NE(nullptr, scene);
+}
+
+TEST(utBlenderImporter, importBlenderDefault271) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/BLEND/BlenderDefault_271.blend", aiProcess_ValidateDataStructure);
+ ASSERT_NE(nullptr, scene);
+}
+
+TEST(utBlenderImporter, importBlenderDefault293) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/BLEND/BlenderDefault_276.blend", aiProcess_ValidateDataStructure);
+ ASSERT_NE(nullptr, scene);
+}
+
+TEST(utBlenderImporter, importCubeHierarchy_248) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/BLEND/CubeHierarchy_248.blend", aiProcess_ValidateDataStructure);
+ // FIXME: this is probably not right, loading this should succeed
+ ASSERT_EQ(nullptr, scene);
+}
+
+TEST(utBlenderImporter, importHuman) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/BLEND/HUMAN.blend", aiProcess_ValidateDataStructure);
+ // FIXME: this is probably not right, loading this should succeed
+ ASSERT_EQ(nullptr, scene);
+}
+
+TEST(utBlenderImporter, importMirroredCube_252) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/BLEND/MirroredCube_252.blend", aiProcess_ValidateDataStructure);
+ // FIXME: this is probably not right, loading this should succeed
+ ASSERT_EQ(nullptr, scene);
+}
+
+TEST(utBlenderImporter, importNoisyTexturedCube_VoronoiGlob_248) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/BLEND/NoisyTexturedCube_VoronoiGlob_248.blend", aiProcess_ValidateDataStructure);
+ // FIXME: this is probably not right, loading this should succeed
+ ASSERT_EQ(nullptr, scene);
+}
+
+TEST(utBlenderImporter, importSmoothVsSolidCube_248) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/BLEND/SmoothVsSolidCube_248.blend", aiProcess_ValidateDataStructure);
+ // FIXME: this is probably not right, loading this should succeed
+ ASSERT_EQ(nullptr, scene);
+}
+
+TEST(utBlenderImporter, importSuzanne_248) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/BLEND/Suzanne_248.blend", aiProcess_ValidateDataStructure);
+ // FIXME: this is probably not right, loading this should succeed
+ ASSERT_EQ(nullptr, scene);
+}
+
+TEST(utBlenderImporter, importSuzanneSubdiv_252) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/BLEND/SuzanneSubdiv_252.blend", aiProcess_ValidateDataStructure);
+ // FIXME: this is probably not right, loading this should succeed
+ ASSERT_EQ(nullptr, scene);
+}
+
+TEST(utBlenderImporter, importTexturedCube_ImageGlob_248) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/BLEND/TexturedCube_ImageGlob_248.blend", aiProcess_ValidateDataStructure);
+ // FIXME: this is probably not right, loading this should succeed
+ ASSERT_EQ(nullptr, scene);
+}
+
+TEST(utBlenderImporter, importTexturedPlane_ImageUv_248) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/BLEND/TexturedPlane_ImageUv_248.blend", aiProcess_ValidateDataStructure);
+ // FIXME: this is probably not right, loading this should succeed
+ ASSERT_EQ(nullptr, scene);
+}
+
+TEST(utBlenderImporter, importTexturedPlane_ImageUvPacked_248) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/BLEND/TexturedPlane_ImageUvPacked_248.blend", aiProcess_ValidateDataStructure);
+ // FIXME: this is probably not right, loading this should succeed
+ ASSERT_EQ(nullptr, scene);
+}
+
+TEST(utBlenderImporter, importTorusLightsCams_250_compressed) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/BLEND/TorusLightsCams_250_compressed.blend", aiProcess_ValidateDataStructure);
+ // FIXME: this is probably not right, loading this should succeed
+ ASSERT_EQ(nullptr, scene);
+}
+
+TEST(utBlenderImporter, import_yxa_1) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/BLEND/yxa_1.blend", aiProcess_ValidateDataStructure);
+ // FIXME: this is probably not right, loading this should succeed
+ ASSERT_EQ(nullptr, scene);
+}
+
+TEST(utBlenderImporter, importBob) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_NONBSD_DIR "/BLEND/Bob.blend", aiProcess_ValidateDataStructure);
+ // FIXME: this is probably not right, loading this should succeed
+ ASSERT_EQ(nullptr, scene);
+}
+
+TEST(utBlenderImporter, importFleurOptonl) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_NONBSD_DIR "/BLEND/fleurOptonl.blend", aiProcess_ValidateDataStructure);
+ ASSERT_NE(nullptr, scene);
+}
diff --git a/libs/assimp/test/unit/utBlenderIntermediate.cpp b/libs/assimp/test/unit/utBlenderIntermediate.cpp
new file mode 100644
index 0000000..c2cc51e
--- /dev/null
+++ b/libs/assimp/test/unit/utBlenderIntermediate.cpp
@@ -0,0 +1,80 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "UnitTestPCH.h"
+#include "AssetLib/Blender/BlenderIntermediate.h"
+#include <assimp/camera.h>
+#include <assimp/light.h>
+#include <assimp/mesh.h>
+#include <assimp/texture.h>
+
+using namespace ::Assimp;
+using namespace ::Assimp::Blender;
+
+class BlenderIntermediateTest : public ::testing::Test {
+ // empty
+};
+
+#define NAME_1 "name1"
+#define NAME_2 "name2"
+
+// Updated this test after fixing #1776:
+// A comparator in C++ is used for ordering and must implement strict weak ordering,
+// which means it must return false for equal values.
+// The C++ standard defines and expects this behavior: true if lhs < rhs, false otherwise.
+TEST_F(BlenderIntermediateTest, ConversionData_ObjectCompareTest) {
+ Object obj1, obj2;
+ strncpy(obj1.id.name, NAME_1, sizeof(obj1.id.name));
+ strncpy(obj2.id.name, NAME_2, sizeof(obj2.id.name));
+
+ Blender::ObjectCompare cmp_true_because_first_is_smaller_than_second;
+ bool res(cmp_true_because_first_is_smaller_than_second(&obj1, &obj2));
+ EXPECT_TRUE(res);
+
+ Blender::ObjectCompare cmp_false_because_equal;
+ res = cmp_false_because_equal(&obj1, &obj1);
+ EXPECT_FALSE(res);
+
+ Blender::ObjectCompare cmp_false_because_first_is_greater_than_second;
+ res = cmp_false_because_first_is_greater_than_second(&obj2, &obj1);
+ EXPECT_FALSE(res);
+}
diff --git a/libs/assimp/test/unit/utBlenderWork.cpp b/libs/assimp/test/unit/utBlenderWork.cpp
new file mode 100644
index 0000000..554198b
--- /dev/null
+++ b/libs/assimp/test/unit/utBlenderWork.cpp
@@ -0,0 +1,73 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "UnitTestPCH.h"
+#include <assimp/cexport.h>
+#include <assimp/postprocess.h>
+#include <assimp/scene.h>
+#include <assimp/Importer.hpp>
+
+using namespace ::Assimp;
+
+class BlenderWorkTest : public ::testing::Test {
+public:
+ virtual void SetUp() {
+ im = new Assimp::Importer();
+ }
+
+ virtual void TearDown() {
+ delete im;
+ }
+
+protected:
+ Assimp::Importer *im;
+};
+
+TEST_F(BlenderWorkTest, work_279) {
+ const aiScene *pTest = im->ReadFile(ASSIMP_TEST_MODELS_DIR "/BLEND/test_279.blend", aiProcess_ValidateDataStructure);
+ ASSERT_TRUE(pTest != NULL);
+
+ // material has 2 diffuse textures
+ ASSERT_TRUE(pTest->HasMaterials());
+ ASSERT_TRUE(pTest->HasMeshes());
+ ASSERT_TRUE(pTest->mMeshes[0]->mNumVertices > 0);
+ ASSERT_EQ(44u, pTest->mMeshes[0]->mNumFaces);
+ EXPECT_EQ(1u, pTest->mNumMaterials);
+}
diff --git a/libs/assimp/test/unit/utCSMImportExport.cpp b/libs/assimp/test/unit/utCSMImportExport.cpp
new file mode 100644
index 0000000..13bfd52
--- /dev/null
+++ b/libs/assimp/test/unit/utCSMImportExport.cpp
@@ -0,0 +1,60 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "AbstractImportExportBase.h"
+#include "UnitTestPCH.h"
+
+#include <assimp/postprocess.h>
+#include <assimp/Importer.hpp>
+
+using namespace Assimp;
+
+class utCSMImportExport : public AbstractImportExportBase {
+public:
+ virtual bool importerTest() {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/CSM/ThomasFechten.csm", aiProcess_ValidateDataStructure);
+ return nullptr != scene;
+ }
+};
+
+TEST_F(utCSMImportExport, importBlenFromFileTest) {
+ EXPECT_TRUE(importerTest());
+}
diff --git a/libs/assimp/test/unit/utColladaExport.cpp b/libs/assimp/test/unit/utColladaExport.cpp
new file mode 100644
index 0000000..bb87071
--- /dev/null
+++ b/libs/assimp/test/unit/utColladaExport.cpp
@@ -0,0 +1,225 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "UnitTestPCH.h"
+
+#include <assimp/cexport.h>
+#include <assimp/commonMetaData.h>
+#include <assimp/postprocess.h>
+#include <assimp/scene.h>
+#include <assimp/Exporter.hpp>
+#include <assimp/Importer.hpp>
+
+#include <array>
+
+#ifndef ASSIMP_BUILD_NO_EXPORT
+
+class utColladaExport : public ::testing::Test {
+public:
+ void SetUp() override {
+ ex = new Assimp::Exporter();
+ im = new Assimp::Importer();
+ }
+
+ void TearDown() override {
+ delete ex;
+ ex = nullptr;
+ delete im;
+ im = nullptr;
+ }
+
+protected:
+ Assimp::Exporter *ex;
+ Assimp::Importer *im;
+};
+
+TEST_F(utColladaExport, testExportCamera) {
+ const char *file = "cameraExp.dae";
+
+ const aiScene *pTest = im->ReadFile(ASSIMP_TEST_MODELS_DIR "/Collada/cameras.dae", aiProcess_ValidateDataStructure);
+ ASSERT_NE(nullptr, pTest);
+ ASSERT_TRUE(pTest->HasCameras());
+
+ EXPECT_EQ(AI_SUCCESS, ex->Export(pTest, "collada", file));
+ const unsigned int origNumCams(pTest->mNumCameras);
+ //std::vector<float> origFOV;
+ std::unique_ptr<float[]> origFOV(new float[origNumCams]);
+ std::unique_ptr<float[]> orifClipPlaneNear(new float[origNumCams]);
+ std::unique_ptr<float[]> orifClipPlaneFar(new float[origNumCams]);
+ std::unique_ptr<aiString[]> names(new aiString[origNumCams]);
+ std::unique_ptr<aiVector3D[]> pos(new aiVector3D[origNumCams]);
+ for (size_t i = 0; i < origNumCams; i++) {
+ const aiCamera *orig = pTest->mCameras[i];
+ ASSERT_NE(nullptr, orig);
+
+ origFOV[i] = orig->mHorizontalFOV;
+ orifClipPlaneNear[i] = orig->mClipPlaneNear;
+ orifClipPlaneFar[i] = orig->mClipPlaneFar;
+ names[i] = orig->mName;
+ pos[i] = orig->mPosition;
+ }
+ const aiScene *imported = im->ReadFile(file, aiProcess_ValidateDataStructure);
+
+ ASSERT_NE(nullptr, imported);
+
+ EXPECT_TRUE(imported->HasCameras());
+ EXPECT_EQ(origNumCams, imported->mNumCameras);
+
+ for (size_t i = 0; i < imported->mNumCameras; i++) {
+ const aiCamera *read = imported->mCameras[i];
+
+ EXPECT_TRUE(names[i] == read->mName);
+ EXPECT_NEAR(origFOV[i], read->mHorizontalFOV, 0.0001f);
+ EXPECT_FLOAT_EQ(orifClipPlaneNear[i], read->mClipPlaneNear);
+ EXPECT_FLOAT_EQ(orifClipPlaneFar[i], read->mClipPlaneFar);
+
+ EXPECT_FLOAT_EQ(pos[i].x, read->mPosition.x);
+ EXPECT_FLOAT_EQ(pos[i].y, read->mPosition.y);
+ EXPECT_FLOAT_EQ(pos[i].z, read->mPosition.z);
+ }
+}
+
+// ------------------------------------------------------------------------------------------------
+TEST_F(utColladaExport, testExportLight) {
+ const char *file = "lightsExp.dae";
+
+ const aiScene *pTest = im->ReadFile(ASSIMP_TEST_MODELS_DIR "/Collada/lights.dae", aiProcess_ValidateDataStructure);
+ ASSERT_NE(pTest, nullptr);
+ ASSERT_TRUE(pTest->HasLights());
+
+ const unsigned int origNumLights = pTest->mNumLights;
+ // There are FIVE!!! LIGHTS!!!
+ EXPECT_EQ(5u, origNumLights) << "lights.dae should contain five lights";
+
+ std::vector<aiLight> origLights(5);
+ for (size_t i = 0; i < origNumLights; i++) {
+ origLights[i] = *(pTest->mLights[i]);
+ }
+
+ // Check loaded first light properly
+ EXPECT_STREQ("Lamp", origLights[0].mName.C_Str());
+ EXPECT_EQ(aiLightSource_POINT, origLights[0].mType);
+ EXPECT_FLOAT_EQ(1.0f, origLights[0].mAttenuationConstant);
+ EXPECT_FLOAT_EQ(0.0f, origLights[0].mAttenuationLinear);
+ EXPECT_FLOAT_EQ(0.00111109f, origLights[0].mAttenuationQuadratic);
+
+ // Common metadata
+ // Confirm was loaded by the Collada importer
+ aiString origImporter;
+ EXPECT_TRUE(pTest->mMetaData->Get(AI_METADATA_SOURCE_FORMAT, origImporter)) << "No importer format metadata";
+ EXPECT_STREQ("Collada Importer", origImporter.C_Str());
+
+ aiString origGenerator;
+ EXPECT_TRUE(pTest->mMetaData->Get(AI_METADATA_SOURCE_GENERATOR, origGenerator)) << "No generator metadata";
+ EXPECT_EQ(strncmp(origGenerator.C_Str(), "Blender", 7), 0) << "AI_METADATA_SOURCE_GENERATOR was: " << origGenerator.C_Str();
+
+ aiString origCopyright;
+ EXPECT_TRUE(pTest->mMetaData->Get(AI_METADATA_SOURCE_COPYRIGHT, origCopyright)) << "No copyright metadata";
+ EXPECT_STREQ("BSD", origCopyright.C_Str());
+
+ aiString origCreated;
+ EXPECT_TRUE(pTest->mMetaData->Get("Created", origCreated)) << "No created metadata";
+ EXPECT_STREQ("2015-05-17T21:55:44", origCreated.C_Str());
+
+ aiString origModified;
+ EXPECT_TRUE(pTest->mMetaData->Get("Modified", origModified)) << "No modified metadata";
+ EXPECT_STREQ("2015-05-17T21:55:44", origModified.C_Str());
+
+ EXPECT_EQ(AI_SUCCESS, ex->Export(pTest, "collada", file));
+
+ // Drop the pointer as about to become invalid
+ pTest = nullptr;
+
+ const aiScene *imported = im->ReadFile(file, aiProcess_ValidateDataStructure);
+
+ ASSERT_TRUE(imported != NULL);
+
+ // Check common metadata survived roundtrip
+ aiString readImporter;
+ EXPECT_TRUE(imported->mMetaData->Get(AI_METADATA_SOURCE_FORMAT, readImporter)) << "No importer format metadata after export";
+ EXPECT_STREQ(origImporter.C_Str(), readImporter.C_Str()) << "Assimp Importer Format changed";
+
+ aiString readGenerator;
+ EXPECT_TRUE(imported->mMetaData->Get(AI_METADATA_SOURCE_GENERATOR, readGenerator)) << "No generator metadata";
+ EXPECT_STREQ(origGenerator.C_Str(), readGenerator.C_Str()) << "Generator changed";
+
+ aiString readCopyright;
+ EXPECT_TRUE(imported->mMetaData->Get(AI_METADATA_SOURCE_COPYRIGHT, readCopyright)) << "No copyright metadata";
+ EXPECT_STREQ(origCopyright.C_Str(), readCopyright.C_Str()) << "Copyright changed";
+
+ aiString readCreated;
+ EXPECT_TRUE(imported->mMetaData->Get("Created", readCreated)) << "No created metadata";
+ EXPECT_STREQ(origCreated.C_Str(), readCreated.C_Str()) << "Created date changed";
+
+ aiString readModified;
+ EXPECT_TRUE(imported->mMetaData->Get("Modified", readModified)) << "No modified metadata";
+ EXPECT_STRNE(origModified.C_Str(), readModified.C_Str()) << "Modified date did not change";
+ EXPECT_GT(readModified.length, ai_uint32(18)) << "Modified date too short";
+
+ // Lights
+ EXPECT_TRUE(imported->HasLights());
+ EXPECT_EQ(origNumLights, imported->mNumLights);
+ for (size_t i = 0; i < origNumLights; i++) {
+ const aiLight *orig = &origLights[i];
+ const aiLight *read = imported->mLights[i];
+ EXPECT_EQ(0, strcmp(orig->mName.C_Str(), read->mName.C_Str()));
+ EXPECT_EQ(orig->mType, read->mType);
+ EXPECT_FLOAT_EQ(orig->mAttenuationConstant, read->mAttenuationConstant);
+ EXPECT_FLOAT_EQ(orig->mAttenuationLinear, read->mAttenuationLinear);
+ EXPECT_NEAR(orig->mAttenuationQuadratic, read->mAttenuationQuadratic, 0.001f);
+
+ EXPECT_FLOAT_EQ(orig->mColorAmbient.r, read->mColorAmbient.r);
+ EXPECT_FLOAT_EQ(orig->mColorAmbient.g, read->mColorAmbient.g);
+ EXPECT_FLOAT_EQ(orig->mColorAmbient.b, read->mColorAmbient.b);
+
+ EXPECT_FLOAT_EQ(orig->mColorDiffuse.r, read->mColorDiffuse.r);
+ EXPECT_FLOAT_EQ(orig->mColorDiffuse.g, read->mColorDiffuse.g);
+ EXPECT_FLOAT_EQ(orig->mColorDiffuse.b, read->mColorDiffuse.b);
+
+ EXPECT_FLOAT_EQ(orig->mColorSpecular.r, read->mColorSpecular.r);
+ EXPECT_FLOAT_EQ(orig->mColorSpecular.g, read->mColorSpecular.g);
+ EXPECT_FLOAT_EQ(orig->mColorSpecular.b, read->mColorSpecular.b);
+
+ EXPECT_NEAR(orig->mAngleInnerCone, read->mAngleInnerCone, 0.001);
+ EXPECT_NEAR(orig->mAngleOuterCone, read->mAngleOuterCone, 0.001);
+ }
+}
+
+#endif // ASSIMP_BUILD_NO_EXPORT
diff --git a/libs/assimp/test/unit/utColladaImportExport.cpp b/libs/assimp/test/unit/utColladaImportExport.cpp
new file mode 100644
index 0000000..b58fa03
--- /dev/null
+++ b/libs/assimp/test/unit/utColladaImportExport.cpp
@@ -0,0 +1,410 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "AbstractImportExportBase.h"
+#include "UnitTestPCH.h"
+
+#include <assimp/ColladaMetaData.h>
+#include <assimp/SceneCombiner.h>
+#include <assimp/commonMetaData.h>
+#include <assimp/postprocess.h>
+#include <assimp/scene.h>
+#include <assimp/Exporter.hpp>
+#include <assimp/Importer.hpp>
+
+using namespace Assimp;
+
+class utColladaImportExport : public AbstractImportExportBase {
+public:
+ // Clones the scene in an exception-safe way
+ struct SceneCloner {
+ SceneCloner(const aiScene *scene) {
+ sceneCopy = nullptr;
+ SceneCombiner::CopyScene(&sceneCopy, scene);
+ }
+
+ ~SceneCloner() {
+ delete sceneCopy;
+ sceneCopy = nullptr;
+ }
+ aiScene *sceneCopy;
+ };
+
+ virtual bool importerTest() final {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/Collada/duck.dae", aiProcess_ValidateDataStructure);
+ if (scene == nullptr)
+ return false;
+
+ // Expected number of items
+ EXPECT_EQ(scene->mNumMeshes, 1u);
+ EXPECT_EQ(scene->mNumMaterials, 1u);
+ EXPECT_EQ(scene->mNumAnimations, 0u);
+ EXPECT_EQ(scene->mNumTextures, 0u);
+ EXPECT_EQ(scene->mNumLights, 1u);
+ EXPECT_EQ(scene->mNumCameras, 1u);
+
+ // Expected common metadata
+ aiString value;
+ EXPECT_TRUE(scene->mMetaData->Get(AI_METADATA_SOURCE_FORMAT, value)) << "No importer format metadata";
+ EXPECT_STREQ("Collada Importer", value.C_Str());
+
+ EXPECT_TRUE(scene->mMetaData->Get(AI_METADATA_SOURCE_FORMAT_VERSION, value)) << "No format version metadata";
+ EXPECT_STREQ("1.4.1", value.C_Str());
+
+ EXPECT_TRUE(scene->mMetaData->Get(AI_METADATA_SOURCE_GENERATOR, value)) << "No generator metadata";
+ EXPECT_EQ(strncmp(value.C_Str(), "Maya 8.0", 8), 0) << "AI_METADATA_SOURCE_GENERATOR was: " << value.C_Str();
+
+ EXPECT_TRUE(scene->mMetaData->Get(AI_METADATA_SOURCE_COPYRIGHT, value)) << "No copyright metadata";
+ EXPECT_EQ(strncmp(value.C_Str(), "Copyright 2006", 14), 0) << "AI_METADATA_SOURCE_COPYRIGHT was: " << value.C_Str();
+
+ return true;
+ }
+
+ typedef std::pair<std::string, std::string> IdNameString;
+ typedef std::map<std::string, std::string> IdNameMap;
+
+ template <typename T>
+ static inline IdNameString GetColladaIdName(const T *item, size_t index) {
+ std::ostringstream stream;
+ stream << typeid(T).name() << "@" << index;
+ if (item->mMetaData) {
+ aiString aiStr;
+ if (item->mMetaData->Get(AI_METADATA_COLLADA_ID, aiStr))
+ return std::make_pair(std::string(aiStr.C_Str()), stream.str());
+ }
+ return std::make_pair(std::string(), stream.str());
+ }
+
+ template <typename T>
+ static inline IdNameString GetItemIdName(const T *item, size_t index) {
+ std::ostringstream stream;
+ stream << typeid(T).name() << "@" << index;
+ return std::make_pair(std::string(item->mName.C_Str()), stream.str());
+ }
+
+ // Specialisations
+ static inline IdNameString GetItemIdName(aiMaterial *item, size_t index) {
+ std::ostringstream stream;
+ stream << typeid(aiMaterial).name() << "@" << index;
+ return std::make_pair(std::string(item->GetName().C_Str()), stream.str());
+ }
+
+ static inline IdNameString GetItemIdName(aiTexture *item, size_t index) {
+ std::ostringstream stream;
+ stream << typeid(aiTexture).name() << "@" << index;
+ return std::make_pair(std::string(item->mFilename.C_Str()), stream.str());
+ }
+
+ static inline void ReportDuplicate(IdNameMap &itemIdMap, const IdNameString &namePair, const char *typeNameStr) {
+ const auto result = itemIdMap.insert(namePair);
+ EXPECT_TRUE(result.second) << "Duplicate '" << typeNameStr << "' name: '" << namePair.first << "'. " << namePair.second << " == " << result.first->second;
+ }
+
+ template <typename T>
+ static inline void CheckUniqueIds(IdNameMap &itemIdMap, unsigned int itemCount, T **itemArray) {
+ for (size_t idx = 0; idx < itemCount; ++idx) {
+ IdNameString namePair = GetItemIdName(itemArray[idx], idx);
+ ReportDuplicate(itemIdMap, namePair, typeid(T).name());
+ }
+ }
+
+ static inline void CheckUniqueIds(IdNameMap &itemIdMap, const aiNode *parent, size_t index) {
+ IdNameString namePair = GetItemIdName(parent, index);
+ ReportDuplicate(itemIdMap, namePair, typeid(aiNode).name());
+
+ for (size_t idx = 0; idx < parent->mNumChildren; ++idx) {
+ CheckUniqueIds(itemIdMap, parent->mChildren[idx], idx);
+ }
+ }
+
+ static inline void CheckNodeIdNames(IdNameMap &nodeIdMap, IdNameMap &nodeNameMap, const aiNode *parent, size_t index) {
+ IdNameString namePair = GetItemIdName(parent, index);
+ IdNameString idPair = GetColladaIdName(parent, index);
+ ReportDuplicate(nodeIdMap, idPair, typeid(aiNode).name());
+
+ for (size_t idx = 0; idx < parent->mNumChildren; ++idx) {
+ CheckNodeIdNames(nodeIdMap, nodeNameMap, parent->mChildren[idx], idx);
+ }
+ }
+
+ static inline void SetAllNodeNames(const aiString &newName, aiNode *node) {
+ node->mName = newName;
+ for (size_t idx = 0; idx < node->mNumChildren; ++idx) {
+ SetAllNodeNames(newName, node->mChildren[idx]);
+ }
+ }
+
+ void ImportAndCheckIds(const char *file, const aiScene *origScene) {
+ // Import the Collada using the 'default' where aiNode and aiMesh names are the Collada ids
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(file, aiProcess_ValidateDataStructure);
+ ASSERT_TRUE(scene != nullptr) << "Fatal: could not re-import " << file;
+ EXPECT_EQ(origScene->mNumMeshes, scene->mNumMeshes) << "in " << file;
+
+ // Check the ids are unique
+ IdNameMap itemIdMap;
+ // Recurse the Nodes
+ CheckUniqueIds(itemIdMap, scene->mRootNode, 0);
+ // Check the lists
+ CheckUniqueIds(itemIdMap, scene->mNumMeshes, scene->mMeshes);
+ // The remaining will come in using the name, which may not be unique
+ // Check we have the right number
+ EXPECT_EQ(origScene->mNumAnimations, scene->mNumAnimations);
+ EXPECT_EQ(origScene->mNumMaterials, scene->mNumMaterials);
+ EXPECT_EQ(origScene->mNumTextures, scene->mNumTextures);
+ EXPECT_EQ(origScene->mNumLights, scene->mNumLights);
+ EXPECT_EQ(origScene->mNumCameras, scene->mNumCameras);
+ }
+
+ void ImportAsNames(const char *file, const aiScene *origScene) {
+ // Import the Collada but using the user-visible names for aiNode and aiMesh
+ // Note that this mode may not support bones or animations
+ Assimp::Importer importer;
+ importer.SetPropertyInteger(AI_CONFIG_IMPORT_COLLADA_USE_COLLADA_NAMES, 1);
+
+ const aiScene *scene = importer.ReadFile(file, aiProcess_ValidateDataStructure);
+ ASSERT_TRUE(scene != nullptr) << "Fatal: could not re-import " << file;
+ EXPECT_EQ(origScene->mNumMeshes, scene->mNumMeshes) << "in " << file;
+
+ // Check the node ids are unique but the node names are not
+ IdNameMap nodeIdMap;
+ IdNameMap nodeNameMap;
+ // Recurse the Nodes
+ CheckNodeIdNames(nodeIdMap, nodeNameMap, scene->mRootNode, 0);
+
+ // nodeNameMap should have fewer than nodeIdMap
+ EXPECT_LT(nodeNameMap.size(), nodeIdMap.size()) << "Some nodes should have the same names";
+ // Check the counts haven't changed
+ EXPECT_EQ(origScene->mNumAnimations, scene->mNumAnimations);
+ EXPECT_EQ(origScene->mNumMaterials, scene->mNumMaterials);
+ EXPECT_EQ(origScene->mNumTextures, scene->mNumTextures);
+ EXPECT_EQ(origScene->mNumLights, scene->mNumLights);
+ EXPECT_EQ(origScene->mNumCameras, scene->mNumCameras);
+ }
+};
+
+TEST_F(utColladaImportExport, importDaeFromFileTest) {
+ EXPECT_TRUE(importerTest());
+}
+
+unsigned int GetMeshUseCount(const aiNode *rootNode) {
+ unsigned int result = rootNode->mNumMeshes;
+ for (unsigned int i = 0; i < rootNode->mNumChildren; ++i) {
+ result += GetMeshUseCount(rootNode->mChildren[i]);
+ }
+ return result;
+}
+
+#ifndef ASSIMP_BUILD_NO_EXPORT
+
+TEST_F(utColladaImportExport, exportRootNodeMeshTest) {
+ Assimp::Importer importer;
+ Assimp::Exporter exporter;
+ const char *outFile = "exportRootNodeMeshTest_out.dae";
+
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/Collada/duck.dae", aiProcess_ValidateDataStructure);
+ ASSERT_TRUE(scene != nullptr) << "Fatal: could not import duck.dae!";
+
+ ASSERT_EQ(0u, scene->mRootNode->mNumMeshes) << "Collada import should not give the root node a mesh";
+
+ {
+ SceneCloner clone(scene);
+ ASSERT_TRUE(clone.sceneCopy != nullptr) << "Fatal: could not copy scene!";
+ // Do this by moving the meshes from the first child that has some
+ aiNode *rootNode = clone.sceneCopy->mRootNode;
+ ASSERT_TRUE(rootNode->mNumChildren > 0) << "Fatal: root has no children";
+ aiNode *meshNode = rootNode->mChildren[0];
+ ASSERT_EQ(1u, meshNode->mNumMeshes) << "Fatal: First child node has no duck mesh";
+
+ // Move the meshes to the parent
+ rootNode->mNumMeshes = meshNode->mNumMeshes;
+ rootNode->mMeshes = new unsigned int[rootNode->mNumMeshes];
+ for (unsigned int i = 0; i < rootNode->mNumMeshes; ++i) {
+ rootNode->mMeshes[i] = meshNode->mMeshes[i];
+ }
+
+ // Remove the meshes from the original node
+ meshNode->mNumMeshes = 0;
+ delete[] meshNode->mMeshes;
+ meshNode->mMeshes = nullptr;
+
+ ASSERT_EQ(AI_SUCCESS, exporter.Export(clone.sceneCopy, "collada", outFile)) << "Fatal: Could not export file";
+ }
+
+ // Reimport and look for meshes
+ scene = importer.ReadFile(outFile, aiProcess_ValidateDataStructure);
+ ASSERT_TRUE(scene != nullptr) << "Fatal: could not reimport!";
+
+ // A Collada root node is not allowed to have a mesh
+ ASSERT_EQ(0u, scene->mRootNode->mNumMeshes) << "Collada reimport should not give the root node a mesh";
+
+ // Walk nodes and counts used meshes
+ // Should be exactly one
+ EXPECT_EQ(1u, GetMeshUseCount(scene->mRootNode)) << "Nodes had unexpected number of meshes in use";
+}
+
+TEST_F(utColladaImportExport, exporterUniqueIdsTest) {
+ Assimp::Importer importer;
+ Assimp::Exporter exporter;
+ const char *outFileEmpty = "exportMeshIdTest_empty_out.dae";
+ const char *outFileNamed = "exportMeshIdTest_named_out.dae";
+
+ // Load a sample file containing multiple meshes
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/Collada/teapots.DAE", aiProcess_ValidateDataStructure);
+
+ ASSERT_TRUE(scene != nullptr) << "Fatal: could not import teapots.DAE!";
+ ASSERT_EQ(3u, scene->mNumMeshes) << "Fatal: teapots.DAE initial load failed";
+
+ // Clear all the names
+ for (size_t idx = 0; idx < scene->mNumMeshes; ++idx) {
+ scene->mMeshes[idx]->mName.Clear();
+ }
+ for (size_t idx = 0; idx < scene->mNumMaterials; ++idx) {
+ scene->mMaterials[idx]->RemoveProperty(AI_MATKEY_NAME);
+ }
+ for (size_t idx = 0; idx < scene->mNumAnimations; ++idx) {
+ scene->mAnimations[idx]->mName.Clear();
+ }
+ // Can't clear texture names
+ for (size_t idx = 0; idx < scene->mNumLights; ++idx) {
+ scene->mLights[idx]->mName.Clear();
+ }
+ for (size_t idx = 0; idx < scene->mNumCameras; ++idx) {
+ scene->mCameras[idx]->mName.Clear();
+ }
+
+ SetAllNodeNames(aiString(), scene->mRootNode);
+
+ ASSERT_EQ(AI_SUCCESS, exporter.Export(scene, "collada", outFileEmpty)) << "Fatal: Could not export un-named meshes file";
+
+ ImportAndCheckIds(outFileEmpty, scene);
+
+ // Force everything to have the same non-empty name
+ aiString testName("test_name");
+ for (size_t idx = 0; idx < scene->mNumMeshes; ++idx) {
+ scene->mMeshes[idx]->mName = testName;
+ }
+ for (size_t idx = 0; idx < scene->mNumMaterials; ++idx) {
+ scene->mMaterials[idx]->AddProperty(&testName, AI_MATKEY_NAME);
+ }
+ for (size_t idx = 0; idx < scene->mNumAnimations; ++idx) {
+ scene->mAnimations[idx]->mName = testName;
+ }
+ // Can't clear texture names
+ for (size_t idx = 0; idx < scene->mNumLights; ++idx) {
+ scene->mLights[idx]->mName = testName;
+ }
+ for (size_t idx = 0; idx < scene->mNumCameras; ++idx) {
+ scene->mCameras[idx]->mName = testName;
+ }
+
+ SetAllNodeNames(testName, scene->mRootNode);
+
+ ASSERT_EQ(AI_SUCCESS, exporter.Export(scene, "collada", outFileNamed)) << "Fatal: Could not export named meshes file";
+
+ ImportAndCheckIds(outFileNamed, scene);
+ ImportAsNames(outFileNamed, scene);
+}
+
+#endif
+
+class utColladaZaeImportExport : public AbstractImportExportBase {
+public:
+ virtual bool importerTest() final {
+ {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/Collada/duck.zae", aiProcess_ValidateDataStructure);
+ if (scene == nullptr)
+ return false;
+
+ // Expected number of items
+ EXPECT_EQ(scene->mNumMeshes, 1u);
+ EXPECT_EQ(scene->mNumMaterials, 1u);
+ EXPECT_EQ(scene->mNumAnimations, 0u);
+ //EXPECT_EQ(scene->mNumTextures, 1u);
+ EXPECT_EQ(scene->mNumLights, 1u);
+ EXPECT_EQ(scene->mNumCameras, 1u);
+ }
+
+ {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/Collada/duck_nomanifest.zae", aiProcess_ValidateDataStructure);
+ if (scene == nullptr)
+ return false;
+
+ // Expected number of items
+ EXPECT_EQ(scene->mNumMeshes, 1u);
+ EXPECT_EQ(scene->mNumMaterials, 1u);
+ EXPECT_EQ(scene->mNumAnimations, 0u);
+ //EXPECT_EQ(scene->mNumTextures, 1u);
+ EXPECT_EQ(scene->mNumLights, 1u);
+ EXPECT_EQ(scene->mNumCameras, 1u);
+ }
+
+ return true;
+ }
+};
+
+TEST_F(utColladaZaeImportExport, importBlenFromFileTest) {
+ EXPECT_TRUE(importerTest());
+}
+
+TEST_F(utColladaZaeImportExport, importMakeHumanTest) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/Collada/human.zae", aiProcess_ValidateDataStructure);
+ ASSERT_NE(nullptr, scene);
+
+ // Expected number of items
+ EXPECT_EQ(scene->mNumMeshes, 2u);
+ EXPECT_EQ(scene->mNumMaterials, 2u);
+ EXPECT_EQ(scene->mNumAnimations, 0u);
+ EXPECT_EQ(scene->mNumTextures, 2u);
+ EXPECT_EQ(scene->mNumLights, 0u);
+ EXPECT_EQ(scene->mNumCameras, 0u);
+
+ // Expected common metadata
+ aiString value;
+ EXPECT_TRUE(scene->mMetaData->Get(AI_METADATA_SOURCE_FORMAT, value)) << "No importer format metadata";
+ EXPECT_STREQ("Collada Importer", value.C_Str());
+
+ EXPECT_TRUE(scene->mMetaData->Get(AI_METADATA_SOURCE_FORMAT_VERSION, value)) << "No format version metadata";
+ EXPECT_STREQ("1.4.1", value.C_Str());
+}
diff --git a/libs/assimp/test/unit/utD3MFImportExport.cpp b/libs/assimp/test/unit/utD3MFImportExport.cpp
new file mode 100644
index 0000000..ed290e8
--- /dev/null
+++ b/libs/assimp/test/unit/utD3MFImportExport.cpp
@@ -0,0 +1,99 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "AbstractImportExportBase.h"
+#include "UnitTestPCH.h"
+
+#include <assimp/postprocess.h>
+#include <assimp/scene.h>
+#include <assimp/Exporter.hpp>
+#include <assimp/Importer.hpp>
+
+#include "AssetLib/3MF/D3MFExporter.h"
+
+class utD3MFImporterExporter : public AbstractImportExportBase {
+public:
+ bool importerTest() override {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/3MF/box.3mf", aiProcess_ValidateDataStructure);
+ if (nullptr == scene) {
+ return false;
+ }
+
+ EXPECT_EQ(1u, scene->mNumMeshes);
+ aiMesh *mesh = scene->mMeshes[0];
+ EXPECT_NE(nullptr, mesh);
+ EXPECT_EQ(12u, mesh->mNumFaces);
+ EXPECT_EQ(8u, mesh->mNumVertices);
+
+ return (nullptr != scene);
+ }
+
+#ifndef ASSIMP_BUILD_NO_EXPORT
+
+ bool exporterTest() override {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/3MF/box.3mf", 0);
+
+ Assimp::Exporter exporter;
+ return AI_SUCCESS == exporter.Export(scene, "3mf", "test.3mf");
+ }
+#endif // ASSIMP_BUILD_NO_EXPORT
+};
+
+TEST_F(utD3MFImporterExporter, import3MFFromFileTest) {
+ EXPECT_TRUE(importerTest());
+}
+
+#ifndef ASSIMP_BUILD_NO_EXPORT
+
+TEST_F(utD3MFImporterExporter, export3MFtoMemTest) {
+ EXPECT_TRUE(exporterTest());
+}
+
+TEST_F(utD3MFImporterExporter, roundtrip3MFtoMemTest) {
+ EXPECT_TRUE(exporterTest());
+
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile("test.3mf", 0);
+ EXPECT_NE(nullptr, scene);
+}
+
+#endif // ASSIMP_BUILD_NO_EXPORT
diff --git a/libs/assimp/test/unit/utDXFImporterExporter.cpp b/libs/assimp/test/unit/utDXFImporterExporter.cpp
new file mode 100644
index 0000000..9193946
--- /dev/null
+++ b/libs/assimp/test/unit/utDXFImporterExporter.cpp
@@ -0,0 +1,73 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+
+#include "AbstractImportExportBase.h"
+#include "UnitTestPCH.h"
+
+#include <assimp/postprocess.h>
+#include <assimp/Importer.hpp>
+
+using namespace Assimp;
+
+class utDXFImporterExporter : public AbstractImportExportBase {
+public:
+ bool importerTest() override {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/DXF/PinkEggFromLW.dxf", aiProcess_ValidateDataStructure);
+ return nullptr != scene;
+ }
+};
+
+TEST_F(utDXFImporterExporter, importDXFFromFileTest) {
+ EXPECT_TRUE(importerTest());
+}
+
+TEST_F(utDXFImporterExporter, importerWithoutExtensionTest) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/DXF/lineTest", aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+}
+
+TEST_F(utDXFImporterExporter, issue2229) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/DXF/issue_2229.dxf", aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+}
diff --git a/libs/assimp/test/unit/utDefaultIOStream.cpp b/libs/assimp/test/unit/utDefaultIOStream.cpp
new file mode 100644
index 0000000..803c6f6
--- /dev/null
+++ b/libs/assimp/test/unit/utDefaultIOStream.cpp
@@ -0,0 +1,83 @@
+/*-------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-------------------------------------------------------------------------*/
+#include <gtest/gtest.h>
+#include "TestIOStream.h"
+#include "UnitTestFileGenerator.h"
+#include <cstdio>
+#include <cstdlib>
+#include <string>
+
+using namespace ::Assimp;
+
+class utDefaultIOStream : public ::testing::Test {
+ // empty
+};
+
+const char data[]{"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Qui\
+sque luctus sem diam, ut eleifend arcu auctor eu. Vestibulum id est vel nulla l\
+obortis malesuada ut sed turpis. Nulla a volutpat tortor. Nunc vestibulum portt\
+itor sapien ornare sagittis volutpat."};
+
+TEST_F( utDefaultIOStream, FileSizeTest ) {
+ const auto dataSize = sizeof(data);
+ const auto dataCount = dataSize / sizeof(*data);
+
+ char fpath[] = { TMP_PATH"rndfp.XXXXXX" };
+ auto* fs = MakeTmpFile(fpath);
+ ASSERT_NE(nullptr, fs);
+ {
+ auto written = std::fwrite(data, sizeof(*data), dataCount, fs );
+ EXPECT_NE( 0U, written );
+
+ auto vflush = std::fflush( fs );
+ ASSERT_EQ(vflush, 0);
+
+ std::fclose(fs);
+ fs = std::fopen(fpath, "r");
+
+ ASSERT_NE(nullptr, fs);
+
+ TestDefaultIOStream myStream( fs, fpath);
+ size_t size = myStream.FileSize();
+ EXPECT_EQ( size, dataSize);
+ }
+ remove(fpath);
+}
diff --git a/libs/assimp/test/unit/utExport.cpp b/libs/assimp/test/unit/utExport.cpp
new file mode 100644
index 0000000..b3ab5e3
--- /dev/null
+++ b/libs/assimp/test/unit/utExport.cpp
@@ -0,0 +1,84 @@
+#include "UnitTestPCH.h"
+
+#include <assimp/cexport.h>
+#include <assimp/Exporter.hpp>
+
+
+#ifndef ASSIMP_BUILD_NO_EXPORT
+
+class ExporterTest : public ::testing::Test {
+public:
+
+ virtual void SetUp()
+ {
+ ex = new Assimp::Exporter();
+ im = new Assimp::Importer();
+
+ pTest = im->ReadFile(ASSIMP_TEST_MODELS_DIR "/X/test.x", aiProcess_ValidateDataStructure);
+ }
+
+ virtual void TearDown()
+ {
+ delete ex;
+ delete im;
+ }
+
+protected:
+
+ const aiScene* pTest;
+ Assimp::Exporter* ex;
+ Assimp::Importer* im;
+};
+
+// ------------------------------------------------------------------------------------------------
+TEST_F(ExporterTest, testExportToFile)
+{
+ const char* file = "unittest_output.dae";
+ EXPECT_EQ(AI_SUCCESS,ex->Export(pTest,"collada",file));
+
+ // check if we can read it again
+ EXPECT_TRUE(im->ReadFile(file, aiProcess_ValidateDataStructure));
+}
+
+// ------------------------------------------------------------------------------------------------
+TEST_F(ExporterTest, testExportToBlob)
+{
+ const aiExportDataBlob* blob = ex->ExportToBlob(pTest,"collada");
+ ASSERT_TRUE(blob);
+ EXPECT_TRUE(blob->data);
+ EXPECT_GT(blob->size, 0U);
+ EXPECT_EQ(0U, blob->name.length);
+
+ // XXX test chained blobs (i.e. obj file with accompanying mtl script)
+
+ // check if we can read it again
+ EXPECT_TRUE(im->ReadFileFromMemory(blob->data,blob->size,0,"dae"));
+}
+
+// ------------------------------------------------------------------------------------------------
+TEST_F(ExporterTest, testCppExportInterface)
+{
+ EXPECT_TRUE(ex->GetExportFormatCount() > 0);
+ for(size_t i = 0; i < ex->GetExportFormatCount(); ++i) {
+ const aiExportFormatDesc* const desc = ex->GetExportFormatDescription(i);
+ ASSERT_TRUE(desc);
+ EXPECT_TRUE(desc->description && strlen(desc->description));
+ EXPECT_TRUE(desc->fileExtension && strlen(desc->fileExtension));
+ EXPECT_TRUE(desc->id && strlen(desc->id));
+ }
+
+ EXPECT_TRUE(ex->IsDefaultIOHandler());
+}
+
+// ------------------------------------------------------------------------------------------------
+TEST_F(ExporterTest, testCExportInterface)
+{
+ EXPECT_TRUE(aiGetExportFormatCount() > 0);
+ for(size_t i = 0; i < aiGetExportFormatCount(); ++i) {
+ const aiExportFormatDesc* const desc = aiGetExportFormatDescription(i);
+ EXPECT_TRUE(desc);
+ // rest has already been validated by testCppExportInterface
+ }
+}
+
+#endif
diff --git a/libs/assimp/test/unit/utFBXImporterExporter.cpp b/libs/assimp/test/unit/utFBXImporterExporter.cpp
new file mode 100644
index 0000000..9b8f2fa
--- /dev/null
+++ b/libs/assimp/test/unit/utFBXImporterExporter.cpp
@@ -0,0 +1,425 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+
+#include "AbstractImportExportBase.h"
+#include "UnitTestPCH.h"
+
+#include <assimp/commonMetaData.h>
+#include <assimp/material.h>
+#include <assimp/postprocess.h>
+#include <assimp/scene.h>
+#include <assimp/types.h>
+#include <assimp/Importer.hpp>
+
+using namespace Assimp;
+
+class utFBXImporterExporter : public AbstractImportExportBase {
+public:
+ bool importerTest() override {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/FBX/spider.fbx", aiProcess_ValidateDataStructure);
+ return nullptr != scene;
+ }
+};
+
+TEST_F(utFBXImporterExporter, importXFromFileTest) {
+ EXPECT_TRUE(importerTest());
+}
+
+TEST_F(utFBXImporterExporter, importBareBoxWithoutColorsAndTextureCoords) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/FBX/box.fbx", aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+ EXPECT_EQ(scene->mNumMeshes, 1u);
+ aiMesh *mesh = scene->mMeshes[0];
+ EXPECT_EQ(mesh->mNumFaces, 12u);
+ EXPECT_EQ(mesh->mNumVertices, 36u);
+}
+
+TEST_F(utFBXImporterExporter, importCubesWithNoNames) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/FBX/cubes_nonames.fbx", aiProcess_ValidateDataStructure);
+ ASSERT_TRUE(scene);
+
+ ASSERT_TRUE(scene->mRootNode);
+ const auto root = scene->mRootNode;
+ ASSERT_STREQ(root->mName.C_Str(), "RootNode");
+ ASSERT_TRUE(root->mChildren);
+ ASSERT_EQ(root->mNumChildren, 2u);
+}
+
+TEST_F(utFBXImporterExporter, importCubesWithUnicodeDuplicatedNames) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/FBX/cubes_with_names.fbx", aiProcess_ValidateDataStructure);
+ ASSERT_TRUE(scene);
+
+ ASSERT_TRUE(scene->mRootNode);
+ const auto root = scene->mRootNode;
+ ASSERT_STREQ(root->mName.C_Str(), "RootNode");
+ ASSERT_TRUE(root->mChildren);
+ ASSERT_EQ(root->mNumChildren, 2u);
+
+ const auto child0 = root->mChildren[0];
+ ASSERT_TRUE(child0);
+ ASSERT_STREQ(child0->mName.C_Str(), "Cube2");
+ ASSERT_TRUE(child0->mChildren);
+ ASSERT_EQ(child0->mNumChildren, 1u);
+
+ const auto child00 = child0->mChildren[0];
+ ASSERT_TRUE(child00);
+ ASSERT_STREQ(child00->mName.C_Str(), "\xd0\x9a\xd1\x83\xd0\xb1\x31");
+
+ const auto child1 = root->mChildren[1];
+ ASSERT_TRUE(child1);
+ ASSERT_STREQ(child1->mName.C_Str(), "Cube3");
+ ASSERT_TRUE(child1->mChildren);
+ ASSERT_EQ(child1->mNumChildren, 1u);
+
+ const auto child10 = child1->mChildren[0];
+ ASSERT_TRUE(child10);
+ ASSERT_STREQ(child10->mName.C_Str(), "\xd0\x9a\xd1\x83\xd0\xb1\x31");
+}
+
+TEST_F(utFBXImporterExporter, importCubesComplexTransform) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/FBX/cubes_with_mirroring_and_pivot.fbx", aiProcess_ValidateDataStructure);
+ ASSERT_TRUE(scene);
+
+ ASSERT_TRUE(scene->mRootNode);
+ const auto root = scene->mRootNode;
+ ASSERT_STREQ(root->mName.C_Str(), "RootNode");
+ ASSERT_TRUE(root->mChildren);
+ ASSERT_EQ(root->mNumChildren, 2u);
+
+ const auto child0 = root->mChildren[0];
+ ASSERT_TRUE(child0);
+ ASSERT_STREQ(child0->mName.C_Str(), "Cube2");
+ ASSERT_TRUE(child0->mChildren);
+ ASSERT_EQ(child0->mNumChildren, 1u);
+
+ const auto child00 = child0->mChildren[0];
+ ASSERT_TRUE(child00);
+ ASSERT_STREQ(child00->mName.C_Str(), "Cube1");
+
+ const auto child1 = root->mChildren[1];
+ ASSERT_TRUE(child1);
+ ASSERT_STREQ(child1->mName.C_Str(), "Cube3");
+
+ auto parent = child1;
+ const size_t chain_length = 8u;
+ const char *chainStr[chain_length] = {
+ "Cube1_$AssimpFbx$_Translation",
+ "Cube1_$AssimpFbx$_RotationPivot",
+ "Cube1_$AssimpFbx$_RotationPivotInverse",
+ "Cube1_$AssimpFbx$_ScalingOffset",
+ "Cube1_$AssimpFbx$_ScalingPivot",
+ "Cube1_$AssimpFbx$_Scaling",
+ "Cube1_$AssimpFbx$_ScalingPivotInverse",
+ "Cube1"
+ };
+ for (size_t i = 0; i < chain_length; ++i) {
+ ASSERT_TRUE(parent->mChildren);
+ ASSERT_EQ(parent->mNumChildren, 1u);
+ auto node = parent->mChildren[0];
+ ASSERT_TRUE(node);
+ ASSERT_STREQ(node->mName.C_Str(), chainStr[i]);
+ parent = node;
+ }
+ ASSERT_EQ(0u, parent->mNumChildren) << "Leaf node";
+}
+
+TEST_F(utFBXImporterExporter, importCloseToIdentityTransforms) {
+ Assimp::Importer importer;
+ // This was asserting in FBXConverter.cpp because the transforms appeared to be the identity by one test, but not by another.
+ // This asset should now load successfully.
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/FBX/close_to_identity_transforms.fbx", aiProcess_ValidateDataStructure);
+ ASSERT_TRUE(scene);
+}
+
+TEST_F(utFBXImporterExporter, importPhongMaterial) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/FBX/phong_cube.fbx", aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+ EXPECT_EQ(1u, scene->mNumMaterials);
+ const aiMaterial *mat = scene->mMaterials[0];
+ EXPECT_NE(nullptr, mat);
+ float f;
+ aiColor3D c;
+
+ // phong_cube.fbx has all properties defined
+ EXPECT_EQ(mat->Get(AI_MATKEY_COLOR_DIFFUSE, c), aiReturn_SUCCESS);
+ EXPECT_EQ(c, aiColor3D(0.5, 0.25, 0.25));
+ EXPECT_EQ(mat->Get(AI_MATKEY_COLOR_SPECULAR, c), aiReturn_SUCCESS);
+ EXPECT_EQ(c, aiColor3D(0.25, 0.25, 0.5));
+ EXPECT_EQ(mat->Get(AI_MATKEY_SHININESS_STRENGTH, f), aiReturn_SUCCESS);
+ EXPECT_EQ(f, 0.5f);
+ EXPECT_EQ(mat->Get(AI_MATKEY_SHININESS, f), aiReturn_SUCCESS);
+ EXPECT_EQ(f, 10.0f);
+ EXPECT_EQ(mat->Get(AI_MATKEY_COLOR_AMBIENT, c), aiReturn_SUCCESS);
+ EXPECT_EQ(c, aiColor3D(0.125, 0.25, 0.25));
+ EXPECT_EQ(mat->Get(AI_MATKEY_COLOR_EMISSIVE, c), aiReturn_SUCCESS);
+ EXPECT_EQ(c, aiColor3D(0.25, 0.125, 0.25));
+ EXPECT_EQ(mat->Get(AI_MATKEY_COLOR_TRANSPARENT, c), aiReturn_SUCCESS);
+ EXPECT_EQ(c, aiColor3D(0.75, 0.5, 0.25));
+ EXPECT_EQ(mat->Get(AI_MATKEY_OPACITY, f), aiReturn_SUCCESS);
+ EXPECT_EQ(f, 0.5f);
+}
+
+TEST_F(utFBXImporterExporter, importUnitScaleFactor) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/FBX/global_settings.fbx", aiProcess_ValidateDataStructure);
+
+ EXPECT_NE(nullptr, scene);
+ EXPECT_NE(nullptr, scene->mMetaData);
+
+ float factor(0.0f);
+ scene->mMetaData->Get("UnitScaleFactor", factor);
+ EXPECT_EQ(500.0f, factor);
+
+ scene->mMetaData->Set("UnitScaleFactor", factor * 2.0f);
+ scene->mMetaData->Get("UnitScaleFactor", factor);
+ EXPECT_EQ(1000.0f, factor);
+}
+
+TEST_F(utFBXImporterExporter, importEmbeddedAsciiTest) {
+ // see https://github.com/assimp/assimp/issues/1957
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/FBX/embedded_ascii/box.FBX", aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+
+ EXPECT_EQ(1u, scene->mNumMaterials);
+ aiMaterial *mat = scene->mMaterials[0];
+ ASSERT_NE(nullptr, mat);
+
+ aiString path;
+ aiTextureMapMode modes[2];
+ EXPECT_EQ(aiReturn_SUCCESS, mat->GetTexture(aiTextureType_DIFFUSE, 0, &path, nullptr, nullptr, nullptr, nullptr, modes));
+ ASSERT_STREQ(path.C_Str(), "..\\..\\..\\Desktop\\uv_test.png");
+
+ ASSERT_EQ(1u, scene->mNumTextures);
+ ASSERT_TRUE(scene->mTextures[0]->pcData);
+ ASSERT_EQ(439176u, scene->mTextures[0]->mWidth) << "FBX ASCII base64 compression splits data by 512Kb, it should be two parts for this texture";
+}
+
+TEST_F(utFBXImporterExporter, importEmbeddedFragmentedAsciiTest) {
+ // see https://github.com/assimp/assimp/issues/1957
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/FBX/embedded_ascii/box_embedded_texture_fragmented.fbx", aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+
+ EXPECT_EQ(1u, scene->mNumMaterials);
+ aiMaterial *mat = scene->mMaterials[0];
+ ASSERT_NE(nullptr, mat);
+
+ aiString path;
+ aiTextureMapMode modes[2];
+ ASSERT_EQ(aiReturn_SUCCESS, mat->GetTexture(aiTextureType_DIFFUSE, 0, &path, nullptr, nullptr, nullptr, nullptr, modes));
+ ASSERT_STREQ(path.C_Str(), "paper.png");
+
+ ASSERT_EQ(1u, scene->mNumTextures);
+ ASSERT_TRUE(scene->mTextures[0]->pcData);
+ ASSERT_EQ(968029u, scene->mTextures[0]->mWidth) << "FBX ASCII base64 compression splits data by 512Kb, it should be two parts for this texture";
+}
+
+TEST_F(utFBXImporterExporter, fbxTokenizeTestTest) {
+ //Assimp::Importer importer;
+ //const aiScene* scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/FBX/transparentTest2.fbx", aiProcess_ValidateDataStructure);
+ //EXPECT_NE(nullptr, scene);
+}
+
+TEST_F(utFBXImporterExporter, importOrphantEmbeddedTextureTest) {
+ // see https://github.com/assimp/assimp/issues/1957
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/FBX/box_orphant_embedded_texture.fbx", aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+
+ EXPECT_EQ(1u, scene->mNumMaterials);
+ aiMaterial *mat = scene->mMaterials[0];
+ ASSERT_NE(nullptr, mat);
+
+ aiString path;
+ aiTextureMapMode modes[2];
+ ASSERT_EQ(aiReturn_SUCCESS, mat->GetTexture(aiTextureType_DIFFUSE, 0, &path, nullptr, nullptr, nullptr, nullptr, modes));
+ ASSERT_STREQ(path.C_Str(), "..\\Primitives\\GridGrey.tga");
+
+ ASSERT_EQ(1u, scene->mNumTextures);
+ ASSERT_TRUE(scene->mTextures[0]->pcData);
+ ASSERT_EQ(9026u, scene->mTextures[0]->mWidth) << "FBX ASCII base64 compression used for a texture.";
+}
+
+TEST_F(utFBXImporterExporter, sceneMetadata) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/FBX/global_settings.fbx",
+ aiProcess_ValidateDataStructure);
+ ASSERT_NE(scene, nullptr);
+ ASSERT_NE(scene->mMetaData, nullptr);
+ {
+ ASSERT_TRUE(scene->mMetaData->HasKey(AI_METADATA_SOURCE_FORMAT));
+ aiString format;
+ ASSERT_TRUE(scene->mMetaData->Get(AI_METADATA_SOURCE_FORMAT, format));
+ ASSERT_EQ(strcmp(format.C_Str(), "Autodesk FBX Importer"), 0);
+ }
+ {
+ ASSERT_TRUE(scene->mMetaData->HasKey(AI_METADATA_SOURCE_FORMAT_VERSION));
+ aiString version;
+ ASSERT_TRUE(scene->mMetaData->Get(AI_METADATA_SOURCE_FORMAT_VERSION, version));
+ ASSERT_EQ(strcmp(version.C_Str(), "7400"), 0);
+ }
+ {
+ ASSERT_TRUE(scene->mMetaData->HasKey(AI_METADATA_SOURCE_GENERATOR));
+ aiString generator;
+ ASSERT_TRUE(scene->mMetaData->Get(AI_METADATA_SOURCE_GENERATOR, generator));
+ ASSERT_EQ(strncmp(generator.C_Str(), "Blender", 7), 0);
+ }
+}
+
+TEST_F(utFBXImporterExporter, importCubesWithOutOfRangeFloat) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/FBX/cubes_with_outofrange_float.fbx", aiProcess_ValidateDataStructure);
+ ASSERT_NE(nullptr, scene);
+ ASSERT_TRUE(scene->mRootNode);
+}
+
+TEST_F(utFBXImporterExporter, importMaxPbrMaterialsMetalRoughness) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/FBX/maxPbrMaterial_metalRough.fbx", aiProcess_ValidateDataStructure);
+ ASSERT_NE(nullptr, scene);
+ ASSERT_TRUE(scene->mRootNode);
+
+ ASSERT_EQ(scene->mNumMaterials, 1u);
+ const aiMaterial* mat = scene->mMaterials[0];
+ aiString texture;
+ ASSERT_EQ(mat->Get(AI_MATKEY_TEXTURE(aiTextureType_BASE_COLOR, 0), texture), AI_SUCCESS);
+ EXPECT_EQ(texture, aiString("Textures\\albedo.png"));
+ ASSERT_EQ(mat->Get(AI_MATKEY_TEXTURE(aiTextureType_METALNESS, 0), texture), AI_SUCCESS);
+ EXPECT_EQ(texture, aiString("Textures\\metalness.png"));
+ ASSERT_EQ(mat->Get(AI_MATKEY_TEXTURE(aiTextureType_EMISSION_COLOR, 0), texture), AI_SUCCESS);
+ EXPECT_EQ(texture, aiString("Textures\\emission.png"));
+ ASSERT_EQ(mat->Get(AI_MATKEY_TEXTURE(aiTextureType_NORMAL_CAMERA, 0), texture), AI_SUCCESS);
+ EXPECT_EQ(texture, aiString("Textures\\normal.png"));
+ ASSERT_EQ(mat->Get(AI_MATKEY_TEXTURE(aiTextureType_DIFFUSE_ROUGHNESS, 0), texture), AI_SUCCESS);
+ EXPECT_EQ(texture, aiString("Textures\\roughness.png"));
+ ASSERT_EQ(mat->Get(AI_MATKEY_TEXTURE(aiTextureType_AMBIENT_OCCLUSION, 0), texture), AI_SUCCESS);
+ EXPECT_EQ(texture, aiString("Textures\\occlusion.png"));
+ ASSERT_EQ(mat->Get(AI_MATKEY_TEXTURE(aiTextureType_OPACITY, 0), texture), AI_SUCCESS);
+ EXPECT_EQ(texture, aiString("Textures\\opacity.png"));
+
+ // The material contains values for standard properties (e.g. SpecularColor), where 3ds Max has presumably
+ // used formulas to map the Pbr values into the standard material model. However, the pbr values themselves
+ // are available in the material as untyped "raw" properties. We check that these are correctly parsed:
+
+ aiColor4D baseColor;
+ ASSERT_EQ(mat->Get("$raw.3dsMax|main|basecolor", aiTextureType_NONE, 0, baseColor), aiReturn_SUCCESS);
+ EXPECT_EQ(baseColor, aiColor4D(0, 1, 1, 1));
+
+ float metalness;
+ ASSERT_EQ(mat->Get("$raw.3dsMax|main|metalness", aiTextureType_NONE, 0, metalness), aiReturn_SUCCESS);
+ EXPECT_EQ(metalness, 0.25f);
+
+ float roughness;
+ ASSERT_EQ(mat->Get("$raw.3dsMax|main|roughness", aiTextureType_NONE, 0, roughness), aiReturn_SUCCESS);
+ EXPECT_EQ(roughness, 0.5f);
+
+ int useGlossiness;
+ ASSERT_EQ(mat->Get("$raw.3dsMax|main|useGlossiness", aiTextureType_NONE, 0, useGlossiness), aiReturn_SUCCESS);
+ EXPECT_EQ(useGlossiness, 2); // 1 = Roughness map is glossiness, 2 = Roughness map is roughness.
+
+ float bumpMapAmt; // Presumably amount.
+ ASSERT_EQ(mat->Get("$raw.3dsMax|main|bump_map_amt", aiTextureType_NONE, 0, bumpMapAmt), aiReturn_SUCCESS);
+ EXPECT_EQ(bumpMapAmt, 0.75f);
+
+ aiColor4D emitColor;
+ ASSERT_EQ(mat->Get("$raw.3dsMax|main|emit_color", aiTextureType_NONE, 0, emitColor), aiReturn_SUCCESS);
+ EXPECT_EQ(emitColor, aiColor4D(1, 1, 0, 1));
+}
+
+TEST_F(utFBXImporterExporter, importMaxPbrMaterialsSpecularGloss) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/FBX/maxPbrMaterial_specGloss.fbx", aiProcess_ValidateDataStructure);
+ ASSERT_NE(nullptr, scene);
+ ASSERT_TRUE(scene->mRootNode);
+
+ ASSERT_EQ(scene->mNumMaterials, 1u);
+ const aiMaterial* mat = scene->mMaterials[0];
+ aiString texture;
+ ASSERT_EQ(mat->Get(AI_MATKEY_TEXTURE(aiTextureType_BASE_COLOR, 0), texture), AI_SUCCESS);
+ EXPECT_EQ(texture, aiString("Textures\\albedo.png"));
+ ASSERT_EQ(mat->Get(AI_MATKEY_TEXTURE(aiTextureType_SPECULAR, 0), texture), AI_SUCCESS);
+ EXPECT_EQ(texture, aiString("Textures\\specular.png"));
+ ASSERT_EQ(mat->Get(AI_MATKEY_TEXTURE(aiTextureType_EMISSION_COLOR, 0), texture), AI_SUCCESS);
+ EXPECT_EQ(texture, aiString("Textures\\emission.png"));
+ ASSERT_EQ(mat->Get(AI_MATKEY_TEXTURE(aiTextureType_NORMAL_CAMERA, 0), texture), AI_SUCCESS);
+ EXPECT_EQ(texture, aiString("Textures\\normal.png"));
+ ASSERT_EQ(mat->Get(AI_MATKEY_TEXTURE(aiTextureType_SHININESS, 0), texture), AI_SUCCESS);
+ EXPECT_EQ(texture, aiString("Textures\\glossiness.png"));
+ ASSERT_EQ(mat->Get(AI_MATKEY_TEXTURE(aiTextureType_AMBIENT_OCCLUSION, 0), texture), AI_SUCCESS);
+ EXPECT_EQ(texture, aiString("Textures\\occlusion.png"));
+ ASSERT_EQ(mat->Get(AI_MATKEY_TEXTURE(aiTextureType_OPACITY, 0), texture), AI_SUCCESS);
+ EXPECT_EQ(texture, aiString("Textures\\opacity.png"));
+
+ // The material contains values for standard properties (e.g. SpecularColor), where 3ds Max has presumably
+ // used formulas to map the Pbr values into the standard material model. However, the pbr values themselves
+ // are available in the material as untyped "raw" properties. We check that these are correctly parsed:
+
+ aiColor4D baseColor;
+ ASSERT_EQ(mat->Get("$raw.3dsMax|main|basecolor", aiTextureType_NONE, 0, baseColor), aiReturn_SUCCESS);
+ EXPECT_EQ(baseColor, aiColor4D(0, 1, 1, 1));
+
+ aiColor4D specular;
+ ASSERT_EQ(mat->Get("$raw.3dsMax|main|Specular", aiTextureType_NONE, 0, specular), aiReturn_SUCCESS);
+ EXPECT_EQ(specular, aiColor4D(1, 1, 0, 1));
+
+ float glossiness;
+ ASSERT_EQ(mat->Get("$raw.3dsMax|main|glossiness", aiTextureType_NONE, 0, glossiness), aiReturn_SUCCESS);
+ EXPECT_EQ(glossiness, 0.33f);
+
+ int useGlossiness;
+ ASSERT_EQ(mat->Get("$raw.3dsMax|main|useGlossiness", aiTextureType_NONE, 0, useGlossiness), aiReturn_SUCCESS);
+ EXPECT_EQ(useGlossiness, 1); // 1 = Glossiness map is glossiness, 2 = Glossiness map is roughness.
+
+ float bumpMapAmt; // Presumably amount.
+ ASSERT_EQ(mat->Get("$raw.3dsMax|main|bump_map_amt", aiTextureType_NONE, 0, bumpMapAmt), aiReturn_SUCCESS);
+ EXPECT_EQ(bumpMapAmt, 0.66f);
+
+ aiColor4D emitColor;
+ ASSERT_EQ(mat->Get("$raw.3dsMax|main|emit_color", aiTextureType_NONE, 0, emitColor), aiReturn_SUCCESS);
+ EXPECT_EQ(emitColor, aiColor4D(1, 0, 1, 1));
+}
diff --git a/libs/assimp/test/unit/utFastAtof.cpp b/libs/assimp/test/unit/utFastAtof.cpp
new file mode 100644
index 0000000..cc25482
--- /dev/null
+++ b/libs/assimp/test/unit/utFastAtof.cpp
@@ -0,0 +1,190 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "UnitTestPCH.h"
+
+#include <assimp/fast_atof.h>
+
+namespace {
+
+template <typename Real>
+bool IsNan(Real x) {
+ return x != x;
+}
+
+template <typename Real>
+bool IsInf(Real x) {
+ return std::abs(x) == std::numeric_limits<Real>::infinity();
+}
+
+} // Namespace
+
+class FastAtofTest : public ::testing::Test
+{
+protected:
+ template <typename Real, typename AtofFunc>
+ static void RunTest(AtofFunc atof_func)
+ {
+ const Real kEps = 1e-5f;
+
+#define TEST_CASE(NUM) EXPECT_NEAR(static_cast<Real>(NUM), atof_func(#NUM), kEps)
+#define TEST_CASE_NAN(NUM) EXPECT_TRUE(IsNan(atof_func(#NUM)))
+#define TEST_CASE_INF(NUM) EXPECT_TRUE(IsInf(atof_func(#NUM)))
+
+ TEST_CASE(0);
+ TEST_CASE(1.354);
+ TEST_CASE(1054E-3);
+ TEST_CASE(-1054E-3);
+ TEST_CASE(-10.54E30);
+ TEST_CASE(-345554.54e-5);
+ TEST_CASE(-34555.534954e-5);
+ TEST_CASE(-34555.534954e-5);
+ TEST_CASE(549067);
+ TEST_CASE(567);
+ TEST_CASE(446);
+ TEST_CASE(7);
+ TEST_CASE(73);
+ TEST_CASE(256);
+ TEST_CASE(5676);
+ TEST_CASE(3);
+ TEST_CASE(738);
+ TEST_CASE(684);
+ TEST_CASE(26);
+ TEST_CASE(673.678e-56);
+ TEST_CASE(53);
+ TEST_CASE(67);
+ TEST_CASE(684);
+ TEST_CASE(-5437E24);
+ TEST_CASE(8);
+ TEST_CASE(84);
+ TEST_CASE(3);
+ TEST_CASE(56733.68);
+ TEST_CASE(786);
+ TEST_CASE(6478);
+ TEST_CASE(34563.65683598734);
+ TEST_CASE(5673);
+ TEST_CASE(784e-3);
+ TEST_CASE(8678);
+ TEST_CASE(46784);
+ TEST_CASE(-54.0888e-6);
+ TEST_CASE(100000e10);
+ TEST_CASE(1e-307);
+ TEST_CASE(0.000001e-301);
+ TEST_CASE(0.0000001e-300);
+ TEST_CASE(0.00000001e-299);
+ TEST_CASE(1000000e-313);
+ TEST_CASE(10000000e-314);
+ TEST_CASE(100000000e-315);
+ TEST_CASE(12.345);
+ TEST_CASE(12.345e19);
+ TEST_CASE(-.1e+9);
+ TEST_CASE(.125);
+ TEST_CASE(1e20);
+ TEST_CASE(0e-19);
+ TEST_CASE(400012);
+ TEST_CASE(5.9e-76);
+ TEST_CASE_INF(inf);
+ TEST_CASE_INF(inf);
+ TEST_CASE_INF(infinity);
+ TEST_CASE_INF(Inf);
+ TEST_CASE_INF(-Inf);
+ TEST_CASE_INF(+InFiNiTy);
+ TEST_CASE_NAN(NAN);
+ TEST_CASE_NAN(NaN);
+ TEST_CASE_NAN(nan);
+ EXPECT_EQ(static_cast<Real>(6), atof_func("006"));
+ EXPECT_EQ(static_cast<Real>(5.3), atof_func("5.300 "));
+
+ /* Failing Cases:
+ EXPECT_EQ(static_cast<Real>(6), atof_func(" 006"));
+ EXPECT_EQ(static_cast<Real>(5.3), atof_func(" 5.300 "));
+ TEST_CASE(-10.54E45);
+ TEST_CASE(0x0A);
+ TEST_CASE(0xA0);
+ TEST_CASE(0x1p1023);
+ TEST_CASE(0x1000p1011);
+ TEST_CASE(0x1p1020);
+ TEST_CASE(0x0.00001p1040);
+ TEST_CASE(0x1p-1021);
+ TEST_CASE(0x1000p-1033);
+ TEST_CASE(0x10000p-1037);
+ TEST_CASE(0x0.001p-1009);
+ TEST_CASE(0x0.0001p-1005);
+ TEST_CASE(0x1.4p+3);
+ TEST_CASE(0xAp0);
+ TEST_CASE(0x0Ap0);
+ TEST_CASE(0x0.A0p8);
+ TEST_CASE(0x0.50p9);
+ TEST_CASE(0x0.28p10);
+ TEST_CASE(0x0.14p11);
+ TEST_CASE(0x0.0A0p12);
+ TEST_CASE(0x0.050p13);
+ TEST_CASE(0x0.028p14);
+ TEST_CASE(0x0.014p15);
+ TEST_CASE(0x00.00A0p16);
+ TEST_CASE(0x00.0050p17);
+ TEST_CASE(0x00.0028p18);
+ TEST_CASE(0x00.0014p19);
+ TEST_CASE(0x1p-1023);
+ TEST_CASE(0x0.8p-1022);
+ TEST_CASE(0x80000Ap-23);
+ TEST_CASE(0x100000000000008p0);
+ TEST_CASE(0x100000000000008.p0);
+ TEST_CASE(0x100000000000008.00p0);
+ TEST_CASE(0x10000000000000800p0);
+ TEST_CASE(0x10000000000000801p0)
+ */
+
+#undef TEST_CASE
+#undef TEST_CASE_NAN
+#undef TEST_CASE_INF
+ }
+};
+
+struct FastAtofWrapper {
+ ai_real operator()(const char* str) { return Assimp::fast_atof(str); }
+};
+
+TEST_F(FastAtofTest, FastAtof)
+{
+ RunTest<ai_real>(FastAtofWrapper());
+}
diff --git a/libs/assimp/test/unit/utFindDegenerates.cpp b/libs/assimp/test/unit/utFindDegenerates.cpp
new file mode 100644
index 0000000..5eadc03
--- /dev/null
+++ b/libs/assimp/test/unit/utFindDegenerates.cpp
@@ -0,0 +1,208 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "UnitTestPCH.h"
+
+#include "../../include/assimp/scene.h"
+#include "PostProcessing/FindDegenerates.h"
+
+#include <memory>
+
+using namespace std;
+using namespace Assimp;
+
+class FindDegeneratesProcessTest : public ::testing::Test {
+public:
+ FindDegeneratesProcessTest() :
+ Test(), mMesh(nullptr), mProcess(nullptr) {
+ // empty
+ }
+
+protected:
+ virtual void SetUp();
+ virtual void TearDown();
+
+protected:
+ aiMesh *mMesh;
+ FindDegeneratesProcess *mProcess;
+};
+
+void FindDegeneratesProcessTest::SetUp() {
+ mMesh = new aiMesh();
+ mProcess = new FindDegeneratesProcess();
+
+ mMesh->mNumFaces = 1000;
+ mMesh->mFaces = new aiFace[1000];
+
+ mMesh->mNumVertices = 5000 * 2;
+ mMesh->mVertices = new aiVector3D[5000 * 2];
+
+ for (unsigned int i = 0; i < 5000; ++i) {
+ mMesh->mVertices[i] = mMesh->mVertices[i + 5000] = aiVector3D((float)i);
+ }
+
+ mMesh->mPrimitiveTypes = aiPrimitiveType_LINE | aiPrimitiveType_POINT |
+ aiPrimitiveType_POLYGON | aiPrimitiveType_TRIANGLE;
+
+ unsigned int numOut = 0, numFaces = 0;
+ for (unsigned int i = 0; i < 1000; ++i) {
+ aiFace &f = mMesh->mFaces[i];
+ f.mNumIndices = (i % 5) + 1; // between 1 and 5
+ f.mIndices = new unsigned int[f.mNumIndices];
+ bool had = false;
+ for (unsigned int n = 0; n < f.mNumIndices; ++n) {
+ // FIXME
+#if 0
+ // some duplicate indices
+ if ( n && n == (i / 200)+1) {
+ f.mIndices[n] = f.mIndices[n-1];
+ had = true;
+ }
+ // and some duplicate vertices
+#endif
+ if (n && i % 2 && 0 == n % 2) {
+ f.mIndices[n] = f.mIndices[n - 1] + 5000;
+ had = true;
+ } else {
+ f.mIndices[n] = numOut++;
+ }
+ }
+ if (!had)
+ ++numFaces;
+ }
+ mMesh->mNumUVComponents[0] = numOut;
+ mMesh->mNumUVComponents[1] = numFaces;
+}
+
+void FindDegeneratesProcessTest::TearDown() {
+ delete mMesh;
+ delete mProcess;
+}
+
+TEST_F(FindDegeneratesProcessTest, testDegeneratesDetection) {
+ mProcess->EnableInstantRemoval(false);
+ mProcess->ExecuteOnMesh(mMesh);
+
+ unsigned int out = 0;
+ for (unsigned int i = 0; i < 1000; ++i) {
+ aiFace &f = mMesh->mFaces[i];
+ out += f.mNumIndices;
+ }
+
+ EXPECT_EQ(1000U, mMesh->mNumFaces);
+ EXPECT_EQ(10000U, mMesh->mNumVertices);
+ EXPECT_EQ(out, mMesh->mNumUVComponents[0]);
+ EXPECT_EQ(static_cast<unsigned int>(
+ aiPrimitiveType_LINE | aiPrimitiveType_POINT |
+ aiPrimitiveType_POLYGON | aiPrimitiveType_TRIANGLE),
+ mMesh->mPrimitiveTypes);
+}
+
+TEST_F(FindDegeneratesProcessTest, testDegeneratesRemoval) {
+ mProcess->EnableAreaCheck(false);
+ mProcess->EnableInstantRemoval(true);
+ mProcess->ExecuteOnMesh(mMesh);
+
+ EXPECT_EQ(mMesh->mNumUVComponents[1], mMesh->mNumFaces);
+}
+
+TEST_F(FindDegeneratesProcessTest, testDegeneratesRemovalWithAreaCheck) {
+ mProcess->EnableAreaCheck(true);
+ mProcess->EnableInstantRemoval(true);
+ mProcess->ExecuteOnMesh(mMesh);
+
+ EXPECT_EQ(mMesh->mNumUVComponents[1] - 100, mMesh->mNumFaces);
+}
+
+namespace
+{
+ std::unique_ptr<aiMesh> getDegenerateMesh()
+ {
+ std::unique_ptr<aiMesh> mesh(new aiMesh);
+ mesh->mNumVertices = 2;
+ mesh->mVertices = new aiVector3D[2];
+ mesh->mVertices[0] = aiVector3D{ 0.0f, 0.0f, 0.0f };
+ mesh->mVertices[1] = aiVector3D{ 1.0f, 0.0f, 0.0f };
+ mesh->mNumFaces = 1;
+ mesh->mFaces = new aiFace[1];
+ mesh->mFaces[0].mNumIndices = 3;
+ mesh->mFaces[0].mIndices = new unsigned int[3];
+ mesh->mFaces[0].mIndices[0] = 0;
+ mesh->mFaces[0].mIndices[1] = 1;
+ mesh->mFaces[0].mIndices[2] = 0;
+ return mesh;
+ }
+}
+
+TEST_F(FindDegeneratesProcessTest, meshRemoval) {
+ mProcess->EnableAreaCheck(true);
+ mProcess->EnableInstantRemoval(true);
+ mProcess->ExecuteOnMesh(mMesh);
+
+ std::unique_ptr<aiScene> scene(new aiScene);
+ scene->mNumMeshes = 5;
+ scene->mMeshes = new aiMesh*[5];
+
+ /// Use the mesh which doesn't get completely stripped of faces from the main test.
+ aiMesh* meshWhichSurvives = mMesh;
+ mMesh = nullptr;
+
+ scene->mMeshes[0] = getDegenerateMesh().release();
+ scene->mMeshes[1] = getDegenerateMesh().release();
+ scene->mMeshes[2] = meshWhichSurvives;
+ scene->mMeshes[3] = getDegenerateMesh().release();
+ scene->mMeshes[4] = getDegenerateMesh().release();
+
+ scene->mRootNode = new aiNode;
+ scene->mRootNode->mNumMeshes = 5;
+ scene->mRootNode->mMeshes = new unsigned int[5];
+ scene->mRootNode->mMeshes[0] = 0;
+ scene->mRootNode->mMeshes[1] = 1;
+ scene->mRootNode->mMeshes[2] = 2;
+ scene->mRootNode->mMeshes[3] = 3;
+ scene->mRootNode->mMeshes[4] = 4;
+
+ mProcess->Execute(scene.get());
+
+ EXPECT_EQ(scene->mNumMeshes, 1u);
+ EXPECT_EQ(scene->mMeshes[0], meshWhichSurvives);
+ EXPECT_EQ(scene->mRootNode->mNumMeshes, 1u);
+ EXPECT_EQ(scene->mRootNode->mMeshes[0], 0u);
+}
diff --git a/libs/assimp/test/unit/utFindInvalidData.cpp b/libs/assimp/test/unit/utFindInvalidData.cpp
new file mode 100644
index 0000000..1fa8a3f
--- /dev/null
+++ b/libs/assimp/test/unit/utFindInvalidData.cpp
@@ -0,0 +1,145 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "UnitTestPCH.h"
+
+#include "PostProcessing/FindInvalidDataProcess.h"
+#include <assimp/mesh.h>
+
+using namespace std;
+using namespace Assimp;
+
+class utFindInvalidDataProcess : public ::testing::Test {
+public:
+ utFindInvalidDataProcess() :
+ Test(), mMesh(nullptr), mProcess(nullptr) {
+ // empty
+ }
+
+protected:
+ virtual void SetUp();
+ virtual void TearDown();
+
+protected:
+ aiMesh *mMesh;
+ FindInvalidDataProcess *mProcess;
+};
+
+// ------------------------------------------------------------------------------------------------
+void utFindInvalidDataProcess::SetUp() {
+ ASSERT_TRUE(AI_MAX_NUMBER_OF_TEXTURECOORDS >= 3);
+
+ mProcess = new FindInvalidDataProcess();
+ mMesh = new aiMesh();
+
+ mMesh->mNumVertices = 1000;
+ mMesh->mVertices = new aiVector3D[1000];
+ for (unsigned int i = 0; i < 1000; ++i) {
+ mMesh->mVertices[i] = aiVector3D((float)i);
+ }
+
+ mMesh->mNormals = new aiVector3D[1000];
+ for (unsigned int i = 0; i < 1000; ++i) {
+ mMesh->mNormals[i] = aiVector3D((float)i + 1);
+ }
+
+ mMesh->mTangents = new aiVector3D[1000];
+ for (unsigned int i = 0; i < 1000; ++i) {
+ mMesh->mTangents[i] = aiVector3D((float)i);
+ }
+
+ mMesh->mBitangents = new aiVector3D[1000];
+ for (unsigned int i = 0; i < 1000; ++i) {
+ mMesh->mBitangents[i] = aiVector3D((float)i);
+ }
+
+ for (unsigned int a = 0; a < AI_MAX_NUMBER_OF_TEXTURECOORDS; ++a) {
+ mMesh->mTextureCoords[a] = new aiVector3D[1000];
+ for (unsigned int i = 0; i < 1000; ++i) {
+ mMesh->mTextureCoords[a][i] = aiVector3D((float)i);
+ }
+ }
+}
+
+// ------------------------------------------------------------------------------------------------
+void utFindInvalidDataProcess::TearDown() {
+ delete mProcess;
+ delete mMesh;
+}
+
+// ------------------------------------------------------------------------------------------------
+TEST_F(utFindInvalidDataProcess, testStepNegativeResult) {
+ for ( size_t i=0; i<mMesh->mNumVertices; ++i ) {
+ mMesh->mNormals[i].x = mMesh->mNormals[i].y = mMesh->mNormals[i].z =0;
+ mMesh->mBitangents[i].x = mMesh->mBitangents[i].y = mMesh->mBitangents[i].z = 0;
+ }
+
+ mMesh->mTextureCoords[2][455] = aiVector3D(std::numeric_limits<float>::quiet_NaN());
+
+ mProcess->ProcessMesh(mMesh);
+
+ EXPECT_TRUE(NULL != mMesh->mVertices);
+ EXPECT_EQ(NULL, mMesh->mNormals);
+ EXPECT_EQ(NULL, mMesh->mTangents);
+ EXPECT_EQ(NULL, mMesh->mBitangents);
+
+ for (unsigned int i = 0; i < 2; ++i) {
+ EXPECT_TRUE(NULL != mMesh->mTextureCoords[i]);
+ }
+
+ for (unsigned int i = 2; i < AI_MAX_NUMBER_OF_TEXTURECOORDS; ++i) {
+ EXPECT_EQ(NULL, mMesh->mTextureCoords[i]);
+ }
+}
+
+// ------------------------------------------------------------------------------------------------
+TEST_F(utFindInvalidDataProcess, testStepPositiveResult) {
+ mProcess->ProcessMesh(mMesh);
+
+ EXPECT_NE(nullptr, mMesh->mVertices);
+
+ EXPECT_NE(nullptr, mMesh->mNormals);
+ EXPECT_NE(nullptr, mMesh->mTangents);
+ EXPECT_NE(nullptr, mMesh->mBitangents);
+
+ for (unsigned int i = 0; i < AI_MAX_NUMBER_OF_TEXTURECOORDS; ++i) {
+ EXPECT_NE(nullptr, mMesh->mTextureCoords[i]);
+ }
+}
diff --git a/libs/assimp/test/unit/utFixInfacingNormals.cpp b/libs/assimp/test/unit/utFixInfacingNormals.cpp
new file mode 100644
index 0000000..8f75dd2
--- /dev/null
+++ b/libs/assimp/test/unit/utFixInfacingNormals.cpp
@@ -0,0 +1,43 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "UnitTestPCH.h"
diff --git a/libs/assimp/test/unit/utGenBoundingBoxesProcess.cpp b/libs/assimp/test/unit/utGenBoundingBoxesProcess.cpp
new file mode 100644
index 0000000..c512e7f
--- /dev/null
+++ b/libs/assimp/test/unit/utGenBoundingBoxesProcess.cpp
@@ -0,0 +1,93 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "UnitTestPCH.h"
+
+#include "PostProcessing/GenBoundingBoxesProcess.h"
+#include <assimp/mesh.h>
+#include <assimp/scene.h>
+
+using namespace Assimp;
+
+class utGenBoundingBoxesProcess : public ::testing::Test {
+public:
+ utGenBoundingBoxesProcess() :
+ Test(), mProcess(nullptr), mMesh(nullptr), mScene(nullptr) {
+ // empty
+ }
+
+ void SetUp() override {
+ mProcess = new GenBoundingBoxesProcess;
+ mMesh = new aiMesh();
+ mMesh->mNumVertices = 100;
+ mMesh->mVertices = new aiVector3D[100];
+ for (unsigned int i = 0; i < 100; ++i) {
+ mMesh->mVertices[i] = aiVector3D((ai_real)i, (ai_real)i, (ai_real)i);
+ }
+ mScene = new aiScene();
+ mScene->mNumMeshes = 1;
+ mScene->mMeshes = new aiMesh *[1];
+ mScene->mMeshes[0] = mMesh;
+ }
+
+ void TearDown() override {
+ delete mProcess;
+ delete mScene;
+ }
+
+protected:
+ GenBoundingBoxesProcess *mProcess;
+ aiMesh *mMesh;
+ aiScene *mScene;
+};
+
+TEST_F(utGenBoundingBoxesProcess, executeTest) {
+ mProcess->Execute(mScene);
+
+ aiMesh *mesh = mScene->mMeshes[0];
+ EXPECT_NE(nullptr, mesh);
+ EXPECT_EQ(0, mesh->mAABB.mMin.x);
+ EXPECT_EQ(0, mesh->mAABB.mMin.y);
+ EXPECT_EQ(0, mesh->mAABB.mMin.z);
+
+ EXPECT_EQ(99, mesh->mAABB.mMax.x);
+ EXPECT_EQ(99, mesh->mAABB.mMax.y);
+ EXPECT_EQ(99, mesh->mAABB.mMax.z);
+}
diff --git a/libs/assimp/test/unit/utGenNormals.cpp b/libs/assimp/test/unit/utGenNormals.cpp
new file mode 100644
index 0000000..83aadb5
--- /dev/null
+++ b/libs/assimp/test/unit/utGenNormals.cpp
@@ -0,0 +1,86 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "UnitTestPCH.h"
+
+#include "PostProcessing/GenVertexNormalsProcess.h"
+
+using namespace ::std;
+using namespace ::Assimp;
+
+class GenNormalsTest : public ::testing::Test {
+public:
+ virtual void SetUp();
+ virtual void TearDown();
+
+protected:
+ aiMesh *pcMesh;
+ GenVertexNormalsProcess *piProcess;
+};
+
+// ------------------------------------------------------------------------------------------------
+void GenNormalsTest::SetUp() {
+ piProcess = new GenVertexNormalsProcess();
+ pcMesh = new aiMesh();
+ pcMesh->mPrimitiveTypes = aiPrimitiveType_TRIANGLE;
+ pcMesh->mNumFaces = 1;
+ pcMesh->mFaces = new aiFace[1];
+ pcMesh->mFaces[0].mIndices = new unsigned int[pcMesh->mFaces[0].mNumIndices = 3];
+ pcMesh->mFaces[0].mIndices[0] = 0;
+ pcMesh->mFaces[0].mIndices[1] = 1;
+ pcMesh->mFaces[0].mIndices[2] = 1;
+ pcMesh->mNumVertices = 3;
+ pcMesh->mVertices = new aiVector3D[3];
+ pcMesh->mVertices[0] = aiVector3D(0.0f, 1.0f, 6.0f);
+ pcMesh->mVertices[1] = aiVector3D(2.0f, 3.0f, 1.0f);
+ pcMesh->mVertices[2] = aiVector3D(3.0f, 2.0f, 4.0f);
+}
+
+// ------------------------------------------------------------------------------------------------
+void GenNormalsTest::TearDown() {
+ delete this->pcMesh;
+ delete this->piProcess;
+}
+
+// ------------------------------------------------------------------------------------------------
+TEST_F(GenNormalsTest, testSimpleTriangle) {
+ piProcess->GenMeshVertexNormals(pcMesh, 0);
+ EXPECT_TRUE(pcMesh->mNormals != NULL);
+}
diff --git a/libs/assimp/test/unit/utHMPImportExport.cpp b/libs/assimp/test/unit/utHMPImportExport.cpp
new file mode 100644
index 0000000..83e7ba0
--- /dev/null
+++ b/libs/assimp/test/unit/utHMPImportExport.cpp
@@ -0,0 +1,60 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "AbstractImportExportBase.h"
+#include "UnitTestPCH.h"
+
+#include <assimp/postprocess.h>
+#include <assimp/Importer.hpp>
+
+using namespace Assimp;
+
+class utHMPImportExport : public AbstractImportExportBase {
+public:
+ virtual bool importerTest() {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/HMP/terrain.hmp", aiProcess_ValidateDataStructure);
+ return nullptr != scene;
+ }
+};
+
+TEST_F(utHMPImportExport, importHMPFromFileTest) {
+ EXPECT_TRUE(importerTest());
+}
diff --git a/libs/assimp/test/unit/utIFCImportExport.cpp b/libs/assimp/test/unit/utIFCImportExport.cpp
new file mode 100644
index 0000000..49c7446
--- /dev/null
+++ b/libs/assimp/test/unit/utIFCImportExport.cpp
@@ -0,0 +1,80 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "AbstractImportExportBase.h"
+#include "UnitTestPCH.h"
+
+#include <assimp/postprocess.h>
+#include <assimp/Importer.hpp>
+
+using namespace Assimp;
+
+class utIFCImportExport : public AbstractImportExportBase {
+public:
+ virtual bool importerTest() {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/IFC/AC14-FZK-Haus.ifc", aiProcess_ValidateDataStructure);
+ return nullptr != scene;
+ }
+};
+
+TEST_F(utIFCImportExport, importIFCFromFileTest) {
+ EXPECT_TRUE(importerTest());
+}
+
+TEST_F(utIFCImportExport, importComplextypeAsColor) {
+ std::string asset =
+ "ISO-10303-21;\n"
+ "HEADER;\n"
+ "FILE_DESCRIPTION( ( 'ViewDefinition [CoordinationView, SpaceBoundary2ndLevelAddOnView]', 'Option [Filter: ]' ), '2;1' );\n"
+ "FILE_NAME( 'S:\\[IFC]\\[COMPLETE-BUILDINGS]\\FZK-MODELS\\FZK-Haus\\ArchiCAD-14\\AC14-FZK-Haus.ifc', '2010-10-07T13:40:52', ( 'Architect' ), ( 'Building Designer Office' ), 'PreProc - EDM 5.0', 'ArchiCAD 14.00 Release 1. Windows Build Number of the Ifc 2x3 interface: 3427', 'The authorising person' );\n"
+ "FILE_SCHEMA( ( 'IFC2X3' ) );\n"
+ "ENDSEC;\n"
+ "\n"
+ "DATA;\n"
+ "#1 = IFCORGANIZATION( 'GS', 'Graphisoft', 'Graphisoft', $, $ );\n"
+ "#2 = IFCPROPERTYSINGLEVALUE( 'Red', $, IFCINTEGER( 255 ), $ );\n"
+ "#3 = IFCPROPERTYSINGLEVALUE( 'Green', $, IFCINTEGER( 255 ), $ );\n"
+ "#4 = IFCPROPERTYSINGLEVALUE( 'Blue', $, IFCINTEGER( 255 ), $ );\n"
+ "#5 = IFCCOMPLEXPROPERTY( 'Color', $, 'Color', ( #19, #20, #21 ) );\n";
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFileFromMemory(asset.c_str(), asset.size(), 0);
+ EXPECT_EQ(nullptr, scene);
+}
diff --git a/libs/assimp/test/unit/utIOStreamBuffer.cpp b/libs/assimp/test/unit/utIOStreamBuffer.cpp
new file mode 100644
index 0000000..7565014
--- /dev/null
+++ b/libs/assimp/test/unit/utIOStreamBuffer.cpp
@@ -0,0 +1,146 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+
+#include "UnitTestPCH.h"
+#include <assimp/IOStreamBuffer.h>
+#include "TestIOStream.h"
+#include "UnitTestFileGenerator.h"
+
+class IOStreamBufferTest : public ::testing::Test {
+ // empty
+};
+
+using namespace Assimp;
+
+TEST_F( IOStreamBufferTest, creationTest ) {
+ bool ok( true );
+ try {
+ IOStreamBuffer<char> myBuffer;
+ } catch ( ... ) {
+ ok = false;
+ }
+ EXPECT_TRUE( ok );
+}
+
+TEST_F( IOStreamBufferTest, accessCacheSizeTest ) {
+ IOStreamBuffer<char> myBuffer1;
+ EXPECT_NE( 0U, myBuffer1.cacheSize() );
+
+ IOStreamBuffer<char> myBuffer2( 100 );
+ EXPECT_EQ( 100U, myBuffer2.cacheSize() );
+}
+
+const char data[]{"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Qui\
+sque luctus sem diam, ut eleifend arcu auctor eu. Vestibulum id est vel nulla l\
+obortis malesuada ut sed turpis. Nulla a volutpat tortor. Nunc vestibulum portt\
+itor sapien ornare sagittis volutpat."};
+
+
+TEST_F( IOStreamBufferTest, open_close_Test ) {
+ IOStreamBuffer<char> myBuffer;
+
+ EXPECT_FALSE( myBuffer.open( nullptr ) );
+ EXPECT_FALSE( myBuffer.close() );
+
+ const auto dataSize = sizeof(data);
+ const auto dataCount = dataSize / sizeof(*data);
+
+ char fname[]={ "octest.XXXXXX" };
+ auto* fs = MakeTmpFile(fname);
+ ASSERT_NE(nullptr, fs);
+
+ auto written = std::fwrite( data, sizeof(*data), dataCount, fs );
+ EXPECT_NE( 0U, written );
+ auto flushResult = std::fflush( fs );
+ ASSERT_EQ(0, flushResult);
+ std::fclose( fs );
+ fs = std::fopen(fname, "r");
+ ASSERT_NE(nullptr, fs);
+ {
+ TestDefaultIOStream myStream( fs, fname );
+
+ EXPECT_TRUE( myBuffer.open( &myStream ) );
+ EXPECT_FALSE( myBuffer.open( &myStream ) );
+ EXPECT_TRUE( myBuffer.close() );
+ }
+ remove(fname);
+}
+
+TEST_F( IOStreamBufferTest, readlineTest ) {
+
+ const auto dataSize = sizeof(data);
+ const auto dataCount = dataSize / sizeof(*data);
+
+ char fname[]={ "readlinetest.XXXXXX" };
+ auto* fs = MakeTmpFile(fname);
+ ASSERT_NE(nullptr, fs);
+
+ auto written = std::fwrite( data, sizeof(*data), dataCount, fs );
+ EXPECT_NE( 0U, written );
+
+ auto flushResult = std::fflush(fs);
+ ASSERT_EQ(0, flushResult);
+ std::fclose(fs);
+ fs = std::fopen(fname, "r");
+ ASSERT_NE(nullptr, fs);
+
+ const auto tCacheSize = 26u;
+
+ IOStreamBuffer<char> myBuffer( tCacheSize );
+ EXPECT_EQ(tCacheSize, myBuffer.cacheSize() );
+
+ TestDefaultIOStream myStream( fs, fname );
+ auto size = myStream.FileSize();
+ auto numBlocks = size / myBuffer.cacheSize();
+ if ( size % myBuffer.cacheSize() > 0 ) {
+ numBlocks++;
+ }
+ EXPECT_TRUE( myBuffer.open( &myStream ) );
+ EXPECT_EQ( numBlocks, myBuffer.getNumBlocks() );
+ EXPECT_TRUE( myBuffer.close() );
+}
+
+TEST_F( IOStreamBufferTest, accessBlockIndexTest ) {
+
+}
+
diff --git a/libs/assimp/test/unit/utIOSystem.cpp b/libs/assimp/test/unit/utIOSystem.cpp
new file mode 100644
index 0000000..d69e645
--- /dev/null
+++ b/libs/assimp/test/unit/utIOSystem.cpp
@@ -0,0 +1,79 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "UnitTestPCH.h"
+#include "TestIOSystem.h"
+
+#include <assimp/IOSystem.hpp>
+
+using namespace std;
+using namespace Assimp;
+
+class IOSystemTest : public ::testing::Test {
+public:
+ virtual void SetUp() {
+ pImp = new TestIOSystem();
+ }
+
+ virtual void TearDown() {
+ delete pImp;
+ }
+
+protected:
+ TestIOSystem* pImp;
+};
+
+TEST_F( IOSystemTest, accessDirectoryStackTest ) {
+ EXPECT_FALSE( pImp->PopDirectory() );
+ EXPECT_EQ( 0U, pImp->StackSize() );
+ EXPECT_FALSE( pImp->PushDirectory( "" ) );
+ std::string path = "test/";
+ EXPECT_TRUE( pImp->PushDirectory( path ) );
+ EXPECT_EQ( 1U, pImp->StackSize() );
+ EXPECT_EQ( path, pImp->CurrentDirectory() );
+ EXPECT_TRUE( pImp->PopDirectory() );
+ EXPECT_EQ( 0U, pImp->StackSize() );
+}
+
+TEST_F( IOSystemTest, delFileTest ) {
+ EXPECT_FALSE( pImp->DeleteFile( "none" ) );
+}
diff --git a/libs/assimp/test/unit/utImporter.cpp b/libs/assimp/test/unit/utImporter.cpp
new file mode 100644
index 0000000..768a276
--- /dev/null
+++ b/libs/assimp/test/unit/utImporter.cpp
@@ -0,0 +1,363 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "UnitTestPCH.h"
+
+#include "../../include/assimp/postprocess.h"
+#include "../../include/assimp/scene.h"
+#include "TestIOSystem.h"
+#include <assimp/BaseImporter.h>
+#include <assimp/DefaultIOSystem.h>
+#include <assimp/Importer.hpp>
+
+using namespace ::std;
+using namespace ::Assimp;
+
+class ImporterTest : public ::testing::Test {
+protected:
+ void SetUp() override {
+ pImp = new Importer();
+ }
+
+ void TearDown() override {
+ delete pImp;
+ }
+
+ Importer *pImp;
+};
+
+#define InputData_BLOCK_SIZE 1310
+
+// clang-format off
+// test data for Importer::ReadFileFromMemory() - ./test/3DS/CameraRollAnim.3ds
+static unsigned char InputData_abRawBlock[1310] = {
+ 77, 77, 30, 5, 0, 0, 2, 0, 10, 0, 0, 0, 3, 0, 0, 0, 61, 61, 91, 3, 0, 0,
+ 62, 61, 10, 0, 0, 0, 3, 0, 0, 0, 0, 1, 10, 0, 0, 0, 0, 0,128, 63, 0, 64,
+ 254, 2, 0, 0, 66,111,120, 48, 49, 0, 0, 65,242, 2, 0, 0, 16, 65, 64, 1, 0, 0,
+ 26, 0,102, 74,198,193,102, 74,198,193, 0, 0, 0, 0,205,121, 55, 66,102, 74,198,193,
+ 0, 0, 0, 0,102, 74,198,193,138,157,184, 65, 0, 0, 0, 0,205,121, 55, 66,138,157,
+ 184, 65, 0, 0, 0, 0,102, 74,198,193,102, 74,198,193, 90,252, 26, 66,205,121, 55, 66,
+ 102, 74,198,193, 90,252, 26, 66,102, 74,198,193,138,157,184, 65, 90,252, 26, 66,205,121,
+ 55, 66,138,157,184, 65, 90,252, 26, 66,102, 74,198,193,102, 74,198,193, 0, 0, 0, 0,
+ 205,121, 55, 66,102, 74,198,193, 0, 0, 0, 0,205,121, 55, 66,102, 74,198,193, 90,252,
+ 26, 66,205,121, 55, 66,102, 74,198,193, 90,252, 26, 66,102, 74,198,193,102, 74,198,193,
+ 90, 252, 26, 66,102, 74,198,193,102, 74,198,193, 0, 0, 0, 0,205,121, 55, 66,138,157,
+ 184, 65, 0, 0, 0, 0,205,121, 55, 66,102, 74,198,193, 90,252, 26, 66,205,121, 55, 66,
+ 138,157,184, 65, 0, 0, 0, 0,102, 74,198,193,138,157,184, 65, 0, 0, 0, 0,102, 74,
+ 198,193,138,157,184, 65, 90,252, 26, 66,102, 74,198,193,138,157,184, 65, 90,252, 26, 66,
+ 205,121, 55, 66,138,157,184, 65, 90,252, 26, 66,205,121, 55, 66,138,157,184, 65, 0, 0,
+ 0, 0,102, 74,198,193,138,157,184, 65, 0, 0, 0, 0,102, 74,198,193,102, 74,198,193,
+ 90,252, 26, 66,102, 74,198,193,102, 74,198,193, 90,252, 26, 66,102, 74,198,193,138,157,
+ 184, 65, 0, 0, 0, 0, 64, 65,216, 0, 0, 0, 26, 0, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,
+ 128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,
+ 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,
+ 0, 0, 96, 65, 54, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 53,169, 40, 65,176,205, 90,191, 0, 0, 0, 0, 32, 65,158, 0, 0, 0, 12, 0, 0, 0,
+ 2, 0, 3, 0, 6, 0, 3, 0, 1, 0, 0, 0, 6, 0, 4, 0, 5, 0, 7, 0, 6, 0,
+ 7, 0, 6, 0, 4, 0, 6, 0, 8, 0, 9, 0, 10, 0, 6, 0, 11, 0, 12, 0, 13, 0,
+ 6, 0, 1, 0, 14, 0, 7, 0, 6, 0, 7, 0, 15, 0, 1, 0, 6, 0, 16, 0, 17, 0,
+ 18, 0, 6, 0, 19, 0, 20, 0, 21, 0, 6, 0, 22, 0, 0, 0, 23, 0, 6, 0, 24, 0,
+ 6, 0, 25, 0, 6, 0, 80, 65, 54, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 4, 0,
+ 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0,
+ 32, 0, 0, 0, 32, 0, 0, 0, 64, 0, 0, 0, 64, 0, 0, 0, 0, 64, 67, 0, 0, 0,
+ 67, 97,109,101,114, 97, 48, 49, 0, 0, 71, 52, 0, 0, 0,189, 19, 25,195,136,104, 81,
+ 64,147, 56,182, 65, 96,233, 20,194, 67,196, 97,190,147, 56,182, 65, 0, 0, 0, 0, 85,
+ 85, 85, 66, 32, 71, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0,122, 68, 0,176,179, 1, 0,
+ 0, 10,176, 21, 0, 0, 0, 5, 0, 77, 65, 88, 83, 67, 69, 78, 69, 0, 44, 1, 0, 0,
+ 8,176, 14, 0, 0, 0, 0, 0, 0, 0, 44, 1, 0, 0, 9,176, 10, 0, 0, 0,128, 2,
+ 0, 0, 2,176,168, 0, 0, 0, 48,176, 8, 0, 0, 0, 0, 0, 16,176, 18, 0, 0, 0,
+ 66,111,120, 48, 49, 0, 0, 64, 0, 0,255,255, 19,176, 18, 0, 0, 0, 0, 0, 0,128,
+ 0, 0, 0,128, 0, 0, 0,128, 32,176, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53,169, 40, 65,176,205, 90,191, 0, 0,
+ 0, 0, 33,176, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 34,176, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 3,176,143, 0, 0, 0,
+ 48,176, 8, 0, 0, 0, 1, 0, 16,176, 21, 0, 0, 0, 67, 97,109,101,114, 97, 48, 49,
+ 0, 0, 64, 0, 0,255,255, 32,176, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,189, 19, 25,195,136,104, 81, 64,147, 56,182,
+ 65, 35,176, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 52, 66, 36,176, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0,120,
+ 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,120, 13, 90,189,120, 0, 0, 0, 0,
+ 0, 99,156,154,194, 4,176, 73, 0, 0, 0, 48,176, 8, 0, 0, 0, 2, 0, 16,176, 21,
+ 0, 0, 0, 67, 97,109,101,114, 97, 48, 49, 0, 0, 64, 0, 0,255,255, 32,176, 38, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 96,233, 20,194, 67,196, 97,190,147, 56,182, 65 };
+// clang-format on
+#define AIUT_DEF_ERROR_TEXT "sorry, this is a test"
+
+static const aiImporterDesc desc = {
+ "UNIT TEST - IMPORTER",
+ "",
+ "",
+ "",
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ "apple mac linux windows"
+};
+
+class TestPlugin : public BaseImporter {
+public:
+ virtual bool CanRead(
+ const std::string &pFile, IOSystem * /*pIOHandler*/, bool /*test*/) const {
+ std::string::size_type pos = pFile.find_last_of('.');
+ // no file extension - can't read
+ if (pos == std::string::npos)
+ return false;
+ std::string extension = pFile.substr(pos);
+
+ // todo ... make case-insensitive
+ return (extension == ".apple" || extension == ".mac" ||
+ extension == ".linux" || extension == ".windows");
+ }
+
+ virtual const aiImporterDesc *GetInfo() const {
+ return &desc;
+ }
+
+ virtual void InternReadFile(
+ const std::string & /*pFile*/, aiScene * /*pScene*/, IOSystem * /*pIOHandler*/) {
+ throw DeadlyImportError(AIUT_DEF_ERROR_TEXT);
+ }
+};
+
+// ------------------------------------------------------------------------------------------------
+TEST_F(ImporterTest, testMemoryRead) {
+ const aiScene *sc = pImp->ReadFileFromMemory(InputData_abRawBlock, InputData_BLOCK_SIZE,
+ aiProcessPreset_TargetRealtime_Quality, "3ds");
+
+ ASSERT_TRUE(sc != NULL);
+ EXPECT_EQ(aiString("<3DSRoot>"), sc->mRootNode->mName);
+ EXPECT_EQ(1U, sc->mNumMeshes);
+ EXPECT_EQ(24U, sc->mMeshes[0]->mNumVertices);
+ EXPECT_EQ(12U, sc->mMeshes[0]->mNumFaces);
+}
+
+// ------------------------------------------------------------------------------------------------
+TEST_F(ImporterTest, testIntProperty) {
+ bool b = pImp->SetPropertyInteger("quakquak", 1503);
+ EXPECT_FALSE(b);
+ EXPECT_EQ(1503, pImp->GetPropertyInteger("quakquak", 0));
+ EXPECT_EQ(314159, pImp->GetPropertyInteger("not_there", 314159));
+
+ b = pImp->SetPropertyInteger("quakquak", 1504);
+ EXPECT_TRUE(b);
+}
+
+// ------------------------------------------------------------------------------------------------
+TEST_F(ImporterTest, testFloatProperty) {
+ bool b = pImp->SetPropertyFloat("quakquak", 1503.f);
+ EXPECT_TRUE(!b);
+ EXPECT_EQ(1503.f, pImp->GetPropertyFloat("quakquak", 0.f));
+ EXPECT_EQ(314159.f, pImp->GetPropertyFloat("not_there", 314159.f));
+}
+
+// ------------------------------------------------------------------------------------------------
+TEST_F(ImporterTest, testStringProperty) {
+ bool b = pImp->SetPropertyString("quakquak", "test");
+ EXPECT_TRUE(!b);
+ EXPECT_EQ("test", pImp->GetPropertyString("quakquak", "weghwekg"));
+ EXPECT_EQ("ILoveYou", pImp->GetPropertyString("not_there", "ILoveYou"));
+}
+
+// ------------------------------------------------------------------------------------------------
+TEST_F(ImporterTest, testPluginInterface) {
+ pImp->RegisterLoader(new TestPlugin());
+ EXPECT_TRUE(pImp->IsExtensionSupported(".apple"));
+ EXPECT_TRUE(pImp->IsExtensionSupported(".mac"));
+ EXPECT_TRUE(pImp->IsExtensionSupported("*.linux"));
+ EXPECT_TRUE(pImp->IsExtensionSupported("windows"));
+ EXPECT_TRUE(pImp->IsExtensionSupported(".x")); /* x and 3ds must be available in this Assimp build, of course! */
+ EXPECT_TRUE(pImp->IsExtensionSupported(".3ds"));
+ EXPECT_FALSE(pImp->IsExtensionSupported("."));
+
+ TestPlugin *p = (TestPlugin *)pImp->GetImporter(".windows");
+ ASSERT_TRUE(NULL != p);
+
+ try {
+ p->InternReadFile("", 0, NULL);
+ } catch (const DeadlyImportError &dead) {
+ EXPECT_TRUE(!strcmp(dead.what(), AIUT_DEF_ERROR_TEXT));
+
+ // unregister the plugin and delete it
+ pImp->UnregisterLoader(p);
+ delete p;
+
+ return;
+ }
+ EXPECT_TRUE(false); // control shouldn't reach this point
+}
+
+// ------------------------------------------------------------------------------------------------
+TEST_F(ImporterTest, testExtensionCheck) {
+ std::string s;
+ pImp->GetExtensionList(s);
+
+ // TODO
+}
+
+// ------------------------------------------------------------------------------------------------
+TEST_F(ImporterTest, testMultipleReads) {
+ // see http://sourceforge.net/projects/assimp/forums/forum/817654/topic/3591099
+ // Check whether reading and post-processing multiple times using
+ // the same objects is *generally* fine. This test doesn't target
+ // importers. Testing post-processing stability is the main point.
+
+ const unsigned int flags =
+ aiProcess_Triangulate |
+ aiProcess_JoinIdenticalVertices |
+ aiProcess_GenSmoothNormals |
+ aiProcess_ValidateDataStructure |
+ aiProcess_RemoveRedundantMaterials |
+ aiProcess_SortByPType |
+ aiProcess_FindDegenerates |
+ aiProcess_FindInvalidData |
+ aiProcess_GenUVCoords |
+ aiProcess_OptimizeMeshes |
+ aiProcess_OptimizeGraph;
+
+ EXPECT_TRUE(pImp->ReadFile(ASSIMP_TEST_MODELS_DIR "/X/test.x", flags));
+ //EXPECT_TRUE(pImp->ReadFile(ASSIMP_TEST_MODELS_DIR "/X/dwarf.x",flags)); # is in nonbsd
+ EXPECT_TRUE(pImp->ReadFile(ASSIMP_TEST_MODELS_DIR "/X/Testwuson.X", flags));
+ EXPECT_TRUE(pImp->ReadFile(ASSIMP_TEST_MODELS_DIR "/X/anim_test.x", flags));
+ //EXPECT_TRUE(pImp->ReadFile(ASSIMP_TEST_MODELS_DIR "/X/dwarf.x",flags)); # is in nonbsd
+
+ EXPECT_TRUE(pImp->ReadFile(ASSIMP_TEST_MODELS_DIR "/X/anim_test.x", flags));
+ EXPECT_TRUE(pImp->ReadFile(ASSIMP_TEST_MODELS_DIR "/X/BCN_Epileptic.X", flags));
+ //EXPECT_TRUE(pImp->ReadFile(ASSIMP_TEST_MODELS_DIR "/X/dwarf.x",flags)); # is in nonbsd
+}
+
+TEST_F(ImporterTest, SearchFileHeaderForTokenTest) {
+ //DefaultIOSystem ioSystem;
+ // BaseImporter::SearchFileHeaderForToken( &ioSystem, assetPath, Token, 2 )
+}
+
+namespace {
+// Description for an importer which fails in specific ways.
+aiImporterDesc s_failingImporterDescription = {
+ "Failing importer",
+ "assimp team",
+ "",
+ "",
+ 0,
+ 1,
+ 0,
+ 1,
+ 0,
+ "fail"
+};
+
+// This importer fails in specific ways.
+class FailingImporter : public Assimp::BaseImporter {
+public:
+ virtual ~FailingImporter() = default;
+ virtual bool CanRead(const std::string &, Assimp::IOSystem *, bool) const override {
+ return true;
+ }
+
+protected:
+ const aiImporterDesc *GetInfo() const override {
+ return &s_failingImporterDescription;
+ }
+
+ void InternReadFile(const std::string &pFile, aiScene *, Assimp::IOSystem *) override {
+ if (pFile == "deadlyImportError.fail") {
+ throw DeadlyImportError("Deadly import error test. Details: ", 42, " More Details: ", "Failure");
+ } else if (pFile == "stdException.fail") {
+ throw std::runtime_error("std::exception test");
+ } else if (pFile == "unexpectedException.fail") {
+ throw 5;
+ }
+ }
+};
+} // namespace
+
+TEST_F(ImporterTest, deadlyImportError) {
+ pImp->RegisterLoader(new FailingImporter);
+ pImp->SetIOHandler(new TestIOSystem);
+ const aiScene *scene = pImp->ReadFile("deadlyImportError.fail", 0);
+ EXPECT_EQ(scene, nullptr);
+ EXPECT_STREQ(pImp->GetErrorString(), "Deadly import error test. Details: 42 More Details: Failure");
+ EXPECT_NE(pImp->GetException(), std::exception_ptr());
+}
+
+TEST_F(ImporterTest, stdException) {
+ pImp->RegisterLoader(new FailingImporter);
+ pImp->SetIOHandler(new TestIOSystem);
+ const aiScene *scene = pImp->ReadFile("stdException.fail", 0);
+ EXPECT_EQ(scene, nullptr);
+ EXPECT_STREQ(pImp->GetErrorString(), "std::exception test");
+ EXPECT_NE(pImp->GetException(), std::exception_ptr());
+ try {
+ std::rethrow_exception(pImp->GetException());
+ } catch (const std::exception &e) {
+ EXPECT_STREQ(e.what(), "std::exception test");
+ } catch (...) {
+ EXPECT_TRUE(false);
+ }
+}
+
+TEST_F(ImporterTest, unexpectedException) {
+ pImp->RegisterLoader(new FailingImporter);
+ pImp->SetIOHandler(new TestIOSystem);
+ const aiScene *scene = pImp->ReadFile("unexpectedException.fail", 0);
+
+ EXPECT_EQ(scene, nullptr);
+ EXPECT_STREQ(pImp->GetErrorString(), "Unknown exception");
+ ASSERT_NE(pImp->GetException(), std::exception_ptr());
+ try {
+ std::rethrow_exception(pImp->GetException());
+ } catch (int x) {
+ EXPECT_EQ(x, 5);
+ } catch (...) {
+ EXPECT_TRUE(false);
+ }
+}
diff --git a/libs/assimp/test/unit/utImproveCacheLocality.cpp b/libs/assimp/test/unit/utImproveCacheLocality.cpp
new file mode 100644
index 0000000..0e97eb0
--- /dev/null
+++ b/libs/assimp/test/unit/utImproveCacheLocality.cpp
@@ -0,0 +1,42 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+
+#include "UnitTestPCH.h"
diff --git a/libs/assimp/test/unit/utIssues.cpp b/libs/assimp/test/unit/utIssues.cpp
new file mode 100644
index 0000000..546c36a
--- /dev/null
+++ b/libs/assimp/test/unit/utIssues.cpp
@@ -0,0 +1,83 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "UnitTestPCH.h"
+
+#include <assimp/scene.h>
+#include <assimp/Importer.hpp>
+#include <assimp/Exporter.hpp>
+#include <assimp/postprocess.h>
+
+#include "TestModelFactory.h"
+
+using namespace Assimp;
+
+class utIssues : public ::testing::Test {
+ // empty
+};
+
+#ifndef ASSIMP_BUILD_NO_EXPORT
+
+TEST_F( utIssues, OpacityBugWhenExporting_727 ) {
+ float opacity;
+ aiScene *scene( TestModelFacttory::createDefaultTestModel( opacity ) );
+ Assimp::Importer importer;
+ Assimp::Exporter exporter;
+
+ std::string path = "dae";
+ const aiExportFormatDesc *desc = exporter.GetExportFormatDescription( 0 );
+ EXPECT_NE( desc, nullptr );
+ path.append(".");
+ path.append( desc->fileExtension );
+ EXPECT_EQ( AI_SUCCESS, exporter.Export( scene, desc->id, path ) );
+ const aiScene *newScene( importer.ReadFile( path, aiProcess_ValidateDataStructure ) );
+ ASSERT_NE( nullptr, newScene );
+ float newOpacity;
+ if ( newScene->mNumMaterials > 0 ) {
+ std::cout << "Desc = " << desc->description << "\n";
+ EXPECT_EQ( AI_SUCCESS, newScene->mMaterials[ 0 ]->Get( AI_MATKEY_OPACITY, newOpacity ) );
+ EXPECT_FLOAT_EQ( opacity, newOpacity );
+ }
+ delete scene;
+}
+
+#endif // ASSIMP_BUILD_NO_EXPORT
diff --git a/libs/assimp/test/unit/utJoinVertices.cpp b/libs/assimp/test/unit/utJoinVertices.cpp
new file mode 100644
index 0000000..b070090
--- /dev/null
+++ b/libs/assimp/test/unit/utJoinVertices.cpp
@@ -0,0 +1,142 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "UnitTestPCH.h"
+
+#include <assimp/scene.h>
+
+#include "PostProcessing/JoinVerticesProcess.h"
+
+using namespace std;
+using namespace Assimp;
+
+class utJoinVertices : public ::testing::Test {
+public:
+ utJoinVertices() :
+ Test(), piProcess(nullptr), pcMesh(nullptr) {
+ // empty
+ }
+
+protected:
+ virtual void SetUp();
+ virtual void TearDown();
+
+protected:
+ JoinVerticesProcess *piProcess;
+ aiMesh *pcMesh;
+};
+
+// ------------------------------------------------------------------------------------------------
+void utJoinVertices::SetUp() {
+ // construct the process
+ piProcess = new JoinVerticesProcess();
+
+ // create a quite small mesh for testing purposes -
+ // the mesh itself is *something* but it has redundant vertices
+ pcMesh = new aiMesh();
+
+ pcMesh->mNumVertices = 900;
+ aiVector3D *&pv = pcMesh->mVertices = new aiVector3D[900];
+ for (unsigned int i = 0; i < 3; ++i) {
+ const unsigned int base = i * 300;
+ for (unsigned int a = 0; a < 300; ++a) {
+ pv[base + a].x = pv[base + a].y = pv[base + a].z = (float)a;
+ }
+ }
+
+ // generate faces - each vertex is referenced once
+ pcMesh->mNumFaces = 300;
+ pcMesh->mFaces = new aiFace[300];
+ for (unsigned int i = 0, p = 0; i < 300; ++i) {
+ aiFace &face = pcMesh->mFaces[i];
+ face.mIndices = new unsigned int[face.mNumIndices = 3];
+ for (unsigned int a = 0; a < 3; ++a) {
+ face.mIndices[a] = p++;
+ }
+ }
+
+ // generate extra members - set them to zero to make sure they're identical
+ pcMesh->mTextureCoords[0] = new aiVector3D[900];
+ pcMesh->mBitangents = new aiVector3D[900];
+ pcMesh->mNormals = new aiVector3D[900];
+ pcMesh->mTangents = new aiVector3D[900];
+ for (unsigned int i = 0; i < 900; ++i) {
+ pcMesh->mTextureCoords[0][i] = aiVector3D(0.f);
+ pcMesh->mNormals[i] = aiVector3D(0.f);
+ pcMesh->mTangents[i] = aiVector3D(0.f);
+ pcMesh->mBitangents[i] = aiVector3D(0.f);
+ }
+}
+
+// ------------------------------------------------------------------------------------------------
+void utJoinVertices::TearDown() {
+ delete this->pcMesh;
+ pcMesh = nullptr;
+ delete this->piProcess;
+ piProcess = nullptr;
+}
+
+// ------------------------------------------------------------------------------------------------
+TEST_F(utJoinVertices, testProcess) {
+ // execute the step on the given data
+ piProcess->ProcessMesh(pcMesh, 0);
+
+ // the number of faces shouldn't change
+ ASSERT_EQ(300U, pcMesh->mNumFaces);
+ ASSERT_EQ(300U, pcMesh->mNumVertices);
+
+ ASSERT_TRUE(nullptr != pcMesh->mNormals);
+ ASSERT_TRUE(nullptr != pcMesh->mTangents);
+ ASSERT_TRUE(nullptr != pcMesh->mBitangents);
+ ASSERT_TRUE(nullptr != pcMesh->mTextureCoords[0]);
+
+ // the order doesn't care
+ float fSum = 0.f;
+ for (unsigned int i = 0; i < 300; ++i) {
+ aiVector3D &v = pcMesh->mVertices[i];
+ fSum += v.x + v.y + v.z;
+
+ EXPECT_FALSE(pcMesh->mNormals[i].x);
+ EXPECT_FALSE(pcMesh->mTangents[i].x);
+ EXPECT_FALSE(pcMesh->mBitangents[i].x);
+ EXPECT_FALSE(pcMesh->mTextureCoords[0][i].x);
+ }
+ EXPECT_EQ(150.f * 299.f * 3.f, fSum); // gaussian sum equation
+}
diff --git a/libs/assimp/test/unit/utLWOImportExport.cpp b/libs/assimp/test/unit/utLWOImportExport.cpp
new file mode 100644
index 0000000..2661050
--- /dev/null
+++ b/libs/assimp/test/unit/utLWOImportExport.cpp
@@ -0,0 +1,77 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "AbstractImportExportBase.h"
+#include "UnitTestPCH.h"
+#include <assimp/postprocess.h>
+#include <assimp/scene.h>
+#include <assimp/Importer.hpp>
+
+using namespace Assimp;
+
+class utLWOImportExport : public AbstractImportExportBase {
+public:
+ virtual bool importerTest() {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/LWO/LWO2/boxuv.lwo", aiProcess_ValidateDataStructure);
+
+ EXPECT_EQ(1u, scene->mNumMeshes);
+ EXPECT_NE(nullptr, scene->mMeshes[0]);
+ EXPECT_EQ(24u, scene->mMeshes[0]->mNumVertices);
+
+ //This test model is using n-gons, so 6 faces instead of 12 tris
+ EXPECT_EQ(6u, scene->mMeshes[0]->mNumFaces);
+ EXPECT_EQ(aiPrimitiveType_POLYGON, scene->mMeshes[0]->mPrimitiveTypes);
+ EXPECT_EQ(true, scene->mMeshes[0]->HasTextureCoords(0));
+
+ return nullptr != scene;
+ }
+};
+
+TEST_F(utLWOImportExport, importLWObox_uv) {
+ EXPECT_TRUE(importerTest());
+}
+
+TEST_F(utLWOImportExport, importLWOformatdetection) {
+ ::Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/LWO/LWO2/formatDetection", aiProcess_ValidateDataStructure);
+
+ EXPECT_NE(nullptr, scene);
+}
diff --git a/libs/assimp/test/unit/utLWSImportExport.cpp b/libs/assimp/test/unit/utLWSImportExport.cpp
new file mode 100644
index 0000000..730911e
--- /dev/null
+++ b/libs/assimp/test/unit/utLWSImportExport.cpp
@@ -0,0 +1,138 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "AbstractImportExportBase.h"
+#include "UnitTestPCH.h"
+#include <assimp/postprocess.h>
+
+#include <assimp/Importer.hpp>
+
+using namespace Assimp;
+
+class utLWSImportExport : public AbstractImportExportBase {
+public:
+ virtual bool importerTest() {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/LWS/move_x.lws", aiProcess_ValidateDataStructure);
+ return nullptr != scene;
+ }
+};
+
+TEST_F(utLWSImportExport, importLWSFromFileTest) {
+ EXPECT_TRUE(importerTest());
+}
+
+TEST_F(utLWSImportExport, importLWSmove_x_post_linear) {
+ ::Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/LWS/move_x_post_linear.lws", aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+}
+
+TEST_F(utLWSImportExport, importLWSmove_xz_bezier) {
+ ::Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/LWS/move_xz_bezier.lws", aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+}
+
+TEST_F(utLWSImportExport, importLWSmove_xz_stepped) {
+ ::Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/LWS/move_xz_stepped.lws", aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+}
+
+TEST_F(utLWSImportExport, importLWSmove_x_oldformat_56) {
+ ::Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/LWS/move_x_oldformat_56.lws", aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+}
+
+TEST_F(utLWSImportExport, importLWSmove_x_post_offset_repeat) {
+ ::Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/LWS/move_x_post_offset_repeat.lws", aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+}
+
+TEST_F(utLWSImportExport, importLWSmove_xz_hermite) {
+ ::Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/LWS/move_xz_hermite.lws", aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+}
+
+TEST_F(utLWSImportExport, importLWSmove_y_pre_ofrep_post_osc) {
+ ::Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/LWS/move_y_pre_ofrep_post_osc.lws", aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+}
+
+TEST_F(utLWSImportExport, importLWSmove_x_oldformat_6) {
+ ::Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/LWS/move_x_oldformat_6.lws", aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+}
+
+TEST_F(utLWSImportExport, importLWSmove_x_post_repeat) {
+ ::Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/LWS/move_x_post_repeat.lws", aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+}
+
+TEST_F(utLWSImportExport, importLWSmove_xz_linear) {
+ ::Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/LWS/move_xz_linear.lws", aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+}
+
+TEST_F(utLWSImportExport, importLWSmove_x_post_constant) {
+ ::Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/LWS/move_x_post_constant.lws", aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+}
+
+TEST_F(utLWSImportExport, importLWSmove_x_post_reset) {
+ ::Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/LWS/move_x_post_reset.lws", aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+}
+
+TEST_F(utLWSImportExport, importLWSmove_xz_spline) {
+ ::Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/LWS/move_xz_spline.lws", aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+}
diff --git a/libs/assimp/test/unit/utLimitBoneWeights.cpp b/libs/assimp/test/unit/utLimitBoneWeights.cpp
new file mode 100644
index 0000000..0c24b56
--- /dev/null
+++ b/libs/assimp/test/unit/utLimitBoneWeights.cpp
@@ -0,0 +1,136 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "UnitTestPCH.h"
+
+#include "PostProcessing/LimitBoneWeightsProcess.h"
+#include <assimp/scene.h>
+
+using namespace std;
+using namespace Assimp;
+
+class LimitBoneWeightsTest : public ::testing::Test {
+public:
+ LimitBoneWeightsTest() :
+ Test(), mProcess(nullptr), mMesh(nullptr) {
+ // empty
+ }
+
+protected:
+ virtual void SetUp();
+ virtual void TearDown();
+
+protected:
+ LimitBoneWeightsProcess *mProcess;
+ aiMesh *mMesh;
+};
+
+// ------------------------------------------------------------------------------------------------
+void LimitBoneWeightsTest::SetUp() {
+ // construct the process
+ this->mProcess = new LimitBoneWeightsProcess();
+
+ // now need to create a nice mesh for testing purposes
+ this->mMesh = new aiMesh();
+
+ mMesh->mNumVertices = 500;
+ mMesh->mVertices = new aiVector3D[500]; // uninit.
+ mMesh->mNumBones = 30;
+ mMesh->mBones = new aiBone *[30];
+ unsigned int iCur = 0;
+ for (unsigned int i = 0; i < 30; ++i) {
+ aiBone *pc = mMesh->mBones[i] = new aiBone();
+ pc->mNumWeights = 250;
+ pc->mWeights = new aiVertexWeight[pc->mNumWeights];
+ for (unsigned int qq = 0; qq < pc->mNumWeights; ++qq) {
+ aiVertexWeight &v = pc->mWeights[qq];
+ v.mVertexId = iCur++;
+ if (500 == iCur) {
+ iCur = 0;
+ }
+ v.mWeight = 1.0f / 15; // each vertex should occur once in two bones
+ }
+ }
+}
+
+// ------------------------------------------------------------------------------------------------
+void LimitBoneWeightsTest::TearDown() {
+ delete mMesh;
+ delete mProcess;
+}
+
+// ------------------------------------------------------------------------------------------------
+TEST_F(LimitBoneWeightsTest, testProcess) {
+ // execute the step on the given data
+ mProcess->ProcessMesh(mMesh);
+
+ // check whether everything is ok ...
+ typedef std::vector<LimitBoneWeightsProcess::Weight> VertexWeightList;
+ VertexWeightList *asWeights = new VertexWeightList[mMesh->mNumVertices];
+
+ for (unsigned int i = 0; i < mMesh->mNumVertices; ++i) {
+ asWeights[i].reserve(4);
+ }
+
+ // sort back as per-vertex lists
+ for (unsigned int i = 0; i < mMesh->mNumBones; ++i) {
+ aiBone &pcBone = **(mMesh->mBones + i);
+ for (unsigned int q = 0; q < pcBone.mNumWeights; ++q) {
+ aiVertexWeight weight = pcBone.mWeights[q];
+ asWeights[weight.mVertexId].push_back(LimitBoneWeightsProcess::Weight(i, weight.mWeight));
+ }
+ }
+
+ // now validate the size of the lists and check whether all weights sum to 1.0f
+ for (unsigned int i = 0; i < mMesh->mNumVertices; ++i) {
+ EXPECT_LE(asWeights[i].size(), 4U);
+ float fSum = 0.0f;
+ for (VertexWeightList::const_iterator iter = asWeights[i].begin(); iter != asWeights[i].end(); ++iter) {
+ fSum += (*iter).mWeight;
+ }
+ EXPECT_GE(fSum, 0.95F);
+ EXPECT_LE(fSum, 1.04F);
+ }
+
+ // delete allocated storage
+ delete[] asWeights;
+
+ // everything seems to be OK
+}
diff --git a/libs/assimp/test/unit/utM3DImportExport.cpp b/libs/assimp/test/unit/utM3DImportExport.cpp
new file mode 100644
index 0000000..bd9fca1
--- /dev/null
+++ b/libs/assimp/test/unit/utM3DImportExport.cpp
@@ -0,0 +1,84 @@
+/*
+---------------------------------------------------------------------------
+Open Asset Import Library (assimp)
+---------------------------------------------------------------------------
+
+Copyright (c) 2006-2020, assimp tea
+
+
+All rights reserved.
+
+Redistribution and use of this software in source and binary forms,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+
+#include "AbstractImportExportBase.h"
+#include "UnitTestPCH.h"
+
+#include <assimp/Importer.hpp>
+#include <assimp/Exporter.hpp>
+#include <assimp/postprocess.h>
+#include <assimp/Importer.hpp>
+
+using namespace Assimp;
+
+class utM3DImportExport : public AbstractImportExportBase {
+public:
+ bool importerTest() override {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/M3D/cube_normals.m3d", aiProcess_ValidateDataStructure);
+#ifndef ASSIMP_BUILD_NO_M3D_IMPORTER
+ return nullptr != scene;
+#else
+ return nullptr == scene;
+#endif // ASSIMP_BUILD_NO_M3D_IMPORTER
+ }
+
+#ifndef ASSIMP_BUILD_NO_EXPORT
+ bool exporterTest() override {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/M3D/cube_normals.m3d", aiProcess_ValidateDataStructure);
+ Exporter exporter;
+ aiReturn ret = exporter.Export(scene, "m3d", ASSIMP_TEST_MODELS_DIR "/M3D/cube_normals_out.m3d");
+ return ret == AI_SUCCESS;
+ }
+#endif
+};
+
+TEST_F(utM3DImportExport, importM3DFromFileTest) {
+ EXPECT_TRUE(importerTest());
+}
+
+#ifndef ASSIMP_BUILD_NO_EXPORT
+TEST_F(utM3DImportExport, exportM3DFromFileTest) {
+ EXPECT_TRUE(exporterTest());
+}
+#endif // ASSIMP_BUILD_NO_EXPORT
diff --git a/libs/assimp/test/unit/utMDCImportExport.cpp b/libs/assimp/test/unit/utMDCImportExport.cpp
new file mode 100644
index 0000000..29b9ed5
--- /dev/null
+++ b/libs/assimp/test/unit/utMDCImportExport.cpp
@@ -0,0 +1,62 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+
+#include "AbstractImportExportBase.h"
+#include "UnitTestPCH.h"
+#include <assimp/postprocess.h>
+#include <assimp/Importer.hpp>
+
+using namespace Assimp;
+
+class utMDCImportExport : public AbstractImportExportBase {
+public:
+ virtual bool importerTest() {
+ Assimp::Importer importer;
+
+ //const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/MDC/spider.mdc", 0);
+ static_cast<void>(importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/MDC/spider.mdc", 0));
+ return true;
+ }
+};
+
+TEST_F(utMDCImportExport, importMDCFromFileTest) {
+ EXPECT_TRUE(importerTest());
+}
diff --git a/libs/assimp/test/unit/utMaterialSystem.cpp b/libs/assimp/test/unit/utMaterialSystem.cpp
new file mode 100644
index 0000000..7b45604
--- /dev/null
+++ b/libs/assimp/test/unit/utMaterialSystem.cpp
@@ -0,0 +1,137 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "UnitTestPCH.h"
+
+#include "Material/MaterialSystem.h"
+#include <assimp/scene.h>
+
+using namespace ::std;
+using namespace ::Assimp;
+
+class MaterialSystemTest : public ::testing::Test {
+public:
+ virtual void SetUp() { this->pcMat = new aiMaterial(); }
+ virtual void TearDown() { delete this->pcMat; }
+
+protected:
+ aiMaterial *pcMat;
+};
+
+// ------------------------------------------------------------------------------------------------
+TEST_F(MaterialSystemTest, testFloatProperty) {
+ float pf = 150392.63f;
+ this->pcMat->AddProperty(&pf, 1, "testKey1");
+ pf = 0.0f;
+
+ EXPECT_EQ(AI_SUCCESS, pcMat->Get("testKey1", 0, 0, pf));
+ EXPECT_EQ(150392.63f, pf);
+}
+
+// ------------------------------------------------------------------------------------------------
+TEST_F(MaterialSystemTest, testFloatArrayProperty) {
+ float pf[] = { 0.0f, 1.0f, 2.0f, 3.0f };
+ unsigned int pMax = sizeof(pf) / sizeof(float);
+ this->pcMat->AddProperty(pf, pMax, "testKey2");
+ pf[0] = pf[1] = pf[2] = pf[3] = 12.0f;
+
+ EXPECT_EQ(AI_SUCCESS, pcMat->Get("testKey2", 0, 0, pf, &pMax));
+ EXPECT_EQ(sizeof(pf) / sizeof(float), static_cast<size_t>(pMax));
+ EXPECT_TRUE(!pf[0] && 1.0f == pf[1] && 2.0f == pf[2] && 3.0f == pf[3]);
+}
+
+// ------------------------------------------------------------------------------------------------
+TEST_F(MaterialSystemTest, testIntProperty) {
+ int pf = 15039263;
+ this->pcMat->AddProperty(&pf, 1, "testKey3");
+ pf = 12;
+
+ EXPECT_EQ(AI_SUCCESS, pcMat->Get("testKey3", 0, 0, pf));
+ EXPECT_EQ(15039263, pf);
+}
+
+// ------------------------------------------------------------------------------------------------
+TEST_F(MaterialSystemTest, testIntArrayProperty) {
+ int pf[] = { 0, 1, 2, 3 };
+ unsigned int pMax = sizeof(pf) / sizeof(int);
+ this->pcMat->AddProperty(pf, pMax, "testKey4");
+ pf[0] = pf[1] = pf[2] = pf[3] = 12;
+
+ EXPECT_EQ(AI_SUCCESS, pcMat->Get("testKey4", 0, 0, pf, &pMax));
+ EXPECT_EQ(sizeof(pf) / sizeof(int), pMax);
+ EXPECT_TRUE(!pf[0] && 1 == pf[1] && 2 == pf[2] && 3 == pf[3]);
+}
+
+// ------------------------------------------------------------------------------------------------
+TEST_F(MaterialSystemTest, testColorProperty) {
+ aiColor4D clr;
+ clr.r = 2.0f;
+ clr.g = 3.0f;
+ clr.b = 4.0f;
+ clr.a = 5.0f;
+ this->pcMat->AddProperty(&clr, 1, "testKey5");
+ clr.b = 1.0f;
+ clr.a = clr.g = clr.r = 0.0f;
+
+ EXPECT_EQ(AI_SUCCESS, pcMat->Get("testKey5", 0, 0, clr));
+ EXPECT_TRUE(clr.r == 2.0f && clr.g == 3.0f && clr.b == 4.0f && clr.a == 5.0f);
+}
+
+// ------------------------------------------------------------------------------------------------
+TEST_F(MaterialSystemTest, testStringProperty) {
+ aiString s;
+ s.Set("Hello, this is a small test");
+ this->pcMat->AddProperty(&s, "testKey6");
+ s.Set("358358");
+ EXPECT_EQ(AI_SUCCESS, pcMat->Get("testKey6", 0, 0, s));
+ EXPECT_STREQ("Hello, this is a small test", s.data);
+}
+
+// ------------------------------------------------------------------------------------------------
+TEST_F(MaterialSystemTest, testMaterialNameAccess) {
+ aiMaterial *mat = new aiMaterial();
+ EXPECT_NE(nullptr, mat);
+
+ aiString name = mat->GetName();
+ const int retValue(strncmp(name.C_Str(), AI_DEFAULT_MATERIAL_NAME, name.length));
+ EXPECT_EQ(0, retValue);
+
+ delete mat;
+}
diff --git a/libs/assimp/test/unit/utMatrix3x3.cpp b/libs/assimp/test/unit/utMatrix3x3.cpp
new file mode 100644
index 0000000..ae722a8
--- /dev/null
+++ b/libs/assimp/test/unit/utMatrix3x3.cpp
@@ -0,0 +1,99 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+
+#include "UnitTestPCH.h"
+#include <iostream>
+
+using namespace ::Assimp;
+
+class utMatrix3x3Test : public ::testing::Test {
+ // empty
+};
+
+TEST_F(utMatrix3x3Test, FromToMatrixTest) {
+ aiVector3D res;
+ aiMatrix3x3 trafo;
+
+ const double PRECISION = 0.000001;
+
+ // axes test
+ aiVector3D axes[] = { aiVector3D(1, 0, 0), aiVector3D(0, 1, 0), aiVector3D(0, 0, 1) };
+
+ for (int i = 0; i < 3; ++i) {
+ for (int j = 0; j < 3; ++j) {
+ aiMatrix3x3::FromToMatrix(axes[i], axes[j], trafo);
+ res = trafo * axes[i];
+
+ ASSERT_NEAR(axes[j].x, res.x, PRECISION);
+ ASSERT_NEAR(axes[j].y, res.y, PRECISION);
+ ASSERT_NEAR(axes[j].z, res.z, PRECISION);
+ }
+ }
+
+ // random test
+ const int NUM_SAMPLES = 10000;
+
+ aiVector3D from, to;
+
+ auto random_ratio = []() -> float {
+ return static_cast<float>(rand()) / static_cast<float>(RAND_MAX);
+ };
+
+ for (int i = 0; i < NUM_SAMPLES; ++i) {
+ from = aiVector3D(
+ 1.f * random_ratio(),
+ 1.f * random_ratio(),
+ 1.f * random_ratio())
+ .Normalize();
+ to = aiVector3D(
+ 1.f * random_ratio(),
+ 1.f * random_ratio(),
+ 1.f * random_ratio())
+ .Normalize();
+
+ aiMatrix3x3::FromToMatrix(from, to, trafo);
+ res = trafo * from;
+
+ ASSERT_NEAR(to.x, res.x, PRECISION);
+ ASSERT_NEAR(to.y, res.y, PRECISION);
+ ASSERT_NEAR(to.z, res.z, PRECISION);
+ }
+}
diff --git a/libs/assimp/test/unit/utMatrix4x4.cpp b/libs/assimp/test/unit/utMatrix4x4.cpp
new file mode 100644
index 0000000..0b85a8f
--- /dev/null
+++ b/libs/assimp/test/unit/utMatrix4x4.cpp
@@ -0,0 +1,92 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+
+#include "UnitTestPCH.h"
+
+using namespace Assimp;
+
+class utMatrix4x4 : public ::testing::Test {
+};
+
+TEST_F(utMatrix4x4, badIndexOperatorTest) {
+ aiMatrix4x4 m;
+ ai_real *a0 = m[4];
+ EXPECT_EQ(NULL, a0);
+}
+
+TEST_F(utMatrix4x4, indexOperatorTest) {
+ aiMatrix4x4 m;
+ ai_real *a0 = m[0];
+ EXPECT_FLOAT_EQ(1.0, *a0);
+ ai_real *a1 = a0 + 1;
+ EXPECT_FLOAT_EQ(0.0, *a1);
+ ai_real *a2 = a0 + 2;
+ EXPECT_FLOAT_EQ(0.0, *a2);
+ ai_real *a3 = a0 + 3;
+ EXPECT_FLOAT_EQ(0.0, *a3);
+
+ ai_real *a4 = m[1];
+ EXPECT_FLOAT_EQ(0.0, *a4);
+ ai_real *a5 = a4 + 1;
+ EXPECT_FLOAT_EQ(1.0, *a5);
+ ai_real *a6 = a4 + 2;
+ EXPECT_FLOAT_EQ(0.0, *a6);
+ ai_real *a7 = a4 + 3;
+ EXPECT_FLOAT_EQ(0.0, *a7);
+
+ ai_real *a8 = m[2];
+ EXPECT_FLOAT_EQ(0.0, *a8);
+ ai_real *a9 = a8 + 1;
+ EXPECT_FLOAT_EQ(0.0, *a9);
+ ai_real *a10 = a8 + 2;
+ EXPECT_FLOAT_EQ(1.0, *a10);
+ ai_real *a11 = a8 + 3;
+ EXPECT_FLOAT_EQ(0.0, *a11);
+
+ ai_real *a12 = m[3];
+ EXPECT_FLOAT_EQ(0.0, *a12);
+ ai_real *a13 = a12 + 1;
+ EXPECT_FLOAT_EQ(0.0, *a13);
+ ai_real *a14 = a12 + 2;
+ EXPECT_FLOAT_EQ(0.0, *a14);
+ ai_real *a15 = a12 + 3;
+ EXPECT_FLOAT_EQ(1.0, *a15);
+}
diff --git a/libs/assimp/test/unit/utMetadata.cpp b/libs/assimp/test/unit/utMetadata.cpp
new file mode 100644
index 0000000..6bd536d
--- /dev/null
+++ b/libs/assimp/test/unit/utMetadata.cpp
@@ -0,0 +1,272 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+
+#include "UnitTestPCH.h"
+
+#include <assimp/metadata.h>
+
+using namespace ::Assimp;
+
+class utMetadata: public ::testing::Test {
+protected:
+ aiMetadata *m_data;
+
+ void SetUp() override {
+ m_data = nullptr;
+ }
+
+ void TearDown() override {
+ aiMetadata::Dealloc( m_data );
+ }
+
+};
+
+TEST_F( utMetadata, creationTest ) {
+ bool ok( true );
+ try {
+ aiMetadata data;
+ } catch ( ... ) {
+ ok = false;
+ }
+ EXPECT_TRUE( ok );
+}
+
+TEST_F( utMetadata, allocTest ) {
+ aiMetadata *data = aiMetadata::Alloc( 0 );
+ EXPECT_EQ( nullptr, data );
+
+ data = aiMetadata::Alloc( 1 );
+ EXPECT_NE( nullptr, data );
+ EXPECT_EQ( 1U, data->mNumProperties );
+ EXPECT_NE( nullptr, data->mKeys );
+ EXPECT_NE( nullptr, data->mValues );
+ aiMetadata::Dealloc( data );
+}
+
+TEST_F( utMetadata, get_set_pod_Test ) {
+ m_data = aiMetadata::Alloc( 5 );
+
+ // int, 32 bit
+ unsigned int index( 0 );
+ bool success( false );
+ const std::string key_int = "test_int";
+ success = m_data->Set( index, key_int, 1 );
+ EXPECT_TRUE( success );
+ success = m_data->Set( index + 10, key_int, 1 );
+ EXPECT_FALSE( success );
+
+ // unsigned int, 64 bit
+ index++;
+ const std::string key_uint = "test_uint";
+ success = m_data->Set<uint64_t>( index, key_uint, 1UL );
+ EXPECT_TRUE( success );
+ uint64_t result_uint( 0 );
+ success = m_data->Get( key_uint, result_uint );
+ EXPECT_TRUE( success );
+ EXPECT_EQ( 1UL, result_uint );
+
+ // bool
+ index++;
+ const std::string key_bool = "test_bool";
+ success = m_data->Set( index, key_bool, true );
+ EXPECT_TRUE( success );
+ bool result_bool( false );
+ success = m_data->Get( key_bool, result_bool );
+ EXPECT_TRUE( success );
+ EXPECT_EQ( true, result_bool );
+
+ // float
+ index++;
+ const std::string key_float = "test_float";
+ float fVal = 2.0f;
+ success = m_data->Set( index, key_float, fVal );
+ EXPECT_TRUE( success );
+ float result_float( 0.0f );
+ success = m_data->Get( key_float, result_float );
+ EXPECT_TRUE( success );
+ EXPECT_FLOAT_EQ( 2.0f, result_float );
+
+ // double
+ index++;
+ const std::string key_double = "test_double";
+ double dVal = 3.0;
+ success = m_data->Set( index, key_double, dVal );
+ EXPECT_TRUE( success );
+ double result_double( 0.0 );
+ success = m_data->Get( key_double, result_double );
+ EXPECT_TRUE( success );
+ EXPECT_DOUBLE_EQ( 3.0, result_double );
+
+ // error
+ int result;
+ success = m_data->Get( "bla", result );
+ EXPECT_FALSE( success );
+}
+
+TEST_F( utMetadata, get_set_string_Test ) {
+ m_data = aiMetadata::Alloc( 1 );
+
+ unsigned int index( 0 );
+ bool success( false );
+ const std::string key = "test";
+ success = m_data->Set( index, key, aiString( std::string( "test" ) ) );
+ EXPECT_TRUE( success );
+
+ success = m_data->Set( index+10, key, aiString( std::string( "test" ) ) );
+ EXPECT_FALSE( success );
+
+ aiString result;
+ success = m_data->Get( key, result );
+ EXPECT_EQ( aiString( std::string( "test" ) ), result );
+ EXPECT_TRUE( success );
+
+ success = m_data->Get( "bla", result );
+ EXPECT_FALSE( success );
+}
+
+TEST_F( utMetadata, get_set_aiVector3D_Test ) {
+ m_data = aiMetadata::Alloc( 1 );
+
+ unsigned int index( 0 );
+ bool success( false );
+ const std::string key = "test";
+ aiVector3D vec( 1, 2, 3 );
+
+ success = m_data->Set( index, key, vec );
+ EXPECT_TRUE( success );
+
+ aiVector3D result( 0, 0, 0 );
+ success = m_data->Get( key, result );
+ EXPECT_EQ( vec, result );
+ EXPECT_TRUE( success );
+}
+
+TEST_F( utMetadata, copy_test ) {
+ m_data = aiMetadata::Alloc( AI_META_MAX );
+ bool bv = true;
+ m_data->Set( 0, "bool", bv );
+ int32_t i32v = -10;
+ m_data->Set( 1, "int32", i32v );
+ uint64_t ui64v = static_cast<uint64_t>( 10 );
+ m_data->Set( 2, "uint64", ui64v );
+ float fv = 1.0f;
+ m_data->Set( 3, "float", fv );
+ double dv = 2.0;
+ m_data->Set( 4, "double", dv );
+ const aiString strVal( std::string( "test" ) );
+ m_data->Set( 5, "aiString", strVal );
+ aiVector3D vecVal( 1, 2, 3 );
+ m_data->Set( 6, "aiVector3D", vecVal );
+ aiMetadata metaVal;
+ m_data->Set( 7, "aiMetadata", metaVal );
+
+ aiMetadata copy( *m_data );
+ EXPECT_EQ( 8u, copy.mNumProperties );
+
+ // bool test
+ {
+ bool v;
+ EXPECT_TRUE( copy.Get( "bool", v ) );
+ EXPECT_EQ( bv, v );
+ }
+
+ // int32_t test
+ {
+ int32_t v = 0;
+ bool ok = copy.Get( "int32", v );
+ EXPECT_TRUE( ok );
+ EXPECT_EQ( i32v, v );
+ }
+
+ // uint64_t test
+ {
+ uint64_t v;
+ bool ok = copy.Get( "uint64", v );
+ EXPECT_TRUE( ok );
+ EXPECT_EQ( ui64v, v );
+ }
+
+ // float test
+ {
+ float v;
+ EXPECT_TRUE( copy.Get( "float", v ) );
+ EXPECT_EQ( fv, v );
+ }
+
+ // double test
+ {
+ double v;
+ EXPECT_TRUE( copy.Get( "double", v ) );
+ EXPECT_EQ( dv, v );
+ }
+
+ // bool test
+ {
+ aiString v;
+ EXPECT_TRUE( copy.Get( "aiString", v ) );
+ EXPECT_EQ( strVal, v );
+ }
+
+ // bool test
+ {
+ aiVector3D v;
+ EXPECT_TRUE( copy.Get( "aiVector3D", v ) );
+ EXPECT_EQ( vecVal, v );
+ }
+
+ // metadata test
+ {
+ aiMetadata v;
+ EXPECT_TRUE( copy.Get( "aiMetadata", v ) );
+ EXPECT_EQ( metaVal, v );
+ }
+}
+
+TEST_F( utMetadata, set_test ) {
+ aiMetadata v;
+ const std::string key_bool = "test_bool";
+ v.Set(1, key_bool, true);
+ v.Set(1, key_bool, true);
+ v.Set(1, key_bool, true);
+ v.Set(1, key_bool, true);
+}
diff --git a/libs/assimp/test/unit/utNoBoostTest.cpp b/libs/assimp/test/unit/utNoBoostTest.cpp
new file mode 100644
index 0000000..cb6c391
--- /dev/null
+++ b/libs/assimp/test/unit/utNoBoostTest.cpp
@@ -0,0 +1,112 @@
+/*
+---------------------------------------------------------------------------
+Open Asset Import Library (assimp)
+---------------------------------------------------------------------------
+
+Copyright (c) 2006-2020, assimp team
+
+All rights reserved.
+
+Redistribution and use of this software in source and binary forms,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "UnitTestPCH.h"
+
+#include "BoostWorkaround/boost/tuple/tuple.hpp"
+
+#define ASSIMP_FORCE_NOBOOST
+#include "BoostWorkaround/boost/format.hpp"
+#include <assimp/TinyFormatter.h>
+
+
+using namespace std;
+using namespace Assimp;
+using namespace Assimp::Formatter;
+
+// ------------------------------------------------------------------------------------------------
+TEST(NoBoostTest, testFormat)
+{
+ EXPECT_EQ( "Ahoi!", boost::str( boost::format("Ahoi!") ));
+ EXPECT_EQ( "Ahoi! %", boost::str( boost::format("Ahoi! %%") ));
+ EXPECT_EQ( "Ahoi! ", boost::str( boost::format("Ahoi! %s") ));
+ EXPECT_EQ( "Ahoi! !!", boost::str( boost::format("Ahoi! %s") % "!!" ));
+ EXPECT_EQ( "Ahoi! !!", boost::str( boost::format("Ahoi! %s") % "!!" % "!!" ));
+ EXPECT_EQ( "abc", boost::str( boost::format("%s%s%s") % "a" % std::string("b") % "c" ));
+}
+
+struct another
+{
+ int dummy;
+};
+
+// ------------------------------------------------------------------------------------------------
+TEST(NoBoostTest, Tuple) {
+ // Implicit conversion
+ boost::tuple<unsigned,unsigned,unsigned> first = boost::make_tuple(4,4,4);
+ EXPECT_EQ(4U, first.get<0>());
+ EXPECT_EQ(4U, first.get<1>());
+ EXPECT_EQ(4U, first.get<2>());
+
+ boost::tuple<int, float, double, bool, another> second=
+ boost::make_tuple(1,1.0f,0.0,false,another());
+ bool b = second.get<3>();
+
+ // check empty tuple
+ boost::tuple<> third;
+ third;
+
+ // FIXME: Explicit conversion not really required yet
+ boost::tuple<float,float,float> last =
+ (boost::tuple<float,float,float>)boost::make_tuple(1.,2.,3.);
+ EXPECT_EQ(1.f, last.get<0>());
+ EXPECT_EQ(2.f, last.get<1>());
+ EXPECT_EQ(3.f, last.get<2>());
+
+ // Non-const access
+ first.get<0>() = 1;
+ first.get<1>() = 2;
+ first.get<2>() = 3;
+ EXPECT_EQ(1U, first.get<0>());
+ EXPECT_EQ(2U, first.get<1>());
+ EXPECT_EQ(3U, first.get<2>());
+
+ // Const cases
+ const boost::tuple<unsigned,unsigned,unsigned> constant = boost::make_tuple(5,5,5);
+ first.get<0>() = constant.get<0>();
+ EXPECT_EQ(5U, constant.get<0>());
+ EXPECT_EQ(5U, first.get<0>());
+
+ // Direct assignment w. explicit conversion
+ last = first;
+ EXPECT_EQ(5.f, last.get<0>());
+ EXPECT_EQ(2.f, last.get<1>());
+ EXPECT_EQ(3.f, last.get<2>());
+}
diff --git a/libs/assimp/test/unit/utObjImportExport.cpp b/libs/assimp/test/unit/utObjImportExport.cpp
new file mode 100644
index 0000000..58eace0
--- /dev/null
+++ b/libs/assimp/test/unit/utObjImportExport.cpp
@@ -0,0 +1,479 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+
+#include "AbstractImportExportBase.h"
+#include "SceneDiffer.h"
+#include "UnitTestPCH.h"
+#include <assimp/postprocess.h>
+#include <assimp/scene.h>
+#include <assimp/Exporter.hpp>
+#include <assimp/Importer.hpp>
+
+using namespace Assimp;
+
+static const float VertComponents[24 * 3] = {
+ -0.500000, 0.500000, 0.500000,
+ -0.500000, 0.500000, -0.500000,
+ -0.500000, -0.500000, -0.500000,
+ -0.500000, -0.500000, 0.500000,
+ -0.500000, -0.500000, -0.500000,
+ 0.500000, -0.500000, -0.500000,
+ 0.500000, -0.500000, 0.500000,
+ -0.500000, -0.500000, 0.500000,
+ -0.500000, 0.500000, -0.500000,
+ 0.500000, 0.500000, -0.500000,
+ 0.500000, -0.500000, -0.500000,
+ -0.500000, -0.500000, -0.500000,
+ 0.500000, 0.500000, 0.500000,
+ 0.500000, 0.500000, -0.500000,
+ -0.500000, 0.500000, -0.500000,
+ -0.500000, 0.500000, 0.500000,
+ 0.500000, -0.500000, 0.500000,
+ 0.500000, 0.500000, 0.500000,
+ -0.500000, 0.500000, 0.500000,
+ -0.500000, -0.500000, 0.500000,
+ 0.500000, -0.500000, -0.500000,
+ 0.500000, 0.500000, -0.500000,
+ 0.500000, 0.500000, 0.500000f,
+ 0.500000, -0.500000, 0.500000f
+};
+
+static const char *ObjModel =
+ "o 1\n"
+ "\n"
+ "# Vertex list\n"
+ "\n"
+ "v -0.5 -0.5 0.5\n"
+ "v -0.5 -0.5 -0.5\n"
+ "v -0.5 0.5 -0.5\n"
+ "v -0.5 0.5 0.5\n"
+ "v 0.5 -0.5 0.5\n"
+ "v 0.5 -0.5 -0.5\n"
+ "v 0.5 0.5 -0.5\n"
+ "v 0.5 0.5 0.5\n"
+ "\n"
+ "# Point / Line / Face list\n"
+ "\n"
+ "g Box01\n"
+ "usemtl Default\n"
+ "f 4 3 2 1\n"
+ "f 2 6 5 1\n"
+ "f 3 7 6 2\n"
+ "f 8 7 3 4\n"
+ "f 5 8 4 1\n"
+ "f 6 7 8 5\n"
+ "\n"
+ "# End of file\n";
+
+static const char *ObjModel_Issue1111 =
+ "o 1\n"
+ "\n"
+ "# Vertex list\n"
+ "\n"
+ "v -0.5 -0.5 0.5\n"
+ "v -0.5 -0.5 -0.5\n"
+ "v -0.5 0.5 -0.5\n"
+ "\n"
+ "usemtl\n"
+ "f 1 2 3\n"
+ "\n"
+ "# End of file\n";
+
+class utObjImportExport : public AbstractImportExportBase {
+protected:
+ void SetUp() override {
+ m_im = new Assimp::Importer;
+ }
+
+ void TearDown() override {
+ delete m_im;
+ m_im = nullptr;
+ }
+
+ aiScene *createScene() {
+ aiScene *expScene = new aiScene;
+ expScene->mNumMeshes = 1;
+ expScene->mMeshes = new aiMesh *[1];
+ aiMesh *mesh = new aiMesh;
+ mesh->mName.Set("Box01");
+ mesh->mNumVertices = 24;
+ mesh->mVertices = new aiVector3D[24];
+ ::memcpy(&mesh->mVertices->x, &VertComponents[0], sizeof(float) * 24 * 3);
+ mesh->mNumFaces = 6;
+ mesh->mFaces = new aiFace[mesh->mNumFaces];
+
+ mesh->mFaces[0].mNumIndices = 4;
+ mesh->mFaces[0].mIndices = new unsigned int[mesh->mFaces[0].mNumIndices];
+ mesh->mFaces[0].mIndices[0] = 0;
+ mesh->mFaces[0].mIndices[1] = 1;
+ mesh->mFaces[0].mIndices[2] = 2;
+ mesh->mFaces[0].mIndices[3] = 3;
+
+ mesh->mFaces[1].mNumIndices = 4;
+ mesh->mFaces[1].mIndices = new unsigned int[mesh->mFaces[0].mNumIndices];
+ mesh->mFaces[1].mIndices[0] = 4;
+ mesh->mFaces[1].mIndices[1] = 5;
+ mesh->mFaces[1].mIndices[2] = 6;
+ mesh->mFaces[1].mIndices[3] = 7;
+
+ mesh->mFaces[2].mNumIndices = 4;
+ mesh->mFaces[2].mIndices = new unsigned int[mesh->mFaces[0].mNumIndices];
+ mesh->mFaces[2].mIndices[0] = 8;
+ mesh->mFaces[2].mIndices[1] = 9;
+ mesh->mFaces[2].mIndices[2] = 10;
+ mesh->mFaces[2].mIndices[3] = 11;
+
+ mesh->mFaces[3].mNumIndices = 4;
+ mesh->mFaces[3].mIndices = new unsigned int[mesh->mFaces[0].mNumIndices];
+ mesh->mFaces[3].mIndices[0] = 12;
+ mesh->mFaces[3].mIndices[1] = 13;
+ mesh->mFaces[3].mIndices[2] = 14;
+ mesh->mFaces[3].mIndices[3] = 15;
+
+ mesh->mFaces[4].mNumIndices = 4;
+ mesh->mFaces[4].mIndices = new unsigned int[mesh->mFaces[0].mNumIndices];
+ mesh->mFaces[4].mIndices[0] = 16;
+ mesh->mFaces[4].mIndices[1] = 17;
+ mesh->mFaces[4].mIndices[2] = 18;
+ mesh->mFaces[4].mIndices[3] = 19;
+
+ mesh->mFaces[5].mNumIndices = 4;
+ mesh->mFaces[5].mIndices = new unsigned int[mesh->mFaces[0].mNumIndices];
+ mesh->mFaces[5].mIndices[0] = 20;
+ mesh->mFaces[5].mIndices[1] = 21;
+ mesh->mFaces[5].mIndices[2] = 22;
+ mesh->mFaces[5].mIndices[3] = 23;
+
+ expScene->mMeshes[0] = mesh;
+
+ expScene->mNumMaterials = 1;
+ expScene->mMaterials = new aiMaterial *[expScene->mNumMaterials];
+
+ return expScene;
+ }
+
+ bool importerTest() override {
+ ::Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/OBJ/spider.obj", aiProcess_ValidateDataStructure);
+ return nullptr != scene;
+ }
+
+#ifndef ASSIMP_BUILD_NO_EXPORT
+
+ bool exporterTest() override {
+ ::Assimp::Importer importer;
+ ::Assimp::Exporter exporter;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/OBJ/spider.obj", aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+ EXPECT_EQ(aiReturn_SUCCESS, exporter.Export(scene, "obj", ASSIMP_TEST_MODELS_DIR "/OBJ/spider_out.obj"));
+ EXPECT_EQ(aiReturn_SUCCESS, exporter.Export(scene, "objnomtl", ASSIMP_TEST_MODELS_DIR "/OBJ/spider_nomtl_out.obj"));
+
+ return true;
+ }
+
+#endif // ASSIMP_BUILD_NO_EXPORT
+
+protected:
+ ::Assimp::Importer *m_im;
+ aiScene *m_expectedScene;
+};
+
+TEST_F(utObjImportExport, importObjFromFileTest) {
+ EXPECT_TRUE(importerTest());
+}
+
+#ifndef ASSIMP_BUILD_NO_EXPORT
+
+TEST_F(utObjImportExport, exportObjFromFileTest) {
+ EXPECT_TRUE(exporterTest());
+}
+
+#endif // ASSIMP_BUILD_NO_EXPORT
+
+TEST_F(utObjImportExport, obj_import_test) {
+ const aiScene *scene = m_im->ReadFileFromMemory((void *)ObjModel, strlen(ObjModel), 0);
+ aiScene *expected = createScene();
+ EXPECT_NE(nullptr, scene);
+
+ SceneDiffer differ;
+ EXPECT_TRUE(differ.isEqual(expected, scene));
+ differ.showReport();
+
+ m_im->FreeScene();
+ for (unsigned int i = 0; i < expected->mNumMeshes; ++i) {
+ delete expected->mMeshes[i];
+ }
+ delete[] expected->mMeshes;
+ expected->mMeshes = nullptr;
+ delete[] expected->mMaterials;
+ expected->mMaterials = nullptr;
+ delete expected;
+}
+
+TEST_F(utObjImportExport, issue1111_no_mat_name_Test) {
+ const aiScene *scene = m_im->ReadFileFromMemory((void *)ObjModel_Issue1111, strlen(ObjModel_Issue1111), 0);
+ EXPECT_NE(nullptr, scene);
+}
+
+TEST_F(utObjImportExport, issue809_vertex_color_Test) {
+ ::Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/OBJ/cube_with_vertexcolors.obj", aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+
+#ifndef ASSIMP_BUILD_NO_EXPORT
+ ::Assimp::Exporter exporter;
+ EXPECT_EQ(aiReturn_SUCCESS, exporter.Export(scene, "obj", ASSIMP_TEST_MODELS_DIR "/OBJ/test_out.obj"));
+#endif // ASSIMP_BUILD_NO_EXPORT
+}
+
+TEST_F(utObjImportExport, issue1923_vertex_color_Test) {
+ ::Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/OBJ/cube_with_vertexcolors_uni.obj", aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+
+ scene = importer.GetOrphanedScene();
+
+#ifndef ASSIMP_BUILD_NO_EXPORT
+ ::Assimp::Exporter exporter;
+ const aiExportDataBlob *blob = exporter.ExportToBlob(scene, "obj");
+ EXPECT_NE(nullptr, blob);
+
+ const aiScene *sceneReImport = importer.ReadFileFromMemory(blob->data, blob->size, aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+
+ SceneDiffer differ;
+ EXPECT_TRUE(differ.isEqual(scene, sceneReImport));
+#endif // ASSIMP_BUILD_NO_EXPORT
+
+ delete scene;
+}
+
+TEST_F(utObjImportExport, issue1453_segfault) {
+ static const char *curObjModel =
+ "v 0.0 0.0 0.0\n"
+ "v 0.0 0.0 1.0\n"
+ "v 0.0 1.0 0.0\n"
+ "v 0.0 1.0 1.0\n"
+ "v 1.0 0.0 0.0\n"
+ "v 1.0 0.0 1.0\n"
+ "v 1.0 1.0 0.0\n"
+ "v 1.0 1.0 1.0\nB";
+
+ Assimp::Importer myimporter;
+ const aiScene *scene = myimporter.ReadFileFromMemory(curObjModel, strlen(curObjModel), aiProcess_ValidateDataStructure);
+ EXPECT_EQ(nullptr, scene);
+}
+
+TEST_F(utObjImportExport, relative_indices_Test) {
+ static const char *curObjModel =
+ "v -0.500000 0.000000 0.400000\n"
+ "v -0.500000 0.000000 -0.800000\n"
+ "v -0.500000 1.000000 -0.800000\n"
+ "v -0.500000 1.000000 0.400000\n"
+ "f -4 -3 -2 -1\nB";
+
+ Assimp::Importer myimporter;
+ const aiScene *scene = myimporter.ReadFileFromMemory(curObjModel, strlen(curObjModel), aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+
+ EXPECT_EQ(scene->mNumMeshes, 1U);
+ const aiMesh *mesh = scene->mMeshes[0];
+ EXPECT_EQ(mesh->mNumVertices, 4U);
+ EXPECT_EQ(mesh->mNumFaces, 1U);
+ const aiFace face = mesh->mFaces[0];
+ EXPECT_EQ(face.mNumIndices, 4U);
+ for (unsigned int i = 0; i < face.mNumIndices; ++i) {
+ EXPECT_EQ(face.mIndices[i], i);
+ }
+}
+
+TEST_F(utObjImportExport, homogeneous_coordinates_Test) {
+ static const char *curObjModel =
+ "v -0.500000 0.000000 0.400000 0.50000\n"
+ "v -0.500000 0.000000 -0.800000 1.00000\n"
+ "v 0.500000 1.000000 -0.800000 0.5000\n"
+ "f 1 2 3\nB";
+
+ Assimp::Importer myimporter;
+ const aiScene *scene = myimporter.ReadFileFromMemory(curObjModel, strlen(curObjModel), aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+
+ EXPECT_EQ(scene->mNumMeshes, 1U);
+ const aiMesh *mesh = scene->mMeshes[0];
+ EXPECT_EQ(mesh->mNumVertices, 3U);
+ EXPECT_EQ(mesh->mNumFaces, 1U);
+ const aiFace face = mesh->mFaces[0];
+ EXPECT_EQ(face.mNumIndices, 3U);
+ const aiVector3D vertice = mesh->mVertices[0];
+ EXPECT_EQ(vertice.x, -1.0f);
+ EXPECT_EQ(vertice.y, 0.0f);
+ EXPECT_EQ(vertice.z, 0.8f);
+}
+
+TEST_F(utObjImportExport, homogeneous_coordinates_divide_by_zero_Test) {
+ static const char *curObjModel =
+ "v -0.500000 0.000000 0.400000 0.\n"
+ "v -0.500000 0.000000 -0.800000 1.00000\n"
+ "v 0.500000 1.000000 -0.800000 0.5000\n"
+ "f 1 2 3\nB";
+
+ Assimp::Importer myimporter;
+ const aiScene *scene = myimporter.ReadFileFromMemory(curObjModel, std::strlen(curObjModel), aiProcess_ValidateDataStructure);
+ EXPECT_EQ(nullptr, scene);
+}
+
+TEST_F(utObjImportExport, 0based_array_Test) {
+ static const char *curObjModel =
+ "v -0.500000 0.000000 0.400000\n"
+ "v -0.500000 0.000000 -0.800000\n"
+ "v -0.500000 1.000000 -0.800000\n"
+ "f 0 1 2\nB";
+
+ Assimp::Importer myImporter;
+ const aiScene *scene = myImporter.ReadFileFromMemory(curObjModel, strlen(curObjModel), 0);
+ EXPECT_EQ(nullptr, scene);
+}
+
+TEST_F(utObjImportExport, invalid_normals_uvs) {
+ static const char *curObjModel =
+ "v -0.500000 0.000000 0.400000\n"
+ "v -0.500000 0.000000 -0.800000\n"
+ "v -0.500000 1.000000 -0.800000\n"
+ "vt 0 0\n"
+ "vn 0 1 0\n"
+ "f 1/1/1 1/1/1 2/2/2\nB";
+
+ Assimp::Importer myImporter;
+ const aiScene *scene = myImporter.ReadFileFromMemory(curObjModel, strlen(curObjModel), 0);
+ EXPECT_NE(nullptr, scene);
+}
+
+TEST_F(utObjImportExport, no_vt_just_vns) {
+ static const char *curObjModel =
+ "v 0 0 0\n"
+ "v 0 0 0\n"
+ "v 0 0 0\n"
+ "v 0 0 0\n"
+ "v 0 0 0\n"
+ "v 0 0 0\n"
+ "v 0 0 0\n"
+ "v 0 0 0\n"
+ "v 0 0 0\n"
+ "v 0 0 0\n"
+ "v 10 0 0\n"
+ "v 0 10 0\n"
+ "vn 0 0 1\n"
+ "vn 0 0 1\n"
+ "vn 0 0 1\n"
+ "vn 0 0 1\n"
+ "vn 0 0 1\n"
+ "vn 0 0 1\n"
+ "vn 0 0 1\n"
+ "vn 0 0 1\n"
+ "vn 0 0 1\n"
+ "vn 0 0 1\n"
+ "vn 0 0 1\n"
+ "vn 0 0 1\n"
+ "f 10/10 11/11 12/12\n";
+
+ Assimp::Importer myImporter;
+ const aiScene *scene = myImporter.ReadFileFromMemory(curObjModel, strlen(curObjModel), 0);
+ EXPECT_NE(nullptr, scene);
+}
+
+TEST_F(utObjImportExport, mtllib_after_g) {
+ ::Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/OBJ/cube_mtllib_after_g.obj", aiProcess_ValidateDataStructure);
+ ASSERT_NE(nullptr, scene);
+
+ EXPECT_EQ(scene->mNumMeshes, 1U);
+ const aiMesh *mesh = scene->mMeshes[0];
+ const aiMaterial *mat = scene->mMaterials[mesh->mMaterialIndex];
+ aiString name;
+ ASSERT_EQ(aiReturn_SUCCESS, mat->Get(AI_MATKEY_NAME, name));
+ EXPECT_STREQ("MyMaterial", name.C_Str());
+}
+
+TEST_F(utObjImportExport, import_point_cloud) {
+ ::Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/OBJ/point_cloud.obj", 0);
+ ASSERT_NE(nullptr, scene);
+}
+
+TEST_F(utObjImportExport, import_without_linend) {
+ Assimp::Importer myImporter;
+ const aiScene *scene = myImporter.ReadFile(ASSIMP_TEST_MODELS_DIR "/OBJ/box_without_lineending.obj", 0);
+ ASSERT_NE(nullptr, scene);
+}
+
+TEST_F(utObjImportExport, import_with_line_continuations) {
+ static const char *curObjModel =
+ "v -0.5 -0.5 0.5\n"
+ "v -0.5 \\\n"
+ " -0.5 -0.5\n"
+ "v -0.5 \\\n"
+ " 0.5 \\\n"
+ " -0.5\n"
+ "f 1 2 3\n";
+
+ Assimp::Importer myImporter;
+ const aiScene *scene = myImporter.ReadFileFromMemory(curObjModel, strlen(curObjModel), 0);
+ EXPECT_NE(nullptr, scene);
+
+ EXPECT_EQ(scene->mNumMeshes, 1U);
+ EXPECT_EQ(scene->mMeshes[0]->mNumVertices, 3U);
+ EXPECT_EQ(scene->mMeshes[0]->mNumFaces, 1U);
+
+ auto vertices = scene->mMeshes[0]->mVertices;
+ const float threshold = 0.0001f;
+
+ EXPECT_NEAR(vertices[0].x, -0.5f, threshold);
+ EXPECT_NEAR(vertices[0].y, -0.5f, threshold);
+ EXPECT_NEAR(vertices[0].z, 0.5f, threshold);
+
+ EXPECT_NEAR(vertices[1].x, -0.5f, threshold);
+ EXPECT_NEAR(vertices[1].y, -0.5f, threshold);
+ EXPECT_NEAR(vertices[1].z, -0.5f, threshold);
+
+ EXPECT_NEAR(vertices[2].x, -0.5f, threshold);
+ EXPECT_NEAR(vertices[2].y, 0.5f, threshold);
+ EXPECT_NEAR(vertices[2].z, -0.5f, threshold);
+}
diff --git a/libs/assimp/test/unit/utObjTools.cpp b/libs/assimp/test/unit/utObjTools.cpp
new file mode 100644
index 0000000..744e226
--- /dev/null
+++ b/libs/assimp/test/unit/utObjTools.cpp
@@ -0,0 +1,116 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "AssetLib/Obj/ObjFileParser.h"
+#include "AssetLib/Obj/ObjTools.h"
+#include "UnitTestPCH.h"
+
+using namespace ::Assimp;
+
+class utObjTools : public ::testing::Test {
+ // empty
+};
+
+class TestObjFileParser : public ObjFileParser {
+public:
+ TestObjFileParser() :
+ ObjFileParser() {
+ // empty
+ }
+
+ ~TestObjFileParser() {
+ // empty
+ }
+
+ void testCopyNextWord(char *pBuffer, size_t length) {
+ copyNextWord(pBuffer, length);
+ }
+
+ size_t testGetNumComponentsInDataDefinition() {
+ return getNumComponentsInDataDefinition();
+ }
+};
+
+TEST_F(utObjTools, skipDataLine_OneLine_Success) {
+ std::vector<char> buffer;
+ std::string data("v -0.5 -0.5 0.5\nend");
+ buffer.resize(data.size());
+ ::memcpy(&buffer[0], &data[0], data.size());
+ std::vector<char>::iterator itBegin(buffer.begin()), itEnd(buffer.end());
+ unsigned int line = 0;
+ std::vector<char>::iterator current = skipLine<std::vector<char>::iterator>(itBegin, itEnd, line);
+ EXPECT_EQ('e', *current);
+}
+
+TEST_F(utObjTools, skipDataLine_TwoLines_Success) {
+ TestObjFileParser test_parser;
+ std::string data("vn -2.061493116917992e-15 -0.9009688496589661 \\\n-0.4338837265968323");
+ std::vector<char> buffer;
+ buffer.resize(data.size());
+ ::memcpy(&buffer[0], &data[0], data.size());
+ test_parser.setBuffer(buffer);
+ static const size_t Size = 4096UL;
+ char data_buffer[Size];
+
+ test_parser.testCopyNextWord(data_buffer, Size);
+ EXPECT_EQ(0, strncmp(data_buffer, "vn", 2));
+
+ test_parser.testCopyNextWord(data_buffer, Size);
+ EXPECT_EQ(data_buffer[0], '-');
+
+ test_parser.testCopyNextWord(data_buffer, Size);
+ EXPECT_EQ(data_buffer[0], '-');
+
+ test_parser.testCopyNextWord(data_buffer, Size);
+ EXPECT_EQ(data_buffer[0], '-');
+}
+
+TEST_F(utObjTools, countComponents_TwoLines_Success) {
+ TestObjFileParser test_parser;
+ std::string data("-2.061493116917992e-15 -0.9009688496589661 \\\n-0.4338837265968323");
+ std::vector<char> buffer;
+ buffer.resize(data.size() + 1);
+ ::memcpy(&buffer[0], &data[0], data.size());
+ buffer[buffer.size() - 1] = '\0';
+ test_parser.setBuffer(buffer);
+
+ size_t numComps = test_parser.testGetNumComponentsInDataDefinition();
+ EXPECT_EQ(3U, numComps);
+}
diff --git a/libs/assimp/test/unit/utOpenGEXImportExport.cpp b/libs/assimp/test/unit/utOpenGEXImportExport.cpp
new file mode 100644
index 0000000..a7b6820
--- /dev/null
+++ b/libs/assimp/test/unit/utOpenGEXImportExport.cpp
@@ -0,0 +1,72 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+
+#include "AbstractImportExportBase.h"
+#include "UnitTestPCH.h"
+
+#include <assimp/Importer.hpp>
+
+using namespace Assimp;
+
+class utOpenGEXImportExport : public AbstractImportExportBase {
+public:
+ bool importerTest() override {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/OpenGEX/Example.ogex", 0);
+ return nullptr != scene;
+ }
+};
+
+TEST_F(utOpenGEXImportExport, importLWSFromFileTest) {
+ EXPECT_TRUE(importerTest());
+}
+
+TEST_F(utOpenGEXImportExport, Importissue1262_NoCrash) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/OpenGEX/light_issue1262.ogex", 0);
+ EXPECT_NE(nullptr, scene);
+}
+
+TEST_F(utOpenGEXImportExport, Importissue1340_EmptyCameraObject) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/OpenGEX/empty_camera.ogex", 0);
+ EXPECT_NE(nullptr, scene);
+}
diff --git a/libs/assimp/test/unit/utPLYImportExport.cpp b/libs/assimp/test/unit/utPLYImportExport.cpp
new file mode 100644
index 0000000..2edbdd7
--- /dev/null
+++ b/libs/assimp/test/unit/utPLYImportExport.cpp
@@ -0,0 +1,182 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "UnitTestPCH.h"
+
+#include "AbstractImportExportBase.h"
+#include <assimp/postprocess.h>
+#include <assimp/scene.h>
+#include <assimp/Exporter.hpp>
+#include <assimp/Importer.hpp>
+
+using namespace ::Assimp;
+
+class utPLYImportExport : public AbstractImportExportBase {
+public:
+ virtual bool importerTest() {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/PLY/cube.ply", aiProcess_ValidateDataStructure);
+ EXPECT_EQ(1u, scene->mNumMeshes);
+ EXPECT_NE(nullptr, scene->mMeshes[0]);
+ if (nullptr == scene->mMeshes[0]) {
+ return false;
+ }
+ EXPECT_EQ(8u, scene->mMeshes[0]->mNumVertices);
+ EXPECT_EQ(6u, scene->mMeshes[0]->mNumFaces);
+
+ return (nullptr != scene);
+ }
+
+#ifndef ASSIMP_BUILD_NO_EXPORT
+ virtual bool exporterTest() {
+ Importer importer;
+ Exporter exporter;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/PLY/cube.ply", aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+ EXPECT_EQ(aiReturn_SUCCESS, exporter.Export(scene, "ply", ASSIMP_TEST_MODELS_DIR "/PLY/cube_out.ply"));
+
+ return true;
+ }
+#endif // ASSIMP_BUILD_NO_EXPORT
+};
+
+TEST_F(utPLYImportExport, importTest_Success) {
+ EXPECT_TRUE(importerTest());
+}
+
+#ifndef ASSIMP_BUILD_NO_EXPORT
+
+TEST_F(utPLYImportExport, exportTest_Success) {
+ EXPECT_TRUE(exporterTest());
+}
+
+#endif // ASSIMP_BUILD_NO_EXPORT
+
+//Test issue 1623, crash when loading two PLY files in a row
+TEST_F(utPLYImportExport, importerMultipleTest) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/PLY/cube.ply", aiProcess_ValidateDataStructure);
+
+ EXPECT_NE(nullptr, scene);
+
+ scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/PLY/cube.ply", aiProcess_ValidateDataStructure);
+
+ EXPECT_NE(nullptr, scene);
+ EXPECT_NE(nullptr, scene->mMeshes[0]);
+ EXPECT_EQ(6u, scene->mMeshes[0]->mNumFaces);
+}
+
+TEST_F(utPLYImportExport, importPLYwithUV) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/PLY/cube_uv.ply", aiProcess_ValidateDataStructure);
+
+ EXPECT_NE(nullptr, scene);
+ EXPECT_NE(nullptr, scene->mMeshes[0]);
+ //This test model is using n-gons, so 6 faces instead of 12 tris
+ EXPECT_EQ(6u, scene->mMeshes[0]->mNumFaces);
+ EXPECT_EQ(aiPrimitiveType_POLYGON, scene->mMeshes[0]->mPrimitiveTypes);
+ EXPECT_EQ(true, scene->mMeshes[0]->HasTextureCoords(0));
+}
+
+TEST_F(utPLYImportExport, importBinaryPLY) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/PLY/cube_binary.ply", aiProcess_ValidateDataStructure);
+
+ EXPECT_NE(nullptr, scene);
+ EXPECT_NE(nullptr, scene->mMeshes[0]);
+ //This test model is double sided, so 12 faces instead of 6
+ EXPECT_EQ(12u, scene->mMeshes[0]->mNumFaces);
+}
+
+TEST_F(utPLYImportExport, vertexColorTest) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/PLY/float-color.ply", aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+ EXPECT_EQ(1u, scene->mMeshes[0]->mNumFaces);
+ EXPECT_EQ(aiPrimitiveType_TRIANGLE, scene->mMeshes[0]->mPrimitiveTypes);
+ EXPECT_EQ(true, scene->mMeshes[0]->HasVertexColors(0));
+
+ auto first_face = scene->mMeshes[0]->mFaces[0];
+ EXPECT_EQ(3u, first_face.mNumIndices);
+ EXPECT_EQ(0u, first_face.mIndices[0]);
+ EXPECT_EQ(1u, first_face.mIndices[1]);
+ EXPECT_EQ(2u, first_face.mIndices[2]);
+}
+
+// Test issue #623, PLY importer should not automatically create faces
+TEST_F(utPLYImportExport, pointcloudTest) {
+ Assimp::Importer importer;
+
+ //Could not use aiProcess_ValidateDataStructure since it's missing faces.
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/PLY/issue623.ply", 0);
+ EXPECT_NE(nullptr, scene);
+
+ EXPECT_EQ(1u, scene->mNumMeshes);
+ EXPECT_NE(nullptr, scene->mMeshes[0]);
+ EXPECT_EQ(24u, scene->mMeshes[0]->mNumVertices);
+ EXPECT_EQ(aiPrimitiveType::aiPrimitiveType_POINT, scene->mMeshes[0]->mPrimitiveTypes);
+ EXPECT_EQ(0u, scene->mMeshes[0]->mNumFaces);
+}
+
+static const char *test_file =
+ "ply\n"
+ "format ascii 1.0\n"
+ "element vertex 4\n"
+ "property float x\n"
+ "property float y\n"
+ "property float z\n"
+ "property uchar red\n"
+ "property uchar green\n"
+ "property uchar blue\n"
+ "property float nx\n"
+ "property float ny\n"
+ "property float nz\n"
+ "end_header\n"
+ "0.0 0.0 0.0 255 255 255 0.0 1.0 0.0\n"
+ "0.0 0.0 1.0 255 0 255 0.0 0.0 1.0\n"
+ "0.0 1.0 0.0 255 255 0 1.0 0.0 0.0\n"
+ "0.0 1.0 1.0 0 255 255 1.0 1.0 0.0\n";
+
+TEST_F(utPLYImportExport, parseErrorTest) {
+ Assimp::Importer importer;
+ //Could not use aiProcess_ValidateDataStructure since it's missing faces.
+ const aiScene *scene = importer.ReadFileFromMemory(test_file, strlen(test_file), 0);
+ EXPECT_NE(nullptr, scene);
+}
diff --git a/libs/assimp/test/unit/utPMXImporter.cpp b/libs/assimp/test/unit/utPMXImporter.cpp
new file mode 100644
index 0000000..a0d663d
--- /dev/null
+++ b/libs/assimp/test/unit/utPMXImporter.cpp
@@ -0,0 +1,62 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+
+#include "UnitTestPCH.h"
+#include "AbstractImportExportBase.h"
+#include "AssetLib/MMD/MMDImporter.h"
+
+#include <assimp/Importer.hpp>
+
+using namespace ::Assimp;
+
+class utPMXImporter : public AbstractImportExportBase {
+public:
+ virtual bool importerTest() {
+ Assimp::Importer importer;
+ /*const aiScene *scene = importer.ReadFile( ASSIMP_TEST_MODELS_DIR "/../models-nonbsd/MMD/Alicia_blade.pmx", aiProcess_ValidateDataStructure );
+ return nullptr != scene;*/
+ return true;
+ }
+};
+
+TEST_F( utPMXImporter, importTest ) {
+ EXPECT_TRUE( importerTest() );
+}
diff --git a/libs/assimp/test/unit/utPretransformVertices.cpp b/libs/assimp/test/unit/utPretransformVertices.cpp
new file mode 100644
index 0000000..b22fdf7
--- /dev/null
+++ b/libs/assimp/test/unit/utPretransformVertices.cpp
@@ -0,0 +1,157 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "UnitTestPCH.h"
+
+#include "PostProcessing/PretransformVertices.h"
+#include <assimp/scene.h>
+
+using namespace std;
+using namespace Assimp;
+
+class PretransformVerticesTest : public ::testing::Test {
+public:
+ PretransformVerticesTest() :
+ Test(), mScene(nullptr), mProcess(nullptr) {
+ // empty
+ }
+
+protected:
+ virtual void SetUp();
+ virtual void TearDown();
+
+protected:
+ aiScene *mScene;
+ PretransformVertices *mProcess;
+};
+
+// ------------------------------------------------------------------------------------------------
+void AddNodes(unsigned int num, aiNode *father, unsigned int depth) {
+ father->mChildren = new aiNode *[father->mNumChildren = 5];
+ for (unsigned int i = 0; i < 5; ++i) {
+ aiNode *nd = father->mChildren[i] = new aiNode();
+
+ nd->mName.length = sprintf(nd->mName.data, "%i%i", depth, i);
+
+ // spawn two meshes
+ nd->mMeshes = new unsigned int[nd->mNumMeshes = 2];
+ nd->mMeshes[0] = num * 5 + i;
+ nd->mMeshes[1] = 24 - (num * 5 + i); // mesh 12 is special ... it references the same mesh twice
+
+ // setup an unique transformation matrix
+ nd->mTransformation.a1 = num * 5.f + i + 1;
+ }
+
+ if (depth > 1) {
+ for (unsigned int i = 0; i < 5; ++i) {
+ AddNodes(i, father->mChildren[i], depth - 1);
+ }
+ }
+}
+
+// ------------------------------------------------------------------------------------------------
+void PretransformVerticesTest::SetUp() {
+ mScene = new aiScene();
+
+ // add 5 empty materials
+ mScene->mMaterials = new aiMaterial *[mScene->mNumMaterials = 5];
+ for (unsigned int i = 0; i < 5; ++i) {
+ mScene->mMaterials[i] = new aiMaterial();
+ }
+
+ // add 25 test meshes
+ mScene->mMeshes = new aiMesh *[mScene->mNumMeshes = 25];
+ for (unsigned int i = 0; i < 25; ++i) {
+ aiMesh *mesh = mScene->mMeshes[i] = new aiMesh();
+
+ mesh->mPrimitiveTypes = aiPrimitiveType_POINT;
+ mesh->mFaces = new aiFace[mesh->mNumFaces = 10 + i];
+ mesh->mVertices = new aiVector3D[mesh->mNumVertices = mesh->mNumFaces];
+ for (unsigned int a = 0; a < mesh->mNumFaces; ++a) {
+ aiFace &f = mesh->mFaces[a];
+ f.mIndices = new unsigned int[f.mNumIndices = 1];
+ f.mIndices[0] = a * 3;
+
+ mesh->mVertices[a] = aiVector3D((float)i, (float)a, 0.f);
+ }
+ mesh->mMaterialIndex = i % 5;
+
+ if (i % 2) {
+ mesh->mNormals = new aiVector3D[mesh->mNumVertices];
+ for (unsigned int normalIdx = 0; normalIdx < mesh->mNumVertices; ++normalIdx) {
+ mesh->mNormals[normalIdx].x = 1.0f;
+ mesh->mNormals[normalIdx].y = 1.0f;
+ mesh->mNormals[normalIdx].z = 1.0f;
+ mesh->mNormals[normalIdx].Normalize();
+ }
+ }
+ }
+
+ // construct some nodes (1+25)
+ mScene->mRootNode = new aiNode();
+ mScene->mRootNode->mName.Set("Root");
+ AddNodes(0, mScene->mRootNode, 2);
+
+ mProcess = new PretransformVertices();
+}
+
+// ------------------------------------------------------------------------------------------------
+void PretransformVerticesTest::TearDown() {
+ delete mScene;
+ delete mProcess;
+}
+
+// ------------------------------------------------------------------------------------------------
+TEST_F(PretransformVerticesTest, testProcessCollapseHierarchy) {
+ mProcess->KeepHierarchy(false);
+ mProcess->Execute(mScene);
+
+ EXPECT_EQ(5U, mScene->mNumMaterials);
+ EXPECT_EQ(10U, mScene->mNumMeshes); // every second mesh has normals
+}
+
+// ------------------------------------------------------------------------------------------------
+TEST_F(PretransformVerticesTest, testProcessKeepHierarchy) {
+ mProcess->KeepHierarchy(true);
+ mProcess->Execute(mScene);
+
+ EXPECT_EQ(5U, mScene->mNumMaterials);
+ EXPECT_EQ(49U, mScene->mNumMeshes); // see note on mesh 12 above
+}
diff --git a/libs/assimp/test/unit/utProfiler.cpp b/libs/assimp/test/unit/utProfiler.cpp
new file mode 100644
index 0000000..6738d56
--- /dev/null
+++ b/libs/assimp/test/unit/utProfiler.cpp
@@ -0,0 +1,77 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "UnitTestPCH.h"
+#include "UTLogStream.h"
+#include <assimp/Profiler.h>
+#include <assimp/DefaultLogger.hpp>
+
+using namespace ::Assimp;
+using namespace ::Assimp::Profiling;
+
+class utProfiler : public ::testing::Test {
+public:
+ LogStream *m_stream;
+
+ /*virtual void SetUp() {
+ m_stream = new UTLogStream;
+ DefaultLogger::create();
+ DefaultLogger::get()->attachStream( m_stream );
+ }
+
+ virtual void TearDown() {
+ DefaultLogger::get()->detatchStream( m_stream );
+ m_stream = nullptr;
+ }*/
+};
+
+TEST_F( utProfiler, addRegion_success ) {
+ Profiler myProfiler;
+ myProfiler.BeginRegion( "t1" );
+ for ( int i=0; i<10; i++ ) {
+ volatile int j=0;
+ j++;
+ }
+ myProfiler.EndRegion( "t1" );
+ //UTLogStream *stream( (UTLogStream*) m_stream );
+ //EXPECT_FALSE( stream->m_messages.empty() );
+}
diff --git a/libs/assimp/test/unit/utQ3DImportExport.cpp b/libs/assimp/test/unit/utQ3DImportExport.cpp
new file mode 100644
index 0000000..e5396a6
--- /dev/null
+++ b/libs/assimp/test/unit/utQ3DImportExport.cpp
@@ -0,0 +1,61 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "UnitTestPCH.h"
+
+#include "AbstractImportExportBase.h"
+
+#include <assimp/postprocess.h>
+#include <assimp/Importer.hpp>
+
+using namespace Assimp;
+
+class utQ3DImportExport : public AbstractImportExportBase {
+public:
+ virtual bool importerTest() {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/Q3D/earth.q3o", aiProcess_ValidateDataStructure);
+ return nullptr != scene;
+ }
+};
+
+TEST_F(utQ3DImportExport, importTest) {
+ EXPECT_TRUE(importerTest());
+}
diff --git a/libs/assimp/test/unit/utRemoveComments.cpp b/libs/assimp/test/unit/utRemoveComments.cpp
new file mode 100644
index 0000000..44fb56e
--- /dev/null
+++ b/libs/assimp/test/unit/utRemoveComments.cpp
@@ -0,0 +1,92 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "UnitTestPCH.h"
+
+#include <assimp/RemoveComments.h>
+
+using namespace std;
+using namespace Assimp;
+
+// ------------------------------------------------------------------------------------------------
+TEST(RemoveCommentsTest, testSingleLineComments) {
+ const char *szTest = "int i = 0; \n"
+ "if (4 == //)\n"
+ "\ttrue) { // do something here \n"
+ "\t// hello ... and bye //\n";
+
+ const size_t len(::strlen(szTest) + 1);
+ char *szTest2 = new char[len];
+ ::strncpy(szTest2, szTest, len);
+
+ const char *szTestResult = "int i = 0; \n"
+ "if (4 == \n"
+ "\ttrue) { \n"
+ "\t \n";
+
+ CommentRemover::RemoveLineComments("//", szTest2, ' ');
+ EXPECT_STREQ(szTestResult, szTest2);
+
+ delete[] szTest2;
+}
+
+// ------------------------------------------------------------------------------------------------
+TEST(RemoveCommentsTest, testMultiLineComments) {
+ const char *szTest =
+ "/* comment to be removed */\n"
+ "valid text /* \n "
+ " comment across multiple lines */"
+ " / * Incomplete comment */ /* /* multiple comments */ */";
+
+ const char *szTestResult =
+ " \n"
+ "valid text "
+ " "
+ " / * Incomplete comment */ */";
+
+ const size_t len(::strlen(szTest) + 1);
+ char *szTest2 = new char[len];
+ ::strncpy(szTest2, szTest, len);
+
+ CommentRemover::RemoveMultiLineComments("/*", "*/", szTest2, ' ');
+ EXPECT_STREQ(szTestResult, szTest2);
+
+ delete[] szTest2;
+}
diff --git a/libs/assimp/test/unit/utRemoveComponent.cpp b/libs/assimp/test/unit/utRemoveComponent.cpp
new file mode 100644
index 0000000..42fb85f
--- /dev/null
+++ b/libs/assimp/test/unit/utRemoveComponent.cpp
@@ -0,0 +1,208 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "UnitTestPCH.h"
+
+#include "Material/MaterialSystem.h"
+#include "PostProcessing/RemoveVCProcess.h"
+#include <assimp/scene.h>
+
+using namespace std;
+using namespace Assimp;
+
+class RemoveVCProcessTest : public ::testing::Test {
+public:
+ virtual void SetUp();
+ virtual void TearDown();
+
+protected:
+ RemoveVCProcess *piProcess;
+ aiScene *pScene;
+};
+
+// ------------------------------------------------------------------------------------------------
+void RemoveVCProcessTest::SetUp() {
+ // construct the process
+ piProcess = new RemoveVCProcess();
+ pScene = new aiScene();
+
+ // fill the scene ..
+ pScene->mMeshes = new aiMesh *[pScene->mNumMeshes = 2];
+ pScene->mMeshes[0] = new aiMesh();
+ pScene->mMeshes[1] = new aiMesh();
+
+ pScene->mMeshes[0]->mNumVertices = 120;
+ pScene->mMeshes[0]->mVertices = new aiVector3D[120];
+ pScene->mMeshes[0]->mNormals = new aiVector3D[120];
+ pScene->mMeshes[0]->mTextureCoords[0] = new aiVector3D[120];
+ pScene->mMeshes[0]->mTextureCoords[1] = new aiVector3D[120];
+ pScene->mMeshes[0]->mTextureCoords[2] = new aiVector3D[120];
+ pScene->mMeshes[0]->mTextureCoords[3] = new aiVector3D[120];
+
+ pScene->mMeshes[1]->mNumVertices = 120;
+ pScene->mMeshes[1]->mVertices = new aiVector3D[120];
+
+ pScene->mAnimations = new aiAnimation *[pScene->mNumAnimations = 2];
+ pScene->mAnimations[0] = new aiAnimation();
+ pScene->mAnimations[1] = new aiAnimation();
+
+ pScene->mTextures = new aiTexture *[pScene->mNumTextures = 2];
+ pScene->mTextures[0] = new aiTexture();
+ pScene->mTextures[1] = new aiTexture();
+
+ pScene->mMaterials = new aiMaterial *[pScene->mNumMaterials = 2];
+ pScene->mMaterials[0] = new aiMaterial();
+ pScene->mMaterials[1] = new aiMaterial();
+
+ pScene->mLights = new aiLight *[pScene->mNumLights = 2];
+ pScene->mLights[0] = new aiLight();
+ pScene->mLights[1] = new aiLight();
+
+ pScene->mCameras = new aiCamera *[pScene->mNumCameras = 2];
+ pScene->mCameras[0] = new aiCamera();
+ pScene->mCameras[1] = new aiCamera();
+}
+
+// ------------------------------------------------------------------------------------------------
+void RemoveVCProcessTest::TearDown() {
+ delete pScene;
+ delete piProcess;
+}
+
+// ------------------------------------------------------------------------------------------------
+TEST_F(RemoveVCProcessTest, testMeshRemove) {
+ piProcess->SetDeleteFlags(aiComponent_MESHES);
+ piProcess->Execute(pScene);
+
+ EXPECT_TRUE(NULL == pScene->mMeshes);
+ EXPECT_EQ(0U, pScene->mNumMeshes);
+ EXPECT_TRUE(pScene->mFlags == AI_SCENE_FLAGS_INCOMPLETE);
+}
+
+// ------------------------------------------------------------------------------------------------
+TEST_F(RemoveVCProcessTest, testAnimRemove) {
+ piProcess->SetDeleteFlags(aiComponent_ANIMATIONS);
+ piProcess->Execute(pScene);
+
+ EXPECT_TRUE(NULL == pScene->mAnimations);
+ EXPECT_EQ(0U, pScene->mNumAnimations);
+ EXPECT_EQ(0U, pScene->mFlags);
+}
+
+// ------------------------------------------------------------------------------------------------
+TEST_F(RemoveVCProcessTest, testMaterialRemove) {
+ piProcess->SetDeleteFlags(aiComponent_MATERIALS);
+ piProcess->Execute(pScene);
+
+ // there should be one default material now ...
+ EXPECT_TRUE(1 == pScene->mNumMaterials &&
+ pScene->mMeshes[0]->mMaterialIndex == 0 &&
+ pScene->mMeshes[1]->mMaterialIndex == 0);
+ EXPECT_EQ(0U, pScene->mFlags);
+}
+
+// ------------------------------------------------------------------------------------------------
+TEST_F(RemoveVCProcessTest, testTextureRemove) {
+ piProcess->SetDeleteFlags(aiComponent_TEXTURES);
+ piProcess->Execute(pScene);
+
+ EXPECT_TRUE(NULL == pScene->mTextures);
+ EXPECT_EQ(0U, pScene->mNumTextures);
+ EXPECT_EQ(0U, pScene->mFlags);
+}
+
+// ------------------------------------------------------------------------------------------------
+TEST_F(RemoveVCProcessTest, testCameraRemove) {
+ piProcess->SetDeleteFlags(aiComponent_CAMERAS);
+ piProcess->Execute(pScene);
+
+ EXPECT_TRUE(NULL == pScene->mCameras);
+ EXPECT_EQ(0U, pScene->mNumCameras);
+ EXPECT_EQ(0U, pScene->mFlags);
+}
+
+// ------------------------------------------------------------------------------------------------
+TEST_F(RemoveVCProcessTest, testLightRemove) {
+ piProcess->SetDeleteFlags(aiComponent_LIGHTS);
+ piProcess->Execute(pScene);
+
+ EXPECT_TRUE(NULL == pScene->mLights);
+ EXPECT_EQ(0U, pScene->mNumLights);
+ EXPECT_EQ(0U, pScene->mFlags);
+}
+
+// ------------------------------------------------------------------------------------------------
+TEST_F(RemoveVCProcessTest, testMeshComponentsRemoveA) {
+ piProcess->SetDeleteFlags(aiComponent_TEXCOORDSn(1) | aiComponent_TEXCOORDSn(2) | aiComponent_TEXCOORDSn(3));
+ piProcess->Execute(pScene);
+
+ EXPECT_TRUE(pScene->mMeshes[0]->mTextureCoords[0] &&
+ !pScene->mMeshes[0]->mTextureCoords[1] &&
+ !pScene->mMeshes[0]->mTextureCoords[2] &&
+ !pScene->mMeshes[0]->mTextureCoords[3]);
+ EXPECT_EQ(0U, pScene->mFlags);
+}
+
+// ------------------------------------------------------------------------------------------------
+TEST_F(RemoveVCProcessTest, testMeshComponentsRemoveB) {
+ piProcess->SetDeleteFlags(aiComponent_TEXCOORDSn(1) | aiComponent_NORMALS);
+ piProcess->Execute(pScene);
+
+ EXPECT_TRUE(pScene->mMeshes[0]->mTextureCoords[0] &&
+ pScene->mMeshes[0]->mTextureCoords[1] &&
+ pScene->mMeshes[0]->mTextureCoords[2] && // shift forward ...
+ !pScene->mMeshes[0]->mTextureCoords[3] &&
+ !pScene->mMeshes[0]->mNormals);
+ EXPECT_EQ(0U, pScene->mFlags);
+}
+
+// ------------------------------------------------------------------------------------------------
+TEST_F(RemoveVCProcessTest, testRemoveEverything) {
+ piProcess->SetDeleteFlags(aiComponent_LIGHTS | aiComponent_ANIMATIONS |
+ aiComponent_MATERIALS | aiComponent_MESHES | aiComponent_CAMERAS | aiComponent_TEXTURES);
+ piProcess->Execute(pScene);
+ EXPECT_EQ(0U, pScene->mNumAnimations);
+ EXPECT_EQ(0U, pScene->mNumCameras);
+ EXPECT_EQ(0U, pScene->mNumLights);
+ EXPECT_EQ(0U, pScene->mNumMeshes);
+ EXPECT_EQ(0U, pScene->mNumTextures);
+ // Only the default material should remain.
+ EXPECT_EQ(1U, pScene->mNumMaterials);
+}
diff --git a/libs/assimp/test/unit/utRemoveRedundantMaterials.cpp b/libs/assimp/test/unit/utRemoveRedundantMaterials.cpp
new file mode 100644
index 0000000..cec4501
--- /dev/null
+++ b/libs/assimp/test/unit/utRemoveRedundantMaterials.cpp
@@ -0,0 +1,177 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "UnitTestPCH.h"
+
+#include "Material/MaterialSystem.h"
+#include "PostProcessing/RemoveRedundantMaterials.h"
+#include <assimp/scene.h>
+
+using namespace std;
+using namespace Assimp;
+
+class RemoveRedundantMatsTest : public ::testing::Test {
+public:
+ virtual void SetUp();
+ virtual void TearDown();
+
+protected:
+ RemoveRedundantMatsProcess *piProcess;
+ aiScene *pcScene1;
+};
+
+// ------------------------------------------------------------------------------------------------
+aiMaterial *getUniqueMaterial1() {
+ // setup an unique name for each material - this shouldn't care
+ aiString mTemp;
+ mTemp.Set("UniqueMat1");
+
+ aiMaterial *pcMat = new aiMaterial();
+ pcMat->AddProperty(&mTemp, AI_MATKEY_NAME);
+ float f = 2.0f;
+ pcMat->AddProperty<float>(&f, 1, AI_MATKEY_BUMPSCALING);
+ pcMat->AddProperty<float>(&f, 1, AI_MATKEY_SHININESS_STRENGTH);
+ return pcMat;
+}
+
+// ------------------------------------------------------------------------------------------------
+aiMaterial *getUniqueMaterial2() {
+ // setup an unique name for each material - this shouldn't care
+ aiString mTemp;
+ mTemp.Set("Unique Mat2");
+
+ aiMaterial *pcMat = new aiMaterial();
+ pcMat->AddProperty(&mTemp, AI_MATKEY_NAME);
+ float f = 4.0f;
+ int i = 1;
+ pcMat->AddProperty<float>(&f, 1, AI_MATKEY_BUMPSCALING);
+ pcMat->AddProperty<int>(&i, 1, AI_MATKEY_ENABLE_WIREFRAME);
+ return pcMat;
+}
+
+// ------------------------------------------------------------------------------------------------
+aiMaterial *getUniqueMaterial3() {
+ // setup an unique name for each material - this shouldn't care
+ aiString mTemp;
+ mTemp.Set("Complex material name");
+
+ aiMaterial *pcMat = new aiMaterial();
+ pcMat->AddProperty(&mTemp, AI_MATKEY_NAME);
+ return pcMat;
+}
+
+// ------------------------------------------------------------------------------------------------
+void RemoveRedundantMatsTest::SetUp() {
+ // construct the process
+ piProcess = new RemoveRedundantMatsProcess();
+
+ // create a scene with 5 materials (2 is a duplicate of 0, 3 of 1)
+ pcScene1 = new aiScene();
+ pcScene1->mNumMaterials = 5;
+ pcScene1->mMaterials = new aiMaterial *[5];
+
+ pcScene1->mMaterials[0] = getUniqueMaterial1();
+ pcScene1->mMaterials[1] = getUniqueMaterial2();
+ pcScene1->mMaterials[4] = getUniqueMaterial3();
+
+ // all materials must be referenced
+ pcScene1->mNumMeshes = 5;
+ pcScene1->mMeshes = new aiMesh *[5];
+ for (unsigned int i = 0; i < 5; ++i) {
+ pcScene1->mMeshes[i] = new aiMesh();
+ pcScene1->mMeshes[i]->mMaterialIndex = i;
+ }
+
+ // setup an unique name for each material - this shouldn't care
+ aiString mTemp;
+ mTemp.length = 1;
+ mTemp.data[0] = 48;
+ mTemp.data[1] = 0;
+
+ aiMaterial *pcMat;
+ pcScene1->mMaterials[2] = pcMat = new aiMaterial();
+ aiMaterial::CopyPropertyList(pcMat, (const aiMaterial *)pcScene1->mMaterials[0]);
+ pcMat->AddProperty(&mTemp, AI_MATKEY_NAME);
+ mTemp.data[0]++;
+
+ pcScene1->mMaterials[3] = pcMat = new aiMaterial();
+ aiMaterial::CopyPropertyList(pcMat, (const aiMaterial *)pcScene1->mMaterials[1]);
+ pcMat->AddProperty(&mTemp, AI_MATKEY_NAME);
+ mTemp.data[0]++;
+}
+
+// ------------------------------------------------------------------------------------------------
+void RemoveRedundantMatsTest::TearDown() {
+ delete piProcess;
+ delete pcScene1;
+}
+
+// ------------------------------------------------------------------------------------------------
+TEST_F(RemoveRedundantMatsTest, testRedundantMaterials) {
+ piProcess->SetFixedMaterialsString();
+
+ piProcess->Execute(pcScene1);
+ EXPECT_EQ(3U, pcScene1->mNumMaterials);
+ EXPECT_TRUE(0 != pcScene1->mMaterials &&
+ 0 != pcScene1->mMaterials[0] &&
+ 0 != pcScene1->mMaterials[1] &&
+ 0 != pcScene1->mMaterials[2]);
+
+ aiString sName;
+ EXPECT_EQ(AI_SUCCESS, aiGetMaterialString(pcScene1->mMaterials[2], AI_MATKEY_NAME, &sName));
+ EXPECT_STREQ("Complex material name", sName.data);
+}
+
+// ------------------------------------------------------------------------------------------------
+TEST_F(RemoveRedundantMatsTest, testRedundantMaterialsWithExcludeList) {
+ piProcess->SetFixedMaterialsString("\'Unique Mat2\'\t\'Complex material name\' and_another_one_which_we_wont_use");
+
+ piProcess->Execute(pcScene1);
+ EXPECT_EQ(4U, pcScene1->mNumMaterials);
+ EXPECT_TRUE(0 != pcScene1->mMaterials &&
+ 0 != pcScene1->mMaterials[0] &&
+ 0 != pcScene1->mMaterials[1] &&
+ 0 != pcScene1->mMaterials[2] &&
+ 0 != pcScene1->mMaterials[3]);
+
+ aiString sName;
+ EXPECT_EQ(AI_SUCCESS, aiGetMaterialString(pcScene1->mMaterials[3], AI_MATKEY_NAME, &sName));
+ EXPECT_STREQ("Complex material name", sName.data);
+}
diff --git a/libs/assimp/test/unit/utRemoveVCProcess.cpp b/libs/assimp/test/unit/utRemoveVCProcess.cpp
new file mode 100644
index 0000000..b555b0c
--- /dev/null
+++ b/libs/assimp/test/unit/utRemoveVCProcess.cpp
@@ -0,0 +1,76 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "PostProcessing/RemoveVCProcess.h"
+#include "UnitTestPCH.h"
+
+#include <assimp/mesh.h>
+#include <assimp/scene.h>
+
+using namespace ::Assimp;
+
+class utRevmoveVCProcess : public ::testing::Test {
+ // empty
+};
+
+TEST_F(utRevmoveVCProcess, createTest) {
+ bool ok = true;
+ try {
+ RemoveVCProcess *process = new RemoveVCProcess;
+ delete process;
+ } catch (...) {
+ ok = false;
+ }
+ EXPECT_TRUE(ok);
+}
+
+TEST_F(utRevmoveVCProcess, issue1266_ProcessMeshTest_NoCrash) {
+ aiScene *scene = new aiScene;
+ scene->mNumMeshes = 1;
+ scene->mMeshes = new aiMesh *[1];
+
+ aiMesh *mesh = new aiMesh;
+ mesh->mNumVertices = 1;
+ mesh->mColors[0] = new aiColor4D[2];
+ scene->mMeshes[0] = mesh;
+ std::unique_ptr<RemoveVCProcess> process(new RemoveVCProcess);
+ process->Execute(scene);
+ delete scene;
+}
diff --git a/libs/assimp/test/unit/utSIBImporter.cpp b/libs/assimp/test/unit/utSIBImporter.cpp
new file mode 100644
index 0000000..b36e088
--- /dev/null
+++ b/libs/assimp/test/unit/utSIBImporter.cpp
@@ -0,0 +1,73 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "UnitTestPCH.h"
+
+#include "AssetLib/SIB/SIBImporter.h"
+
+#include <assimp/postprocess.h>
+#include <assimp/Importer.hpp>
+
+#include "AbstractImportExportBase.h"
+
+using namespace ::Assimp;
+
+class utSIBImporter : public AbstractImportExportBase {
+public:
+ virtual bool importerTest() {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/SIB/heffalump.sib", aiProcess_ValidateDataStructure);
+ return nullptr != scene;
+ }
+};
+
+TEST_F(utSIBImporter, createTest) {
+ bool ok(true);
+ try {
+ SIBImporter myImporter;
+ } catch (...) {
+ ok = false;
+ }
+ EXPECT_TRUE(ok);
+}
+
+TEST_F(utSIBImporter, importTest) {
+ EXPECT_TRUE(importerTest());
+}
diff --git a/libs/assimp/test/unit/utSMDImportExport.cpp b/libs/assimp/test/unit/utSMDImportExport.cpp
new file mode 100644
index 0000000..08683d5
--- /dev/null
+++ b/libs/assimp/test/unit/utSMDImportExport.cpp
@@ -0,0 +1,77 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "UnitTestPCH.h"
+
+#include "AbstractImportExportBase.h"
+#include "AssetLib/SMD/SMDLoader.h"
+#include <assimp/postprocess.h>
+#include <assimp/Importer.hpp>
+
+using namespace ::Assimp;
+
+class utSMDImporter : public AbstractImportExportBase {
+public:
+ virtual bool importerTest() {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/SMD/triangle.smd", aiProcess_ValidateDataStructure);
+ return nullptr != scene;
+ }
+};
+
+TEST_F(utSMDImporter, createTest) {
+ bool ok(true);
+ try {
+ SMDImporter myImporter;
+ } catch (...) {
+ ok = false;
+ }
+ EXPECT_TRUE(ok);
+}
+
+TEST_F(utSMDImporter, importTest) {
+ EXPECT_TRUE(importerTest());
+}
+
+TEST_F(utSMDImporter, issue_899_Texture_garbage_at_end_of_string_Test) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR"/SMD/holy_grailref.smd", aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+}
diff --git a/libs/assimp/test/unit/utSTLImportExport.cpp b/libs/assimp/test/unit/utSTLImportExport.cpp
new file mode 100644
index 0000000..4bf374a
--- /dev/null
+++ b/libs/assimp/test/unit/utSTLImportExport.cpp
@@ -0,0 +1,170 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+
+#include "AbstractImportExportBase.h"
+#include "UnitTestPCH.h"
+
+#include <assimp/postprocess.h>
+#include <assimp/scene.h>
+#include <assimp/Exporter.hpp>
+#include <assimp/Importer.hpp>
+
+#include <vector>
+
+using namespace Assimp;
+
+class utSTLImporterExporter : public AbstractImportExportBase {
+public:
+ virtual bool importerTest() {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/STL/Spider_ascii.stl", aiProcess_ValidateDataStructure);
+ return nullptr != scene;
+ }
+};
+
+TEST_F(utSTLImporterExporter, importSTLFromFileTest) {
+ EXPECT_TRUE(importerTest());
+}
+
+TEST_F(utSTLImporterExporter, test_multiple) {
+ // import same file twice, each with its own importer
+ // must work both times and not crash
+ Assimp::Importer importer1;
+ const aiScene *scene1 = importer1.ReadFile(ASSIMP_TEST_MODELS_DIR "/STL/Spider_ascii.stl", aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene1);
+
+ Assimp::Importer importer2;
+ const aiScene *scene2 = importer2.ReadFile(ASSIMP_TEST_MODELS_DIR "/STL/Spider_ascii.stl", aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene2);
+}
+
+TEST_F(utSTLImporterExporter, importSTLformatdetection) {
+ ::Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/STL/formatDetection", aiProcess_ValidateDataStructure);
+
+ EXPECT_NE(nullptr, scene);
+}
+
+TEST_F(utSTLImporterExporter, test_with_two_solids) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/STL/triangle_with_two_solids.stl", aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+}
+
+TEST_F(utSTLImporterExporter, test_with_empty_solid) {
+ Assimp::Importer importer;
+ //STL File with empty mesh. We should still be able to import other meshes in this file. ValidateDataStructure should fail.
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/STL/triangle_with_empty_solid.stl", 0);
+ EXPECT_NE(nullptr, scene);
+
+ const aiScene *scene2 = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/STL/triangle_with_empty_solid.stl", aiProcess_ValidateDataStructure);
+ EXPECT_EQ(nullptr, scene2);
+}
+
+#ifndef ASSIMP_BUILD_NO_EXPORT
+
+TEST_F(utSTLImporterExporter, exporterTest) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/STL/Spider_ascii.stl", aiProcess_ValidateDataStructure);
+
+ Assimp::Exporter mAiExporter;
+ mAiExporter.Export(scene, "stl", "spiderExport.stl");
+
+ const aiScene *scene2 = importer.ReadFile("spiderExport.stl", aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene2);
+}
+
+TEST_F(utSTLImporterExporter, test_export_pointclouds) {
+ struct XYZ {
+ float x, y, z;
+ };
+
+ std::vector<XYZ> points;
+
+ for (size_t i = 0; i < 10; ++i) {
+ XYZ current;
+ current.x = static_cast<float>(i);
+ current.y = static_cast<float>(i);
+ current.z = static_cast<float>(i);
+ points.push_back(current);
+ }
+ aiScene scene;
+ scene.mRootNode = new aiNode();
+
+ scene.mMeshes = new aiMesh *[1];
+ scene.mMeshes[0] = nullptr;
+ scene.mNumMeshes = 1;
+
+ scene.mMaterials = new aiMaterial *[1];
+ scene.mMaterials[0] = nullptr;
+ scene.mNumMaterials = 1;
+
+ scene.mMaterials[0] = new aiMaterial();
+
+ scene.mMeshes[0] = new aiMesh();
+ scene.mMeshes[0]->mMaterialIndex = 0;
+
+ scene.mRootNode->mMeshes = new unsigned int[1];
+ scene.mRootNode->mMeshes[0] = 0;
+ scene.mRootNode->mNumMeshes = 1;
+
+ auto pMesh = scene.mMeshes[0];
+
+ size_t numValidPoints = points.size();
+
+ pMesh->mVertices = new aiVector3D[numValidPoints];
+ pMesh->mNumVertices = static_cast<unsigned int>(numValidPoints);
+
+ int i = 0;
+ for (XYZ &p : points) {
+ pMesh->mVertices[i] = aiVector3D(p.x, p.y, p.z);
+ ++i;
+ }
+
+ Assimp::Exporter mAiExporter;
+ ExportProperties *properties = new ExportProperties;
+ properties->SetPropertyBool(AI_CONFIG_EXPORT_POINT_CLOUDS, true);
+ mAiExporter.Export(&scene, "stl", "testExport.stl", 0, properties);
+
+ delete properties;
+}
+
+#endif
diff --git a/libs/assimp/test/unit/utScaleProcess.cpp b/libs/assimp/test/unit/utScaleProcess.cpp
new file mode 100644
index 0000000..baa13ab
--- /dev/null
+++ b/libs/assimp/test/unit/utScaleProcess.cpp
@@ -0,0 +1,71 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "PostProcessing/ScaleProcess.h"
+#include "TestModelFactory.h"
+#include "UnitTestPCH.h"
+
+namespace Assimp {
+namespace UnitTest {
+
+class utScaleProcess : public ::testing::Test {
+ // empty
+};
+
+TEST_F(utScaleProcess, createTest) {
+ bool ok = true;
+ try {
+ ScaleProcess process;
+ } catch (...) {
+ ok = false;
+ }
+ EXPECT_TRUE(ok);
+}
+
+TEST_F(utScaleProcess, accessScaleTest) {
+ ScaleProcess process;
+ EXPECT_FLOAT_EQ(AI_CONFIG_GLOBAL_SCALE_FACTOR_DEFAULT, process.getScale());
+
+ process.setScale(2.0f);
+ EXPECT_FLOAT_EQ(2.0f, process.getScale());
+}
+
+} // Namespace UnitTest
+} // Namespace Assimp
diff --git a/libs/assimp/test/unit/utScene.cpp b/libs/assimp/test/unit/utScene.cpp
new file mode 100644
index 0000000..e989db7
--- /dev/null
+++ b/libs/assimp/test/unit/utScene.cpp
@@ -0,0 +1,64 @@
+/*
+---------------------------------------------------------------------------
+Open Asset Import Library (assimp)
+---------------------------------------------------------------------------
+
+Copyright (c) 2006-2020, assimp team
+
+All rights reserved.
+
+Redistribution and use of this software in source and binary forms,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "UnitTestPCH.h"
+#include <assimp/scene.h>
+
+using namespace ::Assimp;
+
+class utScene : public ::testing::Test {
+ // empty
+};
+
+TEST_F( utScene, aiNode_addChildrenTest ) {
+ aiNode myNode;
+
+ static const size_t NumChildren = 10;
+ aiNode **childrenPtr = new aiNode*[ NumChildren ];
+ for ( unsigned int i = 0; i < NumChildren; i++ ) {
+ childrenPtr[ i ] = new aiNode;
+ }
+ myNode.addChildren( NumChildren, childrenPtr );
+ EXPECT_EQ( NumChildren, myNode.mNumChildren );
+ for ( unsigned int i = 0; i < NumChildren; i++ ) {
+ EXPECT_EQ( childrenPtr[ i ], myNode.mChildren[ i ] );
+ }
+}
+
diff --git a/libs/assimp/test/unit/utSceneCombiner.cpp b/libs/assimp/test/unit/utSceneCombiner.cpp
new file mode 100644
index 0000000..d837e4d
--- /dev/null
+++ b/libs/assimp/test/unit/utSceneCombiner.cpp
@@ -0,0 +1,77 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "UnitTestPCH.h"
+#include <assimp/SceneCombiner.h>
+#include <assimp/mesh.h>
+#include <memory>
+
+using namespace ::Assimp;
+
+class utSceneCombiner : public ::testing::Test {
+ // empty
+};
+
+TEST_F(utSceneCombiner, MergeMeshes_ValidNames_Test) {
+ std::vector<aiMesh *> merge_list;
+ aiMesh *mesh1 = new aiMesh;
+ mesh1->mName.Set("mesh_1");
+ merge_list.push_back(mesh1);
+
+ aiMesh *mesh2 = new aiMesh;
+ mesh2->mName.Set("mesh_2");
+ merge_list.push_back(mesh2);
+
+ aiMesh *mesh3 = new aiMesh;
+ mesh3->mName.Set("mesh_3");
+ merge_list.push_back(mesh3);
+
+ std::unique_ptr<aiMesh> out;
+ aiMesh *ptr = nullptr;
+ SceneCombiner::MergeMeshes(&ptr, 0, merge_list.begin(), merge_list.end());
+ out.reset(ptr);
+ std::string outName = out->mName.C_Str();
+ EXPECT_EQ("mesh_1.mesh_2.mesh_3", outName);
+}
+
+TEST_F(utSceneCombiner, CopySceneWithNullptr_AI_NO_EXCEPTion) {
+ EXPECT_NO_THROW(SceneCombiner::CopyScene(nullptr, nullptr));
+ EXPECT_NO_THROW(SceneCombiner::CopySceneFlat(nullptr, nullptr));
+}
diff --git a/libs/assimp/test/unit/utScenePreprocessor.cpp b/libs/assimp/test/unit/utScenePreprocessor.cpp
new file mode 100644
index 0000000..45d8a36
--- /dev/null
+++ b/libs/assimp/test/unit/utScenePreprocessor.cpp
@@ -0,0 +1,197 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "UnitTestPCH.h"
+
+#include "Common/ScenePreprocessor.h"
+#include <assimp/mesh.h>
+#include <assimp/scene.h>
+#include <assimp/Importer.hpp>
+
+using namespace std;
+using namespace Assimp;
+
+class ScenePreprocessorTest : public ::testing::Test {
+public:
+ ScenePreprocessorTest() :
+ Test(), mScenePreprocessor(nullptr), mScene(nullptr) {
+ // empty
+ }
+
+protected:
+ virtual void SetUp();
+ virtual void TearDown();
+
+protected:
+ void CheckIfOnly(aiMesh *p, unsigned int num, unsigned flag);
+ void ProcessAnimation(aiAnimation *anim) { mScenePreprocessor->ProcessAnimation(anim); }
+ void ProcessMesh(aiMesh *mesh) { mScenePreprocessor->ProcessMesh(mesh); }
+
+private:
+ ScenePreprocessor *mScenePreprocessor;
+ aiScene *mScene;
+};
+
+// ------------------------------------------------------------------------------------------------
+void ScenePreprocessorTest::SetUp() {
+ // setup a dummy scene with a single node
+ mScene = new aiScene();
+ mScene->mRootNode = new aiNode();
+ mScene->mRootNode->mName.Set("<test>");
+
+ // add some translation
+ mScene->mRootNode->mTransformation.a4 = 1.f;
+ mScene->mRootNode->mTransformation.b4 = 2.f;
+ mScene->mRootNode->mTransformation.c4 = 3.f;
+
+ // and allocate a ScenePreprocessor to operate on the scene
+ mScenePreprocessor = new ScenePreprocessor(mScene);
+}
+
+// ------------------------------------------------------------------------------------------------
+void ScenePreprocessorTest::TearDown() {
+ delete mScenePreprocessor;
+ delete mScene;
+}
+
+// ------------------------------------------------------------------------------------------------
+// Check whether ProcessMesh() returns flag for a mesh that consist of primitives with num indices
+void ScenePreprocessorTest::CheckIfOnly(aiMesh *p, unsigned int num, unsigned int flag) {
+ // Triangles only
+ for (unsigned i = 0; i < p->mNumFaces; ++i) {
+ p->mFaces[i].mNumIndices = num;
+ }
+ mScenePreprocessor->ProcessMesh(p);
+ EXPECT_EQ(flag, p->mPrimitiveTypes);
+ p->mPrimitiveTypes = 0;
+}
+
+// ------------------------------------------------------------------------------------------------
+// Check whether a mesh is preprocessed correctly. Case 1: The mesh needs preprocessing
+TEST_F(ScenePreprocessorTest, testMeshPreprocessingPos) {
+ aiMesh *p = new aiMesh;
+ p->mNumFaces = 100;
+ p->mFaces = new aiFace[p->mNumFaces];
+
+ p->mTextureCoords[0] = new aiVector3D[10];
+ p->mNumUVComponents[0] = 0;
+ p->mNumUVComponents[1] = 0;
+
+ CheckIfOnly(p, 1, aiPrimitiveType_POINT);
+ CheckIfOnly(p, 2, aiPrimitiveType_LINE);
+ CheckIfOnly(p, 3, aiPrimitiveType_TRIANGLE);
+ CheckIfOnly(p, 4, aiPrimitiveType_POLYGON);
+ CheckIfOnly(p, 1249, aiPrimitiveType_POLYGON);
+
+ // Polygons and triangles mixed
+ unsigned i;
+ for (i = 0; i < p->mNumFaces / 2; ++i) {
+ p->mFaces[i].mNumIndices = 3;
+ }
+ for (; i < p->mNumFaces - p->mNumFaces / 4; ++i) {
+ p->mFaces[i].mNumIndices = 4;
+ }
+ for (; i < p->mNumFaces; ++i) {
+ p->mFaces[i].mNumIndices = 10;
+ }
+ ProcessMesh(p);
+ EXPECT_EQ(static_cast<unsigned int>(aiPrimitiveType_TRIANGLE | aiPrimitiveType_POLYGON),
+ p->mPrimitiveTypes);
+ EXPECT_EQ(2U, p->mNumUVComponents[0]);
+ EXPECT_EQ(0U, p->mNumUVComponents[1]);
+ delete p;
+}
+
+// ------------------------------------------------------------------------------------------------
+// Check whether a mesh is preprocessed correctly. Case 1: The mesh doesn't need preprocessing
+TEST_F(ScenePreprocessorTest, testMeshPreprocessingNeg) {
+ aiMesh *p = new aiMesh;
+ p->mPrimitiveTypes = aiPrimitiveType_TRIANGLE | aiPrimitiveType_POLYGON;
+ ProcessMesh(p);
+
+ // should be unmodified
+ EXPECT_EQ(static_cast<unsigned int>(aiPrimitiveType_TRIANGLE | aiPrimitiveType_POLYGON),
+ p->mPrimitiveTypes);
+
+ delete p;
+}
+
+// ------------------------------------------------------------------------------------------------
+// Make a dummy animation with a single channel, '<test>'
+aiAnimation *MakeDummyAnimation() {
+ aiAnimation *p = new aiAnimation();
+ p->mNumChannels = 1;
+ p->mChannels = new aiNodeAnim *[1];
+ aiNodeAnim *anim = p->mChannels[0] = new aiNodeAnim();
+ anim->mNodeName.Set("<test>");
+ return p;
+}
+
+// ------------------------------------------------------------------------------------------------
+// Check whether an anim is preprocessed correctly. Case 1: The anim needs preprocessing
+TEST_F(ScenePreprocessorTest, testAnimationPreprocessingPos) {
+ aiAnimation *p = MakeDummyAnimation();
+ aiNodeAnim *anim = p->mChannels[0];
+
+ // we don't set the animation duration, but generate scaling channels
+ anim->mNumScalingKeys = 10;
+ anim->mScalingKeys = new aiVectorKey[10];
+
+ for (unsigned int i = 0; i < 10; ++i) {
+ anim->mScalingKeys[i].mTime = i;
+ anim->mScalingKeys[i].mValue = aiVector3D((float)i);
+ }
+ ProcessAnimation(p);
+
+ // we should now have a proper duration
+ EXPECT_NEAR(p->mDuration, 9., 0.005);
+
+ // ... one scaling key
+ EXPECT_TRUE(anim->mNumPositionKeys == 1 &&
+ anim->mPositionKeys &&
+ anim->mPositionKeys[0].mTime == 0.0 &&
+ anim->mPositionKeys[0].mValue == aiVector3D(1.f, 2.f, 3.f));
+
+ // ... and one rotation key
+ EXPECT_TRUE(anim->mNumRotationKeys == 1 && anim->mRotationKeys &&
+ anim->mRotationKeys[0].mTime == 0.0);
+
+ delete p;
+}
diff --git a/libs/assimp/test/unit/utSharedPPData.cpp b/libs/assimp/test/unit/utSharedPPData.cpp
new file mode 100644
index 0000000..e4be169
--- /dev/null
+++ b/libs/assimp/test/unit/utSharedPPData.cpp
@@ -0,0 +1,124 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "UnitTestPCH.h"
+
+#include <assimp/scene.h>
+
+#include "Common/BaseProcess.h"
+
+using namespace std;
+using namespace Assimp;
+
+class SharedPPDataTest : public ::testing::Test {
+public:
+ virtual void SetUp();
+ virtual void TearDown();
+
+protected:
+ SharedPostProcessInfo* shared;
+};
+
+// ------------------------------------------------------------------------------------------------
+void SharedPPDataTest::SetUp()
+{
+ shared = new SharedPostProcessInfo();
+}
+
+// ------------------------------------------------------------------------------------------------
+void SharedPPDataTest::TearDown()
+{
+ delete shared;
+}
+
+// ------------------------------------------------------------------------------------------------
+TEST_F(SharedPPDataTest, testPODProperty)
+{
+ int i = 5;
+ shared->AddProperty("test",i);
+ int o = 0;
+ EXPECT_TRUE(shared->GetProperty("test",o));
+ EXPECT_EQ(5, o);
+ EXPECT_FALSE(shared->GetProperty("test2",o));
+ EXPECT_EQ(5, o);
+
+ float f = 12.f, m;
+ shared->AddProperty("test",f);
+ EXPECT_TRUE(shared->GetProperty("test",m));
+ EXPECT_EQ(12.f, m);
+}
+
+// ------------------------------------------------------------------------------------------------
+TEST_F(SharedPPDataTest, testPropertyPointer)
+{
+ int *i = new int;
+ shared->AddProperty("test16",i);
+ int* o;
+ EXPECT_TRUE(shared->GetProperty("test16",o));
+ EXPECT_EQ(i, o);
+ shared->RemoveProperty("test16");
+ EXPECT_FALSE(shared->GetProperty("test16",o));
+}
+
+static bool destructed;
+
+struct TestType
+{
+ ~TestType()
+ {
+ destructed = true;
+ }
+};
+// ------------------------------------------------------------------------------------------------
+TEST_F(SharedPPDataTest, testPropertyDeallocation)
+{
+ SharedPostProcessInfo* localShared = new SharedPostProcessInfo();
+ destructed = false;
+
+ TestType *out, * pip = new TestType();
+ localShared->AddProperty("quak",pip);
+ EXPECT_TRUE(localShared->GetProperty("quak",out));
+ EXPECT_EQ(pip, out);
+
+ delete localShared;
+ EXPECT_TRUE(destructed);
+}
diff --git a/libs/assimp/test/unit/utSimd.cpp b/libs/assimp/test/unit/utSimd.cpp
new file mode 100644
index 0000000..720d657
--- /dev/null
+++ b/libs/assimp/test/unit/utSimd.cpp
@@ -0,0 +1,62 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+
+#include "UnitTestPCH.h"
+
+#include "Common/simd.h"
+
+using namespace ::Assimp;
+
+class utSimd : public ::testing::Test {
+protected:
+ // empty
+};
+
+TEST_F( utSimd, SSE2SupportedTest ) {
+ bool isSupported;
+
+ isSupported = CPUSupportsSSE2();
+ if ( isSupported ) {
+ std::cout << "Supported" << std::endl;
+ } else {
+ std::cout << "Not supported" << std::endl;
+ }
+}
diff --git a/libs/assimp/test/unit/utSortByPType.cpp b/libs/assimp/test/unit/utSortByPType.cpp
new file mode 100644
index 0000000..4dc0342
--- /dev/null
+++ b/libs/assimp/test/unit/utSortByPType.cpp
@@ -0,0 +1,204 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "UnitTestPCH.h"
+
+#include "Common/ScenePreprocessor.h"
+#include "PostProcessing/SortByPTypeProcess.h"
+#include <assimp/scene.h>
+
+using namespace std;
+using namespace Assimp;
+
+class SortByPTypeProcessTest : public ::testing::Test {
+public:
+ SortByPTypeProcessTest() :
+ Test(), mProcess1(nullptr), mScene(nullptr) {
+ // empty
+ }
+
+protected:
+ virtual void SetUp();
+ virtual void TearDown();
+
+protected:
+ SortByPTypeProcess *mProcess1;
+ aiScene *mScene;
+};
+
+// ------------------------------------------------------------------------------------------------
+static unsigned int num[10][4] = {
+ { 0, 0, 0, 1000 },
+ { 0, 0, 1000, 0 },
+ { 0, 1000, 0, 0 },
+ { 1000, 0, 0, 0 },
+ { 500, 500, 0, 0 },
+ { 500, 0, 500, 0 },
+ { 0, 330, 330, 340 },
+ { 250, 250, 250, 250 },
+ { 100, 100, 100, 700 },
+ { 0, 100, 0, 900 },
+};
+
+// ------------------------------------------------------------------------------------------------
+static unsigned int result[10] = {
+ aiPrimitiveType_POLYGON,
+ aiPrimitiveType_TRIANGLE,
+ aiPrimitiveType_LINE,
+ aiPrimitiveType_POINT,
+ aiPrimitiveType_POINT | aiPrimitiveType_LINE,
+ aiPrimitiveType_POINT | aiPrimitiveType_TRIANGLE,
+ aiPrimitiveType_TRIANGLE | aiPrimitiveType_LINE | aiPrimitiveType_POLYGON,
+ aiPrimitiveType_POLYGON | aiPrimitiveType_LINE | aiPrimitiveType_TRIANGLE | aiPrimitiveType_POINT,
+ aiPrimitiveType_POLYGON | aiPrimitiveType_LINE | aiPrimitiveType_TRIANGLE | aiPrimitiveType_POINT,
+ aiPrimitiveType_LINE | aiPrimitiveType_POLYGON,
+};
+
+// ------------------------------------------------------------------------------------------------
+void SortByPTypeProcessTest::SetUp() {
+ mProcess1 = new SortByPTypeProcess();
+ mScene = new aiScene();
+
+ mScene->mNumMeshes = 10;
+ mScene->mMeshes = new aiMesh *[10];
+
+ bool five = false;
+ for (unsigned int i = 0; i < 10; ++i) {
+ aiMesh *mesh = mScene->mMeshes[i] = new aiMesh();
+ mesh->mNumFaces = 1000;
+ aiFace *faces = mesh->mFaces = new aiFace[1000];
+ aiVector3D *pv = mesh->mVertices = new aiVector3D[mesh->mNumFaces * 5];
+ aiVector3D *pn = mesh->mNormals = new aiVector3D[mesh->mNumFaces * 5];
+
+ aiVector3D *pt = mesh->mTangents = new aiVector3D[mesh->mNumFaces * 5];
+ aiVector3D *pb = mesh->mBitangents = new aiVector3D[mesh->mNumFaces * 5];
+
+ aiVector3D *puv = mesh->mTextureCoords[0] = new aiVector3D[mesh->mNumFaces * 5];
+
+ unsigned int remaining[4] = { num[i][0], num[i][1], num[i][2], num[i][3] };
+ unsigned int n = 0;
+ for (unsigned int m = 0; m < 1000; ++m) {
+ unsigned int idx = m % 4;
+ while (true) {
+ if (!remaining[idx]) {
+ if (4 == ++idx) {
+ idx = 0;
+ }
+ continue;
+ }
+ break;
+ }
+ faces->mNumIndices = idx + 1;
+ if (4 == faces->mNumIndices) {
+ if (five) ++faces->mNumIndices;
+ five = !five;
+ }
+ faces->mIndices = new unsigned int[faces->mNumIndices];
+ for (unsigned int q = 0; q < faces->mNumIndices; ++q, ++n) {
+ faces->mIndices[q] = n;
+ float f = (float)remaining[idx];
+
+ // (the values need to be unique - otherwise all degenerates would be removed)
+ *pv++ = aiVector3D(f, f + 1.f, f + q);
+ *pn++ = aiVector3D(f, f + 1.f, f + q);
+ *pt++ = aiVector3D(f, f + 1.f, f + q);
+ *pb++ = aiVector3D(f, f + 1.f, f + q);
+ *puv++ = aiVector3D(f, f + 1.f, f + q);
+ }
+ ++faces;
+ --remaining[idx];
+ }
+ mesh->mNumVertices = n;
+ }
+
+ mScene->mRootNode = new aiNode();
+ mScene->mRootNode->mNumChildren = 5;
+ mScene->mRootNode->mChildren = new aiNode *[5];
+ for (unsigned int i = 0; i < 5; ++i) {
+ aiNode *node = mScene->mRootNode->mChildren[i] = new aiNode();
+ node->mNumMeshes = 2;
+ node->mMeshes = new unsigned int[2];
+ node->mMeshes[0] = (i << 1u);
+ node->mMeshes[1] = (i << 1u) + 1;
+ }
+}
+
+// ------------------------------------------------------------------------------------------------
+void SortByPTypeProcessTest::TearDown() {
+ delete mProcess1;
+ delete mScene;
+}
+
+// ------------------------------------------------------------------------------------------------
+TEST_F(SortByPTypeProcessTest, SortByPTypeStep) {
+ ScenePreprocessor s(mScene);
+ s.ProcessScene();
+ for (unsigned int m = 0; m < 10; ++m)
+ EXPECT_EQ(result[m], mScene->mMeshes[m]->mPrimitiveTypes);
+
+ mProcess1->Execute(mScene);
+
+ unsigned int idx = 0;
+ for (unsigned int m = 0, real = 0; m < 10; ++m) {
+ for (unsigned int n = 0; n < 4; ++n) {
+ idx = num[m][n];
+ if (idx) {
+ EXPECT_TRUE(real < mScene->mNumMeshes);
+
+ aiMesh *mesh = mScene->mMeshes[real];
+
+ EXPECT_TRUE(NULL != mesh);
+ EXPECT_EQ(AI_PRIMITIVE_TYPE_FOR_N_INDICES(n + 1), mesh->mPrimitiveTypes);
+ EXPECT_TRUE(NULL != mesh->mVertices);
+ EXPECT_TRUE(NULL != mesh->mNormals);
+ EXPECT_TRUE(NULL != mesh->mTangents);
+ EXPECT_TRUE(NULL != mesh->mBitangents);
+ EXPECT_TRUE(NULL != mesh->mTextureCoords[0]);
+
+ EXPECT_TRUE(mesh->mNumFaces == idx);
+ for (unsigned int f = 0; f < mesh->mNumFaces; ++f) {
+ aiFace &face = mesh->mFaces[f];
+ EXPECT_TRUE(face.mNumIndices == (n + 1) || (3 == n && face.mNumIndices > 3));
+ }
+ ++real;
+ }
+ }
+ }
+}
diff --git a/libs/assimp/test/unit/utSplitLargeMeshes.cpp b/libs/assimp/test/unit/utSplitLargeMeshes.cpp
new file mode 100644
index 0000000..c8a697d
--- /dev/null
+++ b/libs/assimp/test/unit/utSplitLargeMeshes.cpp
@@ -0,0 +1,155 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "UnitTestPCH.h"
+
+#include "PostProcessing/SplitLargeMeshes.h"
+#include <assimp/scene.h>
+
+using namespace std;
+using namespace Assimp;
+
+class SplitLargeMeshesTest : public ::testing::Test {
+public:
+ virtual void SetUp();
+ virtual void TearDown();
+
+protected:
+ SplitLargeMeshesProcess_Triangle *piProcessTriangle;
+ SplitLargeMeshesProcess_Vertex *piProcessVertex;
+};
+
+// ------------------------------------------------------------------------------------------------
+void SplitLargeMeshesTest::SetUp() {
+ // construct the processes
+ this->piProcessTriangle = new SplitLargeMeshesProcess_Triangle();
+ this->piProcessVertex = new SplitLargeMeshesProcess_Vertex();
+
+ this->piProcessTriangle->SetLimit(1000);
+ this->piProcessVertex->SetLimit(1000);
+}
+
+// ------------------------------------------------------------------------------------------------
+void SplitLargeMeshesTest::TearDown() {
+ delete this->piProcessTriangle;
+ delete this->piProcessVertex;
+}
+
+// ------------------------------------------------------------------------------------------------
+TEST_F(SplitLargeMeshesTest, testVertexSplit) {
+ std::vector<std::pair<aiMesh *, unsigned int>> avOut;
+
+ aiMesh *pcMesh1 = new aiMesh();
+ pcMesh1->mNumVertices = 2100; // quersumme: 3
+ pcMesh1->mVertices = new aiVector3D[pcMesh1->mNumVertices];
+ pcMesh1->mNormals = new aiVector3D[pcMesh1->mNumVertices];
+
+ pcMesh1->mNumFaces = pcMesh1->mNumVertices / 3;
+ pcMesh1->mFaces = new aiFace[pcMesh1->mNumFaces];
+
+ unsigned int qq = 0;
+ for (unsigned int i = 0; i < pcMesh1->mNumFaces; ++i) {
+ aiFace &face = pcMesh1->mFaces[i];
+ face.mNumIndices = 3;
+ face.mIndices = new unsigned int[3];
+ face.mIndices[0] = qq++;
+ face.mIndices[1] = qq++;
+ face.mIndices[2] = qq++;
+ }
+
+ int iOldFaceNum = (int)pcMesh1->mNumFaces;
+ piProcessVertex->SplitMesh(0, pcMesh1, avOut);
+
+ for (std::vector<std::pair<aiMesh *, unsigned int>>::const_iterator
+ iter = avOut.begin(),
+ end = avOut.end();
+ iter != end; ++iter) {
+ aiMesh *mesh = (*iter).first;
+ EXPECT_LT(mesh->mNumVertices, 1000U);
+ EXPECT_TRUE(NULL != mesh->mNormals);
+ EXPECT_TRUE(NULL != mesh->mVertices);
+
+ iOldFaceNum -= mesh->mNumFaces;
+ delete mesh;
+ }
+ EXPECT_EQ(0, iOldFaceNum);
+}
+
+// ------------------------------------------------------------------------------------------------
+TEST_F(SplitLargeMeshesTest, testTriangleSplit) {
+ std::vector<std::pair<aiMesh *, unsigned int>> avOut;
+
+ // generate many, many faces with randomized indices for
+ // the second mesh
+ aiMesh *pcMesh2 = new aiMesh();
+ pcMesh2->mNumVertices = 3000;
+ pcMesh2->mVertices = new aiVector3D[pcMesh2->mNumVertices];
+ pcMesh2->mNormals = new aiVector3D[pcMesh2->mNumVertices];
+
+ pcMesh2->mNumFaces = 10000;
+ pcMesh2->mFaces = new aiFace[pcMesh2->mNumFaces];
+
+ for (unsigned int i = 0; i < pcMesh2->mNumFaces; ++i) {
+ aiFace &face = pcMesh2->mFaces[i];
+ face.mNumIndices = 3;
+ face.mIndices = new unsigned int[3];
+ face.mIndices[0] = (unsigned int)((rand() / (float)RAND_MAX) * pcMesh2->mNumVertices);
+ face.mIndices[1] = (unsigned int)((rand() / (float)RAND_MAX) * pcMesh2->mNumVertices);
+ face.mIndices[2] = (unsigned int)((rand() / (float)RAND_MAX) * pcMesh2->mNumVertices);
+ }
+
+ // the number of faces shouldn't change
+ int iOldFaceNum = (int)pcMesh2->mNumFaces;
+ piProcessTriangle->SplitMesh(0, pcMesh2, avOut);
+
+ for (std::vector<std::pair<aiMesh *, unsigned int>>::const_iterator
+ iter = avOut.begin(),
+ end = avOut.end();
+ iter != end; ++iter) {
+ aiMesh *mesh = (*iter).first;
+ EXPECT_LT(mesh->mNumFaces, 1000U);
+ EXPECT_TRUE(NULL != mesh->mNormals);
+ EXPECT_TRUE(NULL != mesh->mVertices);
+
+ iOldFaceNum -= mesh->mNumFaces;
+ delete mesh;
+ }
+ EXPECT_EQ(0, iOldFaceNum);
+}
diff --git a/libs/assimp/test/unit/utStringUtils.cpp b/libs/assimp/test/unit/utStringUtils.cpp
new file mode 100644
index 0000000..9c5ab31
--- /dev/null
+++ b/libs/assimp/test/unit/utStringUtils.cpp
@@ -0,0 +1,77 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "UnitTestPCH.h"
+#include <assimp/StringUtils.h>
+
+class utStringUtils : public ::testing::Test {
+ // empty
+};
+
+TEST_F(utStringUtils, to_string_Test ) {
+ std::string res = ai_to_string( 1 );
+ EXPECT_EQ( res, "1" );
+
+ res = ai_to_string( 1.0f );
+ EXPECT_EQ( res, "1" );
+}
+
+TEST_F(utStringUtils, ai_strtofTest ) {
+ float res = ai_strtof( nullptr, nullptr );
+ EXPECT_FLOAT_EQ( res, 0.0f );
+
+ std::string testStr1 = "200.0";
+ res = ai_strtof( testStr1.c_str(), nullptr );
+ EXPECT_FLOAT_EQ( res, 200.0f );
+
+ std::string testStr2 = "200.0 xxx";
+ const char *begin( testStr2.c_str() );
+ const char *end( begin + 6 );
+ res = ai_strtof( begin, end );
+ EXPECT_FLOAT_EQ( res, 200.0f );
+}
+
+TEST_F(utStringUtils, ai_rgba2hexTest) {
+ std::string result;
+ result = ai_rgba2hex(255, 255, 255, 255, true);
+ EXPECT_EQ(result, "#ffffffff");
+ result = ai_rgba2hex(0, 0, 0, 0, false);
+ EXPECT_EQ(result, "00000000");
+}
diff --git a/libs/assimp/test/unit/utTargetAnimation.cpp b/libs/assimp/test/unit/utTargetAnimation.cpp
new file mode 100644
index 0000000..9cbb453
--- /dev/null
+++ b/libs/assimp/test/unit/utTargetAnimation.cpp
@@ -0,0 +1,43 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "UnitTestPCH.h"
+
+// TODO
diff --git a/libs/assimp/test/unit/utTextureTransform.cpp b/libs/assimp/test/unit/utTextureTransform.cpp
new file mode 100644
index 0000000..9cbb453
--- /dev/null
+++ b/libs/assimp/test/unit/utTextureTransform.cpp
@@ -0,0 +1,43 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "UnitTestPCH.h"
+
+// TODO
diff --git a/libs/assimp/test/unit/utTriangulate.cpp b/libs/assimp/test/unit/utTriangulate.cpp
new file mode 100644
index 0000000..874e55c
--- /dev/null
+++ b/libs/assimp/test/unit/utTriangulate.cpp
@@ -0,0 +1,137 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "UnitTestPCH.h"
+
+#include <assimp/scene.h>
+
+#include "PostProcessing/TriangulateProcess.h"
+
+using namespace std;
+using namespace Assimp;
+
+class TriangulateProcessTest : public ::testing::Test {
+public:
+ virtual void SetUp();
+ virtual void TearDown();
+
+protected:
+ aiMesh *pcMesh;
+ TriangulateProcess *piProcess;
+};
+
+void TriangulateProcessTest::SetUp() {
+ piProcess = new TriangulateProcess();
+ pcMesh = new aiMesh();
+
+ pcMesh->mNumFaces = 1000;
+ pcMesh->mFaces = new aiFace[1000];
+ pcMesh->mVertices = new aiVector3D[10000];
+
+ pcMesh->mPrimitiveTypes = aiPrimitiveType_POINT | aiPrimitiveType_LINE | aiPrimitiveType_POLYGON;
+
+ for (unsigned int m = 0, t = 0, q = 4; m < 1000; ++m) {
+ ++t;
+ aiFace &face = pcMesh->mFaces[m];
+ face.mNumIndices = t;
+ if (4 == t) {
+ face.mNumIndices = q++;
+ t = 0;
+
+ if (10 == q) q = 4;
+ }
+ face.mIndices = new unsigned int[face.mNumIndices];
+ for (unsigned int p = 0; p < face.mNumIndices; ++p) {
+ face.mIndices[p] = pcMesh->mNumVertices;
+
+ // construct fully convex input data in ccw winding, xy plane
+ aiVector3D &v = pcMesh->mVertices[pcMesh->mNumVertices++];
+ v.z = 0.f;
+ v.x = cos(p * (float)(AI_MATH_TWO_PI) / face.mNumIndices);
+ v.y = sin(p * (float)(AI_MATH_TWO_PI) / face.mNumIndices);
+ }
+ }
+}
+
+void TriangulateProcessTest::TearDown() {
+ delete piProcess;
+ delete pcMesh;
+}
+
+TEST_F(TriangulateProcessTest, testTriangulation) {
+ piProcess->TriangulateMesh(pcMesh);
+
+ for (unsigned int m = 0, t = 0, q = 4, max = 1000, idx = 0; m < max; ++m) {
+ ++t;
+ aiFace &face = pcMesh->mFaces[m];
+ if (4 == t) {
+ t = 0;
+ max += q - 3;
+
+ std::vector<bool> ait(q, false);
+
+ for (unsigned int i = 0, tt = q - 2; i < tt; ++i, ++m) {
+ aiFace &curFace = pcMesh->mFaces[m];
+ EXPECT_EQ(3U, curFace.mNumIndices);
+
+ for (unsigned int qqq = 0; qqq < curFace.mNumIndices; ++qqq) {
+ ait[curFace.mIndices[qqq] - idx] = true;
+ }
+ }
+ for (std::vector<bool>::const_iterator it = ait.begin(); it != ait.end(); ++it) {
+ EXPECT_TRUE(*it);
+ }
+ --m;
+ idx += q;
+ if (++q == 10) {
+ q = 4;
+ }
+ } else {
+ EXPECT_EQ(t, face.mNumIndices);
+
+ for (unsigned int i = 0; i < face.mNumIndices; ++i, ++idx) {
+ EXPECT_EQ(idx, face.mIndices[i]);
+ }
+ }
+ }
+
+ // we should have no valid normal vectors now because we aren't a pure polygon mesh
+ EXPECT_TRUE(pcMesh->mNormals == NULL);
+}
diff --git a/libs/assimp/test/unit/utTypes.cpp b/libs/assimp/test/unit/utTypes.cpp
new file mode 100644
index 0000000..33d2b4f
--- /dev/null
+++ b/libs/assimp/test/unit/utTypes.cpp
@@ -0,0 +1,77 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "UnitTestPCH.h"
+
+#include <assimp/types.h>
+
+using namespace Assimp;
+
+class utTypes : public ::testing::Test {
+ // empty
+};
+
+TEST_F( utTypes, Color3dCpmpareOpTest ) {
+ aiColor3D col1( 1, 2, 3 );
+ aiColor3D col2( 4, 5, 6 );
+ const aiColor3D &col3(col1);
+
+ EXPECT_FALSE( col1 == col2 );
+ EXPECT_FALSE( col2 == col3 );
+ EXPECT_TRUE( col1 == col3 );
+
+ EXPECT_TRUE( col1 != col2 );
+ EXPECT_TRUE( col2 != col3 );
+ EXPECT_FALSE( col1 != col3 );
+}
+
+TEST_F( utTypes, Color3dIndexOpTest ) {
+ aiColor3D col( 1, 2, 3 );
+ const ai_real r = col[ 0 ];
+ EXPECT_FLOAT_EQ( 1, r );
+
+ const ai_real g = col[ 1 ];
+ EXPECT_FLOAT_EQ( 2, g );
+
+ const ai_real b = col[ 2 ];
+ EXPECT_FLOAT_EQ( 3, b );
+}
diff --git a/libs/assimp/test/unit/utValidateDataStructure.cpp b/libs/assimp/test/unit/utValidateDataStructure.cpp
new file mode 100644
index 0000000..099c54d
--- /dev/null
+++ b/libs/assimp/test/unit/utValidateDataStructure.cpp
@@ -0,0 +1,199 @@
+/*
+---------------------------------------------------------------------------
+Open Asset Import Library (assimp)
+---------------------------------------------------------------------------
+
+Copyright (c) 2006-2020, assimp team
+
+
+
+All rights reserved.
+
+Redistribution and use of this software in source and binary forms,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "UnitTestPCH.h"
+
+#include <assimp/mesh.h>
+#include <assimp/scene.h>
+#include <ValidateDataStructure.h>
+
+using namespace std;
+using namespace Assimp;
+
+
+class ValidateDataStructureTest : public ::testing::Test
+{
+public:
+
+ virtual void SetUp();
+ virtual void TearDown();
+
+protected:
+
+
+ ValidateDSProcess* vds;
+ aiScene* scene;
+};
+
+// ------------------------------------------------------------------------------------------------
+void ValidateDataStructureTest::SetUp()
+{
+ // setup a dummy scene with a single node
+ scene = new aiScene();
+ scene->mRootNode = new aiNode();
+ scene->mRootNode->mName.Set("<test>");
+
+ // add some translation
+ scene->mRootNode->mTransformation.a4 = 1.f;
+ scene->mRootNode->mTransformation.b4 = 2.f;
+ scene->mRootNode->mTransformation.c4 = 3.f;
+
+ // and allocate a ScenePreprocessor to operate on the scene
+ vds = new ValidateDSProcess();
+}
+
+// ------------------------------------------------------------------------------------------------
+void ValidateDataStructureTest::TearDown()
+{
+ delete vds;
+ delete scene;
+}
+
+
+
+// ------------------------------------------------------------------------------------------------
+//Template
+//TEST_F(ScenePreprocessorTest, test)
+//{
+//}
+// TODO Conditions not yet checked:
+//132: ReportError("aiScene::%s is NULL (aiScene::%s is %i)",
+//139: ReportError("aiScene::%s[%i] is NULL (aiScene::%s is %i)",
+//156: ReportError("aiScene::%s is NULL (aiScene::%s is %i)",
+//163: ReportError("aiScene::%s[%i] is NULL (aiScene::%s is %i)",
+//173: ReportError("aiScene::%s[%i] has the same name as "
+//192: ReportError("aiScene::%s[%i] has no corresponding node in the scene graph (%s)",
+//196: ReportError("aiScene::%s[%i]: there are more than one nodes with %s as name",
+//217: ReportError("aiScene::mNumMeshes is 0. At least one mesh must be there");
+//220: ReportError("aiScene::mMeshes is non-null although there are no meshes");
+//229: ReportError("aiScene::mAnimations is non-null although there are no animations");
+//238: ReportError("aiScene::mCameras is non-null although there are no cameras");
+//247: ReportError("aiScene::mLights is non-null although there are no lights");
+//256: ReportError("aiScene::mTextures is non-null although there are no textures");
+//266: ReportError("aiScene::mNumMaterials is 0. At least one material must be there");
+//270: ReportError("aiScene::mMaterials is non-null although there are no materials");
+//281: ReportWarning("aiLight::mType is aiLightSource_UNDEFINED");
+//286: ReportWarning("aiLight::mAttenuationXXX - all are zero");
+//290: ReportError("aiLight::mAngleInnerCone is larger than aiLight::mAngleOuterCone");
+//295: ReportWarning("aiLight::mColorXXX - all are black and won't have any influence");
+//303: ReportError("aiCamera::mClipPlaneFar must be >= aiCamera::mClipPlaneNear");
+//308: ReportWarning("%f is not a valid value for aiCamera::mHorizontalFOV",pCamera->mHorizontalFOV);
+//317: ReportError("aiMesh::mMaterialIndex is invalid (value: %i maximum: %i)",
+//332: ReportError("aiMesh::mFaces[%i].mNumIndices is 0",i);
+//336: ReportError("aiMesh::mFaces[%i] is a POINT but aiMesh::mPrimitiveTypes "
+//337: "does not report the POINT flag",i);
+//343: ReportError("aiMesh::mFaces[%i] is a LINE but aiMesh::mPrimitiveTypes "
+//344: "does not report the LINE flag",i);
+//350: ReportError("aiMesh::mFaces[%i] is a TRIANGLE but aiMesh::mPrimitiveTypes "
+//351: "does not report the TRIANGLE flag",i);
+//357: this->ReportError("aiMesh::mFaces[%i] is a POLYGON but aiMesh::mPrimitiveTypes "
+//358: "does not report the POLYGON flag",i);
+//365: ReportError("aiMesh::mFaces[%i].mIndices is NULL",i);
+//370: ReportError("The mesh %s contains no vertices", pMesh->mName.C_Str());
+//374: ReportError("Mesh has too many vertices: %u, but the limit is %u",pMesh->mNumVertices,AI_MAX_VERTICES);
+//377: ReportError("Mesh has too many faces: %u, but the limit is %u",pMesh->mNumFaces,AI_MAX_FACES);
+//382: ReportError("If there are tangents, bitangent vectors must be present as well");
+//387: ReportError("Mesh %s contains no faces", pMesh->mName.C_Str());
+//398: ReportError("Face %u has too many faces: %u, but the limit is %u",i,face.mNumIndices,AI_MAX_FACE_INDICES);
+//404: ReportError("aiMesh::mFaces[%i]::mIndices[%i] is out of range",i,a);
+//412: ReportError("aiMesh::mVertices[%i] is referenced twice - second "
+//426: ReportWarning("There are unreferenced vertices");
+//439: ReportError("Texture coordinate channel %i exists "
+//453: ReportError("Vertex color channel %i is exists "
+//464: ReportError("aiMesh::mBones is NULL (aiMesh::mNumBones is %i)",
+//480: ReportError("Bone %u has too many weights: %u, but the limit is %u",i,bone->mNumWeights,AI_MAX_BONE_WEIGHTS);
+//485: ReportError("aiMesh::mBones[%i] is NULL (aiMesh::mNumBones is %i)",
+//498: ReportError("aiMesh::mBones[%i], name = \"%s\" has the same name as "
+//507: ReportWarning("aiMesh::mVertices[%i]: bone weight sum != 1.0 (sum is %f)",i,afSum[i]);
+//513: ReportError("aiMesh::mBones is non-null although there are no bones");
+//524: ReportError("aiBone::mNumWeights is zero");
+//531: ReportError("aiBone::mWeights[%i].mVertexId is out of range",i);
+//534: ReportWarning("aiBone::mWeights[%i].mWeight has an invalid value",i);
+//549: ReportError("aiAnimation::mChannels is NULL (aiAnimation::mNumChannels is %i)",
+//556: ReportError("aiAnimation::mChannels[%i] is NULL (aiAnimation::mNumChannels is %i)",
+//563: ReportError("aiAnimation::mNumChannels is 0. At least one node animation channel must be there.");
+//567: // if (!pAnimation->mDuration)this->ReportError("aiAnimation::mDuration is zero");
+//592: ReportError("Material property %s is expected to be a string",prop->mKey.data);
+//596: ReportError("%s #%i is set, but there are only %i %s textures",
+//611: ReportError("Found texture property with index %i, although there "
+//619: ReportError("Material property %s%i is expected to be an integer (size is %i)",
+//627: ReportError("Material property %s%i is expected to be 5 floats large (size is %i)",
+//635: ReportError("Material property %s%i is expected to be an integer (size is %i)",
+//656: ReportWarning("Invalid UV index: %i (key %s). Mesh %i has only %i UV channels",
+//676: ReportWarning("UV-mapped texture, but there are no UV coords");
+//690: ReportError("aiMaterial::mProperties[%i] is NULL (aiMaterial::mNumProperties is %i)",
+//694: ReportError("aiMaterial::mProperties[%i].mDataLength or "
+//702: ReportError("aiMaterial::mProperties[%i].mDataLength is "
+//707: ReportError("Missing null-terminator in string material property");
+//713: ReportError("aiMaterial::mProperties[%i].mDataLength is "
+//720: ReportError("aiMaterial::mProperties[%i].mDataLength is "
+//739: ReportWarning("A specular shading model is specified but there is no "
+//743: ReportWarning("A specular shading model is specified but the value of the "
+//752: ReportWarning("Invalid opacity value (must be 0 < opacity < 1.0)");
+//776: ReportError("aiTexture::pcData is NULL");
+//781: ReportError("aiTexture::mWidth is zero (aiTexture::mHeight is %i, uncompressed texture)",
+//788: ReportError("aiTexture::mWidth is zero (compressed texture)");
+//791: ReportWarning("aiTexture::achFormatHint must be zero-terminated");
+//794: ReportWarning("aiTexture::achFormatHint should contain a file extension "
+//804: ReportError("aiTexture::achFormatHint contains non-lowercase letters");
+//815: ReportError("Empty node animation channel");
+//822: ReportError("aiNodeAnim::mPositionKeys is NULL (aiNodeAnim::mNumPositionKeys is %i)",
+//833: ReportError("aiNodeAnim::mPositionKeys[%i].mTime (%.5f) is larger "
+//840: ReportWarning("aiNodeAnim::mPositionKeys[%i].mTime (%.5f) is smaller "
+//853: ReportError("aiNodeAnim::mRotationKeys is NULL (aiNodeAnim::mNumRotationKeys is %i)",
+//861: ReportError("aiNodeAnim::mRotationKeys[%i].mTime (%.5f) is larger "
+//868: ReportWarning("aiNodeAnim::mRotationKeys[%i].mTime (%.5f) is smaller "
+//880: ReportError("aiNodeAnim::mScalingKeys is NULL (aiNodeAnim::mNumScalingKeys is %i)",
+//888: ReportError("aiNodeAnim::mScalingKeys[%i].mTime (%.5f) is larger "
+//895: ReportWarning("aiNodeAnim::mScalingKeys[%i].mTime (%.5f) is smaller "
+//907: ReportError("A node animation channel must have at least one subtrack");
+//915: ReportError("A node of the scenegraph is NULL");
+//920: ReportError("Non-root node %s lacks a valid parent (aiNode::mParent is NULL) ",pNode->mName);
+//928: ReportError("aiNode::mMeshes is NULL for node %s (aiNode::mNumMeshes is %i)",
+//937: ReportError("aiNode::mMeshes[%i] is out of range for node %s (maximum is %i)",
+//942: ReportError("aiNode::mMeshes[%i] is already referenced by this node %s (value: %i)",
+//951: ReportError("aiNode::mChildren is NULL for node %s (aiNode::mNumChildren is %i)",
+//965: ReportError("aiString::length is too large (%i, maximum is %lu)",
+//974: ReportError("aiString::data is invalid: the terminal zero is at a wrong offset");
+//979: ReportError("aiString::data is invalid. There is no terminal character");
+}
+
diff --git a/libs/assimp/test/unit/utVector3.cpp b/libs/assimp/test/unit/utVector3.cpp
new file mode 100644
index 0000000..2602c28
--- /dev/null
+++ b/libs/assimp/test/unit/utVector3.cpp
@@ -0,0 +1,69 @@
+/*-------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-------------------------------------------------------------------------*/
+#include "UnitTestPCH.h"
+#include <assimp/vector3.h>
+
+using namespace ::Assimp;
+
+class utVector3 : public ::testing::Test {
+ // empty
+};
+
+TEST_F(utVector3, CreationTest) {
+ aiVector3D v0;
+ aiVector3D v1(1.0f, 2.0f, 3.0f);
+ EXPECT_FLOAT_EQ(1.0f, v1[0]);
+ EXPECT_FLOAT_EQ(2.0f, v1[1]);
+ EXPECT_FLOAT_EQ(3.0f, v1[2]);
+ aiVector3D v2(1);
+ EXPECT_FLOAT_EQ(1.0f, v2[0]);
+ EXPECT_FLOAT_EQ(1.0f, v2[1]);
+ EXPECT_FLOAT_EQ(1.0f, v2[2]);
+ aiVector3D v3(v1);
+ EXPECT_FLOAT_EQ(v1[0], v3[0]);
+ EXPECT_FLOAT_EQ(v1[1], v3[1]);
+ EXPECT_FLOAT_EQ(v1[2], v3[2]);
+}
+
+TEST_F(utVector3, BracketOpTest) {
+ aiVector3D v(1.0f, 2.0f, 3.0f);
+ EXPECT_FLOAT_EQ(1.0f, v[0]);
+ EXPECT_FLOAT_EQ(2.0f, v[1]);
+ EXPECT_FLOAT_EQ(3.0f, v[2]);
+}
diff --git a/libs/assimp/test/unit/utVersion.cpp b/libs/assimp/test/unit/utVersion.cpp
new file mode 100644
index 0000000..7548417
--- /dev/null
+++ b/libs/assimp/test/unit/utVersion.cpp
@@ -0,0 +1,77 @@
+/*-------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-------------------------------------------------------------------------*/
+#include "UnitTestPCH.h"
+#include <assimp/version.h>
+
+class utVersion : public ::testing::Test {
+ // empty
+};
+
+TEST_F( utVersion, aiGetLegalStringTest ) {
+ const char *lv = aiGetLegalString();
+ EXPECT_NE( lv, nullptr );
+ std::string text( lv );
+
+ size_t pos = text.find(std::string("2022"));
+ EXPECT_NE(pos, std::string::npos);
+}
+
+TEST_F( utVersion, aiGetVersionMinorTest ) {
+ EXPECT_EQ(aiGetVersionMinor(), 2U);
+}
+
+TEST_F( utVersion, aiGetVersionMajorTest ) {
+ EXPECT_EQ( aiGetVersionMajor(), 5U );
+}
+
+TEST_F( utVersion, aiGetVersionPatchTest ) {
+ EXPECT_EQ(aiGetVersionPatch(), 0U );
+}
+
+TEST_F( utVersion, aiGetCompileFlagsTest ) {
+ EXPECT_NE( aiGetCompileFlags(), 0U );
+}
+
+TEST_F( utVersion, aiGetVersionRevisionTest ) {
+ EXPECT_NE( aiGetVersionRevision(), 0U );
+}
+
+TEST_F( utVersion, aiGetBranchNameTest ) {
+ EXPECT_NE( nullptr, aiGetBranchName() );
+}
diff --git a/libs/assimp/test/unit/utVertexTriangleAdjacency.cpp b/libs/assimp/test/unit/utVertexTriangleAdjacency.cpp
new file mode 100644
index 0000000..bda6304
--- /dev/null
+++ b/libs/assimp/test/unit/utVertexTriangleAdjacency.cpp
@@ -0,0 +1,210 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "UnitTestPCH.h"
+
+#include <assimp/mesh.h>
+#include <assimp/types.h>
+
+#include "Common/VertexTriangleAdjacency.h"
+
+using namespace std;
+using namespace Assimp;
+
+class VTAdjacencyTest : public ::testing::Test {
+protected:
+ void checkMesh(const aiMesh &mesh);
+};
+
+// ------------------------------------------------------------------------------------------------
+TEST_F(VTAdjacencyTest, largeRandomDataSet) {
+ // build a test mesh with randomized input data
+ // *******************************************************************************
+ aiMesh mesh;
+
+ mesh.mNumVertices = 500;
+ mesh.mNumFaces = 600;
+
+ mesh.mFaces = new aiFace[600];
+ unsigned int iCurrent = 0;
+ for (unsigned int i = 0; i < 600; ++i) {
+ aiFace &face = mesh.mFaces[i];
+ face.mNumIndices = 3;
+ face.mIndices = new unsigned int[3];
+
+ if (499 == iCurrent) iCurrent = 0;
+ face.mIndices[0] = iCurrent++;
+
+ while (face.mIndices[0] == (face.mIndices[1] = (unsigned int)(((float)rand() / RAND_MAX) * 499)))
+ ;
+ while (face.mIndices[0] == (face.mIndices[2] = (unsigned int)(((float)rand() / RAND_MAX) * 499)) ||
+ face.mIndices[1] == face.mIndices[2])
+ ;
+ }
+
+ checkMesh(mesh);
+}
+
+// ------------------------------------------------------------------------------------------------
+TEST_F(VTAdjacencyTest, smallDataSet) {
+
+ // build a test mesh - this one is extremely small
+ // *******************************************************************************
+ aiMesh mesh;
+
+ mesh.mNumVertices = 5;
+ mesh.mNumFaces = 3;
+
+ mesh.mFaces = new aiFace[3];
+ mesh.mFaces[0].mIndices = new unsigned int[3];
+ mesh.mFaces[0].mNumIndices = 3;
+ mesh.mFaces[1].mIndices = new unsigned int[3];
+ mesh.mFaces[1].mNumIndices = 3;
+ mesh.mFaces[2].mIndices = new unsigned int[3];
+ mesh.mFaces[2].mNumIndices = 3;
+
+ mesh.mFaces[0].mIndices[0] = 1;
+ mesh.mFaces[0].mIndices[1] = 3;
+ mesh.mFaces[0].mIndices[2] = 2;
+
+ mesh.mFaces[1].mIndices[0] = 0;
+ mesh.mFaces[1].mIndices[1] = 2;
+ mesh.mFaces[1].mIndices[2] = 3;
+
+ mesh.mFaces[2].mIndices[0] = 3;
+ mesh.mFaces[2].mIndices[1] = 0;
+ mesh.mFaces[2].mIndices[2] = 4;
+
+ checkMesh(mesh);
+}
+
+// ------------------------------------------------------------------------------------------------
+TEST_F(VTAdjacencyTest, unreferencedVerticesSet) {
+ // build a test mesh which does not reference all vertices
+ // *******************************************************************************
+ aiMesh mesh;
+
+ mesh.mNumVertices = 500;
+ mesh.mNumFaces = 600;
+
+ mesh.mFaces = new aiFace[600];
+ unsigned int iCurrent = 0;
+ for (unsigned int i = 0; i < 600; ++i) {
+ aiFace &face = mesh.mFaces[i];
+ face.mNumIndices = 3;
+ face.mIndices = new unsigned int[3];
+
+ if (499 == iCurrent) iCurrent = 0;
+ face.mIndices[0] = iCurrent++;
+
+ if (499 == iCurrent) iCurrent = 0;
+ face.mIndices[1] = iCurrent++;
+
+ if (499 == iCurrent) iCurrent = 0;
+ face.mIndices[2] = iCurrent++;
+
+ if (rand() > RAND_MAX / 2 && face.mIndices[0]) {
+ face.mIndices[0]--;
+ } else if (face.mIndices[1])
+ face.mIndices[1]--;
+ }
+
+ checkMesh(mesh);
+}
+
+// ------------------------------------------------------------------------------------------------
+void VTAdjacencyTest::checkMesh(const aiMesh &mesh) {
+ VertexTriangleAdjacency adj(mesh.mFaces, mesh.mNumFaces, mesh.mNumVertices, true);
+
+ unsigned int *const piNum = adj.mLiveTriangles;
+
+ // check the primary adjacency table and check whether all faces
+ // are contained in the list
+ unsigned int maxOfs = 0;
+ for (unsigned int i = 0; i < mesh.mNumFaces; ++i) {
+ aiFace &face = mesh.mFaces[i];
+ for (unsigned int qq = 0; qq < 3; ++qq) {
+ const unsigned int idx = face.mIndices[qq];
+ const unsigned int num = piNum[idx];
+
+ // go to this offset
+ const unsigned int ofs = adj.mOffsetTable[idx];
+ maxOfs = std::max(ofs + num, maxOfs);
+ unsigned int *pi = &adj.mAdjacencyTable[ofs];
+
+ // and search for us ...
+ unsigned int tt = 0;
+ for (; tt < num; ++tt, ++pi) {
+ if (i == *pi) {
+ // mask our entry in the table. Finally all entries should be masked
+ *pi = 0xffffffff;
+
+ // there shouldn't be two entries for the same face
+ break;
+ }
+ }
+ // assert if *this* vertex has not been found in the table
+ EXPECT_LT(tt, num);
+ }
+ }
+
+ // now check whether there are invalid faces
+ const unsigned int *pi = adj.mAdjacencyTable;
+ for (unsigned int i = 0; i < maxOfs; ++i, ++pi) {
+ EXPECT_EQ(0xffffffff, *pi);
+ }
+
+ // check the numTrianglesPerVertex table
+ for (unsigned int i = 0; i < mesh.mNumFaces; ++i) {
+ aiFace &face = mesh.mFaces[i];
+ for (unsigned int qq = 0; qq < 3; ++qq) {
+ const unsigned int idx = face.mIndices[qq];
+
+ // we should not reach 0 here ...
+ EXPECT_NE(0U, piNum[idx]);
+ piNum[idx]--;
+ }
+ }
+
+ // check whether we reached 0 in all entries
+ for (unsigned int i = 0; i < mesh.mNumVertices; ++i) {
+ EXPECT_FALSE(piNum[i]);
+ }
+}
diff --git a/libs/assimp/test/unit/utX3DImportExport.cpp b/libs/assimp/test/unit/utX3DImportExport.cpp
new file mode 100644
index 0000000..f2df81a
--- /dev/null
+++ b/libs/assimp/test/unit/utX3DImportExport.cpp
@@ -0,0 +1,61 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+
+#include "AbstractImportExportBase.h"
+#include "UnitTestPCH.h"
+
+#include <assimp/postprocess.h>
+#include <assimp/Importer.hpp>
+
+using namespace Assimp;
+
+class utX3DImportExport : public AbstractImportExportBase {
+public:
+ bool importerTest() override {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/X3D/HelloX3dTrademark.x3d", aiProcess_ValidateDataStructure);
+ return nullptr != scene;
+ }
+};
+
+TEST_F(utX3DImportExport, importX3DFromFileTest) {
+ EXPECT_TRUE(importerTest());
+}
diff --git a/libs/assimp/test/unit/utXImporterExporter.cpp b/libs/assimp/test/unit/utXImporterExporter.cpp
new file mode 100644
index 0000000..4d247cc
--- /dev/null
+++ b/libs/assimp/test/unit/utXImporterExporter.cpp
@@ -0,0 +1,126 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+
+#include "AbstractImportExportBase.h"
+#include "UnitTestPCH.h"
+
+#include <assimp/postprocess.h>
+#include <assimp/Importer.hpp>
+
+using namespace Assimp;
+
+class utXImporterExporter : public AbstractImportExportBase {
+public:
+ virtual bool importerTest() {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/X/test.x", aiProcess_ValidateDataStructure);
+ return nullptr != scene;
+ }
+};
+
+TEST_F(utXImporterExporter, importXFromFileTest) {
+ EXPECT_TRUE(importerTest());
+}
+
+TEST_F(utXImporterExporter, heap_overflow_in_tokenizer) {
+ Assimp::Importer importer;
+ EXPECT_NO_THROW(importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/X/OV_GetNextToken", 0));
+}
+
+TEST(utXImporter, importAnimTest) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/X/anim_test.x", aiProcess_ValidateDataStructure);
+ ASSERT_NE(nullptr, scene);
+}
+
+TEST(utXImporter, importBCNEpileptic) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/X/BCN_Epileptic.X", aiProcess_ValidateDataStructure);
+ ASSERT_NE(nullptr, scene);
+}
+
+TEST(utXImporter, importFromTrueSpaceBin32) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/X/fromtruespace_bin32.x", aiProcess_ValidateDataStructure);
+ ASSERT_NE(nullptr, scene);
+}
+
+TEST(utXImporter, import_kwxport_test_cubewithvcolors) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/X/kwxport_test_cubewithvcolors.x", aiProcess_ValidateDataStructure);
+ ASSERT_NE(nullptr, scene);
+}
+
+TEST(utXImporter, importTestCubeBinary) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/X/test_cube_binary.x", aiProcess_ValidateDataStructure);
+ ASSERT_NE(nullptr, scene);
+}
+
+TEST(utXImporter, importTestCubeCompressed) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/X/test_cube_compressed.x", aiProcess_ValidateDataStructure);
+ ASSERT_NE(nullptr, scene);
+}
+
+TEST(utXImporter, importTestCubeText) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/X/test_cube_text.x", aiProcess_ValidateDataStructure);
+ ASSERT_NE(nullptr, scene);
+}
+
+TEST(utXImporter, importTestWuson) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/X/Testwuson.X", aiProcess_ValidateDataStructure);
+ ASSERT_NE(nullptr, scene);
+}
+
+TEST(utXImporter, TestFormatDetection) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/X/TestFormatDetection", aiProcess_ValidateDataStructure);
+ ASSERT_NE(nullptr, scene);
+}
+
+TEST(utXImporter, importDwarf) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_NONBSD_DIR "/X/dwarf.x", aiProcess_ValidateDataStructure);
+ ASSERT_NE(nullptr, scene);
+}
diff --git a/libs/assimp/test/unit/utglTF2ImportExport.cpp b/libs/assimp/test/unit/utglTF2ImportExport.cpp
new file mode 100644
index 0000000..00f76aa
--- /dev/null
+++ b/libs/assimp/test/unit/utglTF2ImportExport.cpp
@@ -0,0 +1,834 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "AbstractImportExportBase.h"
+#include "UnitTestPCH.h"
+
+#include <assimp/commonMetaData.h>
+#include <assimp/postprocess.h>
+#include <assimp/scene.h>
+#include <assimp/Exporter.hpp>
+#include <assimp/Importer.hpp>
+#include <assimp/LogStream.hpp>
+#include <assimp/DefaultLogger.hpp>
+
+#include <rapidjson/schema.h>
+
+#include <array>
+
+#include <assimp/material.h>
+#include <assimp/GltfMaterial.h>
+
+using namespace Assimp;
+
+class utglTF2ImportExport : public AbstractImportExportBase {
+public:
+ virtual bool importerMatTest(const char *file, bool spec_gloss, std::array<aiTextureMapMode, 2> exp_modes = { aiTextureMapMode_Wrap, aiTextureMapMode_Wrap }) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(file, aiProcess_ValidateDataStructure);
+ EXPECT_NE(scene, nullptr);
+ if (!scene) {
+ return false;
+ }
+
+ EXPECT_TRUE(scene->HasMaterials());
+ if (!scene->HasMaterials()) {
+ return false;
+ }
+ const aiMaterial *material = scene->mMaterials[0];
+
+ // This Material should be a PBR
+ aiShadingMode shadingMode;
+ EXPECT_EQ(aiReturn_SUCCESS, material->Get(AI_MATKEY_SHADING_MODEL, shadingMode));
+ EXPECT_EQ(aiShadingMode_PBR_BRDF, shadingMode);
+
+ // Should import the texture as diffuse and as base color
+ aiString path;
+ std::array<aiTextureMapMode,2> modes;
+ EXPECT_EQ(aiReturn_SUCCESS, material->GetTexture(aiTextureType_DIFFUSE, 0, &path, nullptr, nullptr,
+ nullptr, nullptr, modes.data()));
+ EXPECT_STREQ(path.C_Str(), "CesiumLogoFlat.png");
+ EXPECT_EQ(exp_modes, modes);
+
+ // Also as Base Color
+ EXPECT_EQ(aiReturn_SUCCESS, material->GetTexture(aiTextureType_BASE_COLOR, 0, &path, nullptr, nullptr,
+ nullptr, nullptr, modes.data()));
+ EXPECT_STREQ(path.C_Str(), "CesiumLogoFlat.png");
+ EXPECT_EQ(exp_modes, modes);
+
+ // Should have a MetallicFactor (default is 1.0)
+ ai_real metal_factor = ai_real(0.5);
+ EXPECT_EQ(aiReturn_SUCCESS, material->Get(AI_MATKEY_METALLIC_FACTOR, metal_factor));
+ EXPECT_EQ(ai_real(0.0), metal_factor);
+
+ // And a roughness factor (default is 1.0)
+ ai_real roughness_factor = ai_real(0.5);
+ EXPECT_EQ(aiReturn_SUCCESS, material->Get(AI_MATKEY_ROUGHNESS_FACTOR, roughness_factor));
+ EXPECT_EQ(ai_real(1.0), roughness_factor);
+
+ aiColor3D spec_color = { 0, 0, 0 };
+ ai_real glossiness = ai_real(0.5);
+ if (spec_gloss) {
+ EXPECT_EQ(aiReturn_SUCCESS, material->Get(AI_MATKEY_COLOR_SPECULAR, spec_color));
+ constexpr ai_real spec_val(0.20000000298023225); // From the file
+ EXPECT_EQ(spec_val, spec_color.r);
+ EXPECT_EQ(spec_val, spec_color.g);
+ EXPECT_EQ(spec_val, spec_color.b);
+ EXPECT_EQ(aiReturn_SUCCESS, material->Get(AI_MATKEY_GLOSSINESS_FACTOR, glossiness));
+ EXPECT_EQ(ai_real(1.0), glossiness);
+ } else {
+ EXPECT_EQ(aiReturn_FAILURE, material->Get(AI_MATKEY_COLOR_SPECULAR, spec_color));
+ EXPECT_EQ(aiReturn_FAILURE, material->Get(AI_MATKEY_GLOSSINESS_FACTOR, glossiness));
+ }
+
+ return true;
+ }
+
+ virtual bool binaryImporterTest() {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/2CylinderEngine-glTF-Binary/2CylinderEngine.glb",
+ aiProcess_ValidateDataStructure);
+ return nullptr != scene;
+ }
+
+#ifndef ASSIMP_BUILD_NO_EXPORT
+ virtual bool exporterTest() {
+ Assimp::Importer importer;
+ Assimp::Exporter exporter;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/BoxTextured-glTF/BoxTextured.gltf",
+ aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+ EXPECT_EQ(aiReturn_SUCCESS, exporter.Export(scene, "gltf2", ASSIMP_TEST_MODELS_DIR "/glTF2/BoxTextured-glTF/BoxTextured_out.gltf"));
+
+ return true;
+ }
+#endif // ASSIMP_BUILD_NO_EXPORT
+};
+
+TEST_F(utglTF2ImportExport, importglTF2FromFileTest) {
+ EXPECT_TRUE(importerMatTest(ASSIMP_TEST_MODELS_DIR "/glTF2/BoxTextured-glTF/BoxTextured.gltf", false, {aiTextureMapMode_Mirror, aiTextureMapMode_Clamp}));
+}
+
+TEST_F(utglTF2ImportExport, importBinaryglTF2FromFileTest) {
+ EXPECT_TRUE(binaryImporterTest());
+}
+
+TEST_F(utglTF2ImportExport, importglTF2_KHR_materials_pbrSpecularGlossiness) {
+ EXPECT_TRUE(importerMatTest(ASSIMP_TEST_MODELS_DIR "/glTF2/BoxTextured-glTF-pbrSpecularGlossiness/BoxTextured.gltf", true));
+}
+
+void VerifyClearCoatScene(const aiScene *scene) {
+ ASSERT_NE(nullptr, scene);
+
+ ASSERT_TRUE(scene->HasMaterials());
+
+ // Find a specific Clearcoat material and check the values
+ const aiString partial_coated("Partial_Coated");
+ bool found_partial_coat = false;
+ for (size_t i = 0; i < scene->mNumMaterials; ++i) {
+ const aiMaterial *material = scene->mMaterials[i];
+ ASSERT_NE(nullptr, material);
+ if (material->GetName() == partial_coated) {
+ found_partial_coat = true;
+
+ ai_real clearcoat_factor(0.0f);
+ EXPECT_EQ(aiReturn_SUCCESS, material->Get(AI_MATKEY_CLEARCOAT_FACTOR, clearcoat_factor));
+ EXPECT_EQ(ai_real(1.0f), clearcoat_factor);
+
+ ai_real clearcoat_rough_factor(0.0f);
+ EXPECT_EQ(aiReturn_SUCCESS, material->Get(AI_MATKEY_CLEARCOAT_ROUGHNESS_FACTOR, clearcoat_rough_factor));
+ EXPECT_EQ(ai_real(0.03f), clearcoat_rough_factor);
+
+ // Should import the texture as diffuse and as base color
+ aiString path;
+ std::array<aiTextureMapMode, 2> modes;
+ static const std::array<aiTextureMapMode, 2> exp_modes = { aiTextureMapMode_Wrap, aiTextureMapMode_Wrap };
+ EXPECT_EQ(aiReturn_SUCCESS, material->GetTexture(AI_MATKEY_CLEARCOAT_TEXTURE, &path, nullptr, nullptr,
+ nullptr, nullptr, modes.data()));
+ EXPECT_STREQ(path.C_Str(), "PartialCoating.png");
+ EXPECT_EQ(exp_modes, modes);
+ }
+ }
+ EXPECT_TRUE(found_partial_coat);
+}
+
+TEST_F(utglTF2ImportExport, importglTF2_KHR_materials_clearcoat) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/ClearCoat-glTF/ClearCoatTest.gltf", aiProcess_ValidateDataStructure);
+ VerifyClearCoatScene(scene);
+}
+
+#ifndef ASSIMP_BUILD_NO_EXPORT
+
+TEST_F(utglTF2ImportExport, importglTF2AndExport_KHR_materials_clearcoat) {
+ {
+ Assimp::Importer importer;
+ Assimp::Exporter exporter;
+ const aiScene* scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/ClearCoat-glTF/ClearCoatTest.gltf", aiProcess_ValidateDataStructure);
+ ASSERT_NE(nullptr, scene);
+ // Export
+ EXPECT_EQ(aiReturn_SUCCESS, exporter.Export(scene, "glb2", ASSIMP_TEST_MODELS_DIR "/glTF2/ClearCoat-glTF/ClearCoatTest_out.glb"));
+ }
+
+ // And re-import
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/ClearCoat-glTF/ClearCoatTest_out.glb", aiProcess_ValidateDataStructure);
+ VerifyClearCoatScene(scene);
+}
+
+TEST_F(utglTF2ImportExport, importglTF2AndExport_KHR_materials_pbrSpecularGlossiness) {
+ Assimp::Importer importer;
+ Assimp::Exporter exporter;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/BoxTextured-glTF-pbrSpecularGlossiness/BoxTextured.gltf",
+ aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+ // Export
+ EXPECT_EQ(aiReturn_SUCCESS, exporter.Export(scene, "glb2", ASSIMP_TEST_MODELS_DIR "/glTF2/BoxTextured-glTF-pbrSpecularGlossiness/BoxTextured_out.glb"));
+
+ // And re-import
+ EXPECT_TRUE(importerMatTest(ASSIMP_TEST_MODELS_DIR "/glTF2/BoxTextured-glTF-pbrSpecularGlossiness/BoxTextured_out.glb", true));
+}
+
+TEST_F(utglTF2ImportExport, importglTF2AndExportToOBJ) {
+ Assimp::Importer importer;
+ Assimp::Exporter exporter;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/BoxTextured-glTF/BoxTextured.gltf",
+ aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+ EXPECT_EQ(aiReturn_SUCCESS, exporter.Export(scene, "obj", ASSIMP_TEST_MODELS_DIR "/glTF2/BoxTextured-glTF/BoxTextured_out.obj"));
+}
+
+TEST_F(utglTF2ImportExport, importglTF2EmbeddedAndExportToOBJ) {
+ Assimp::Importer importer;
+ Assimp::Exporter exporter;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/BoxTextured-glTF-Embedded/BoxTextured.gltf",
+ aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+ EXPECT_EQ(aiReturn_SUCCESS, exporter.Export(scene, "obj", ASSIMP_TEST_MODELS_DIR "/glTF2/BoxTextured-glTF-Embedded/BoxTextured_out.obj"));
+}
+
+#endif // ASSIMP_BUILD_NO_EXPORT
+
+TEST_F(utglTF2ImportExport, importglTF2PrimitiveModePointsWithoutIndices) {
+ Assimp::Importer importer;
+ //Points without indices
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/glTF-Asset-Generator/Mesh_PrimitiveMode/Mesh_PrimitiveMode_00.gltf", aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+ EXPECT_EQ(scene->mMeshes[0]->mNumVertices, 1024u);
+ for (unsigned int i = 0; i < scene->mMeshes[0]->mNumFaces; ++i) {
+ EXPECT_EQ(scene->mMeshes[0]->mFaces[i].mNumIndices, 1u);
+ EXPECT_EQ(scene->mMeshes[0]->mFaces[i].mIndices[0], i);
+ }
+}
+
+TEST_F(utglTF2ImportExport, importglTF2PrimitiveModeLinesWithoutIndices) {
+ Assimp::Importer importer;
+ //Lines without indices
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/glTF-Asset-Generator/Mesh_PrimitiveMode/Mesh_PrimitiveMode_01.gltf", aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+ EXPECT_EQ(scene->mMeshes[0]->mNumVertices, 8u);
+ for (unsigned int i = 0; i < scene->mMeshes[0]->mNumFaces; ++i) {
+ EXPECT_EQ(scene->mMeshes[0]->mFaces[i].mNumIndices, 2u);
+ EXPECT_EQ(scene->mMeshes[0]->mFaces[i].mIndices[0], i * 2u);
+ EXPECT_EQ(scene->mMeshes[0]->mFaces[i].mIndices[1], i * 2u + 1u);
+ }
+}
+
+TEST_F(utglTF2ImportExport, importglTF2PrimitiveModeLinesLoopWithoutIndices) {
+ Assimp::Importer importer;
+ //Lines loop without indices
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/glTF-Asset-Generator/Mesh_PrimitiveMode/Mesh_PrimitiveMode_02.gltf", aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+ EXPECT_EQ(scene->mMeshes[0]->mNumVertices, 4u);
+
+ std::array<unsigned int, 5> l1 = { { 0u, 1u, 2u, 3u, 0u } };
+ EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mNumIndices, 2u);
+ for (unsigned int i = 0; i < scene->mMeshes[0]->mNumFaces; ++i) {
+ EXPECT_EQ(scene->mMeshes[0]->mFaces[i].mNumIndices, 2u);
+ EXPECT_EQ(scene->mMeshes[0]->mFaces[i].mIndices[0], l1[i]);
+ EXPECT_EQ(scene->mMeshes[0]->mFaces[i].mIndices[1], l1[i + 1u]);
+ }
+}
+
+TEST_F(utglTF2ImportExport, importglTF2PrimitiveModeLinesStripWithoutIndices) {
+ Assimp::Importer importer;
+ //Lines strip without indices
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/glTF-Asset-Generator/Mesh_PrimitiveMode/Mesh_PrimitiveMode_03.gltf", aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+ EXPECT_EQ(scene->mMeshes[0]->mNumVertices, 5u);
+
+ EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mNumIndices, 2u);
+ for (unsigned int i = 0; i < scene->mMeshes[0]->mNumFaces; ++i) {
+ EXPECT_EQ(scene->mMeshes[0]->mFaces[i].mNumIndices, 2u);
+ EXPECT_EQ(scene->mMeshes[0]->mFaces[i].mIndices[0], i);
+ EXPECT_EQ(scene->mMeshes[0]->mFaces[i].mIndices[1], i + 1u);
+ }
+}
+
+TEST_F(utglTF2ImportExport, importglTF2PrimitiveModeTrianglesStripWithoutIndices) {
+ Assimp::Importer importer;
+ //Triangles strip without indices
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/glTF-Asset-Generator/Mesh_PrimitiveMode/Mesh_PrimitiveMode_04.gltf", aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+ EXPECT_EQ(scene->mMeshes[0]->mNumFaces, 2u);
+ EXPECT_EQ(scene->mMeshes[0]->mNumVertices, 4u);
+ std::array<unsigned int, 3> f1 = { { 0u, 1u, 2u } };
+ EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mNumIndices, 3u);
+ for (unsigned int i = 0; i < 3; ++i) {
+ EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mIndices[i], f1[i]);
+ }
+
+ std::array<unsigned int, 3> f2 = { { 2u, 1u, 3u } };
+ EXPECT_EQ(scene->mMeshes[0]->mFaces[1].mNumIndices, 3u);
+ for (size_t i = 0; i < 3; ++i) {
+ EXPECT_EQ(scene->mMeshes[0]->mFaces[1].mIndices[i], f2[i]);
+ }
+}
+
+TEST_F(utglTF2ImportExport, importglTF2PrimitiveModeTrianglesFanWithoutIndices) {
+ Assimp::Importer importer;
+ //Triangles fan without indices
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/glTF-Asset-Generator/Mesh_PrimitiveMode/Mesh_PrimitiveMode_05.gltf", aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+ EXPECT_EQ(scene->mMeshes[0]->mNumFaces, 2u);
+ EXPECT_EQ(scene->mMeshes[0]->mNumVertices, 4u);
+ std::array<unsigned int, 3> f1 = { { 0u, 1u, 2u } };
+ EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mNumIndices, 3u);
+ for (size_t i = 0; i < 3; ++i) {
+ EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mIndices[i], f1[i]);
+ }
+
+ std::array<unsigned int, 3> f2 = { { 0u, 2u, 3u } };
+ EXPECT_EQ(scene->mMeshes[0]->mFaces[1].mNumIndices, 3u);
+ for (size_t i = 0; i < 3; ++i) {
+ EXPECT_EQ(scene->mMeshes[0]->mFaces[1].mIndices[i], f2[i]);
+ }
+}
+
+TEST_F(utglTF2ImportExport, importglTF2PrimitiveModeTrianglesWithoutIndices) {
+ Assimp::Importer importer;
+ //Triangles without indices
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/glTF-Asset-Generator/Mesh_PrimitiveMode/Mesh_PrimitiveMode_06.gltf", aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+ EXPECT_EQ(scene->mMeshes[0]->mNumFaces, 2u);
+ EXPECT_EQ(scene->mMeshes[0]->mNumVertices, 6u);
+ std::array<unsigned int, 3> f1 = { { 0u, 1u, 2u } };
+ EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mNumIndices, 3u);
+ for (size_t i = 0; i < 3; ++i) {
+ EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mIndices[i], f1[i]);
+ }
+
+ std::array<unsigned int, 3> f2 = { { 3u, 4u, 5u } };
+ EXPECT_EQ(scene->mMeshes[0]->mFaces[1].mNumIndices, 3u);
+ for (size_t i = 0; i < 3; ++i) {
+ EXPECT_EQ(scene->mMeshes[0]->mFaces[1].mIndices[i], f2[i]);
+ }
+}
+
+TEST_F(utglTF2ImportExport, importglTF2PrimitiveModePoints) {
+ Assimp::Importer importer;
+ //Line loop
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/glTF-Asset-Generator/Mesh_PrimitiveMode/Mesh_PrimitiveMode_07.gltf", aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+ EXPECT_EQ(scene->mMeshes[0]->mNumVertices, 1024u);
+ for (unsigned int i = 0; i < scene->mMeshes[0]->mNumFaces; ++i) {
+ EXPECT_EQ(scene->mMeshes[0]->mFaces[i].mNumIndices, 1u);
+ EXPECT_EQ(scene->mMeshes[0]->mFaces[i].mIndices[0], i);
+ }
+}
+
+TEST_F(utglTF2ImportExport, importglTF2PrimitiveModeLines) {
+ Assimp::Importer importer;
+ //Lines
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/glTF-Asset-Generator/Mesh_PrimitiveMode/Mesh_PrimitiveMode_08.gltf", aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+ EXPECT_EQ(scene->mMeshes[0]->mNumVertices, 4u);
+ std::array<unsigned int, 5> l1 = { { 0u, 3u, 2u, 1u, 0u } };
+ EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mNumIndices, 2u);
+ for (unsigned int i = 0; i < scene->mMeshes[0]->mNumFaces; ++i) {
+ EXPECT_EQ(scene->mMeshes[0]->mFaces[i].mIndices[0], l1[i]);
+ EXPECT_EQ(scene->mMeshes[0]->mFaces[i].mIndices[1], l1[i + 1]);
+ }
+}
+
+TEST_F(utglTF2ImportExport, importglTF2PrimitiveModeLineLoop) {
+ Assimp::Importer importer;
+ //Line loop
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/glTF-Asset-Generator/Mesh_PrimitiveMode/Mesh_PrimitiveMode_09.gltf", aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+ EXPECT_EQ(scene->mMeshes[0]->mNumVertices, 4u);
+ std::array<unsigned int, 5> l1 = { { 0, 3u, 2u, 1u, 0u } };
+ EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mNumIndices, 2u);
+ for (unsigned int i = 0; i < scene->mMeshes[0]->mNumFaces; ++i) {
+ EXPECT_EQ(scene->mMeshes[0]->mFaces[i].mIndices[0], l1[i]);
+ EXPECT_EQ(scene->mMeshes[0]->mFaces[i].mIndices[1], l1[i + 1]);
+ }
+}
+
+TEST_F(utglTF2ImportExport, importglTF2PrimitiveModeLineStrip) {
+ Assimp::Importer importer;
+ //Lines Strip
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/glTF-Asset-Generator/Mesh_PrimitiveMode/Mesh_PrimitiveMode_10.gltf", aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+ EXPECT_EQ(scene->mMeshes[0]->mNumVertices, 4u);
+ std::array<unsigned int, 5> l1 = { { 0u, 3u, 2u, 1u, 0u } };
+ EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mNumIndices, 2u);
+ for (unsigned int i = 0; i < scene->mMeshes[0]->mNumFaces; ++i) {
+ EXPECT_EQ(scene->mMeshes[0]->mFaces[i].mIndices[0], l1[i]);
+ EXPECT_EQ(scene->mMeshes[0]->mFaces[i].mIndices[1], l1[i + 1]);
+ }
+}
+
+TEST_F(utglTF2ImportExport, importglTF2PrimitiveModeTrianglesStrip) {
+ Assimp::Importer importer;
+ //Triangles strip
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/glTF-Asset-Generator/Mesh_PrimitiveMode/Mesh_PrimitiveMode_11.gltf", aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+ EXPECT_EQ(scene->mMeshes[0]->mNumFaces, 2u);
+ EXPECT_EQ(scene->mMeshes[0]->mNumVertices, 4u);
+ std::array<unsigned int, 3> f1 = { { 0u, 3u, 1u } };
+ EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mNumIndices, 3u);
+ for (size_t i = 0; i < 3; ++i) {
+ EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mIndices[i], f1[i]);
+ }
+
+ std::array<unsigned int, 3> f2 = { { 1u, 3u, 2u } };
+ EXPECT_EQ(scene->mMeshes[0]->mFaces[1].mNumIndices, 3u);
+ for (size_t i = 0; i < 3; ++i) {
+ EXPECT_EQ(scene->mMeshes[0]->mFaces[1].mIndices[i], f2[i]);
+ }
+}
+
+TEST_F(utglTF2ImportExport, importglTF2PrimitiveModeTrianglesFan) {
+ Assimp::Importer importer;
+ //Triangles fan
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/glTF-Asset-Generator/Mesh_PrimitiveMode/Mesh_PrimitiveMode_12.gltf", aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+ EXPECT_EQ(scene->mMeshes[0]->mNumVertices, 4u);
+ EXPECT_EQ(scene->mMeshes[0]->mNumFaces, 2u);
+ std::array<unsigned int, 3> f1 = { { 0u, 3u, 2u } };
+ EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mNumIndices, 3u);
+ for (size_t i = 0; i < 3; ++i) {
+ EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mIndices[i], f1[i]);
+ }
+
+ std::array<unsigned int, 3> f2 = { { 0u, 2u, 1u } };
+ EXPECT_EQ(scene->mMeshes[0]->mFaces[1].mNumIndices, 3u);
+ for (size_t i = 0; i < 3; ++i) {
+ EXPECT_EQ(scene->mMeshes[0]->mFaces[1].mIndices[i], f2[i]);
+ }
+}
+
+std::vector<char> ReadFile(const char *name) {
+ std::vector<char> ret;
+
+ FILE *p = ::fopen(name, "r");
+ if (nullptr == p) {
+ return ret;
+ }
+
+ ::fseek(p, 0, SEEK_END);
+ const size_t size = ::ftell(p);
+ ::fseek(p, 0, SEEK_SET);
+
+ ret.resize(size);
+ const size_t readSize = ::fread(&ret[0], 1, size, p);
+ EXPECT_EQ(readSize, size);
+ ::fclose(p);
+
+ return ret;
+}
+
+TEST_F(utglTF2ImportExport, importglTF2FromMemory) {
+ /*const auto flags = aiProcess_CalcTangentSpace | aiProcess_Triangulate | aiProcess_RemoveComponent |
+ aiProcess_GenSmoothNormals | aiProcess_PreTransformVertices | aiProcess_FixInfacingNormals |
+ aiProcess_FindDegenerates | aiProcess_GenUVCoords | aiProcess_SortByPType;
+ const auto& buff = ReadFile("C:\\Users\\kimkulling\\Downloads\\camel\\camel\\scene.gltf");*/
+ /*const aiScene* Scene = ::aiImportFileFromMemory(&buff[0], buff.size(), flags, ".gltf");
+ EXPECT_EQ( nullptr, Scene );*/
+}
+
+TEST_F(utglTF2ImportExport, bug_import_simple_skin) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/simple_skin/simple_skin.gltf",
+ aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+}
+
+TEST_F(utglTF2ImportExport, import_cameras) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/cameras/Cameras.gltf",
+ aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+}
+
+TEST_F(utglTF2ImportExport, incorrect_vertex_arrays) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/IncorrectVertexArrays/Cube.gltf",
+ aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+ EXPECT_EQ(scene->mMeshes[0]->mNumVertices, 36u);
+ EXPECT_EQ(scene->mMeshes[0]->mNumFaces, 12u);
+ EXPECT_EQ(scene->mMeshes[1]->mNumVertices, 35u);
+ EXPECT_EQ(scene->mMeshes[1]->mNumFaces, 11u);
+ EXPECT_EQ(scene->mMeshes[2]->mNumVertices, 36u);
+ EXPECT_EQ(scene->mMeshes[2]->mNumFaces, 18u);
+ EXPECT_EQ(scene->mMeshes[3]->mNumVertices, 35u);
+ EXPECT_EQ(scene->mMeshes[3]->mNumFaces, 17u);
+ EXPECT_EQ(scene->mMeshes[4]->mNumVertices, 36u);
+ EXPECT_EQ(scene->mMeshes[4]->mNumFaces, 12u);
+ EXPECT_EQ(scene->mMeshes[5]->mNumVertices, 35u);
+ EXPECT_EQ(scene->mMeshes[5]->mNumFaces, 11u);
+ EXPECT_EQ(scene->mMeshes[6]->mNumVertices, 36u);
+ EXPECT_EQ(scene->mMeshes[6]->mNumFaces, 18u);
+ EXPECT_EQ(scene->mMeshes[7]->mNumVertices, 35u);
+ EXPECT_EQ(scene->mMeshes[7]->mNumFaces, 17u);
+}
+
+TEST_F(utglTF2ImportExport, texture_transform_test) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/textureTransform/TextureTransformTest.gltf",
+ aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+}
+
+#ifndef ASSIMP_BUILD_NO_EXPORT
+TEST_F(utglTF2ImportExport, exportglTF2FromFileTest) {
+ EXPECT_TRUE(exporterTest());
+}
+
+TEST_F(utglTF2ImportExport, crash_in_anim_mesh_destructor) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/glTF-Sample-Models/AnimatedMorphCube-glTF/AnimatedMorphCube.gltf",
+ aiProcess_ValidateDataStructure);
+ ASSERT_NE(nullptr, scene);
+ Assimp::Exporter exporter;
+ ASSERT_EQ(aiReturn_SUCCESS, exporter.Export(scene, "glb2", ASSIMP_TEST_MODELS_DIR "/glTF2/glTF-Sample-Models/AnimatedMorphCube-glTF/AnimatedMorphCube_out.glTF"));
+}
+
+TEST_F(utglTF2ImportExport, error_string_preserved) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/MissingBin/BoxTextured.gltf",
+ aiProcess_ValidateDataStructure);
+ ASSERT_EQ(nullptr, scene);
+ std::string error = importer.GetErrorString();
+ ASSERT_NE(error.find("BoxTextured0.bin"), std::string::npos) << "Error string should contain an error about missing .bin file";
+}
+
+TEST_F(utglTF2ImportExport, export_bad_accessor_bounds) {
+ Assimp::Importer importer;
+ Assimp::Exporter exporter;
+ const aiScene* scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/BoxWithInfinites-glTF-Binary/BoxWithInfinites.glb", aiProcess_ValidateDataStructure);
+ ASSERT_NE(scene, nullptr);
+
+ EXPECT_EQ(aiReturn_SUCCESS, exporter.Export(scene, "glb2", ASSIMP_TEST_MODELS_DIR "/glTF2/BoxWithInfinites-glTF-Binary/BoxWithInfinites_out.glb"));
+ EXPECT_EQ(aiReturn_SUCCESS, exporter.Export(scene, "gltf2", ASSIMP_TEST_MODELS_DIR "/glTF2/BoxWithInfinites-glTF-Binary/BoxWithInfinites_out.gltf"));
+}
+
+TEST_F(utglTF2ImportExport, export_normalized_normals) {
+ Assimp::Importer importer;
+ Assimp::Exporter exporter;
+ const aiScene* scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/BoxBadNormals-glTF-Binary/BoxBadNormals.glb", aiProcess_ValidateDataStructure);
+ ASSERT_NE(scene, nullptr);
+ EXPECT_EQ(aiReturn_SUCCESS, exporter.Export(scene, "glb2", ASSIMP_TEST_MODELS_DIR "/glTF2/BoxBadNormals-glTF-Binary/BoxBadNormals_out.glb"));
+
+ // load in again and ensure normal-length normals but no Nan's or Inf's introduced
+ scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/BoxBadNormals-glTF-Binary/BoxBadNormals_out.glb", aiProcess_ValidateDataStructure);
+ for ( auto i = 0u; i < scene->mMeshes[0]->mNumVertices; ++i ) {
+ const auto length = scene->mMeshes[0]->mNormals[i].Length();
+ EXPECT_TRUE(abs(length) < 1e-6 || abs(length - 1) < ai_epsilon);
+ }
+}
+
+#endif // ASSIMP_BUILD_NO_EXPORT
+
+TEST_F(utglTF2ImportExport, sceneMetadata) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/BoxTextured-glTF/BoxTextured.gltf",
+ aiProcess_ValidateDataStructure);
+ ASSERT_NE(scene, nullptr);
+ ASSERT_NE(scene->mMetaData, nullptr);
+ {
+ ASSERT_TRUE(scene->mMetaData->HasKey(AI_METADATA_SOURCE_FORMAT));
+ aiString format;
+ ASSERT_TRUE(scene->mMetaData->Get(AI_METADATA_SOURCE_FORMAT, format));
+ ASSERT_EQ(strcmp(format.C_Str(), "glTF2 Importer"), 0);
+ }
+ {
+ ASSERT_TRUE(scene->mMetaData->HasKey(AI_METADATA_SOURCE_FORMAT_VERSION));
+ aiString version;
+ ASSERT_TRUE(scene->mMetaData->Get(AI_METADATA_SOURCE_FORMAT_VERSION, version));
+ ASSERT_EQ(strcmp(version.C_Str(), "2.0"), 0);
+ }
+ {
+ ASSERT_TRUE(scene->mMetaData->HasKey(AI_METADATA_SOURCE_GENERATOR));
+ aiString generator;
+ ASSERT_TRUE(scene->mMetaData->Get(AI_METADATA_SOURCE_GENERATOR, generator));
+ ASSERT_EQ(strcmp(generator.C_Str(), "COLLADA2GLTF"), 0);
+ }
+}
+
+TEST_F(utglTF2ImportExport, texcoords) {
+
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/BoxTexcoords-glTF/boxTexcoords.gltf", aiProcess_ValidateDataStructure);
+ ASSERT_NE(scene, nullptr);
+ ASSERT_TRUE(scene->HasMaterials());
+ const aiMaterial *material = scene->mMaterials[0];
+
+ aiString path;
+ unsigned int uvIndex = 255;
+ aiTextureMapMode modes[2];
+ EXPECT_EQ(aiReturn_SUCCESS, material->GetTexture(AI_MATKEY_BASE_COLOR_TEXTURE, &path, nullptr, &uvIndex, nullptr, nullptr, modes));
+ EXPECT_STREQ(path.C_Str(), "texture.png");
+ EXPECT_EQ(uvIndex, 0u);
+
+ uvIndex = 255;
+ EXPECT_EQ(aiReturn_SUCCESS, material->GetTexture(AI_MATKEY_GLTF_PBRMETALLICROUGHNESS_METALLICROUGHNESS_TEXTURE, &path, nullptr, &uvIndex, nullptr, nullptr, modes));
+ EXPECT_STREQ(path.C_Str(), "texture.png");
+ EXPECT_EQ(uvIndex, 1u);
+}
+
+#ifndef ASSIMP_BUILD_NO_EXPORT
+
+TEST_F(utglTF2ImportExport, texcoords_export) {
+ {
+ Assimp::Importer importer;
+ Assimp::Exporter exporter;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/BoxTexcoords-glTF/boxTexcoords.gltf", aiProcess_ValidateDataStructure);
+ ASSERT_NE(scene, nullptr);
+ ASSERT_EQ(aiReturn_SUCCESS, exporter.Export(scene, "glb2", ASSIMP_TEST_MODELS_DIR "/glTF2/BoxTexcoords-glTF/boxTexcoords.gltf_out.glb"));
+ }
+
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/BoxTexcoords-glTF/boxTexcoords.gltf", aiProcess_ValidateDataStructure);
+ ASSERT_NE(scene, nullptr);
+
+ ASSERT_TRUE(scene->HasMaterials());
+ const aiMaterial *material = scene->mMaterials[0];
+
+ aiString path;
+ unsigned int uvIndex = 255;
+ aiTextureMapMode modes[2];
+ EXPECT_EQ(aiReturn_SUCCESS, material->GetTexture(AI_MATKEY_BASE_COLOR_TEXTURE, &path, nullptr, &uvIndex, nullptr, nullptr, modes));
+ EXPECT_STREQ(path.C_Str(), "texture.png");
+ EXPECT_EQ(uvIndex, 0u);
+
+ uvIndex = 255;
+ EXPECT_EQ(aiReturn_SUCCESS, material->GetTexture(AI_MATKEY_GLTF_PBRMETALLICROUGHNESS_METALLICROUGHNESS_TEXTURE, &path, nullptr, &uvIndex, nullptr, nullptr, modes));
+ EXPECT_STREQ(path.C_Str(), "texture.png");
+ EXPECT_EQ(uvIndex, 1u);
+}
+
+#endif // ASSIMP_BUILD_NO_EXPORT
+TEST_F(utglTF2ImportExport, recursive_nodes) {
+ Assimp::Importer importer;
+ const aiScene* scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/RecursiveNodes/RecursiveNodes.gltf", aiProcess_ValidateDataStructure);
+ EXPECT_EQ(nullptr, scene);
+}
+
+TEST_F(utglTF2ImportExport, norootnode_noscene) {
+ Assimp::Importer importer;
+ const aiScene* scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/TestNoRootNode/NoScene.gltf", aiProcess_ValidateDataStructure);
+ ASSERT_EQ(scene, nullptr);
+}
+
+TEST_F(utglTF2ImportExport, norootnode_scenewithoutnodes) {
+ Assimp::Importer importer;
+ const aiScene* scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/TestNoRootNode/SceneWithoutNodes.gltf", aiProcess_ValidateDataStructure);
+ ASSERT_NE(scene, nullptr);
+ ASSERT_NE(scene->mRootNode, nullptr);
+}
+
+// Shall not crash!
+TEST_F(utglTF2ImportExport, norootnode_issue_3269) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/issue_3269/texcoord_crash.gltf", aiProcess_ValidateDataStructure);
+ ASSERT_EQ(scene, nullptr);
+}
+
+TEST_F(utglTF2ImportExport, indexOutOfRange) {
+ // The contents of an asset should not lead to an assert.
+ Assimp::Importer importer;
+
+ struct LogObserver : Assimp::LogStream {
+ bool m_observedWarning = false;
+ void write(const char *message) override {
+ m_observedWarning = m_observedWarning || std::strstr(message, "faces were dropped");
+ }
+ };
+ LogObserver logObserver;
+
+ DefaultLogger::get()->attachStream(&logObserver);
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/IndexOutOfRange/IndexOutOfRange.gltf", aiProcess_ValidateDataStructure);
+ ASSERT_NE(scene, nullptr);
+ ASSERT_NE(scene->mRootNode, nullptr);
+ ASSERT_EQ(scene->mNumMeshes, 1u);
+ EXPECT_EQ(scene->mMeshes[0]->mNumFaces, 11u);
+ DefaultLogger::get()->detachStream(&logObserver);
+ EXPECT_TRUE(logObserver.m_observedWarning);
+}
+
+TEST_F(utglTF2ImportExport, allIndicesOutOfRange) {
+ // The contents of an asset should not lead to an assert.
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/IndexOutOfRange/AllIndicesOutOfRange.gltf", aiProcess_ValidateDataStructure);
+ ASSERT_EQ(scene, nullptr);
+ std::string error = importer.GetErrorString();
+ ASSERT_NE(error.find("Mesh \"Mesh\" has no faces"), std::string::npos);
+}
+
+/////////////////////////////////
+// Draco decoding
+
+TEST_F(utglTF2ImportExport, import_dracoEncoded) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/draco/2CylinderEngine.gltf",
+ aiProcess_ValidateDataStructure);
+#ifndef ASSIMP_ENABLE_DRACO
+ // No draco support, scene should not load
+ ASSERT_EQ(scene, nullptr);
+#else
+ ASSERT_NE(scene, nullptr);
+ ASSERT_NE(scene->mMetaData, nullptr);
+ {
+ ASSERT_TRUE(scene->mMetaData->HasKey(AI_METADATA_SOURCE_FORMAT));
+ aiString format;
+ ASSERT_TRUE(scene->mMetaData->Get(AI_METADATA_SOURCE_FORMAT, format));
+ ASSERT_EQ(strcmp(format.C_Str(), "glTF2 Importer"), 0);
+ }
+ {
+ ASSERT_TRUE(scene->mMetaData->HasKey(AI_METADATA_SOURCE_FORMAT_VERSION));
+ aiString version;
+ ASSERT_TRUE(scene->mMetaData->Get(AI_METADATA_SOURCE_FORMAT_VERSION, version));
+ ASSERT_EQ(strcmp(version.C_Str(), "2.0"), 0);
+ }
+ {
+ ASSERT_TRUE(scene->mMetaData->HasKey(AI_METADATA_SOURCE_GENERATOR));
+ aiString generator;
+ ASSERT_TRUE(scene->mMetaData->Get(AI_METADATA_SOURCE_GENERATOR, generator));
+ ASSERT_EQ(strcmp(generator.C_Str(), "COLLADA2GLTF"), 0);
+ }
+#endif
+}
+
+TEST_F(utglTF2ImportExport, wrongTypes) {
+ // Deliberately broken version of the BoxTextured.gltf asset.
+ using tup_T = std::tuple<std::string, std::string, std::string, std::string>;
+ std::vector<tup_T> wrongTypes = {
+ { "/glTF2/wrongTypes/badArray.gltf", "array", "primitives", "meshes[0]" },
+ { "/glTF2/wrongTypes/badString.gltf", "string", "name", "scenes[0]" },
+ { "/glTF2/wrongTypes/badUint.gltf", "uint", "index", "materials[0]" },
+ { "/glTF2/wrongTypes/badNumber.gltf", "number", "scale", "materials[0]" },
+ { "/glTF2/wrongTypes/badObject.gltf", "object", "pbrMetallicRoughness", "materials[0]" },
+ { "/glTF2/wrongTypes/badExtension.gltf", "object", "KHR_texture_transform", "materials[0]" }
+ };
+ for (const auto& tuple : wrongTypes)
+ {
+ const auto& file = std::get<0>(tuple);
+ const auto& type = std::get<1>(tuple);
+ const auto& member = std::get<2>(tuple);
+ const auto& context = std::get<3>(tuple);
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR + file , aiProcess_ValidateDataStructure);
+ ASSERT_EQ(scene, nullptr);
+ const std::string error = importer.GetErrorString();
+ EXPECT_FALSE(error.empty());
+ EXPECT_NE(error.find(member + "\" was not of type \"" + type + "\" when reading " + context), std::string::npos);
+ }
+}
+
+namespace {
+ /// This class provides a fake schema to the GLTF importer.
+ /// It just checks that the file has a top-level "scene" property which is an integer.
+ class FakeSchemaProvider : public rapidjson::IRemoteSchemaDocumentProvider
+ {
+ public:
+ FakeSchemaProvider(const char* schemaName) :
+ m_schemaName(schemaName)
+ {
+ rapidjson::Document schemaDoc;
+ schemaDoc.Parse(R"==({"properties":{"scene" : { "type" : "integer" }}, "required": [ "scene" ]})==");
+ EXPECT_FALSE(schemaDoc.HasParseError());
+ m_schema.reset(new rapidjson::SchemaDocument(schemaDoc, m_schemaName.c_str(), static_cast<rapidjson::SizeType>(m_schemaName.size()), this));
+ }
+
+ const rapidjson::SchemaDocument* GetRemoteDocument(const char* uri, rapidjson::SizeType) override {
+ if (m_schemaName == uri) {
+ return m_schema.get();
+ }
+ return nullptr;
+ }
+
+ private:
+ std::string m_schemaName;
+ std::unique_ptr<const rapidjson::SchemaDocument> m_schema;
+ };
+}
+
+TEST_F(utglTF2ImportExport, schemaCheckPass) {
+ FakeSchemaProvider schemaProvider("glTF.schema.json");
+ Assimp::Importer importer;
+ importer.SetPropertyPointer(AI_CONFIG_IMPORT_SCHEMA_DOCUMENT_PROVIDER, &schemaProvider);
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/BoxTextured-glTF/BoxTextured.gltf", aiProcess_ValidateDataStructure);
+ EXPECT_NE(scene, nullptr);
+ EXPECT_STREQ(importer.GetErrorString(), "");
+}
+
+TEST_F(utglTF2ImportExport, schemaCheckFail) {
+ FakeSchemaProvider schemaProvider("glTF.schema.json");
+ Assimp::Importer importer;
+ importer.SetPropertyPointer(AI_CONFIG_IMPORT_SCHEMA_DOCUMENT_PROVIDER, &schemaProvider);
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/SchemaFailures/sceneWrongType.gltf", aiProcess_ValidateDataStructure);
+ EXPECT_EQ(scene, nullptr);
+ const std::string errorString = importer.GetErrorString();
+ EXPECT_NE(errorString.find("The JSON document did not satisfy the glTF2 schema"), std::string::npos);
+}
+
+TEST_F(utglTF2ImportExport, noSchemaFound) {
+ // More than one importer might make use the provider, but not all schemas might be present.
+ // Check that the glTF importer handles the case when an non-null provider returns null when asked for schemas.
+ FakeSchemaProvider schemaProvider("missingSchema.json");
+ Assimp::Importer importer;
+ importer.SetPropertyPointer(AI_CONFIG_IMPORT_SCHEMA_DOCUMENT_PROVIDER, &schemaProvider);
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/BoxTextured-glTF/BoxTextured.gltf", aiProcess_ValidateDataStructure);
+ EXPECT_NE(scene, nullptr);
+ EXPECT_STREQ(importer.GetErrorString(), "");
+}
diff --git a/libs/assimp/test/unit/utglTFImportExport.cpp b/libs/assimp/test/unit/utglTFImportExport.cpp
new file mode 100644
index 0000000..cb20c15
--- /dev/null
+++ b/libs/assimp/test/unit/utglTFImportExport.cpp
@@ -0,0 +1,111 @@
+/*
+---------------------------------------------------------------------------
+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,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+#include "AbstractImportExportBase.h"
+#include "UnitTestPCH.h"
+
+#include <assimp/postprocess.h>
+#include <assimp/Importer.hpp>
+
+#include <assimp/commonMetaData.h>
+#include <assimp/scene.h>
+
+using namespace Assimp;
+
+class utglTFImportExport : public AbstractImportExportBase {
+public:
+ bool importerTest() override {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF/TwoBoxes/TwoBoxes.gltf", aiProcess_ValidateDataStructure);
+ return nullptr != scene;
+ }
+};
+
+TEST_F(utglTFImportExport, importglTFFromFileTest) {
+ EXPECT_TRUE(importerTest());
+}
+
+TEST_F(utglTFImportExport, incorrect_vertex_arrays) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF/IncorrectVertexArrays/Cube_v1.gltf",
+ aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+ EXPECT_EQ(scene->mMeshes[0]->mNumVertices, 36u);
+ EXPECT_EQ(scene->mMeshes[0]->mNumFaces, 12u);
+ EXPECT_EQ(scene->mMeshes[1]->mNumVertices, 35u);
+ EXPECT_EQ(scene->mMeshes[1]->mNumFaces, 11u);
+ EXPECT_EQ(scene->mMeshes[2]->mNumVertices, 36u);
+ EXPECT_EQ(scene->mMeshes[2]->mNumFaces, 18u);
+ EXPECT_EQ(scene->mMeshes[3]->mNumVertices, 35u);
+ EXPECT_EQ(scene->mMeshes[3]->mNumFaces, 17u);
+ EXPECT_EQ(scene->mMeshes[4]->mNumVertices, 36u);
+ EXPECT_EQ(scene->mMeshes[4]->mNumFaces, 12u);
+ EXPECT_EQ(scene->mMeshes[5]->mNumVertices, 35u);
+ EXPECT_EQ(scene->mMeshes[5]->mNumFaces, 11u);
+ EXPECT_EQ(scene->mMeshes[6]->mNumVertices, 36u);
+ EXPECT_EQ(scene->mMeshes[6]->mNumFaces, 18u);
+ EXPECT_EQ(scene->mMeshes[7]->mNumVertices, 35u);
+ EXPECT_EQ(scene->mMeshes[7]->mNumFaces, 17u);
+}
+
+TEST_F(utglTFImportExport, sceneMetadata) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF/TwoBoxes/TwoBoxes.gltf", aiProcess_ValidateDataStructure);
+ ASSERT_TRUE(scene);
+ ASSERT_TRUE(scene->mMetaData);
+ {
+ ASSERT_TRUE(scene->mMetaData->HasKey(AI_METADATA_SOURCE_FORMAT));
+ aiString format;
+ ASSERT_TRUE(scene->mMetaData->Get(AI_METADATA_SOURCE_FORMAT, format));
+ ASSERT_EQ(strcmp(format.C_Str(), "glTF Importer"), 0);
+ }
+ {
+ ASSERT_TRUE(scene->mMetaData->HasKey(AI_METADATA_SOURCE_FORMAT_VERSION));
+ aiString version;
+ ASSERT_TRUE(scene->mMetaData->Get(AI_METADATA_SOURCE_FORMAT_VERSION, version));
+ ASSERT_EQ(strcmp(version.C_Str(), "1.0"), 0);
+ }
+ {
+ ASSERT_TRUE(scene->mMetaData->HasKey(AI_METADATA_SOURCE_GENERATOR));
+ aiString generator;
+ ASSERT_TRUE(scene->mMetaData->Get(AI_METADATA_SOURCE_GENERATOR, generator));
+ ASSERT_EQ(strncmp(generator.C_Str(), "collada2gltf", 12), 0);
+ }
+}