diff options
author | sanine <sanine.not@pm.me> | 2022-04-16 11:55:09 -0500 |
---|---|---|
committer | sanine <sanine.not@pm.me> | 2022-04-16 11:55:09 -0500 |
commit | db81b925d776103326128bf629cbdda576a223e7 (patch) | |
tree | 58bea8155c686733310009f6bed7363f91fbeb9d /libs/assimp/test/unit | |
parent | 55860037b14fb3893ba21cf2654c83d349cc1082 (diff) |
move 3rd-party librarys into libs/ and add built-in honeysuckle
Diffstat (limited to 'libs/assimp/test/unit')
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); + } +} |