From a949102dd14d92532644cae8696d04bc8aa5a646 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Christian=20Str=C3=B8mme?= <christian.stromme@qt.io>
Date: Tue, 20 Aug 2019 17:01:42 +0200
Subject: [PATCH] Re-add assimp

Assimp is now a submodule, and configure options have been added to make
it possible to select the supplied version, the system version, or non.

Change-Id: If9930c5e65d6e087fd918d61e6d367ca0fc3a4e0
Reviewed-by: Andy Nichols <andy.nichols@qt.io>
---
 .gitmodules                                   |   3 +
 config.tests/assimp/assimp.pro                |   1 +
 config.tests/assimp/main.cpp                  |  49 +
 config_help.txt                               |   3 +
 configure.json                                |   5 +
 src/3rdparty/assimp/assimp.pri                | 576 +++++-----
 src/3rdparty/assimp/config.h                  | 992 ++++++++++++++++++
 src/3rdparty/assimp/revision.h                |  15 +-
 src/3rdparty/assimp/src                       |   1 +
 src/plugins/assetimporters/assetimporters.pro |   3 +
 src/plugins/assetimporters/assimp/assimp.pro  |   9 +-
 src/plugins/assetimporters/configure.json     |  48 +
 12 files changed, 1406 insertions(+), 299 deletions(-)
 create mode 100644 .gitmodules
 create mode 100644 config.tests/assimp/assimp.pro
 create mode 100644 config.tests/assimp/main.cpp
 create mode 100644 config_help.txt
 create mode 100644 configure.json
 create mode 100644 src/3rdparty/assimp/config.h
 create mode 160000 src/3rdparty/assimp/src
 create mode 100644 src/plugins/assetimporters/configure.json

diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 000000000..340e872f8
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "src/3rdparty/assimp/src"]
+	path = src/3rdparty/assimp/src
+	url = https://github.com/assimp/assimp.git
diff --git a/config.tests/assimp/assimp.pro b/config.tests/assimp/assimp.pro
new file mode 100644
index 000000000..28dcadcbf
--- /dev/null
+++ b/config.tests/assimp/assimp.pro
@@ -0,0 +1 @@
+SOURCES += main.cpp
diff --git a/config.tests/assimp/main.cpp b/config.tests/assimp/main.cpp
new file mode 100644
index 000000000..8d5e86f85
--- /dev/null
+++ b/config.tests/assimp/main.cpp
@@ -0,0 +1,49 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB).
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt3D module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <assimp/cimport.h>
+#include <assimp/scene.h>
+#include <assimp/postprocess.h>
+#include <assimp/Importer.hpp>
+#include <assimp/DefaultLogger.hpp>
+#include <assimp/anim.h>
+
+int main(int , char **)
+{
+  Assimp::Importer importer;
+  Assimp::DefaultLogger::create("AssimpLog.txt", Assimp::Logger::VERBOSE);
+
+  // SET THIS TO REMOVE POINTS AND LINES -> HAVE ONLY TRIANGLES
+  importer.SetPropertyInteger(AI_CONFIG_PP_SBP_REMOVE, aiPrimitiveType_LINE|aiPrimitiveType_POINT);
+
+  // Check for new version by setting animation morph channels.
+  aiAnimation anim;
+  anim.mNumMorphMeshChannels = 0;
+
+  return 0;
+}
diff --git a/config_help.txt b/config_help.txt
new file mode 100644
index 000000000..453b1a9e1
--- /dev/null
+++ b/config_help.txt
@@ -0,0 +1,3 @@
+QtQuick3D options:
+
+  -assimp .............. Select used assimp library [system/qt/no]
diff --git a/configure.json b/configure.json
new file mode 100644
index 000000000..fb93e060b
--- /dev/null
+++ b/configure.json
@@ -0,0 +1,5 @@
+{
+    "subconfigs": [
+        "src/plugins/assetimporters"
+    ]
+}
diff --git a/src/3rdparty/assimp/assimp.pri b/src/3rdparty/assimp/assimp.pri
index dd46503da..dee1601bc 100644
--- a/src/3rdparty/assimp/assimp.pri
+++ b/src/3rdparty/assimp/assimp.pri
@@ -3,6 +3,8 @@ CONFIG += exceptions rtti
 
 CONFIG -= precompile_header
 
+ASSIMP_SRC = $$PWD/src
+
 win32:DEFINES+=_CRT_SECURE_NO_WARNINGS
 
 qtConfig(system-zlib):!if(cross_compile:host_build): \
@@ -100,312 +102,316 @@ msvc: QMAKE_CXXFLAGS += /bigobj
 CONFIG += warn_on
 
 VPATH += \
-    $$PWD \
-    $$PWD/code \
-    $$PWD/code/res
+    $$ASSIMP_SRC \
+    $$ASSIMP_SRC/code \
+    $$ASSIMP_SRC/code/res
 
 INCLUDEPATH += \
         $$PWD \
-        $$PWD/code \
-        $$PWD/include \
-        $$PWD/include/assimp/Compiler
+        $$PWD/.. \
+        $$ASSIMP_SRC \
+        $$ASSIMP_SRC/code \
+        $$ASSIMP_SRC/include \
+        $$ASSIMP_SRC/include/assimp/Compiler
+
+HEADERS += \
+    $$PWD/config.h \
+    $$PWD/revision.h
 
 HEADERS += \
-    revision.h \
-    include/assimp/Compiler/pushpack1.h \
-    include/assimp/Compiler/poppack1.h \
-    include/assimp/Compiler/pstdint.h \
-    include/assimp/anim.h \
-    include/assimp/ai_assert.h \
-    include/assimp/camera.h \
-    include/assimp/color4.h \
-    include/assimp/color4.inl \
-    include/assimp/config.h \
-    include/assimp/defs.h \
-    include/assimp/Defines.h \
-    include/assimp/cfileio.h \
-    include/assimp/light.h \
-    include/assimp/material.h \
-    include/assimp/material.inl \
-    include/assimp/matrix3x3.h \
-    include/assimp/matrix3x3.inl \
-    include/assimp/matrix4x4.h \
-    include/assimp/matrix4x4.inl \
-    include/assimp/mesh.h \
-    include/assimp/pbrmaterial.h \
-    include/assimp/postprocess.h \
-    include/assimp/quaternion.h \
-    include/assimp/quaternion.inl \
-    include/assimp/scene.h \
-    include/assimp/metadata.h \
-    include/assimp/texture.h \
-    include/assimp/types.h \
-    include/assimp/vector2.h \
-    include/assimp/vector2.inl \
-    include/assimp/vector3.h \
-    include/assimp/vector3.inl \
-    include/assimp/version.h \
-    include/assimp/cimport.h \
-    include/assimp/importerdesc.h \
-    include/assimp/Importer.hpp \
-    include/assimp/DefaultLogger.hpp \
-    include/assimp/ProgressHandler.hpp \
-    include/assimp/IOStream.hpp \
-    include/assimp/IOSystem.hpp \
-    include/assimp/Logger.hpp \
-    include/assimp/LogStream.hpp \
-    include/assimp/NullLogger.hpp \
-    include/assimp/cexport.h \
-    include/assimp/Exporter.hpp \
-    include/assimp/DefaultIOStream.h \
-    include/assimp/DefaultIOSystem.h \
-    include/assimp/SceneCombiner.h \
-    include/assimp/fast_atof.h \
-    include/assimp/qnan.h \
-    include/assimp/BaseImporter.h \
-    include/assimp/Hash.h \
-    include/assimp/MemoryIOWrapper.h \
-    include/assimp/ParsingUtils.h \
-    include/assimp/StreamReader.h \
-    include/assimp/StreamWriter.h \
-    include/assimp/StringComparison.h \
-    include/assimp/StringUtils.h \
-    include/assimp/SGSpatialSort.h \
-    include/assimp/GenericProperty.h \
-    include/assimp/SpatialSort.h \
-    include/assimp/SkeletonMeshBuilder.h \
-    include/assimp/SmoothingGroups.h \
-    include/assimp/SmoothingGroups.inl \
-    include/assimp/StandardShapes.h \
-    include/assimp/RemoveComments.h \
-    include/assimp/Subdivision.h \
-    include/assimp/Vertex.h \
-    include/assimp/LineSplitter.h \
-    include/assimp/TinyFormatter.h \
-    include/assimp/Profiler.h \
-    include/assimp/LogAux.h \
-    include/assimp/Bitmap.h \
-    include/assimp/XMLTools.h \
-    include/assimp/IOStreamBuffer.h \
-    include/assimp/CreateAnimMesh.h \
-    include/assimp/irrXMLWrapper.h \
-    include/assimp/BlobIOSystem.h \
-    include/assimp/MathFunctions.h \
-    include/assimp/Macros.h \
-    include/assimp/Exceptional.h \
-    include/assimp/ByteSwapper.h \
-    include/assimp/DefaultLogger.hpp \
-    include/assimp/LogStream.hpp \
-    include/assimp/Logger.hpp \
-    include/assimp/NullLogger.hpp \
-    code/FileLogStream.h \
-    code/StdOStreamLogStream.h \
-    code/BaseProcess.h \
-    code/Importer.h \
-    code/ScenePrivate.h \
-    code/DefaultProgressHandler.h \
-    code/CInterfaceIOWrapper.h \
-    code/IFF.h \
-    code/VertexTriangleAdjacency.h \
-    code/ScenePreprocessor.h \
-    code/SplitByBoneCountProcess.h \
-    code/TargetAnimation.h \
-    code/simd.h \
-    code/ColladaHelper.h \
-    code/ColladaLoader.h \
-    code/ColladaParser.h \
-    code/MaterialSystem.h \
-    code/ObjFileData.h \
-    code/ObjFileImporter.h \
-    code/ObjFileMtlImporter.h \
-    code/ObjFileParser.h \
-    code/ObjTools.h \
-    code/BlenderLoader.h \
-    code/BlenderDNA.h \
-    code/BlenderDNA.inl \
-    code/BlenderScene.h \
-    code/BlenderSceneGen.h \
-    code/BlenderIntermediate.h \
-    code/BlenderModifier.h \
-    code/BlenderBMesh.h \
-    code/BlenderTessellator.h \
-    code/BlenderCustomData.h \
-    code/FBXCompileConfig.h \
-    code/FBXImporter.h \
-    code/FBXParser.h \
-    code/FBXTokenizer.h \
-    code/FBXImportSettings.h \
-    code/FBXConverter.h \
-    code/FBXUtil.h \
-    code/FBXDocument.h \
-    code/FBXProperties.h \
-    code/FBXMeshGeometry.h \
-    code/FBXCommon.h \
-    code/CalcTangentsProcess.h \
-    code/ComputeUVMappingProcess.h \
-    code/ConvertToLHProcess.h \
-    code/EmbedTexturesProcess.h \
-    code/FindDegenerates.h \
-    code/FindInstancesProcess.h \
-    code/FindInvalidDataProcess.h \
-    code/FixNormalsStep.h \
-    code/DropFaceNormalsProcess.h \
-    code/GenFaceNormalsProcess.h \
-    code/GenVertexNormalsProcess.h \
-    code/PretransformVertices.h \
-    code/ImproveCacheLocality.h \
-    code/JoinVerticesProcess.h \
-    code/LimitBoneWeightsProcess.h \
-    code/RemoveRedundantMaterials.h \
-    code/RemoveVCProcess.h \
-    code/SortByPTypeProcess.h \
-    code/SplitLargeMeshes.h \
-    code/TextureTransform.h \
-    code/TriangulateProcess.h \
-    code/ValidateDataStructure.h \
-    code/OptimizeGraph.h \
-    code/OptimizeMeshes.h \
-    code/DeboneProcess.h \
-    code/ProcessHelper.h \
-    code/PolyTools.h \
-    code/MakeVerboseFormat.h \
-    code/ScaleProcess.h \
-    code/glTFAsset.h \
-    code/glTFAsset.inl \
-    code/glTFAssetWriter.inl \
-    code/glTFAssetWriter.h \
-    code/glTFImporter.h \
-    code/glTF2AssetWriter.h \
-    code/glTF2Asset.h \
-    code/glTF2Asset.inl \
-    code/glTF2AssetWriter.inl \
-    code/glTF2Importer.h 
+    $$ASSIMP_SRC/include/assimp/Compiler/pushpack1.h \
+    $$ASSIMP_SRC/include/assimp/Compiler/poppack1.h \
+    $$ASSIMP_SRC/include/assimp/Compiler/pstdint.h \
+    $$ASSIMP_SRC/include/assimp/anim.h \
+    $$ASSIMP_SRC/include/assimp/ai_assert.h \
+    $$ASSIMP_SRC/include/assimp/camera.h \
+    $$ASSIMP_SRC/include/assimp/color4.h \
+    $$ASSIMP_SRC/include/assimp/color4.inl \
+    $$ASSIMP_SRC/include/assimp/defs.h \
+    $$ASSIMP_SRC/include/assimp/Defines.h \
+    $$ASSIMP_SRC/include/assimp/cfileio.h \
+    $$ASSIMP_SRC/include/assimp/light.h \
+    $$ASSIMP_SRC/include/assimp/material.h \
+    $$ASSIMP_SRC/include/assimp/material.inl \
+    $$ASSIMP_SRC/include/assimp/matrix3x3.h \
+    $$ASSIMP_SRC/include/assimp/matrix3x3.inl \
+    $$ASSIMP_SRC/include/assimp/matrix4x4.h \
+    $$ASSIMP_SRC/include/assimp/matrix4x4.inl \
+    $$ASSIMP_SRC/include/assimp/mesh.h \
+    $$ASSIMP_SRC/include/assimp/pbrmaterial.h \
+    $$ASSIMP_SRC/include/assimp/postprocess.h \
+    $$ASSIMP_SRC/include/assimp/quaternion.h \
+    $$ASSIMP_SRC/include/assimp/quaternion.inl \
+    $$ASSIMP_SRC/include/assimp/scene.h \
+    $$ASSIMP_SRC/include/assimp/metadata.h \
+    $$ASSIMP_SRC/include/assimp/texture.h \
+    $$ASSIMP_SRC/include/assimp/types.h \
+    $$ASSIMP_SRC/include/assimp/vector2.h \
+    $$ASSIMP_SRC/include/assimp/vector2.inl \
+    $$ASSIMP_SRC/include/assimp/vector3.h \
+    $$ASSIMP_SRC/include/assimp/vector3.inl \
+    $$ASSIMP_SRC/include/assimp/version.h \
+    $$ASSIMP_SRC/include/assimp/cimport.h \
+    $$ASSIMP_SRC/include/assimp/importerdesc.h \
+    $$ASSIMP_SRC/include/assimp/Importer.hpp \
+    $$ASSIMP_SRC/include/assimp/DefaultLogger.hpp \
+    $$ASSIMP_SRC/include/assimp/ProgressHandler.hpp \
+    $$ASSIMP_SRC/include/assimp/IOStream.hpp \
+    $$ASSIMP_SRC/include/assimp/IOSystem.hpp \
+    $$ASSIMP_SRC/include/assimp/Logger.hpp \
+    $$ASSIMP_SRC/include/assimp/LogStream.hpp \
+    $$ASSIMP_SRC/include/assimp/NullLogger.hpp \
+    $$ASSIMP_SRC/include/assimp/cexport.h \
+    $$ASSIMP_SRC/include/assimp/Exporter.hpp \
+    $$ASSIMP_SRC/include/assimp/DefaultIOStream.h \
+    $$ASSIMP_SRC/include/assimp/DefaultIOSystem.h \
+    $$ASSIMP_SRC/include/assimp/SceneCombiner.h \
+    $$ASSIMP_SRC/include/assimp/fast_atof.h \
+    $$ASSIMP_SRC/include/assimp/qnan.h \
+    $$ASSIMP_SRC/include/assimp/BaseImporter.h \
+    $$ASSIMP_SRC/include/assimp/Hash.h \
+    $$ASSIMP_SRC/include/assimp/MemoryIOWrapper.h \
+    $$ASSIMP_SRC/include/assimp/ParsingUtils.h \
+    $$ASSIMP_SRC/include/assimp/StreamReader.h \
+    $$ASSIMP_SRC/include/assimp/StreamWriter.h \
+    $$ASSIMP_SRC/include/assimp/StringComparison.h \
+    $$ASSIMP_SRC/include/assimp/StringUtils.h \
+    $$ASSIMP_SRC/include/assimp/SGSpatialSort.h \
+    $$ASSIMP_SRC/include/assimp/GenericProperty.h \
+    $$ASSIMP_SRC/include/assimp/SpatialSort.h \
+    $$ASSIMP_SRC/include/assimp/SkeletonMeshBuilder.h \
+    $$ASSIMP_SRC/include/assimp/SmoothingGroups.h \
+    $$ASSIMP_SRC/include/assimp/SmoothingGroups.inl \
+    $$ASSIMP_SRC/include/assimp/StandardShapes.h \
+    $$ASSIMP_SRC/include/assimp/RemoveComments.h \
+    $$ASSIMP_SRC/include/assimp/Subdivision.h \
+    $$ASSIMP_SRC/include/assimp/Vertex.h \
+    $$ASSIMP_SRC/include/assimp/LineSplitter.h \
+    $$ASSIMP_SRC/include/assimp/TinyFormatter.h \
+    $$ASSIMP_SRC/include/assimp/Profiler.h \
+    $$ASSIMP_SRC/include/assimp/LogAux.h \
+    $$ASSIMP_SRC/include/assimp/Bitmap.h \
+    $$ASSIMP_SRC/include/assimp/XMLTools.h \
+    $$ASSIMP_SRC/include/assimp/IOStreamBuffer.h \
+    $$ASSIMP_SRC/include/assimp/CreateAnimMesh.h \
+    $$ASSIMP_SRC/include/assimp/irrXMLWrapper.h \
+    $$ASSIMP_SRC/include/assimp/BlobIOSystem.h \
+    $$ASSIMP_SRC/include/assimp/MathFunctions.h \
+    $$ASSIMP_SRC/include/assimp/Macros.h \
+    $$ASSIMP_SRC/include/assimp/Exceptional.h \
+    $$ASSIMP_SRC/include/assimp/ByteSwapper.h \
+    $$ASSIMP_SRC/include/assimp/DefaultLogger.hpp \
+    $$ASSIMP_SRC/include/assimp/LogStream.hpp \
+    $$ASSIMP_SRC/include/assimp/Logger.hpp \
+    $$ASSIMP_SRC/include/assimp/NullLogger.hpp \
+    $$ASSIMP_SRC/code/FileLogStream.h \
+    $$ASSIMP_SRC/code/StdOStreamLogStream.h \
+    $$ASSIMP_SRC/code/BaseProcess.h \
+    $$ASSIMP_SRC/code/Importer.h \
+    $$ASSIMP_SRC/code/ScenePrivate.h \
+    $$ASSIMP_SRC/code/DefaultProgressHandler.h \
+    $$ASSIMP_SRC/code/CInterfaceIOWrapper.h \
+    $$ASSIMP_SRC/code/IFF.h \
+    $$ASSIMP_SRC/code/VertexTriangleAdjacency.h \
+    $$ASSIMP_SRC/code/ScenePreprocessor.h \
+    $$ASSIMP_SRC/code/SplitByBoneCountProcess.h \
+    $$ASSIMP_SRC/code/TargetAnimation.h \
+    $$ASSIMP_SRC/code/simd.h \
+    $$ASSIMP_SRC/code/ColladaHelper.h \
+    $$ASSIMP_SRC/code/ColladaLoader.h \
+    $$ASSIMP_SRC/code/ColladaParser.h \
+    $$ASSIMP_SRC/code/MaterialSystem.h \
+    $$ASSIMP_SRC/code/ObjFileData.h \
+    $$ASSIMP_SRC/code/ObjFileImporter.h \
+    $$ASSIMP_SRC/code/ObjFileMtlImporter.h \
+    $$ASSIMP_SRC/code/ObjFileParser.h \
+    $$ASSIMP_SRC/code/ObjTools.h \
+    $$ASSIMP_SRC/code/BlenderLoader.h \
+    $$ASSIMP_SRC/code/BlenderDNA.h \
+    $$ASSIMP_SRC/code/BlenderDNA.inl \
+    $$ASSIMP_SRC/code/BlenderScene.h \
+    $$ASSIMP_SRC/code/BlenderSceneGen.h \
+    $$ASSIMP_SRC/code/BlenderIntermediate.h \
+    $$ASSIMP_SRC/code/BlenderModifier.h \
+    $$ASSIMP_SRC/code/BlenderBMesh.h \
+    $$ASSIMP_SRC/code/BlenderTessellator.h \
+    $$ASSIMP_SRC/code/BlenderCustomData.h \
+    $$ASSIMP_SRC/code/FBXCompileConfig.h \
+    $$ASSIMP_SRC/code/FBXImporter.h \
+    $$ASSIMP_SRC/code/FBXParser.h \
+    $$ASSIMP_SRC/code/FBXTokenizer.h \
+    $$ASSIMP_SRC/code/FBXImportSettings.h \
+    $$ASSIMP_SRC/code/FBXConverter.h \
+    $$ASSIMP_SRC/code/FBXUtil.h \
+    $$ASSIMP_SRC/code/FBXDocument.h \
+    $$ASSIMP_SRC/code/FBXProperties.h \
+    $$ASSIMP_SRC/code/FBXMeshGeometry.h \
+    $$ASSIMP_SRC/code/FBXCommon.h \
+    $$ASSIMP_SRC/code/CalcTangentsProcess.h \
+    $$ASSIMP_SRC/code/ComputeUVMappingProcess.h \
+    $$ASSIMP_SRC/code/ConvertToLHProcess.h \
+    $$ASSIMP_SRC/code/EmbedTexturesProcess.h \
+    $$ASSIMP_SRC/code/FindDegenerates.h \
+    $$ASSIMP_SRC/code/FindInstancesProcess.h \
+    $$ASSIMP_SRC/code/FindInvalidDataProcess.h \
+    $$ASSIMP_SRC/code/FixNormalsStep.h \
+    $$ASSIMP_SRC/code/DropFaceNormalsProcess.h \
+    $$ASSIMP_SRC/code/GenFaceNormalsProcess.h \
+    $$ASSIMP_SRC/code/GenVertexNormalsProcess.h \
+    $$ASSIMP_SRC/code/PretransformVertices.h \
+    $$ASSIMP_SRC/code/ImproveCacheLocality.h \
+    $$ASSIMP_SRC/code/JoinVerticesProcess.h \
+    $$ASSIMP_SRC/code/LimitBoneWeightsProcess.h \
+    $$ASSIMP_SRC/code/RemoveRedundantMaterials.h \
+    $$ASSIMP_SRC/code/RemoveVCProcess.h \
+    $$ASSIMP_SRC/code/SortByPTypeProcess.h \
+    $$ASSIMP_SRC/code/SplitLargeMeshes.h \
+    $$ASSIMP_SRC/code/TextureTransform.h \
+    $$ASSIMP_SRC/code/TriangulateProcess.h \
+    $$ASSIMP_SRC/code/ValidateDataStructure.h \
+    $$ASSIMP_SRC/code/OptimizeGraph.h \
+    $$ASSIMP_SRC/code/OptimizeMeshes.h \
+    $$ASSIMP_SRC/code/DeboneProcess.h \
+    $$ASSIMP_SRC/code/ProcessHelper.h \
+    $$ASSIMP_SRC/code/PolyTools.h \
+    $$ASSIMP_SRC/code/MakeVerboseFormat.h \
+    $$ASSIMP_SRC/code/ScaleProcess.h \
+    $$ASSIMP_SRC/code/glTFAsset.h \
+    $$ASSIMP_SRC/code/glTFAsset.inl \
+    $$ASSIMP_SRC/code/glTFAssetWriter.inl \
+    $$ASSIMP_SRC/code/glTFAssetWriter.h \
+    $$ASSIMP_SRC/code/glTFImporter.h \
+    $$ASSIMP_SRC/code/glTF2AssetWriter.h \
+    $$ASSIMP_SRC/code/glTF2Asset.h \
+    $$ASSIMP_SRC/code/glTF2Asset.inl \
+    $$ASSIMP_SRC/code/glTF2AssetWriter.inl \
+    $$ASSIMP_SRC/code/glTF2Importer.h
 
 SOURCES += \
-    code/Assimp.cpp \
-    code/DefaultLogger.cpp \
-    code/BaseImporter.cpp \
-    code/BaseProcess.cpp \
-    code/PostStepRegistry.cpp \
-    code/ImporterRegistry.cpp \
-    code/DefaultIOStream.cpp \
-    code/DefaultIOSystem.cpp \
-    code/CInterfaceIOWrapper.cpp \
-    code/Importer.cpp \
-    code/SGSpatialSort.cpp \
-    code/VertexTriangleAdjacency.cpp \
-    code/SpatialSort.cpp \
-    code/SceneCombiner.cpp \
-    code/ScenePreprocessor.cpp \
-    code/SkeletonMeshBuilder.cpp \
-    code/SplitByBoneCountProcess.cpp \
-    code/StandardShapes.cpp \
-    code/TargetAnimation.cpp \
-    code/RemoveComments.cpp \
-    code/Subdivision.cpp \
-    code/scene.cpp \
-    code/Bitmap.cpp \
-    code/Version.cpp \
-    code/CreateAnimMesh.cpp \
-    code/simd.cpp \
-    code/ColladaLoader.cpp \
-    code/ColladaParser.cpp \
-    code/MaterialSystem.cpp \
-    code/ObjFileImporter.cpp \
-    code/ObjFileMtlImporter.cpp \
-    code/ObjFileParser.cpp \
-    code/BlenderLoader.cpp \
-    code/BlenderDNA.cpp \
-    code/BlenderScene.cpp \
-    code/BlenderModifier.cpp \
-    code/BlenderBMesh.cpp \
-    code/BlenderTessellator.cpp \
-    code/BlenderCustomData.cpp \
-    code/FBXImporter.cpp \
-    code/FBXParser.cpp \
-    code/FBXTokenizer.cpp \
-    code/FBXConverter.cpp \
-    code/FBXUtil.cpp \
-    code/FBXDocument.cpp \
-    code/FBXProperties.cpp \
-    code/FBXMeshGeometry.cpp \
-    code/FBXMaterial.cpp \
-    code/FBXModel.cpp \
-    code/FBXAnimation.cpp \
-    code/FBXNodeAttribute.cpp \
-    code/FBXDeformer.cpp \
-    code/FBXBinaryTokenizer.cpp \
-    code/FBXDocumentUtil.cpp \
-    code/CalcTangentsProcess.cpp \
-    code/ComputeUVMappingProcess.cpp \
-    code/ConvertToLHProcess.cpp \
-    code/EmbedTexturesProcess.cpp \
-    code/FindDegenerates.cpp \
-    code/FindInstancesProcess.cpp \
-    code/FindInvalidDataProcess.cpp \
-    code/FixNormalsStep.cpp \
-    code/DropFaceNormalsProcess.cpp \
-    code/GenFaceNormalsProcess.cpp \
-    code/GenVertexNormalsProcess.cpp \
-    code/PretransformVertices.cpp \
-    code/ImproveCacheLocality.cpp \
-    code/JoinVerticesProcess.cpp \
-    code/LimitBoneWeightsProcess.cpp \
-    code/RemoveRedundantMaterials.cpp \
-    code/RemoveVCProcess.cpp \
-    code/SortByPTypeProcess.cpp \
-    code/SplitLargeMeshes.cpp \
-    code/TextureTransform.cpp \
-    code/TriangulateProcess.cpp \
-    code/ValidateDataStructure.cpp \
-    code/OptimizeGraph.cpp \
-    code/OptimizeMeshes.cpp \
-    code/DeboneProcess.cpp \
-    code/ProcessHelper.cpp \
-    code/MakeVerboseFormat.cpp \
-    code/ScaleProcess.cpp \
-    code/glTFImporter.cpp \
-    code/glTF2Importer.cpp
+    $$ASSIMP_SRC/code/Assimp.cpp \
+    $$ASSIMP_SRC/code/DefaultLogger.cpp \
+    $$ASSIMP_SRC/code/BaseImporter.cpp \
+    $$ASSIMP_SRC/code/BaseProcess.cpp \
+    $$ASSIMP_SRC/code/PostStepRegistry.cpp \
+    $$ASSIMP_SRC/code/ImporterRegistry.cpp \
+    $$ASSIMP_SRC/code/DefaultIOStream.cpp \
+    $$ASSIMP_SRC/code/DefaultIOSystem.cpp \
+    $$ASSIMP_SRC/code/CInterfaceIOWrapper.cpp \
+    $$ASSIMP_SRC/code/Importer.cpp \
+    $$ASSIMP_SRC/code/SGSpatialSort.cpp \
+    $$ASSIMP_SRC/code/VertexTriangleAdjacency.cpp \
+    $$ASSIMP_SRC/code/SpatialSort.cpp \
+    $$ASSIMP_SRC/code/SceneCombiner.cpp \
+    $$ASSIMP_SRC/code/ScenePreprocessor.cpp \
+    $$ASSIMP_SRC/code/SkeletonMeshBuilder.cpp \
+    $$ASSIMP_SRC/code/SplitByBoneCountProcess.cpp \
+    $$ASSIMP_SRC/code/StandardShapes.cpp \
+    $$ASSIMP_SRC/code/TargetAnimation.cpp \
+    $$ASSIMP_SRC/code/RemoveComments.cpp \
+    $$ASSIMP_SRC/code/Subdivision.cpp \
+    $$ASSIMP_SRC/code/scene.cpp \
+    $$ASSIMP_SRC/code/Bitmap.cpp \
+    $$ASSIMP_SRC/code/Version.cpp \
+    $$ASSIMP_SRC/code/CreateAnimMesh.cpp \
+    $$ASSIMP_SRC/code/simd.cpp \
+    $$ASSIMP_SRC/code/ColladaLoader.cpp \
+    $$ASSIMP_SRC/code/ColladaParser.cpp \
+    $$ASSIMP_SRC/code/MaterialSystem.cpp \
+    $$ASSIMP_SRC/code/ObjFileImporter.cpp \
+    $$ASSIMP_SRC/code/ObjFileMtlImporter.cpp \
+    $$ASSIMP_SRC/code/ObjFileParser.cpp \
+    $$ASSIMP_SRC/code/BlenderLoader.cpp \
+    $$ASSIMP_SRC/code/BlenderDNA.cpp \
+    $$ASSIMP_SRC/code/BlenderScene.cpp \
+    $$ASSIMP_SRC/code/BlenderModifier.cpp \
+    $$ASSIMP_SRC/code/BlenderBMesh.cpp \
+    $$ASSIMP_SRC/code/BlenderTessellator.cpp \
+    $$ASSIMP_SRC/code/BlenderCustomData.cpp \
+    $$ASSIMP_SRC/code/FBXImporter.cpp \
+    $$ASSIMP_SRC/code/FBXParser.cpp \
+    $$ASSIMP_SRC/code/FBXTokenizer.cpp \
+    $$ASSIMP_SRC/code/FBXConverter.cpp \
+    $$ASSIMP_SRC/code/FBXUtil.cpp \
+    $$ASSIMP_SRC/code/FBXDocument.cpp \
+    $$ASSIMP_SRC/code/FBXProperties.cpp \
+    $$ASSIMP_SRC/code/FBXMeshGeometry.cpp \
+    $$ASSIMP_SRC/code/FBXMaterial.cpp \
+    $$ASSIMP_SRC/code/FBXModel.cpp \
+    $$ASSIMP_SRC/code/FBXAnimation.cpp \
+    $$ASSIMP_SRC/code/FBXNodeAttribute.cpp \
+    $$ASSIMP_SRC/code/FBXDeformer.cpp \
+    $$ASSIMP_SRC/code/FBXBinaryTokenizer.cpp \
+    $$ASSIMP_SRC/code/FBXDocumentUtil.cpp \
+    $$ASSIMP_SRC/code/CalcTangentsProcess.cpp \
+    $$ASSIMP_SRC/code/ComputeUVMappingProcess.cpp \
+    $$ASSIMP_SRC/code/ConvertToLHProcess.cpp \
+    $$ASSIMP_SRC/code/EmbedTexturesProcess.cpp \
+    $$ASSIMP_SRC/code/FindDegenerates.cpp \
+    $$ASSIMP_SRC/code/FindInstancesProcess.cpp \
+    $$ASSIMP_SRC/code/FindInvalidDataProcess.cpp \
+    $$ASSIMP_SRC/code/FixNormalsStep.cpp \
+    $$ASSIMP_SRC/code/DropFaceNormalsProcess.cpp \
+    $$ASSIMP_SRC/code/GenFaceNormalsProcess.cpp \
+    $$ASSIMP_SRC/code/GenVertexNormalsProcess.cpp \
+    $$ASSIMP_SRC/code/PretransformVertices.cpp \
+    $$ASSIMP_SRC/code/ImproveCacheLocality.cpp \
+    $$ASSIMP_SRC/code/JoinVerticesProcess.cpp \
+    $$ASSIMP_SRC/code/LimitBoneWeightsProcess.cpp \
+    $$ASSIMP_SRC/code/RemoveRedundantMaterials.cpp \
+    $$ASSIMP_SRC/code/RemoveVCProcess.cpp \
+    $$ASSIMP_SRC/code/SortByPTypeProcess.cpp \
+    $$ASSIMP_SRC/code/SplitLargeMeshes.cpp \
+    $$ASSIMP_SRC/code/TextureTransform.cpp \
+    $$ASSIMP_SRC/code/TriangulateProcess.cpp \
+    $$ASSIMP_SRC/code/ValidateDataStructure.cpp \
+    $$ASSIMP_SRC/code/OptimizeGraph.cpp \
+    $$ASSIMP_SRC/code/OptimizeMeshes.cpp \
+    $$ASSIMP_SRC/code/DeboneProcess.cpp \
+    $$ASSIMP_SRC/code/ProcessHelper.cpp \
+    $$ASSIMP_SRC/code/MakeVerboseFormat.cpp \
+    $$ASSIMP_SRC/code/ScaleProcess.cpp \
+    $$ASSIMP_SRC/code/glTFImporter.cpp \
+    $$ASSIMP_SRC/code/glTF2Importer.cpp
 
 # IrrXML (needed for DAE/Collada support)
 HEADERS += \
-    contrib/irrXML/CXMLReaderImpl.h \
-    contrib/irrXML/heapsort.h \
-    contrib/irrXML/irrArray.h \
-    contrib/irrXML/irrString.h \
-    contrib/irrXML/irrTypes.h \
-    contrib/irrXML/irrXML.h
+    $$ASSIMP_SRC/contrib/irrXML/CXMLReaderImpl.h \
+    $$ASSIMP_SRC/contrib/irrXML/heapsort.h \
+    $$ASSIMP_SRC/contrib/irrXML/irrArray.h \
+    $$ASSIMP_SRC/contrib/irrXML/irrString.h \
+    $$ASSIMP_SRC/contrib/irrXML/irrTypes.h \
+    $$ASSIMP_SRC/contrib/irrXML/irrXML.h
 
-SOURCES += contrib/irrXML/irrXML.cpp
+SOURCES += $$ASSIMP_SRC/contrib/irrXML/irrXML.cpp
 
-VPATH += $$PWD/contrib/irrXML
-INCLUDEPATH += $$PWD/contrib/irrXML
+VPATH += $$ASSIMP_SRC/contrib/irrXML
+INCLUDEPATH += $$ASSIMP_SRC/contrib/irrXML
 
 msvc: DEFINES += _SCL_SECURE_NO_WARNINGS _CRT_SECURE_NO_WARNINGS
 
 # rapidjson (needed for GLTF/GLTF2)
-VPATH += $$PWD/contrib/rapidjson/include
-INCLUDEPATH += $$PWD/contrib/rapidjson/include
+VPATH += $$ASSIMP_SRC/contrib/rapidjson/include
+INCLUDEPATH += $$ASSIMP_SRC/contrib/rapidjson/include
 
 # utf8cpp
-VPATH += $$PWD/contrib/utf8cpp/source
-INCLUDEPATH += $$PWD/contrib/utf8cpp/source
+VPATH += $$ASSIMP_SRC/contrib/utf8cpp/source
+INCLUDEPATH += $$ASSIMP_SRC/contrib/utf8cpp/source
 
 # poly2tri (blender tessellator)
-VPATH += $$PWD/contrib/poly2tri
-INCLUDEPATH += $$PWD/contrib/poly2tri
+VPATH += $$ASSIMP_SRC/contrib/poly2tri
+INCLUDEPATH += $$ASSIMP_SRC/contrib/poly2tri
 
 HEADERS += \
-    contrib/poly2tri/poly2tri/common/shapes.h \
-    contrib/poly2tri/poly2tri/common/utils.h \
-    contrib/poly2tri/poly2tri/sweep/advancing_front.h \
-    contrib/poly2tri/poly2tri/sweep/cdt.h \
-    contrib/poly2tri/poly2tri/sweep/sweep.h \
-    contrib/poly2tri/poly2tri/sweep/sweep_context.h
+    $$ASSIMP_SRC/contrib/poly2tri/poly2tri/common/shapes.h \
+    $$ASSIMP_SRC/contrib/poly2tri/poly2tri/common/utils.h \
+    $$ASSIMP_SRC/contrib/poly2tri/poly2tri/sweep/advancing_front.h \
+    $$ASSIMP_SRC/contrib/poly2tri/poly2tri/sweep/cdt.h \
+    $$ASSIMP_SRC/contrib/poly2tri/poly2tri/sweep/sweep.h \
+    $$ASSIMP_SRC/contrib/poly2tri/poly2tri/sweep/sweep_context.h
 
 SOURCES += \
-    contrib/poly2tri/poly2tri/common/shapes.cc \
-    contrib/poly2tri/poly2tri/sweep/advancing_front.cc \
-    contrib/poly2tri/poly2tri/sweep/cdt.cc \
-    contrib/poly2tri/poly2tri/sweep/sweep.cc \
-    contrib/poly2tri/poly2tri/sweep/sweep_context.cc
+    $$ASSIMP_SRC/contrib/poly2tri/poly2tri/common/shapes.cc \
+    $$ASSIMP_SRC/contrib/poly2tri/poly2tri/sweep/advancing_front.cc \
+    $$ASSIMP_SRC/contrib/poly2tri/poly2tri/sweep/cdt.cc \
+    $$ASSIMP_SRC/contrib/poly2tri/poly2tri/sweep/sweep.cc \
+    $$ASSIMP_SRC/contrib/poly2tri/poly2tri/sweep/sweep_context.cc
diff --git a/src/3rdparty/assimp/config.h b/src/3rdparty/assimp/config.h
new file mode 100644
index 000000000..c75a419dd
--- /dev/null
+++ b/src/3rdparty/assimp/config.h
@@ -0,0 +1,992 @@
+/*
+---------------------------------------------------------------------------
+Open Asset Import Library (assimp)
+---------------------------------------------------------------------------
+
+Copyright (c) 2006-2018, assimp team
+
+
+All rights reserved.
+
+Redistribution and use of this software in source and binary forms,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+  copyright notice, this list of conditions and the
+  following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+  copyright notice, this list of conditions and the
+  following disclaimer in the documentation and/or other
+  materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+  contributors may be used to endorse or promote products
+  derived from this software without specific prior
+  written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(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 config.h
+ *  @brief Defines constants for configurable properties for the library
+ *
+ *  Typically these properties are set via
+ *  #Assimp::Importer::SetPropertyFloat,
+ *  #Assimp::Importer::SetPropertyInteger or
+ *  #Assimp::Importer::SetPropertyString,
+ *  depending on the data type of a property. All properties have a
+ *  default value. See the doc for the mentioned methods for more details.
+ *
+ *  <br><br>
+ *  The corresponding functions for use with the plain-c API are:
+ *  #aiSetImportPropertyInteger,
+ *  #aiSetImportPropertyFloat,
+ *  #aiSetImportPropertyString
+ */
+#pragma once
+#ifndef AI_CONFIG_H_INC
+#define AI_CONFIG_H_INC
+
+
+// ###########################################################################
+// LIBRARY SETTINGS
+// General, global settings
+// ###########################################################################
+
+// ---------------------------------------------------------------------------
+/** @brief Enables time measurements.
+ *
+ *  If enabled, measures the time needed for each part of the loading
+ *  process (i.e. IO time, importing, postprocessing, ..) and dumps
+ *  these timings to the DefaultLogger. See the @link perf Performance
+ *  Page@endlink for more information on this topic.
+ *
+ * Property type: bool. Default value: false.
+ */
+#define AI_CONFIG_GLOB_MEASURE_TIME  \
+    "GLOB_MEASURE_TIME"
+
+
+// ---------------------------------------------------------------------------
+/** @brief Global setting to disable generation of skeleton dummy meshes
+ *
+ * Skeleton dummy meshes are generated as a visualization aid in cases which
+ * the input data contains no geometry, but only animation data.
+ * Property data type: bool. Default value: false
+ */
+// ---------------------------------------------------------------------------
+#define AI_CONFIG_IMPORT_NO_SKELETON_MESHES \
+    "IMPORT_NO_SKELETON_MESHES"
+
+
+
+# if 0 // not implemented yet
+// ---------------------------------------------------------------------------
+/** @brief Set Assimp's multithreading policy.
+ *
+ * This setting is ignored if Assimp was built without boost.thread
+ * support (ASSIMP_BUILD_NO_THREADING, which is implied by ASSIMP_BUILD_BOOST_WORKAROUND).
+ * Possible values are: -1 to let Assimp decide what to do, 0 to disable
+ * multithreading entirely and any number larger than 0 to force a specific
+ * number of threads. Assimp is always free to ignore this settings, which is
+ * merely a hint. Usually, the default value (-1) will be fine. However, if
+ * Assimp is used concurrently from multiple user threads, it might be useful
+ * to limit each Importer instance to a specific number of cores.
+ *
+ * For more information, see the @link threading Threading page@endlink.
+ * Property type: int, default value: -1.
+ */
+#define AI_CONFIG_GLOB_MULTITHREADING  \
+    "GLOB_MULTITHREADING"
+#endif
+
+// ###########################################################################
+// POST PROCESSING SETTINGS
+// Various stuff to fine-tune the behavior of a specific post processing step.
+// ###########################################################################
+
+
+// ---------------------------------------------------------------------------
+/** @brief Maximum bone count per mesh for the SplitbyBoneCount step.
+ *
+ * Meshes are split until the maximum number of bones is reached. The default
+ * value is AI_SBBC_DEFAULT_MAX_BONES, which may be altered at
+ * compile-time.
+ * Property data type: integer.
+ */
+// ---------------------------------------------------------------------------
+#define AI_CONFIG_PP_SBBC_MAX_BONES \
+    "PP_SBBC_MAX_BONES"
+
+
+// default limit for bone count
+#if (!defined AI_SBBC_DEFAULT_MAX_BONES)
+#   define AI_SBBC_DEFAULT_MAX_BONES        60
+#endif
+
+
+// ---------------------------------------------------------------------------
+/** @brief  Specifies the maximum angle that may be between two vertex tangents
+ *         that their tangents and bi-tangents are smoothed.
+ *
+ * This applies to the CalcTangentSpace-Step. The angle is specified
+ * in degrees. The maximum value is 175.
+ * Property type: float. Default value: 45 degrees
+ */
+#define AI_CONFIG_PP_CT_MAX_SMOOTHING_ANGLE \
+    "PP_CT_MAX_SMOOTHING_ANGLE"
+
+// ---------------------------------------------------------------------------
+/** @brief Source UV channel for tangent space computation.
+ *
+ * The specified channel must exist or an error will be raised.
+ * Property type: integer. Default value: 0
+ */
+// ---------------------------------------------------------------------------
+#define AI_CONFIG_PP_CT_TEXTURE_CHANNEL_INDEX \
+    "PP_CT_TEXTURE_CHANNEL_INDEX"
+
+// ---------------------------------------------------------------------------
+/** @brief  Specifies the maximum angle that may be between two face normals
+ *          at the same vertex position that their are smoothed together.
+ *
+ * Sometimes referred to as 'crease angle'.
+ * This applies to the GenSmoothNormals-Step. The angle is specified
+ * in degrees, so 180 is PI. The default value is 175 degrees (all vertex
+ * normals are smoothed). The maximum value is 175, too. Property type: float.
+ * Warning: setting this option may cause a severe loss of performance. The
+ * performance is unaffected if the #AI_CONFIG_FAVOUR_SPEED flag is set but
+ * the output quality may be reduced.
+ */
+#define AI_CONFIG_PP_GSN_MAX_SMOOTHING_ANGLE \
+    "PP_GSN_MAX_SMOOTHING_ANGLE"
+
+
+// ---------------------------------------------------------------------------
+/** @brief Sets the colormap (= palette) to be used to decode embedded
+ *         textures in MDL (Quake or 3DGS) files.
+ *
+ * This must be a valid path to a file. The file is 768 (256*3) bytes
+ * large and contains RGB triplets for each of the 256 palette entries.
+ * The default value is colormap.lmp. If the file is not found,
+ * a default palette (from Quake 1) is used.
+ * Property type: string.
+ */
+#define AI_CONFIG_IMPORT_MDL_COLORMAP       \
+    "IMPORT_MDL_COLORMAP"
+
+// ---------------------------------------------------------------------------
+/** @brief Configures the #aiProcess_RemoveRedundantMaterials step to
+ *  keep materials matching a name in a given list.
+ *
+ * This is a list of 1 to n strings, ' ' serves as delimiter character.
+ * Identifiers containing whitespaces must be enclosed in *single*
+ * quotation marks. For example:<tt>
+ * "keep-me and_me_to anotherMaterialToBeKept \'name with whitespace\'"</tt>.
+ * If a material matches on of these names, it will not be modified or
+ * removed by the postprocessing step nor will other materials be replaced
+ * by a reference to it. <br>
+ * This option might be useful if you are using some magic material names
+ * to pass additional semantics through the content pipeline. This ensures
+ * they won't be optimized away, but a general optimization is still
+ * performed for materials not contained in the list.
+ * Property type: String. Default value: n/a
+ * @note Linefeeds, tabs or carriage returns are treated as whitespace.
+ *   Material names are case sensitive.
+ */
+#define AI_CONFIG_PP_RRM_EXCLUDE_LIST   \
+    "PP_RRM_EXCLUDE_LIST"
+
+// ---------------------------------------------------------------------------
+/** @brief Configures the #aiProcess_PreTransformVertices step to
+ *  keep the scene hierarchy. Meshes are moved to worldspace, but
+ *  no optimization is performed (read: meshes with equal materials are not
+ *  joined. The total number of meshes won't change).
+ *
+ * This option could be of use for you if the scene hierarchy contains
+ * important additional information which you intend to parse.
+ * For rendering, you can still render all meshes in the scene without
+ * any transformations.
+ * Property type: bool. Default value: false.
+ */
+#define AI_CONFIG_PP_PTV_KEEP_HIERARCHY     \
+    "PP_PTV_KEEP_HIERARCHY"
+
+// ---------------------------------------------------------------------------
+/** @brief Configures the #aiProcess_PreTransformVertices step to normalize
+ *  all vertex components into the [-1,1] range. That is, a bounding box
+ *  for the whole scene is computed, the maximum component is taken and all
+ *  meshes are scaled appropriately (uniformly of course!).
+ *  This might be useful if you don't know the spatial dimension of the input
+ *  data*/
+#define AI_CONFIG_PP_PTV_NORMALIZE  \
+    "PP_PTV_NORMALIZE"
+
+// ---------------------------------------------------------------------------
+/** @brief Configures the #aiProcess_PreTransformVertices step to use
+ *  a users defined matrix as the scene root node transformation before
+ *  transforming vertices.
+ *  Property type: bool. Default value: false.
+ */
+#define AI_CONFIG_PP_PTV_ADD_ROOT_TRANSFORMATION    \
+    "PP_PTV_ADD_ROOT_TRANSFORMATION"
+
+// ---------------------------------------------------------------------------
+/** @brief Configures the #aiProcess_PreTransformVertices step to use
+ *  a users defined matrix as the scene root node transformation before
+ *  transforming vertices. This property correspond to the 'a1' component
+ *  of the transformation matrix.
+ *  Property type: aiMatrix4x4.
+ */
+#define AI_CONFIG_PP_PTV_ROOT_TRANSFORMATION    \
+    "PP_PTV_ROOT_TRANSFORMATION"
+
+// ---------------------------------------------------------------------------
+/** @brief Configures the #aiProcess_FindDegenerates step to
+ *  remove degenerated primitives from the import - immediately.
+ *
+ * The default behaviour converts degenerated triangles to lines and
+ * degenerated lines to points. See the documentation to the
+ * #aiProcess_FindDegenerates step for a detailed example of the various ways
+ * to get rid of these lines and points if you don't want them.
+ * Property type: bool. Default value: false.
+ */
+#define AI_CONFIG_PP_FD_REMOVE \
+    "PP_FD_REMOVE"
+
+// ---------------------------------------------------------------------------
+/**
+ *  @brief  Configures the #aiProcess_FindDegenerates to check the area of a
+ *  trinagle to be greates than e-6. If this is not the case the triangle will
+ *  be removed if #AI_CONFIG_PP_FD_REMOVE is set to true.
+ */
+#define AI_CONFIG_PP_FD_CHECKAREA \
+    "PP_FD_CHECKAREA"
+
+// ---------------------------------------------------------------------------
+/** @brief Configures the #aiProcess_OptimizeGraph step to preserve nodes
+ * matching a name in a given list.
+ *
+ * This is a list of 1 to n strings, ' ' serves as delimiter character.
+ * Identifiers containing whitespaces must be enclosed in *single*
+ * quotation marks. For example:<tt>
+ * "keep-me and_me_to anotherNodeToBeKept \'name with whitespace\'"</tt>.
+ * If a node matches on of these names, it will not be modified or
+ * removed by the postprocessing step.<br>
+ * This option might be useful if you are using some magic node names
+ * to pass additional semantics through the content pipeline. This ensures
+ * they won't be optimized away, but a general optimization is still
+ * performed for nodes not contained in the list.
+ * Property type: String. Default value: n/a
+ * @note Linefeeds, tabs or carriage returns are treated as whitespace.
+ *   Node names are case sensitive.
+ */
+#define AI_CONFIG_PP_OG_EXCLUDE_LIST    \
+    "PP_OG_EXCLUDE_LIST"
+
+// ---------------------------------------------------------------------------
+/** @brief  Set the maximum number of triangles in a mesh.
+ *
+ * This is used by the "SplitLargeMeshes" PostProcess-Step to determine
+ * whether a mesh must be split or not.
+ * @note The default value is AI_SLM_DEFAULT_MAX_TRIANGLES
+ * Property type: integer.
+ */
+#define AI_CONFIG_PP_SLM_TRIANGLE_LIMIT \
+    "PP_SLM_TRIANGLE_LIMIT"
+
+// default value for AI_CONFIG_PP_SLM_TRIANGLE_LIMIT
+#if (!defined AI_SLM_DEFAULT_MAX_TRIANGLES)
+#   define AI_SLM_DEFAULT_MAX_TRIANGLES     1000000
+#endif
+
+// ---------------------------------------------------------------------------
+/** @brief  Set the maximum number of vertices in a mesh.
+ *
+ * This is used by the "SplitLargeMeshes" PostProcess-Step to determine
+ * whether a mesh must be split or not.
+ * @note The default value is AI_SLM_DEFAULT_MAX_VERTICES
+ * Property type: integer.
+ */
+#define AI_CONFIG_PP_SLM_VERTEX_LIMIT \
+    "PP_SLM_VERTEX_LIMIT"
+
+// default value for AI_CONFIG_PP_SLM_VERTEX_LIMIT
+#if (!defined AI_SLM_DEFAULT_MAX_VERTICES)
+#   define AI_SLM_DEFAULT_MAX_VERTICES      1000000
+#endif
+
+// ---------------------------------------------------------------------------
+/** @brief Set the maximum number of bones affecting a single vertex
+ *
+ * This is used by the #aiProcess_LimitBoneWeights PostProcess-Step.
+ * @note The default value is AI_LMW_MAX_WEIGHTS
+ * Property type: integer.*/
+#define AI_CONFIG_PP_LBW_MAX_WEIGHTS    \
+    "PP_LBW_MAX_WEIGHTS"
+
+// default value for AI_CONFIG_PP_LBW_MAX_WEIGHTS
+#if (!defined AI_LMW_MAX_WEIGHTS)
+#   define AI_LMW_MAX_WEIGHTS   0x4
+#endif // !! AI_LMW_MAX_WEIGHTS
+
+// ---------------------------------------------------------------------------
+/** @brief Lower the deboning threshold in order to remove more bones.
+ *
+ * This is used by the #aiProcess_Debone PostProcess-Step.
+ * @note The default value is AI_DEBONE_THRESHOLD
+ * Property type: float.*/
+#define AI_CONFIG_PP_DB_THRESHOLD \
+    "PP_DB_THRESHOLD"
+
+// default value for AI_CONFIG_PP_LBW_MAX_WEIGHTS
+#if (!defined AI_DEBONE_THRESHOLD)
+#   define AI_DEBONE_THRESHOLD  1.0f
+#endif // !! AI_DEBONE_THRESHOLD
+
+// ---------------------------------------------------------------------------
+/** @brief Require all bones qualify for deboning before removing any
+ *
+ * This is used by the #aiProcess_Debone PostProcess-Step.
+ * @note The default value is 0
+ * Property type: bool.*/
+#define AI_CONFIG_PP_DB_ALL_OR_NONE \
+    "PP_DB_ALL_OR_NONE"
+
+/** @brief Default value for the #AI_CONFIG_PP_ICL_PTCACHE_SIZE property
+ */
+#ifndef PP_ICL_PTCACHE_SIZE
+#   define PP_ICL_PTCACHE_SIZE 12
+#endif
+
+// ---------------------------------------------------------------------------
+/** @brief Set the size of the post-transform vertex cache to optimize the
+ *    vertices for. This configures the #aiProcess_ImproveCacheLocality step.
+ *
+ * The size is given in vertices. Of course you can't know how the vertex
+ * format will exactly look like after the import returns, but you can still
+ * guess what your meshes will probably have.
+ * @note The default value is #PP_ICL_PTCACHE_SIZE. That results in slight
+ * performance improvements for most nVidia/AMD cards since 2002.
+ * Property type: integer.
+ */
+#define AI_CONFIG_PP_ICL_PTCACHE_SIZE   "PP_ICL_PTCACHE_SIZE"
+
+// ---------------------------------------------------------------------------
+/** @brief Enumerates components of the aiScene and aiMesh data structures
+ *  that can be excluded from the import using the #aiProcess_RemoveComponent step.
+ *
+ *  See the documentation to #aiProcess_RemoveComponent for more details.
+ */
+enum aiComponent
+{
+    /** Normal vectors */
+#ifdef SWIG
+    aiComponent_NORMALS = 0x2,
+#else
+    aiComponent_NORMALS = 0x2u,
+#endif
+
+    /** Tangents and bitangents go always together ... */
+#ifdef SWIG
+    aiComponent_TANGENTS_AND_BITANGENTS = 0x4,
+#else
+    aiComponent_TANGENTS_AND_BITANGENTS = 0x4u,
+#endif
+
+    /** ALL color sets
+     * Use aiComponent_COLORn(N) to specify the N'th set */
+    aiComponent_COLORS = 0x8,
+
+    /** ALL texture UV sets
+     * aiComponent_TEXCOORDn(N) to specify the N'th set  */
+    aiComponent_TEXCOORDS = 0x10,
+
+    /** Removes all bone weights from all meshes.
+     * The scenegraph nodes corresponding to the bones are NOT removed.
+     * use the #aiProcess_OptimizeGraph step to do this */
+    aiComponent_BONEWEIGHTS = 0x20,
+
+    /** Removes all node animations (aiScene::mAnimations).
+     * The corresponding scenegraph nodes are NOT removed.
+     * use the #aiProcess_OptimizeGraph step to do this */
+    aiComponent_ANIMATIONS = 0x40,
+
+    /** Removes all embedded textures (aiScene::mTextures) */
+    aiComponent_TEXTURES = 0x80,
+
+    /** Removes all light sources (aiScene::mLights).
+     * The corresponding scenegraph nodes are NOT removed.
+     * use the #aiProcess_OptimizeGraph step to do this */
+    aiComponent_LIGHTS = 0x100,
+
+    /** Removes all cameras (aiScene::mCameras).
+     * The corresponding scenegraph nodes are NOT removed.
+     * use the #aiProcess_OptimizeGraph step to do this */
+    aiComponent_CAMERAS = 0x200,
+
+    /** Removes all meshes (aiScene::mMeshes). */
+    aiComponent_MESHES = 0x400,
+
+    /** Removes all materials. One default material will
+     * be generated, so aiScene::mNumMaterials will be 1. */
+    aiComponent_MATERIALS = 0x800,
+
+
+    /** This value is not used. It is just there to force the
+     *  compiler to map this enum to a 32 Bit integer. */
+#ifndef SWIG
+    _aiComponent_Force32Bit = 0x9fffffff
+#endif
+};
+
+// Remove a specific color channel 'n'
+#define aiComponent_COLORSn(n) (1u << (n+20u))
+
+// Remove a specific UV channel 'n'
+#define aiComponent_TEXCOORDSn(n) (1u << (n+25u))
+
+// ---------------------------------------------------------------------------
+/** @brief Input parameter to the #aiProcess_RemoveComponent step:
+ *  Specifies the parts of the data structure to be removed.
+ *
+ * See the documentation to this step for further details. The property
+ * is expected to be an integer, a bitwise combination of the
+ * #aiComponent flags defined above in this header. The default
+ * value is 0. Important: if no valid mesh is remaining after the
+ * step has been executed (e.g you thought it was funny to specify ALL
+ * of the flags defined above) the import FAILS. Mainly because there is
+ * no data to work on anymore ...
+ */
+#define AI_CONFIG_PP_RVC_FLAGS              \
+    "PP_RVC_FLAGS"
+
+// ---------------------------------------------------------------------------
+/** @brief Input parameter to the #aiProcess_SortByPType step:
+ *  Specifies which primitive types are removed by the step.
+ *
+ *  This is a bitwise combination of the aiPrimitiveType flags.
+ *  Specifying all of them is illegal, of course. A typical use would
+ *  be to exclude all line and point meshes from the import. This
+ *  is an integer property, its default value is 0.
+ */
+#define AI_CONFIG_PP_SBP_REMOVE             \
+    "PP_SBP_REMOVE"
+
+// ---------------------------------------------------------------------------
+/** @brief Input parameter to the #aiProcess_FindInvalidData step:
+ *  Specifies the floating-point accuracy for animation values. The step
+ *  checks for animation tracks where all frame values are absolutely equal
+ *  and removes them. This tweakable controls the epsilon for floating-point
+ *  comparisons - two keys are considered equal if the invariant
+ *  abs(n0-n1)>epsilon holds true for all vector respectively quaternion
+ *  components. The default value is 0.f - comparisons are exact then.
+ */
+#define AI_CONFIG_PP_FID_ANIM_ACCURACY              \
+    "PP_FID_ANIM_ACCURACY"
+
+// ---------------------------------------------------------------------------
+/** @brief Input parameter to the #aiProcess_FindInvalidData step:
+ *  Set to true to ignore texture coordinates. This may be useful if you have
+ *  to assign different kind of textures like one for the summer or one for the winter.
+ */
+#define AI_CONFIG_PP_FID_IGNORE_TEXTURECOORDS        \
+    "PP_FID_IGNORE_TEXTURECOORDS"
+
+// TransformUVCoords evaluates UV scalings
+#define AI_UVTRAFO_SCALING 0x1
+
+// TransformUVCoords evaluates UV rotations
+#define AI_UVTRAFO_ROTATION 0x2
+
+// TransformUVCoords evaluates UV translation
+#define AI_UVTRAFO_TRANSLATION 0x4
+
+// Everything baked together -> default value
+#define AI_UVTRAFO_ALL (AI_UVTRAFO_SCALING | AI_UVTRAFO_ROTATION | AI_UVTRAFO_TRANSLATION)
+
+// ---------------------------------------------------------------------------
+/** @brief Input parameter to the #aiProcess_TransformUVCoords step:
+ *  Specifies which UV transformations are evaluated.
+ *
+ *  This is a bitwise combination of the AI_UVTRAFO_XXX flags (integer
+ *  property, of course). By default all transformations are enabled
+ * (AI_UVTRAFO_ALL).
+ */
+#define AI_CONFIG_PP_TUV_EVALUATE               \
+    "PP_TUV_EVALUATE"
+
+// ---------------------------------------------------------------------------
+/** @brief A hint to assimp to favour speed against import quality.
+ *
+ * Enabling this option may result in faster loading, but it needn't.
+ * It represents just a hint to loaders and post-processing steps to use
+ * faster code paths, if possible.
+ * This property is expected to be an integer, != 0 stands for true.
+ * The default value is 0.
+ */
+#define AI_CONFIG_FAVOUR_SPEED              \
+ "FAVOUR_SPEED"
+
+
+// ###########################################################################
+// IMPORTER SETTINGS
+// Various stuff to fine-tune the behaviour of specific importer plugins.
+// ###########################################################################
+
+
+// ---------------------------------------------------------------------------
+/** @brief Set whether the fbx importer will merge all geometry layers present
+ *    in the source file or take only the first.
+ *
+ * The default value is true (1)
+ * Property type: bool
+ */
+#define AI_CONFIG_IMPORT_FBX_READ_ALL_GEOMETRY_LAYERS \
+    "IMPORT_FBX_READ_ALL_GEOMETRY_LAYERS"
+
+// ---------------------------------------------------------------------------
+/** @brief Set whether the fbx importer will read all materials present in the
+ *    source file or take only the referenced materials.
+ *
+ * This is void unless IMPORT_FBX_READ_MATERIALS=1.
+ *
+ * The default value is false (0)
+ * Property type: bool
+ */
+#define AI_CONFIG_IMPORT_FBX_READ_ALL_MATERIALS \
+    "IMPORT_FBX_READ_ALL_MATERIALS"
+
+// ---------------------------------------------------------------------------
+/** @brief Set whether the fbx importer will read materials.
+ *
+ * The default value is true (1)
+ * Property type: bool
+ */
+#define AI_CONFIG_IMPORT_FBX_READ_MATERIALS \
+    "IMPORT_FBX_READ_MATERIALS"
+
+// ---------------------------------------------------------------------------
+/** @brief Set whether the fbx importer will read embedded textures.
+ *
+ * The default value is true (1)
+ * Property type: bool
+ */
+#define AI_CONFIG_IMPORT_FBX_READ_TEXTURES \
+    "IMPORT_FBX_READ_TEXTURES"
+
+// ---------------------------------------------------------------------------
+/** @brief Set whether the fbx importer will read cameras.
+ *
+ * The default value is true (1)
+ * Property type: bool
+ */
+#define AI_CONFIG_IMPORT_FBX_READ_CAMERAS \
+    "IMPORT_FBX_READ_CAMERAS"
+
+// ---------------------------------------------------------------------------
+/** @brief Set whether the fbx importer will read light sources.
+ *
+ * The default value is true (1)
+ * Property type: bool
+ */
+#define AI_CONFIG_IMPORT_FBX_READ_LIGHTS \
+    "IMPORT_FBX_READ_LIGHTS"
+
+// ---------------------------------------------------------------------------
+/** @brief Set whether the fbx importer will read animations.
+ *
+ * The default value is true (1)
+ * Property type: bool
+ */
+#define AI_CONFIG_IMPORT_FBX_READ_ANIMATIONS \
+    "IMPORT_FBX_READ_ANIMATIONS"
+
+// ---------------------------------------------------------------------------
+/** @brief Set whether the fbx importer will act in strict mode in which only
+ *    FBX 2013 is supported and any other sub formats are rejected. FBX 2013
+ *    is the primary target for the importer, so this format is best
+ *    supported and well-tested.
+ *
+ * The default value is false (0)
+ * Property type: bool
+ */
+#define AI_CONFIG_IMPORT_FBX_STRICT_MODE \
+    "IMPORT_FBX_STRICT_MODE"
+
+// ---------------------------------------------------------------------------
+/** @brief Set whether the fbx importer will preserve pivot points for
+ *    transformations (as extra nodes). If set to false, pivots and offsets
+ *    will be evaluated whenever possible.
+ *
+ * The default value is true (1)
+ * Property type: bool
+ */
+#define AI_CONFIG_IMPORT_FBX_PRESERVE_PIVOTS \
+    "IMPORT_FBX_PRESERVE_PIVOTS"
+
+// ---------------------------------------------------------------------------
+/** @brief Specifies whether the importer will drop empty animation curves or
+ *    animation curves which match the bind pose transformation over their
+ *    entire defined range.
+ *
+ * The default value is true (1)
+ * Property type: bool
+ */
+#define AI_CONFIG_IMPORT_FBX_OPTIMIZE_EMPTY_ANIMATION_CURVES \
+    "IMPORT_FBX_OPTIMIZE_EMPTY_ANIMATION_CURVES"
+
+// ---------------------------------------------------------------------------
+/** @brief Set whether the fbx importer will use the legacy embedded texture naming.
+*
+* The default value is false (0)
+* Property type: bool
+*/
+#define AI_CONFIG_IMPORT_FBX_EMBEDDED_TEXTURES_LEGACY_NAMING \
+	"AI_CONFIG_IMPORT_FBX_EMBEDDED_TEXTURES_LEGACY_NAMING"
+
+// ---------------------------------------------------------------------------
+/** @brief  Set the vertex animation keyframe to be imported
+ *
+ * ASSIMP does not support vertex keyframes (only bone animation is supported).
+ * The library reads only one frame of models with vertex animations.
+ * By default this is the first frame.
+ * \note The default value is 0. This option applies to all importers.
+ *   However, it is also possible to override the global setting
+ *   for a specific loader. You can use the AI_CONFIG_IMPORT_XXX_KEYFRAME
+ *   options (where XXX is a placeholder for the file format for which you
+ *   want to override the global setting).
+ * Property type: integer.
+ */
+#define AI_CONFIG_IMPORT_GLOBAL_KEYFRAME    "IMPORT_GLOBAL_KEYFRAME"
+
+#define AI_CONFIG_IMPORT_MD3_KEYFRAME       "IMPORT_MD3_KEYFRAME"
+#define AI_CONFIG_IMPORT_MD2_KEYFRAME       "IMPORT_MD2_KEYFRAME"
+#define AI_CONFIG_IMPORT_MDL_KEYFRAME       "IMPORT_MDL_KEYFRAME"
+#define AI_CONFIG_IMPORT_MDC_KEYFRAME       "IMPORT_MDC_KEYFRAME"
+#define AI_CONFIG_IMPORT_SMD_KEYFRAME       "IMPORT_SMD_KEYFRAME"
+#define AI_CONFIG_IMPORT_UNREAL_KEYFRAME    "IMPORT_UNREAL_KEYFRAME"
+
+// ---------------------------------------------------------------------------
+/** Smd load multiple animations
+ *
+ *  Property type: bool. Default value: true.
+ */
+#define AI_CONFIG_IMPORT_SMD_LOAD_ANIMATION_LIST "IMPORT_SMD_LOAD_ANIMATION_LIST"
+
+// ---------------------------------------------------------------------------
+/** @brief  Configures the AC loader to collect all surfaces which have the
+ *    "Backface cull" flag set in separate meshes.
+ *
+ *  Property type: bool. Default value: true.
+ */
+#define AI_CONFIG_IMPORT_AC_SEPARATE_BFCULL \
+    "IMPORT_AC_SEPARATE_BFCULL"
+
+// ---------------------------------------------------------------------------
+/** @brief  Configures whether the AC loader evaluates subdivision surfaces (
+ *  indicated by the presence of the 'subdiv' attribute in the file). By
+ *  default, Assimp performs the subdivision using the standard
+ *  Catmull-Clark algorithm
+ *
+ * * Property type: bool. Default value: true.
+ */
+#define AI_CONFIG_IMPORT_AC_EVAL_SUBDIVISION    \
+    "IMPORT_AC_EVAL_SUBDIVISION"
+
+// ---------------------------------------------------------------------------
+/** @brief  Configures the UNREAL 3D loader to separate faces with different
+ *    surface flags (e.g. two-sided vs. single-sided).
+ *
+ * * Property type: bool. Default value: true.
+ */
+#define AI_CONFIG_IMPORT_UNREAL_HANDLE_FLAGS \
+    "UNREAL_HANDLE_FLAGS"
+
+// ---------------------------------------------------------------------------
+/** @brief Configures the terragen import plugin to compute uv's for
+ *  terrains, if not given. Furthermore a default texture is assigned.
+ *
+ * UV coordinates for terrains are so simple to compute that you'll usually
+ * want to compute them on your own, if you need them. This option is intended
+ * for model viewers which want to offer an easy way to apply textures to
+ * terrains.
+ * * Property type: bool. Default value: false.
+ */
+#define AI_CONFIG_IMPORT_TER_MAKE_UVS \
+    "IMPORT_TER_MAKE_UVS"
+
+// ---------------------------------------------------------------------------
+/** @brief  Configures the ASE loader to always reconstruct normal vectors
+ *  basing on the smoothing groups loaded from the file.
+ *
+ * Some ASE files have carry invalid normals, other don't.
+ * * Property type: bool. Default value: true.
+ */
+#define AI_CONFIG_IMPORT_ASE_RECONSTRUCT_NORMALS    \
+    "IMPORT_ASE_RECONSTRUCT_NORMALS"
+
+// ---------------------------------------------------------------------------
+/** @brief  Configures the M3D loader to detect and process multi-part
+ *    Quake player models.
+ *
+ * These models usually consist of 3 files, lower.md3, upper.md3 and
+ * head.md3. If this property is set to true, Assimp will try to load and
+ * combine all three files if one of them is loaded.
+ * Property type: bool. Default value: true.
+ */
+#define AI_CONFIG_IMPORT_MD3_HANDLE_MULTIPART \
+    "IMPORT_MD3_HANDLE_MULTIPART"
+
+// ---------------------------------------------------------------------------
+/** @brief  Tells the MD3 loader which skin files to load.
+ *
+ * When loading MD3 files, Assimp checks whether a file
+ * [md3_file_name]_[skin_name].skin is existing. These files are used by
+ * Quake III to be able to assign different skins (e.g. red and blue team)
+ * to models. 'default', 'red', 'blue' are typical skin names.
+ * Property type: String. Default value: "default".
+ */
+#define AI_CONFIG_IMPORT_MD3_SKIN_NAME \
+    "IMPORT_MD3_SKIN_NAME"
+
+// ---------------------------------------------------------------------------
+/** @brief  Specify the Quake 3 shader file to be used for a particular
+ *  MD3 file. This can also be a search path.
+ *
+ * By default Assimp's behaviour is as follows: If a MD3 file
+ * <tt>any_path/models/any_q3_subdir/model_name/file_name.md3</tt> is
+ * loaded, the library tries to locate the corresponding shader file in
+ * <tt>any_path/scripts/model_name.shader</tt>. This property overrides this
+ * behaviour. It can either specify a full path to the shader to be loaded
+ * or alternatively the path (relative or absolute) to the directory where
+ * the shaders for all MD3s to be loaded reside. Assimp attempts to open
+ * <tt>IMPORT_MD3_SHADER_SRC/model_name.shader</tt> first, <tt>IMPORT_MD3_SHADER_SRC/file_name.shader</tt>
+ * is the fallback file. Note that IMPORT_MD3_SHADER_SRC should have a terminal (back)slash.
+ * Property type: String. Default value: n/a.
+ */
+#define AI_CONFIG_IMPORT_MD3_SHADER_SRC \
+    "IMPORT_MD3_SHADER_SRC"
+
+// ---------------------------------------------------------------------------
+/** @brief  Configures the LWO loader to load just one layer from the model.
+ *
+ * LWO files consist of layers and in some cases it could be useful to load
+ * only one of them. This property can be either a string - which specifies
+ * the name of the layer - or an integer - the index of the layer. If the
+ * property is not set the whole LWO model is loaded. Loading fails if the
+ * requested layer is not available. The layer index is zero-based and the
+ * layer name may not be empty.<br>
+ * Property type: Integer. Default value: all layers are loaded.
+ */
+#define AI_CONFIG_IMPORT_LWO_ONE_LAYER_ONLY         \
+    "IMPORT_LWO_ONE_LAYER_ONLY"
+
+// ---------------------------------------------------------------------------
+/** @brief  Configures the MD5 loader to not load the MD5ANIM file for
+ *  a MD5MESH file automatically.
+ *
+ * The default strategy is to look for a file with the same name but the
+ * MD5ANIM extension in the same directory. If it is found, it is loaded
+ * and combined with the MD5MESH file. This configuration option can be
+ * used to disable this behaviour.
+ *
+ * * Property type: bool. Default value: false.
+ */
+#define AI_CONFIG_IMPORT_MD5_NO_ANIM_AUTOLOAD           \
+    "IMPORT_MD5_NO_ANIM_AUTOLOAD"
+
+// ---------------------------------------------------------------------------
+/** @brief Defines the begin of the time range for which the LWS loader
+ *    evaluates animations and computes aiNodeAnim's.
+ *
+ * Assimp provides full conversion of LightWave's envelope system, including
+ * pre and post conditions. The loader computes linearly subsampled animation
+ * chanels with the frame rate given in the LWS file. This property defines
+ * the start time. Note: animation channels are only generated if a node
+ * has at least one envelope with more tan one key assigned. This property.
+ * is given in frames, '0' is the first frame. By default, if this property
+ * is not set, the importer takes the animation start from the input LWS
+ * file ('FirstFrame' line)<br>
+ * Property type: Integer. Default value: taken from file.
+ *
+ * @see AI_CONFIG_IMPORT_LWS_ANIM_END - end of the imported time range
+ */
+#define AI_CONFIG_IMPORT_LWS_ANIM_START         \
+    "IMPORT_LWS_ANIM_START"
+#define AI_CONFIG_IMPORT_LWS_ANIM_END           \
+    "IMPORT_LWS_ANIM_END"
+
+// ---------------------------------------------------------------------------
+/** @brief Defines the output frame rate of the IRR loader.
+ *
+ * IRR animations are difficult to convert for Assimp and there will
+ * always be a loss of quality. This setting defines how many keys per second
+ * are returned by the converter.<br>
+ * Property type: integer. Default value: 100
+ */
+#define AI_CONFIG_IMPORT_IRR_ANIM_FPS               \
+    "IMPORT_IRR_ANIM_FPS"
+
+// ---------------------------------------------------------------------------
+/** @brief Ogre Importer will try to find referenced materials from this file.
+ *
+ * Ogre meshes reference with material names, this does not tell Assimp the file
+ * where it is located in. Assimp will try to find the source file in the following
+ * order: <material-name>.material, <mesh-filename-base>.material and
+ * lastly the material name defined by this config property.
+ * <br>
+ * Property type: String. Default value: Scene.material.
+ */
+#define AI_CONFIG_IMPORT_OGRE_MATERIAL_FILE \
+    "IMPORT_OGRE_MATERIAL_FILE"
+
+// ---------------------------------------------------------------------------
+/** @brief Ogre Importer detect the texture usage from its filename.
+ *
+ * Ogre material texture units do not define texture type, the textures usage
+ * depends on the used shader or Ogre's fixed pipeline. If this config property
+ * is true Assimp will try to detect the type from the textures filename postfix:
+ * _n, _nrm, _nrml, _normal, _normals and _normalmap for normal map, _s, _spec,
+ * _specular and _specularmap for specular map, _l, _light, _lightmap, _occ
+ * and _occlusion for light map, _disp and _displacement for displacement map.
+ * The matching is case insensitive. Post fix is taken between the last
+ * underscore and the last period.
+ * Default behavior is to detect type from lower cased texture unit name by
+ * matching against: normalmap, specularmap, lightmap and displacementmap.
+ * For both cases if no match is found aiTextureType_DIFFUSE is used.
+ * <br>
+ * Property type: Bool. Default value: false.
+ */
+#define AI_CONFIG_IMPORT_OGRE_TEXTURETYPE_FROM_FILENAME \
+    "IMPORT_OGRE_TEXTURETYPE_FROM_FILENAME"
+
+ /** @brief Specifies whether the Android JNI asset extraction is supported.
+  *
+  * Turn on this option if you want to manage assets in native
+  * Android application without having to keep the internal directory and asset
+  * manager pointer.
+  */
+ #define AI_CONFIG_ANDROID_JNI_ASSIMP_MANAGER_SUPPORT "AI_CONFIG_ANDROID_JNI_ASSIMP_MANAGER_SUPPORT"
+
+// ---------------------------------------------------------------------------
+/** @brief Specifies whether the IFC loader skips over IfcSpace elements.
+ *
+ * IfcSpace elements (and their geometric representations) are used to
+ * represent, well, free space in a building storey.<br>
+ * Property type: Bool. Default value: true.
+ */
+#define AI_CONFIG_IMPORT_IFC_SKIP_SPACE_REPRESENTATIONS "IMPORT_IFC_SKIP_SPACE_REPRESENTATIONS"
+
+// ---------------------------------------------------------------------------
+/** @brief Specifies whether the IFC loader will use its own, custom triangulation
+ *   algorithm to triangulate wall and floor meshes.
+ *
+ * If this property is set to false, walls will be either triangulated by
+ * #aiProcess_Triangulate or will be passed through as huge polygons with
+ * faked holes (i.e. holes that are connected with the outer boundary using
+ * a dummy edge). It is highly recommended to set this property to true
+ * if you want triangulated data because #aiProcess_Triangulate is known to
+ * have problems with the kind of polygons that the IFC loader spits out for
+ * complicated meshes.
+ * Property type: Bool. Default value: true.
+ */
+#define AI_CONFIG_IMPORT_IFC_CUSTOM_TRIANGULATION "IMPORT_IFC_CUSTOM_TRIANGULATION"
+
+// ---------------------------------------------------------------------------
+/** @brief  Set the tessellation conic angle for IFC smoothing curves.
+ *
+ * This is used by the IFC importer to determine the tessellation parameter
+ * for smoothing curves.
+ * @note The default value is AI_IMPORT_IFC_DEFAULT_SMOOTHING_ANGLE and the
+ * accepted values are in range [5.0, 120.0].
+ * Property type: Float.
+ */
+#define AI_CONFIG_IMPORT_IFC_SMOOTHING_ANGLE "IMPORT_IFC_SMOOTHING_ANGLE"
+
+// default value for AI_CONFIG_IMPORT_IFC_SMOOTHING_ANGLE
+#if (!defined AI_IMPORT_IFC_DEFAULT_SMOOTHING_ANGLE)
+#   define AI_IMPORT_IFC_DEFAULT_SMOOTHING_ANGLE 10.0f
+#endif
+
+// ---------------------------------------------------------------------------
+/** @brief  Set the tessellation for IFC cylindrical shapes.
+ *
+ * This is used by the IFC importer to determine the tessellation parameter
+ * for cylindrical shapes, i.e. the number of segments used to approximate a circle.
+ * @note The default value is AI_IMPORT_IFC_DEFAULT_CYLINDRICAL_TESSELLATION and the
+ * accepted values are in range [3, 180].
+ * Property type: Integer.
+ */
+#define AI_CONFIG_IMPORT_IFC_CYLINDRICAL_TESSELLATION "IMPORT_IFC_CYLINDRICAL_TESSELLATION"
+
+// default value for AI_CONFIG_IMPORT_IFC_CYLINDRICAL_TESSELLATION
+#if (!defined AI_IMPORT_IFC_DEFAULT_CYLINDRICAL_TESSELLATION)
+#   define AI_IMPORT_IFC_DEFAULT_CYLINDRICAL_TESSELLATION 32
+#endif
+
+// ---------------------------------------------------------------------------
+/** @brief Specifies whether the Collada loader will ignore the provided up direction.
+ *
+ * If this property is set to true, the up direction provided in the file header will
+ * be ignored and the file will be loaded as is.
+ * Property type: Bool. Default value: false.
+ */
+#define AI_CONFIG_IMPORT_COLLADA_IGNORE_UP_DIRECTION "IMPORT_COLLADA_IGNORE_UP_DIRECTION"
+
+// ---------------------------------------------------------------------------
+/** @brief Specifies whether the Collada loader should use Collada names as node names.
+ *
+ * If this property is set to true, the Collada names will be used as the
+ * node name. The default is to use the id tag (resp. sid tag, if no id tag is present)
+ * instead.
+ * Property type: Bool. Default value: false.
+ */
+#define AI_CONFIG_IMPORT_COLLADA_USE_COLLADA_NAMES "IMPORT_COLLADA_USE_COLLADA_NAMES"
+
+// ---------- All the Export defines ------------
+
+/** @brief Specifies the xfile use double for real values of float
+ *
+ * Property type: Bool. Default value: false.
+ */
+
+#define AI_CONFIG_EXPORT_XFILE_64BIT "EXPORT_XFILE_64BIT"
+
+/**
+ *
+ */
+#define AI_CONFIG_EXPORT_POINT_CLOUDS "EXPORT_POINT_CLOUDS"
+
+/**
+ *  @brief  Specifies a gobal key factor for scale, float value
+ */
+#define AI_CONFIG_GLOBAL_SCALE_FACTOR_KEY "GLOBAL_SCALE_FACTOR"
+
+#if (!defined AI_CONFIG_GLOBAL_SCALE_FACTOR_DEFAULT)
+#   define AI_CONFIG_GLOBAL_SCALE_FACTOR_DEFAULT  1.0f
+#endif // !! AI_DEBONE_THRESHOLD
+
+// ---------- All the Build/Compile-time defines ------------
+
+/** @brief Specifies if double precision is supported inside assimp
+ *
+ * Property type: Bool. Default value: undefined.
+ */
+
+/* #undef ASSIMP_DOUBLE_PRECISION */
+
+#endif // !! AI_CONFIG_H_INC
diff --git a/src/3rdparty/assimp/revision.h b/src/3rdparty/assimp/revision.h
index adc837138..985b2c7e7 100644
--- a/src/3rdparty/assimp/revision.h
+++ b/src/3rdparty/assimp/revision.h
@@ -1,18 +1,7 @@
 #ifndef ASSIMP_REVISION_H_INC
 #define ASSIMP_REVISION_H_INC
 
-#define GitVersion 0x9740c04
-#define GitBranch "master"
-
-//#define VER_MAJOR @ASSIMP_VERSION_MAJOR@
-//#define VER_MINOR @ASSIMP_VERSION_MINOR@
-//#define VER_PATCH @ASSIMP_VERSION_PATCH@
-//#define VER_BUILD @ASSIMP_PACKAGE_VERSION@
-
-//#define STR_HELP(x) #x
-//#define STR(x) STR_HELP(x)
-
-//#define VER_FILEVERSION             VER_MAJOR,VER_MINOR,VER_PATCH,VER_BUILD
-//#define VER_FILEVERSION_STR         STR(VER_MAJOR) "." STR(VER_MINOR) "." STR(VER_PATCH) "." STR(VER_BUILD)
+#define GitVersion 0x5c900d68
+#define GitBranch "HEAD"
 
 #endif // ASSIMP_REVISION_H_INC
diff --git a/src/3rdparty/assimp/src b/src/3rdparty/assimp/src
new file mode 160000
index 000000000..5c900d689
--- /dev/null
+++ b/src/3rdparty/assimp/src
@@ -0,0 +1 @@
+Subproject commit 5c900d689a5db5637b98f665fc1e9e9c9ed416b9
diff --git a/src/plugins/assetimporters/assetimporters.pro b/src/plugins/assetimporters/assetimporters.pro
index da8d911f4..7add08840 100644
--- a/src/plugins/assetimporters/assetimporters.pro
+++ b/src/plugins/assetimporters/assetimporters.pro
@@ -3,3 +3,6 @@ TEMPLATE = subdirs
 SUBDIRS = \
     uip
 
+qtConfig(assimp):!integrity {
+    SUBDIRS += assimp
+}
diff --git a/src/plugins/assetimporters/assimp/assimp.pro b/src/plugins/assetimporters/assimp/assimp.pro
index b17774a76..035c198f9 100644
--- a/src/plugins/assetimporters/assimp/assimp.pro
+++ b/src/plugins/assetimporters/assimp/assimp.pro
@@ -6,7 +6,14 @@ PLUGIN_CLASS_NAME = AssimpImporterPlugin
 
 load(qt_plugin)
 
-include(../../../3rdparty/assimp/assimp.pri)
+QT_FOR_CONFIG += assetimporters-private
+include($$OUT_PWD/../qtassetimporters-config.pri)
+
+qtConfig(system-assimp):!if(cross_compile:host_build) {
+    QMAKE_USE_PRIVATE += assimp
+} else {
+    include(../../../3rdparty/assimp/assimp.pri)
+}
 
 OTHER_FILES += assimp.json
 
diff --git a/src/plugins/assetimporters/configure.json b/src/plugins/assetimporters/configure.json
new file mode 100644
index 000000000..456b4c01d
--- /dev/null
+++ b/src/plugins/assetimporters/configure.json
@@ -0,0 +1,48 @@
+{
+    "module": "assetimporters",
+    "testDir": "../../../config.tests",
+
+    "commandline": {
+        "options": {
+            "assimp": { "type": "enum", "values": [ "no", "qt", "system" ] }
+        }
+    },
+
+    "libraries": {
+        "assimp": {
+            "label": "Assimp",
+            "test": "assimp",
+            "sources": [
+                { "type": "pkgConfig", "args": "assimp >= 5.0.0" },
+                "-lassimp"
+            ]
+        }
+    },
+
+    "features": {
+        "assimp": {
+            "label": "Assimp",
+            "output": [ "privateFeature", "feature" ]
+        },
+        "system-assimp": {
+            "label": "System Assimp",
+            "enable": "input.assimp == 'system'",
+            "disable": "input.assimp == 'qt'",
+            "condition": "features.assimp && libs.assimp",
+            "output": [ "privateFeature" ]
+        }
+    },
+
+    "report": [
+    ],
+
+    "summary": [
+        {
+            "section": "QtQuick3D",
+            "entries": [
+                "assimp",
+                "system-assimp"
+            ]
+        }
+    ]
+}
-- 
GitLab