From f1fe73d1909a2448a004a88362a1a532d0d4f7c3 Mon Sep 17 00:00:00 2001
From: sanine <sanine.not@pm.me>
Date: Sun, 12 Feb 2023 23:53:22 -0600
Subject: switch to tinyobj and nanovg from assimp and cairo

---
 .../code/AssetLib/Ogre/OgreBinarySerializer.cpp    |  973 ------------------
 .../code/AssetLib/Ogre/OgreBinarySerializer.h      |  415 --------
 libs/assimp/code/AssetLib/Ogre/OgreImporter.cpp    |  135 ---
 libs/assimp/code/AssetLib/Ogre/OgreImporter.h      |   98 --
 libs/assimp/code/AssetLib/Ogre/OgreMaterial.cpp    |  500 ---------
 libs/assimp/code/AssetLib/Ogre/OgreParsingUtils.h  |   95 --
 libs/assimp/code/AssetLib/Ogre/OgreStructs.cpp     | 1076 --------------------
 libs/assimp/code/AssetLib/Ogre/OgreStructs.h       |  696 -------------
 .../code/AssetLib/Ogre/OgreXmlSerializer.cpp       |  755 --------------
 libs/assimp/code/AssetLib/Ogre/OgreXmlSerializer.h |  102 --
 10 files changed, 4845 deletions(-)
 delete mode 100644 libs/assimp/code/AssetLib/Ogre/OgreBinarySerializer.cpp
 delete mode 100644 libs/assimp/code/AssetLib/Ogre/OgreBinarySerializer.h
 delete mode 100644 libs/assimp/code/AssetLib/Ogre/OgreImporter.cpp
 delete mode 100644 libs/assimp/code/AssetLib/Ogre/OgreImporter.h
 delete mode 100644 libs/assimp/code/AssetLib/Ogre/OgreMaterial.cpp
 delete mode 100644 libs/assimp/code/AssetLib/Ogre/OgreParsingUtils.h
 delete mode 100644 libs/assimp/code/AssetLib/Ogre/OgreStructs.cpp
 delete mode 100644 libs/assimp/code/AssetLib/Ogre/OgreStructs.h
 delete mode 100644 libs/assimp/code/AssetLib/Ogre/OgreXmlSerializer.cpp
 delete mode 100644 libs/assimp/code/AssetLib/Ogre/OgreXmlSerializer.h

(limited to 'libs/assimp/code/AssetLib/Ogre')

diff --git a/libs/assimp/code/AssetLib/Ogre/OgreBinarySerializer.cpp b/libs/assimp/code/AssetLib/Ogre/OgreBinarySerializer.cpp
deleted file mode 100644
index 738e118..0000000
--- a/libs/assimp/code/AssetLib/Ogre/OgreBinarySerializer.cpp
+++ /dev/null
@@ -1,973 +0,0 @@
-/*
-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 "OgreBinarySerializer.h"
-#include "OgreParsingUtils.h"
-#include "OgreXmlSerializer.h"
-
-#include <assimp/TinyFormatter.h>
-#include <assimp/DefaultLogger.hpp>
-
-#ifndef ASSIMP_BUILD_NO_OGRE_IMPORTER
-
-// Define as 1 to get verbose logging.
-#define OGRE_BINARY_SERIALIZER_DEBUG 0
-
-namespace Assimp {
-namespace Ogre {
-
-static constexpr auto MESH_VERSION_1_8 = "[MeshSerializer_v1.8]";
-static constexpr auto SKELETON_VERSION_1_8 = "[Serializer_v1.80]";
-static constexpr auto SKELETON_VERSION_1_1 = "[Serializer_v1.10]";
-
-const unsigned short HEADER_CHUNK_ID = 0x1000;
-
-const long MSTREAM_OVERHEAD_SIZE = sizeof(uint16_t) + sizeof(uint32_t);
-const long MSTREAM_BONE_SIZE_WITHOUT_SCALE = MSTREAM_OVERHEAD_SIZE + sizeof(unsigned short) + (sizeof(float) * 7);
-const long MSTREAM_KEYFRAME_SIZE_WITHOUT_SCALE = MSTREAM_OVERHEAD_SIZE + (sizeof(float) * 8);
-
-template <>
-inline bool OgreBinarySerializer::Read<bool>() {
-    return (m_reader->GetU1() > 0);
-}
-
-template <>
-inline char OgreBinarySerializer::Read<char>() {
-    return static_cast<char>(m_reader->GetU1());
-}
-
-template <>
-inline uint8_t OgreBinarySerializer::Read<uint8_t>() {
-    return m_reader->GetU1();
-}
-
-template <>
-inline uint16_t OgreBinarySerializer::Read<uint16_t>() {
-    return m_reader->GetU2();
-}
-
-template <>
-inline uint32_t OgreBinarySerializer::Read<uint32_t>() {
-    return m_reader->GetU4();
-}
-
-template <>
-inline float OgreBinarySerializer::Read<float>() {
-    return m_reader->GetF4();
-}
-
-void OgreBinarySerializer::ReadBytes(char *dest, size_t numBytes) {
-    ReadBytes(static_cast<void *>(dest), numBytes);
-}
-
-void OgreBinarySerializer::ReadBytes(uint8_t *dest, size_t numBytes) {
-    ReadBytes(static_cast<void *>(dest), numBytes);
-}
-
-void OgreBinarySerializer::ReadBytes(void *dest, size_t numBytes) {
-    m_reader->CopyAndAdvance(dest, numBytes);
-}
-
-uint8_t *OgreBinarySerializer::ReadBytes(size_t numBytes) {
-    uint8_t *bytes = new uint8_t[numBytes];
-    ReadBytes(bytes, numBytes);
-    return bytes;
-}
-
-void OgreBinarySerializer::ReadVector(aiVector3D &vec) {
-    m_reader->CopyAndAdvance(&vec.x, sizeof(float) * 3);
-}
-
-void OgreBinarySerializer::ReadQuaternion(aiQuaternion &quat) {
-    float temp[4];
-    m_reader->CopyAndAdvance(temp, sizeof(float) * 4);
-    quat.x = temp[0];
-    quat.y = temp[1];
-    quat.z = temp[2];
-    quat.w = temp[3];
-}
-
-bool OgreBinarySerializer::AtEnd() const {
-    return (m_reader->GetRemainingSize() == 0);
-}
-
-std::string OgreBinarySerializer::ReadString(size_t len) {
-    std::string str;
-    str.resize(len);
-    ReadBytes(&str[0], len);
-    return str;
-}
-
-std::string OgreBinarySerializer::ReadLine() {
-    std::string str;
-    while (!AtEnd()) {
-        char c = Read<char>();
-        if (c == '\n')
-            break;
-        str += c;
-    }
-    return str;
-}
-
-uint16_t OgreBinarySerializer::ReadHeader(bool readLen) {
-    uint16_t id = Read<uint16_t>();
-    if (readLen)
-        m_currentLen = Read<uint32_t>();
-
-#if (OGRE_BINARY_SERIALIZER_DEBUG == 1)
-    if (id != HEADER_CHUNK_ID) {
-        ASSIMP_LOG_DEBUG((assetMode == AM_Mesh ? MeshHeaderToString(static_cast<MeshChunkId>(id)) : SkeletonHeaderToString(static_cast<SkeletonChunkId>(id))));
-    }
-#endif
-
-    return id;
-}
-
-void OgreBinarySerializer::RollbackHeader() {
-    m_reader->IncPtr(-MSTREAM_OVERHEAD_SIZE);
-}
-
-void OgreBinarySerializer::SkipBytes(size_t numBytes) {
-#if (OGRE_BINARY_SERIALIZER_DEBUG == 1)
-    ASSIMP_LOG_VERBOSE_DEBUG("Skipping ", numBytes, " bytes");
-#endif
-
-    m_reader->IncPtr(numBytes);
-}
-
-// Mesh
-
-Mesh *OgreBinarySerializer::ImportMesh(MemoryStreamReader *stream) {
-    OgreBinarySerializer serializer(stream, OgreBinarySerializer::AM_Mesh);
-
-    uint16_t id = serializer.ReadHeader(false);
-    if (id != HEADER_CHUNK_ID) {
-        throw DeadlyImportError("Invalid Ogre Mesh file header.");
-    }
-
-    /// @todo Check what we can actually support.
-    std::string version = serializer.ReadLine();
-    if (version != MESH_VERSION_1_8) {
-        throw DeadlyImportError("Mesh version ", version, " not supported by this importer. Run OgreMeshUpgrader tool on the file and try again.",
-                                                    " Supported versions: ", MESH_VERSION_1_8);
-    }
-
-    Mesh *mesh = new Mesh();
-    while (!serializer.AtEnd()) {
-        id = serializer.ReadHeader();
-        switch (id) {
-            case M_MESH: {
-                serializer.ReadMesh(mesh);
-                break;
-            }
-        }
-    }
-    return mesh;
-}
-
-void OgreBinarySerializer::ReadMesh(Mesh *mesh) {
-    mesh->hasSkeletalAnimations = Read<bool>();
-
-    ASSIMP_LOG_VERBOSE_DEBUG("Reading Mesh");
-    ASSIMP_LOG_VERBOSE_DEBUG("  - Skeletal animations: ", mesh->hasSkeletalAnimations ? "true" : "false");
-
-    if (!AtEnd()) {
-        uint16_t id = ReadHeader();
-        while (!AtEnd() &&
-                (id == M_GEOMETRY ||
-                        id == M_SUBMESH ||
-                        id == M_MESH_SKELETON_LINK ||
-                        id == M_MESH_BONE_ASSIGNMENT ||
-                        id == M_MESH_LOD ||
-                        id == M_MESH_BOUNDS ||
-                        id == M_SUBMESH_NAME_TABLE ||
-                        id == M_EDGE_LISTS ||
-                        id == M_POSES ||
-                        id == M_ANIMATIONS ||
-                        id == M_TABLE_EXTREMES)) {
-            switch (id) {
-                case M_GEOMETRY: {
-                    mesh->sharedVertexData = new VertexData();
-                    ReadGeometry(mesh->sharedVertexData);
-                    break;
-                }
-                case M_SUBMESH: {
-                    ReadSubMesh(mesh);
-                    break;
-                }
-                case M_MESH_SKELETON_LINK: {
-                    ReadMeshSkeletonLink(mesh);
-                    break;
-                }
-                case M_MESH_BONE_ASSIGNMENT: {
-                    ReadBoneAssignment(mesh->sharedVertexData);
-                    break;
-                }
-                case M_MESH_LOD: {
-                    ReadMeshLodInfo(mesh);
-                    break;
-                }
-                case M_MESH_BOUNDS: {
-                    ReadMeshBounds(mesh);
-                    break;
-                }
-                case M_SUBMESH_NAME_TABLE: {
-                    ReadSubMeshNames(mesh);
-                    break;
-                }
-                case M_EDGE_LISTS: {
-                    ReadEdgeList(mesh);
-                    break;
-                }
-                case M_POSES: {
-                    ReadPoses(mesh);
-                    break;
-                }
-                case M_ANIMATIONS: {
-                    ReadAnimations(mesh);
-                    break;
-                }
-                case M_TABLE_EXTREMES: {
-                    ReadMeshExtremes(mesh);
-                    break;
-                }
-            }
-
-            if (!AtEnd())
-                id = ReadHeader();
-        }
-        if (!AtEnd())
-            RollbackHeader();
-    }
-
-    NormalizeBoneWeights(mesh->sharedVertexData);
-}
-
-void OgreBinarySerializer::ReadMeshLodInfo(Mesh *mesh) {
-    // Assimp does not acknowledge LOD levels as far as I can see it. This info is just skipped.
-    // @todo Put this stuff to scene/mesh custom properties. If manual mesh the app can use the information.
-    ReadLine(); // strategy name
-    uint16_t numLods = Read<uint16_t>();
-    bool manual = Read<bool>();
-
-    /// @note Main mesh is considered as LOD 0, start from index 1.
-    for (size_t i = 1; i < numLods; ++i) {
-        uint16_t id = ReadHeader();
-        if (id != M_MESH_LOD_USAGE) {
-            throw DeadlyImportError("M_MESH_LOD does not contain a M_MESH_LOD_USAGE for each LOD level");
-        }
-
-        m_reader->IncPtr(sizeof(float)); // user value
-
-        if (manual) {
-            id = ReadHeader();
-            if (id != M_MESH_LOD_MANUAL) {
-                throw DeadlyImportError("Manual M_MESH_LOD_USAGE does not contain M_MESH_LOD_MANUAL");
-            }
-
-            ReadLine(); // manual mesh name (ref to another mesh)
-        } else {
-            for (size_t si = 0, silen = mesh->NumSubMeshes(); si < silen; ++si) {
-                id = ReadHeader();
-                if (id != M_MESH_LOD_GENERATED) {
-                    throw DeadlyImportError("Generated M_MESH_LOD_USAGE does not contain M_MESH_LOD_GENERATED");
-                }
-
-                uint32_t indexCount = Read<uint32_t>();
-                bool is32bit = Read<bool>();
-
-                if (indexCount > 0) {
-                    uint32_t len = indexCount * (is32bit ? sizeof(uint32_t) : sizeof(uint16_t));
-                    m_reader->IncPtr(len);
-                }
-            }
-        }
-    }
-}
-
-void OgreBinarySerializer::ReadMeshSkeletonLink(Mesh *mesh) {
-    mesh->skeletonRef = ReadLine();
-}
-
-void OgreBinarySerializer::ReadMeshBounds(Mesh * /*mesh*/) {
-    // Skip bounds, not compatible with Assimp.
-    // 2x float vec3 + 1x float sphere radius
-    SkipBytes(sizeof(float) * 7);
-}
-
-void OgreBinarySerializer::ReadMeshExtremes(Mesh * /*mesh*/) {
-    // Skip extremes, not compatible with Assimp.
-    size_t numBytes = m_currentLen - MSTREAM_OVERHEAD_SIZE;
-    SkipBytes(numBytes);
-}
-
-void OgreBinarySerializer::ReadBoneAssignment(VertexData *dest) {
-    if (!dest) {
-        throw DeadlyImportError("Cannot read bone assignments, vertex data is null.");
-    }
-
-    VertexBoneAssignment ba;
-    ba.vertexIndex = Read<uint32_t>();
-    ba.boneIndex = Read<uint16_t>();
-    ba.weight = Read<float>();
-
-    dest->boneAssignments.push_back(ba);
-}
-
-void OgreBinarySerializer::ReadSubMesh(Mesh *mesh) {
-    uint16_t id = 0;
-
-    SubMesh *submesh = new SubMesh();
-    submesh->materialRef = ReadLine();
-    submesh->usesSharedVertexData = Read<bool>();
-
-    submesh->indexData->count = Read<uint32_t>();
-    submesh->indexData->faceCount = static_cast<uint32_t>(submesh->indexData->count / 3);
-    submesh->indexData->is32bit = Read<bool>();
-
-    ASSIMP_LOG_VERBOSE_DEBUG("Reading SubMesh ", mesh->subMeshes.size());
-    ASSIMP_LOG_VERBOSE_DEBUG("  - Material: '", submesh->materialRef, "'");
-    ASSIMP_LOG_VERBOSE_DEBUG("  - Uses shared geometry: ", submesh->usesSharedVertexData ? "true" : "false");
-
-    // Index buffer
-    if (submesh->indexData->count > 0) {
-        uint32_t numBytes = submesh->indexData->count * (submesh->indexData->is32bit ? sizeof(uint32_t) : sizeof(uint16_t));
-        uint8_t *indexBuffer = ReadBytes(numBytes);
-        submesh->indexData->buffer = MemoryStreamPtr(new Assimp::MemoryIOStream(indexBuffer, numBytes, true));
-
-        ASSIMP_LOG_VERBOSE_DEBUG("  - ", submesh->indexData->faceCount,
-                " faces from ", submesh->indexData->count, (submesh->indexData->is32bit ? " 32bit" : " 16bit"),
-                " indexes of ", numBytes, " bytes");
-    }
-
-    // Vertex buffer if not referencing the shared geometry
-    if (!submesh->usesSharedVertexData) {
-        id = ReadHeader();
-        if (id != M_GEOMETRY) {
-            throw DeadlyImportError("M_SUBMESH does not contain M_GEOMETRY, but shader geometry is set to false");
-        }
-
-        submesh->vertexData = new VertexData();
-        ReadGeometry(submesh->vertexData);
-    }
-
-    // Bone assignment, submesh operation and texture aliases
-    if (!AtEnd()) {
-        id = ReadHeader();
-        while (!AtEnd() &&
-                (id == M_SUBMESH_OPERATION ||
-                        id == M_SUBMESH_BONE_ASSIGNMENT ||
-                        id == M_SUBMESH_TEXTURE_ALIAS)) {
-            switch (id) {
-                case M_SUBMESH_OPERATION: {
-                    ReadSubMeshOperation(submesh);
-                    break;
-                }
-                case M_SUBMESH_BONE_ASSIGNMENT: {
-                    ReadBoneAssignment(submesh->vertexData);
-                    break;
-                }
-                case M_SUBMESH_TEXTURE_ALIAS: {
-                    ReadSubMeshTextureAlias(submesh);
-                    break;
-                }
-            }
-
-            if (!AtEnd())
-                id = ReadHeader();
-        }
-        if (!AtEnd())
-            RollbackHeader();
-    }
-
-    NormalizeBoneWeights(submesh->vertexData);
-
-    submesh->index = static_cast<unsigned int>(mesh->subMeshes.size());
-    mesh->subMeshes.push_back(submesh);
-}
-
-void OgreBinarySerializer::NormalizeBoneWeights(VertexData *vertexData) const {
-    if (!vertexData || vertexData->boneAssignments.empty())
-        return;
-
-    std::set<uint32_t> influencedVertices;
-    for (VertexBoneAssignmentList::const_iterator baIter = vertexData->boneAssignments.begin(), baEnd = vertexData->boneAssignments.end(); baIter != baEnd; ++baIter) {
-        influencedVertices.insert(baIter->vertexIndex);
-    }
-
-    /** Normalize bone weights.
-        Some exporters won't care if the sum of all bone weights
-        for a single vertex equals 1 or not, so validate here. */
-    const float epsilon = 0.05f;
-    for (const uint32_t vertexIndex : influencedVertices) {
-        float sum = 0.0f;
-        for (VertexBoneAssignmentList::const_iterator baIter = vertexData->boneAssignments.begin(), baEnd = vertexData->boneAssignments.end(); baIter != baEnd; ++baIter) {
-            if (baIter->vertexIndex == vertexIndex)
-                sum += baIter->weight;
-        }
-        if ((sum < (1.0f - epsilon)) || (sum > (1.0f + epsilon))) {
-            for (auto &boneAssign : vertexData->boneAssignments) {
-                if (boneAssign.vertexIndex == vertexIndex)
-                    boneAssign.weight /= sum;
-            }
-        }
-    }
-}
-
-void OgreBinarySerializer::ReadSubMeshOperation(SubMesh *submesh) {
-    submesh->operationType = static_cast<SubMesh::OperationType>(Read<uint16_t>());
-}
-
-void OgreBinarySerializer::ReadSubMeshTextureAlias(SubMesh *submesh) {
-    submesh->textureAliasName = ReadLine();
-    submesh->textureAliasRef = ReadLine();
-}
-
-void OgreBinarySerializer::ReadSubMeshNames(Mesh *mesh) {
-    uint16_t id = 0;
-
-    if (!AtEnd()) {
-        id = ReadHeader();
-        while (!AtEnd() && id == M_SUBMESH_NAME_TABLE_ELEMENT) {
-            uint16_t submeshIndex = Read<uint16_t>();
-            SubMesh *submesh = mesh->GetSubMesh(submeshIndex);
-            if (!submesh) {
-                throw DeadlyImportError("Ogre Mesh does not include submesh ", submeshIndex, " referenced in M_SUBMESH_NAME_TABLE_ELEMENT. Invalid mesh file.");
-            }
-
-            submesh->name = ReadLine();
-            ASSIMP_LOG_VERBOSE_DEBUG("  - SubMesh ", submesh->index, " name '", submesh->name, "'");
-
-            if (!AtEnd())
-                id = ReadHeader();
-        }
-        if (!AtEnd())
-            RollbackHeader();
-    }
-}
-
-void OgreBinarySerializer::ReadGeometry(VertexData *dest) {
-    dest->count = Read<uint32_t>();
-
-    ASSIMP_LOG_VERBOSE_DEBUG("  - Reading geometry of ", dest->count, " vertices");
-
-    if (!AtEnd()) {
-        uint16_t id = ReadHeader();
-        while (!AtEnd() &&
-                (id == M_GEOMETRY_VERTEX_DECLARATION ||
-                        id == M_GEOMETRY_VERTEX_BUFFER)) {
-            switch (id) {
-                case M_GEOMETRY_VERTEX_DECLARATION: {
-                    ReadGeometryVertexDeclaration(dest);
-                    break;
-                }
-                case M_GEOMETRY_VERTEX_BUFFER: {
-                    ReadGeometryVertexBuffer(dest);
-                    break;
-                }
-            }
-
-            if (!AtEnd())
-                id = ReadHeader();
-        }
-        if (!AtEnd())
-            RollbackHeader();
-    }
-}
-
-void OgreBinarySerializer::ReadGeometryVertexDeclaration(VertexData *dest) {
-    if (!AtEnd()) {
-        uint16_t id = ReadHeader();
-        while (!AtEnd() && id == M_GEOMETRY_VERTEX_ELEMENT) {
-            ReadGeometryVertexElement(dest);
-
-            if (!AtEnd())
-                id = ReadHeader();
-        }
-        if (!AtEnd())
-            RollbackHeader();
-    }
-}
-
-void OgreBinarySerializer::ReadGeometryVertexElement(VertexData *dest) {
-    VertexElement element;
-    element.source = Read<uint16_t>();
-    element.type = static_cast<VertexElement::Type>(Read<uint16_t>());
-    element.semantic = static_cast<VertexElement::Semantic>(Read<uint16_t>());
-    element.offset = Read<uint16_t>();
-    element.index = Read<uint16_t>();
-
-    ASSIMP_LOG_VERBOSE_DEBUG("    - Vertex element ", element.SemanticToString(), " of type ",
-            element.TypeToString(), " index=", element.index, " source=", element.source);
-
-    dest->vertexElements.push_back(element);
-}
-
-void OgreBinarySerializer::ReadGeometryVertexBuffer(VertexData *dest) {
-    uint16_t bindIndex = Read<uint16_t>();
-    uint16_t vertexSize = Read<uint16_t>();
-
-    uint16_t id = ReadHeader();
-    if (id != M_GEOMETRY_VERTEX_BUFFER_DATA)
-        throw DeadlyImportError("M_GEOMETRY_VERTEX_BUFFER_DATA not found in M_GEOMETRY_VERTEX_BUFFER");
-
-    if (dest->VertexSize(bindIndex) != vertexSize)
-        throw DeadlyImportError("Vertex buffer size does not agree with vertex declaration in M_GEOMETRY_VERTEX_BUFFER");
-
-    size_t numBytes = dest->count * vertexSize;
-    uint8_t *vertexBuffer = ReadBytes(numBytes);
-    dest->vertexBindings[bindIndex] = MemoryStreamPtr(new Assimp::MemoryIOStream(vertexBuffer, numBytes, true));
-
-    ASSIMP_LOG_VERBOSE_DEBUG("    - Read vertex buffer for source ", bindIndex, " of ", numBytes, " bytes");
-}
-
-void OgreBinarySerializer::ReadEdgeList(Mesh * /*mesh*/) {
-    // Assimp does not acknowledge LOD levels as far as I can see it. This info is just skipped.
-
-    if (!AtEnd()) {
-        uint16_t id = ReadHeader();
-        while (!AtEnd() && id == M_EDGE_LIST_LOD) {
-            m_reader->IncPtr(sizeof(uint16_t)); // lod index
-            bool manual = Read<bool>();
-
-            if (!manual) {
-                m_reader->IncPtr(sizeof(uint8_t));
-                uint32_t numTriangles = Read<uint32_t>();
-                uint32_t numEdgeGroups = Read<uint32_t>();
-
-                size_t skipBytes = (sizeof(uint32_t) * 8 + sizeof(float) * 4) * numTriangles;
-                m_reader->IncPtr(skipBytes);
-
-                for (size_t i = 0; i < numEdgeGroups; ++i) {
-                    uint16_t curId = ReadHeader();
-                    if (curId != M_EDGE_GROUP)
-                        throw DeadlyImportError("M_EDGE_GROUP not found in M_EDGE_LIST_LOD");
-
-                    m_reader->IncPtr(sizeof(uint32_t) * 3);
-                    uint32_t numEdges = Read<uint32_t>();
-                    for (size_t j = 0; j < numEdges; ++j) {
-                        m_reader->IncPtr(sizeof(uint32_t) * 6 + sizeof(uint8_t));
-                    }
-                }
-            }
-
-            if (!AtEnd())
-                id = ReadHeader();
-        }
-        if (!AtEnd())
-            RollbackHeader();
-    }
-}
-
-void OgreBinarySerializer::ReadPoses(Mesh *mesh) {
-    if (!AtEnd()) {
-        uint16_t id = ReadHeader();
-        while (!AtEnd() && id == M_POSE) {
-            Pose *pose = new Pose();
-            pose->name = ReadLine();
-            pose->target = Read<uint16_t>();
-            pose->hasNormals = Read<bool>();
-
-            ReadPoseVertices(pose);
-
-            mesh->poses.push_back(pose);
-
-            if (!AtEnd())
-                id = ReadHeader();
-        }
-        if (!AtEnd())
-            RollbackHeader();
-    }
-}
-
-void OgreBinarySerializer::ReadPoseVertices(Pose *pose) {
-    if (!AtEnd()) {
-        uint16_t id = ReadHeader();
-        while (!AtEnd() && id == M_POSE_VERTEX) {
-            Pose::Vertex v;
-            v.index = Read<uint32_t>();
-            ReadVector(v.offset);
-            if (pose->hasNormals)
-                ReadVector(v.normal);
-
-            pose->vertices[v.index] = v;
-
-            if (!AtEnd())
-                id = ReadHeader();
-        }
-        if (!AtEnd())
-            RollbackHeader();
-    }
-}
-
-void OgreBinarySerializer::ReadAnimations(Mesh *mesh) {
-    if (!AtEnd()) {
-        uint16_t id = ReadHeader();
-        while (!AtEnd() && id == M_ANIMATION) {
-            Animation *anim = new Animation(mesh);
-            anim->name = ReadLine();
-            anim->length = Read<float>();
-
-            ReadAnimation(anim);
-
-            mesh->animations.push_back(anim);
-
-            if (!AtEnd())
-                id = ReadHeader();
-        }
-        if (!AtEnd())
-            RollbackHeader();
-    }
-}
-
-void OgreBinarySerializer::ReadAnimation(Animation *anim) {
-    if (!AtEnd()) {
-        uint16_t id = ReadHeader();
-        if (id == M_ANIMATION_BASEINFO) {
-            anim->baseName = ReadLine();
-            anim->baseTime = Read<float>();
-
-            // Advance to first track
-            id = ReadHeader();
-        }
-
-        while (!AtEnd() && id == M_ANIMATION_TRACK) {
-            VertexAnimationTrack track;
-            track.type = static_cast<VertexAnimationTrack::Type>(Read<uint16_t>());
-            track.target = Read<uint16_t>();
-
-            ReadAnimationKeyFrames(anim, &track);
-
-            anim->tracks.push_back(track);
-
-            if (!AtEnd())
-                id = ReadHeader();
-        }
-        if (!AtEnd())
-            RollbackHeader();
-    }
-}
-
-void OgreBinarySerializer::ReadAnimationKeyFrames(Animation *anim, VertexAnimationTrack *track) {
-    if (!AtEnd()) {
-        uint16_t id = ReadHeader();
-        while (!AtEnd() &&
-                (id == M_ANIMATION_MORPH_KEYFRAME ||
-                        id == M_ANIMATION_POSE_KEYFRAME)) {
-            if (id == M_ANIMATION_MORPH_KEYFRAME) {
-                MorphKeyFrame kf;
-                kf.timePos = Read<float>();
-                bool hasNormals = Read<bool>();
-
-                size_t vertexCount = anim->AssociatedVertexData(track)->count;
-                size_t vertexSize = sizeof(float) * (hasNormals ? 6 : 3);
-                size_t numBytes = vertexCount * vertexSize;
-
-                uint8_t *morphBuffer = ReadBytes(numBytes);
-                kf.buffer = MemoryStreamPtr(new Assimp::MemoryIOStream(morphBuffer, numBytes, true));
-
-                track->morphKeyFrames.push_back(kf);
-            } else if (id == M_ANIMATION_POSE_KEYFRAME) {
-                PoseKeyFrame kf;
-                kf.timePos = Read<float>();
-
-                if (!AtEnd()) {
-                    id = ReadHeader();
-                    while (!AtEnd() && id == M_ANIMATION_POSE_REF) {
-                        PoseRef pr;
-                        pr.index = Read<uint16_t>();
-                        pr.influence = Read<float>();
-                        kf.references.push_back(pr);
-
-                        if (!AtEnd())
-                            id = ReadHeader();
-                    }
-                    if (!AtEnd())
-                        RollbackHeader();
-                }
-
-                track->poseKeyFrames.push_back(kf);
-            }
-
-            if (!AtEnd())
-                id = ReadHeader();
-        }
-        if (!AtEnd())
-            RollbackHeader();
-    }
-}
-
-// Skeleton
-
-bool OgreBinarySerializer::ImportSkeleton(Assimp::IOSystem *pIOHandler, Mesh *mesh) {
-    if (!mesh || mesh->skeletonRef.empty())
-        return false;
-
-    // Highly unusual to see in read world cases but support
-    // binary mesh referencing a XML skeleton file.
-    if (EndsWith(mesh->skeletonRef, ".skeleton.xml", false)) {
-        OgreXmlSerializer::ImportSkeleton(pIOHandler, mesh);
-        return false;
-    }
-
-    MemoryStreamReaderPtr reader = OpenReader(pIOHandler, mesh->skeletonRef);
-    if (!reader)
-        return false;
-
-    Skeleton *skeleton = new Skeleton();
-    OgreBinarySerializer serializer(reader.get(), OgreBinarySerializer::AM_Skeleton);
-    serializer.ReadSkeleton(skeleton);
-    mesh->skeleton = skeleton;
-    return true;
-}
-
-bool OgreBinarySerializer::ImportSkeleton(Assimp::IOSystem *pIOHandler, MeshXml *mesh) {
-    if (!mesh || mesh->skeletonRef.empty())
-        return false;
-
-    MemoryStreamReaderPtr reader = OpenReader(pIOHandler, mesh->skeletonRef);
-    if (!reader.get())
-        return false;
-
-    Skeleton *skeleton = new Skeleton();
-    OgreBinarySerializer serializer(reader.get(), OgreBinarySerializer::AM_Skeleton);
-    serializer.ReadSkeleton(skeleton);
-    mesh->skeleton = skeleton;
-    return true;
-}
-
-MemoryStreamReaderPtr OgreBinarySerializer::OpenReader(Assimp::IOSystem *pIOHandler, const std::string &filename) {
-    if (!EndsWith(filename, ".skeleton", false)) {
-        ASSIMP_LOG_ERROR("Imported Mesh is referencing to unsupported '", filename, "' skeleton file.");
-        return MemoryStreamReaderPtr();
-    }
-
-    if (!pIOHandler->Exists(filename)) {
-        ASSIMP_LOG_ERROR("Failed to find skeleton file '", filename, "' that is referenced by imported Mesh.");
-        return MemoryStreamReaderPtr();
-    }
-
-    IOStream *f = pIOHandler->Open(filename, "rb");
-    if (!f) {
-        throw DeadlyImportError("Failed to open skeleton file ", filename);
-    }
-
-    return MemoryStreamReaderPtr(new MemoryStreamReader(f));
-}
-
-void OgreBinarySerializer::ReadSkeleton(Skeleton *skeleton) {
-    uint16_t id = ReadHeader(false);
-    if (id != HEADER_CHUNK_ID) {
-        throw DeadlyImportError("Invalid Ogre Skeleton file header.");
-    }
-
-    // This deserialization supports both versions of the skeleton spec
-    std::string version = ReadLine();
-    if (version != SKELETON_VERSION_1_8 && version != SKELETON_VERSION_1_1) {
-        throw DeadlyImportError("Skeleton version ", version, " not supported by this importer.",
-                                                    " Supported versions: ", SKELETON_VERSION_1_8, " and ", SKELETON_VERSION_1_1);
-    }
-
-    ASSIMP_LOG_VERBOSE_DEBUG("Reading Skeleton");
-
-    bool firstBone = true;
-    bool firstAnim = true;
-
-    while (!AtEnd()) {
-        id = ReadHeader();
-        switch (id) {
-            case SKELETON_BLENDMODE: {
-                skeleton->blendMode = static_cast<Skeleton::BlendMode>(Read<uint16_t>());
-                break;
-            }
-            case SKELETON_BONE: {
-                if (firstBone) {
-                    ASSIMP_LOG_VERBOSE_DEBUG("  - Bones");
-                    firstBone = false;
-                }
-
-                ReadBone(skeleton);
-                break;
-            }
-            case SKELETON_BONE_PARENT: {
-                ReadBoneParent(skeleton);
-                break;
-            }
-            case SKELETON_ANIMATION: {
-                if (firstAnim) {
-                    ASSIMP_LOG_VERBOSE_DEBUG("  - Animations");
-                    firstAnim = false;
-                }
-
-                ReadSkeletonAnimation(skeleton);
-                break;
-            }
-            case SKELETON_ANIMATION_LINK: {
-                ReadSkeletonAnimationLink(skeleton);
-                break;
-            }
-        }
-    }
-
-    // Calculate bone matrices for root bones. Recursively calculates their children.
-    for (size_t i = 0, len = skeleton->bones.size(); i < len; ++i) {
-        Bone *bone = skeleton->bones[i];
-        if (!bone->IsParented())
-            bone->CalculateWorldMatrixAndDefaultPose(skeleton);
-    }
-}
-
-void OgreBinarySerializer::ReadBone(Skeleton *skeleton) {
-    Bone *bone = new Bone();
-    bone->name = ReadLine();
-    bone->id = Read<uint16_t>();
-
-    // Pos and rot
-    ReadVector(bone->position);
-    ReadQuaternion(bone->rotation);
-
-    // Scale (optional)
-    if (m_currentLen > MSTREAM_BONE_SIZE_WITHOUT_SCALE)
-        ReadVector(bone->scale);
-
-    // Bone indexes need to start from 0 and be contiguous
-    if (bone->id != skeleton->bones.size()) {
-        throw DeadlyImportError("Ogre Skeleton bone indexes not contiguous. Error at bone index ", bone->id);
-    }
-
-    ASSIMP_LOG_VERBOSE_DEBUG("    ", bone->id, " ", bone->name);
-
-    skeleton->bones.push_back(bone);
-}
-
-void OgreBinarySerializer::ReadBoneParent(Skeleton *skeleton) {
-    uint16_t childId = Read<uint16_t>();
-    uint16_t parentId = Read<uint16_t>();
-
-    Bone *child = skeleton->BoneById(childId);
-    Bone *parent = skeleton->BoneById(parentId);
-
-    if (child && parent)
-        parent->AddChild(child);
-    else
-        throw DeadlyImportError("Failed to find bones for parenting: Child id ", childId, " for parent id ", parentId);
-}
-
-void OgreBinarySerializer::ReadSkeletonAnimation(Skeleton *skeleton) {
-    Animation *anim = new Animation(skeleton);
-    anim->name = ReadLine();
-    anim->length = Read<float>();
-
-    if (!AtEnd()) {
-        uint16_t id = ReadHeader();
-        if (id == SKELETON_ANIMATION_BASEINFO) {
-            anim->baseName = ReadLine();
-            anim->baseTime = Read<float>();
-
-            // Advance to first track
-            id = ReadHeader();
-        }
-
-        while (!AtEnd() && id == SKELETON_ANIMATION_TRACK) {
-            ReadSkeletonAnimationTrack(skeleton, anim);
-
-            if (!AtEnd())
-                id = ReadHeader();
-        }
-        if (!AtEnd())
-            RollbackHeader();
-    }
-
-    skeleton->animations.push_back(anim);
-
-    ASSIMP_LOG_VERBOSE_DEBUG("    ", anim->name, " (", anim->length, " sec, ", anim->tracks.size(), " tracks)");
-}
-
-void OgreBinarySerializer::ReadSkeletonAnimationTrack(Skeleton * /*skeleton*/, Animation *dest) {
-    uint16_t boneId = Read<uint16_t>();
-    Bone *bone = dest->parentSkeleton->BoneById(boneId);
-    if (!bone) {
-        throw DeadlyImportError("Cannot read animation track, target bone ", boneId, " not in target Skeleton");
-    }
-
-    VertexAnimationTrack track;
-    track.type = VertexAnimationTrack::VAT_TRANSFORM;
-    track.boneName = bone->name;
-
-    uint16_t id = ReadHeader();
-    while (!AtEnd() && id == SKELETON_ANIMATION_TRACK_KEYFRAME) {
-        ReadSkeletonAnimationKeyFrame(&track);
-
-        if (!AtEnd())
-            id = ReadHeader();
-    }
-    if (!AtEnd())
-        RollbackHeader();
-
-    dest->tracks.push_back(track);
-}
-
-void OgreBinarySerializer::ReadSkeletonAnimationKeyFrame(VertexAnimationTrack *dest) {
-    TransformKeyFrame keyframe;
-    keyframe.timePos = Read<float>();
-
-    // Rot and pos
-    ReadQuaternion(keyframe.rotation);
-    ReadVector(keyframe.position);
-
-    // Scale (optional)
-    if (m_currentLen > MSTREAM_KEYFRAME_SIZE_WITHOUT_SCALE)
-        ReadVector(keyframe.scale);
-
-    dest->transformKeyFrames.push_back(keyframe);
-}
-
-void OgreBinarySerializer::ReadSkeletonAnimationLink(Skeleton * /*skeleton*/) {
-    // Skip bounds, not compatible with Assimp.
-    ReadLine(); // skeleton name
-    SkipBytes(sizeof(float) * 3); // scale
-}
-
-} // namespace Ogre
-} // namespace Assimp
-
-#endif // ASSIMP_BUILD_NO_OGRE_IMPORTER
diff --git a/libs/assimp/code/AssetLib/Ogre/OgreBinarySerializer.h b/libs/assimp/code/AssetLib/Ogre/OgreBinarySerializer.h
deleted file mode 100644
index eb026ea..0000000
--- a/libs/assimp/code/AssetLib/Ogre/OgreBinarySerializer.h
+++ /dev/null
@@ -1,415 +0,0 @@
-/*
-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 AI_OGREBINARYSERIALIZER_H_INC
-#define AI_OGREBINARYSERIALIZER_H_INC
-
-#ifndef ASSIMP_BUILD_NO_OGRE_IMPORTER
-
-#include "OgreStructs.h"
-#include <assimp/StreamReader.h>
-
-namespace Assimp {
-namespace Ogre {
-
-typedef Assimp::StreamReaderLE MemoryStreamReader;
-typedef std::shared_ptr<MemoryStreamReader> MemoryStreamReaderPtr;
-
-class OgreBinarySerializer {
-public:
-    /// Imports mesh and returns the result.
-    /** @note Fatal unrecoverable errors will throw a DeadlyImportError. */
-    static Mesh *ImportMesh(MemoryStreamReader *reader);
-
-    /// Imports skeleton to @c mesh into Mesh::skeleton.
-    /** If mesh does not have a skeleton reference or the skeleton file
-        cannot be found it is not a fatal DeadlyImportError.
-        @return If skeleton import was successful. */
-    static bool ImportSkeleton(Assimp::IOSystem *pIOHandler, Mesh *mesh);
-    static bool ImportSkeleton(Assimp::IOSystem *pIOHandler, MeshXml *mesh);
-
-private:
-    enum AssetMode {
-        AM_Mesh,
-        AM_Skeleton
-    };
-
-    OgreBinarySerializer(MemoryStreamReader *reader, AssetMode mode) :
-            m_currentLen(0),
-            m_reader(reader),
-            assetMode(mode) {
-    }
-
-    static MemoryStreamReaderPtr OpenReader(Assimp::IOSystem *pIOHandler, const std::string &filename);
-
-    // Header
-
-    uint16_t ReadHeader(bool readLen = true);
-    void RollbackHeader();
-
-    // Mesh
-
-    void ReadMesh(Mesh *mesh);
-    void ReadMeshLodInfo(Mesh *mesh);
-    void ReadMeshSkeletonLink(Mesh *mesh);
-    void ReadMeshBounds(Mesh *mesh);
-    void ReadMeshExtremes(Mesh *mesh);
-
-    void ReadSubMesh(Mesh *mesh);
-    void ReadSubMeshNames(Mesh *mesh);
-    void ReadSubMeshOperation(SubMesh *submesh);
-    void ReadSubMeshTextureAlias(SubMesh *submesh);
-
-    void ReadBoneAssignment(VertexData *dest);
-
-    void ReadGeometry(VertexData *dest);
-    void ReadGeometryVertexDeclaration(VertexData *dest);
-    void ReadGeometryVertexElement(VertexData *dest);
-    void ReadGeometryVertexBuffer(VertexData *dest);
-
-    void ReadEdgeList(Mesh *mesh);
-    void ReadPoses(Mesh *mesh);
-    void ReadPoseVertices(Pose *pose);
-
-    void ReadAnimations(Mesh *mesh);
-    void ReadAnimation(Animation *anim);
-    void ReadAnimationKeyFrames(Animation *anim, VertexAnimationTrack *track);
-
-    void NormalizeBoneWeights(VertexData *vertexData) const;
-
-    // Skeleton
-
-    void ReadSkeleton(Skeleton *skeleton);
-
-    void ReadBone(Skeleton *skeleton);
-    void ReadBoneParent(Skeleton *skeleton);
-
-    void ReadSkeletonAnimation(Skeleton *skeleton);
-    void ReadSkeletonAnimationTrack(Skeleton *skeleton, Animation *dest);
-    void ReadSkeletonAnimationKeyFrame(VertexAnimationTrack *dest);
-    void ReadSkeletonAnimationLink(Skeleton *skeleton);
-
-    // Reader utils
-    bool AtEnd() const;
-
-    template <typename T>
-    inline T Read();
-
-    void ReadBytes(char *dest, size_t numBytes);
-    void ReadBytes(uint8_t *dest, size_t numBytes);
-    void ReadBytes(void *dest, size_t numBytes);
-    uint8_t *ReadBytes(size_t numBytes);
-
-    void ReadVector(aiVector3D &vec);
-    void ReadQuaternion(aiQuaternion &quat);
-
-    std::string ReadString(size_t len);
-    std::string ReadLine();
-
-    void SkipBytes(size_t numBytes);
-
-    uint32_t m_currentLen;
-    MemoryStreamReader *m_reader;
-
-    AssetMode assetMode;
-};
-
-enum MeshChunkId {
-    M_HEADER = 0x1000,
-    // char*          version          : Version number check
-    M_MESH = 0x3000,
-    // bool skeletallyAnimated   // important flag which affects h/w buffer policies
-    // Optional M_GEOMETRY chunk
-    M_SUBMESH = 0x4000,
-    // char* materialName
-    // bool useSharedVertices
-    // unsigned int indexCount
-    // bool indexes32Bit
-    // unsigned int* faceVertexIndices (indexCount)
-    // OR
-    // unsigned short* faceVertexIndices (indexCount)
-    // M_GEOMETRY chunk (Optional: present only if useSharedVertices = false)
-    M_SUBMESH_OPERATION = 0x4010, // optional, trilist assumed if missing
-    // unsigned short operationType
-    M_SUBMESH_BONE_ASSIGNMENT = 0x4100,
-    // Optional bone weights (repeating section)
-    // unsigned int vertexIndex;
-    // unsigned short boneIndex;
-    // float weight;
-    // Optional chunk that matches a texture name to an alias
-    // a texture alias is sent to the submesh material to use this texture name
-    // instead of the one in the texture unit with a matching alias name
-    M_SUBMESH_TEXTURE_ALIAS = 0x4200, // Repeating section
-    // char* aliasName;
-    // char* textureName;
-
-    M_GEOMETRY = 0x5000, // NB this chunk is embedded within M_MESH and M_SUBMESH
-    // unsigned int vertexCount
-    M_GEOMETRY_VERTEX_DECLARATION = 0x5100,
-    M_GEOMETRY_VERTEX_ELEMENT = 0x5110, // Repeating section
-    // unsigned short source;   // buffer bind source
-    // unsigned short type;     // VertexElementType
-    // unsigned short semantic; // VertexElementSemantic
-    // unsigned short offset;   // start offset in buffer in bytes
-    // unsigned short index;    // index of the semantic (for colours and texture coords)
-    M_GEOMETRY_VERTEX_BUFFER = 0x5200, // Repeating section
-    // unsigned short bindIndex;    // Index to bind this buffer to
-    // unsigned short vertexSize;   // Per-vertex size, must agree with declaration at this index
-    M_GEOMETRY_VERTEX_BUFFER_DATA = 0x5210,
-    // raw buffer data
-    M_MESH_SKELETON_LINK = 0x6000,
-    // Optional link to skeleton
-    // char* skeletonName          : name of .skeleton to use
-    M_MESH_BONE_ASSIGNMENT = 0x7000,
-    // Optional bone weights (repeating section)
-    // unsigned int vertexIndex;
-    // unsigned short boneIndex;
-    // float weight;
-    M_MESH_LOD = 0x8000,
-    // Optional LOD information
-    // string strategyName;
-    // unsigned short numLevels;
-    // bool manual;  (true for manual alternate meshes, false for generated)
-    M_MESH_LOD_USAGE = 0x8100,
-    // Repeating section, ordered in increasing depth
-    // NB LOD 0 (full detail from 0 depth) is omitted
-    // LOD value - this is a distance, a pixel count etc, based on strategy
-    // float lodValue;
-    M_MESH_LOD_MANUAL = 0x8110,
-    // Required if M_MESH_LOD section manual = true
-    // String manualMeshName;
-    M_MESH_LOD_GENERATED = 0x8120,
-    // Required if M_MESH_LOD section manual = false
-    // Repeating section (1 per submesh)
-    // unsigned int indexCount;
-    // bool indexes32Bit
-    // unsigned short* faceIndexes;  (indexCount)
-    // OR
-    // unsigned int* faceIndexes;  (indexCount)
-    M_MESH_BOUNDS = 0x9000,
-    // float minx, miny, minz
-    // float maxx, maxy, maxz
-    // float radius
-
-    // Added By DrEvil
-    // optional chunk that contains a table of submesh indexes and the names of
-    // the sub-meshes.
-    M_SUBMESH_NAME_TABLE = 0xA000,
-    // Subchunks of the name table. Each chunk contains an index & string
-    M_SUBMESH_NAME_TABLE_ELEMENT = 0xA100,
-    // short index
-    // char* name
-    // Optional chunk which stores precomputed edge data
-    M_EDGE_LISTS = 0xB000,
-    // Each LOD has a separate edge list
-    M_EDGE_LIST_LOD = 0xB100,
-    // unsigned short lodIndex
-    // bool isManual            // If manual, no edge data here, loaded from manual mesh
-    // bool isClosed
-    // unsigned long numTriangles
-    // unsigned long numEdgeGroups
-    // Triangle* triangleList
-    // unsigned long indexSet
-    // unsigned long vertexSet
-    // unsigned long vertIndex[3]
-    // unsigned long sharedVertIndex[3]
-    // float normal[4]
-
-    M_EDGE_GROUP = 0xB110,
-    // unsigned long vertexSet
-    // unsigned long triStart
-    // unsigned long triCount
-    // unsigned long numEdges
-    // Edge* edgeList
-    // unsigned long  triIndex[2]
-    // unsigned long  vertIndex[2]
-    // unsigned long  sharedVertIndex[2]
-    // bool degenerate
-    // Optional poses section, referred to by pose keyframes
-    M_POSES = 0xC000,
-    M_POSE = 0xC100,
-    // char* name (may be blank)
-    // unsigned short target    // 0 for shared geometry,
-    // 1+ for submesh index + 1
-    // bool includesNormals [1.8+]
-    M_POSE_VERTEX = 0xC111,
-    // unsigned long vertexIndex
-    // float xoffset, yoffset, zoffset
-    // float xnormal, ynormal, znormal (optional, 1.8+)
-    // Optional vertex animation chunk
-    M_ANIMATIONS = 0xD000,
-    M_ANIMATION = 0xD100,
-    // char* name
-    // float length
-    M_ANIMATION_BASEINFO = 0xD105,
-    // [Optional] base keyframe information (pose animation only)
-    // char* baseAnimationName (blank for self)
-    // float baseKeyFrameTime
-    M_ANIMATION_TRACK = 0xD110,
-    // unsigned short type          // 1 == morph, 2 == pose
-    // unsigned short target        // 0 for shared geometry,
-    // 1+ for submesh index + 1
-    M_ANIMATION_MORPH_KEYFRAME = 0xD111,
-    // float time
-    // bool includesNormals [1.8+]
-    // float x,y,z          // repeat by number of vertices in original geometry
-    M_ANIMATION_POSE_KEYFRAME = 0xD112,
-    // float time
-    M_ANIMATION_POSE_REF = 0xD113, // repeat for number of referenced poses
-    // unsigned short poseIndex
-    // float influence
-    // Optional submesh extreme vertex list chink
-    M_TABLE_EXTREMES = 0xE000
-    // unsigned short submesh_index;
-    // float extremes [n_extremes][3];
-};
-
-/*
-static std::string MeshHeaderToString(MeshChunkId id)
-{
-    switch(id)
-    {
-        case M_HEADER:                      return "HEADER";
-        case M_MESH:                        return "MESH";
-        case M_SUBMESH:                     return "SUBMESH";
-        case M_SUBMESH_OPERATION:           return "SUBMESH_OPERATION";
-        case M_SUBMESH_BONE_ASSIGNMENT:     return "SUBMESH_BONE_ASSIGNMENT";
-        case M_SUBMESH_TEXTURE_ALIAS:       return "SUBMESH_TEXTURE_ALIAS";
-        case M_GEOMETRY:                    return "GEOMETRY";
-        case M_GEOMETRY_VERTEX_DECLARATION: return "GEOMETRY_VERTEX_DECLARATION";
-        case M_GEOMETRY_VERTEX_ELEMENT:     return "GEOMETRY_VERTEX_ELEMENT";
-        case M_GEOMETRY_VERTEX_BUFFER:      return "GEOMETRY_VERTEX_BUFFER";
-        case M_GEOMETRY_VERTEX_BUFFER_DATA: return "GEOMETRY_VERTEX_BUFFER_DATA";
-        case M_MESH_SKELETON_LINK:          return "MESH_SKELETON_LINK";
-        case M_MESH_BONE_ASSIGNMENT:        return "MESH_BONE_ASSIGNMENT";
-        case M_MESH_LOD:                    return "MESH_LOD";
-        case M_MESH_LOD_USAGE:              return "MESH_LOD_USAGE";
-        case M_MESH_LOD_MANUAL:             return "MESH_LOD_MANUAL";
-        case M_MESH_LOD_GENERATED:          return "MESH_LOD_GENERATED";
-        case M_MESH_BOUNDS:                 return "MESH_BOUNDS";
-        case M_SUBMESH_NAME_TABLE:          return "SUBMESH_NAME_TABLE";
-        case M_SUBMESH_NAME_TABLE_ELEMENT:  return "SUBMESH_NAME_TABLE_ELEMENT";
-        case M_EDGE_LISTS:                  return "EDGE_LISTS";
-        case M_EDGE_LIST_LOD:               return "EDGE_LIST_LOD";
-        case M_EDGE_GROUP:                  return "EDGE_GROUP";
-        case M_POSES:                       return "POSES";
-        case M_POSE:                        return "POSE";
-        case M_POSE_VERTEX:                 return "POSE_VERTEX";
-        case M_ANIMATIONS:                  return "ANIMATIONS";
-        case M_ANIMATION:                   return "ANIMATION";
-        case M_ANIMATION_BASEINFO:          return "ANIMATION_BASEINFO";
-        case M_ANIMATION_TRACK:             return "ANIMATION_TRACK";
-        case M_ANIMATION_MORPH_KEYFRAME:    return "ANIMATION_MORPH_KEYFRAME";
-        case M_ANIMATION_POSE_KEYFRAME:     return "ANIMATION_POSE_KEYFRAME";
-        case M_ANIMATION_POSE_REF:          return "ANIMATION_POSE_REF";
-        case M_TABLE_EXTREMES:              return "TABLE_EXTREMES";
-    }
-    return "Unknown_MeshChunkId";
-}
-*/
-
-enum SkeletonChunkId {
-    SKELETON_HEADER = 0x1000,
-    // char* version           : Version number check
-    SKELETON_BLENDMODE = 0x1010, // optional
-    // unsigned short blendmode     : SkeletonAnimationBlendMode
-    SKELETON_BONE = 0x2000,
-    // Repeating section defining each bone in the system.
-    // Bones are assigned indexes automatically based on their order of declaration
-    // starting with 0.
-    // char* name                      : name of the bone
-    // unsigned short handle            : handle of the bone, should be contiguous & start at 0
-    // Vector3 position              : position of this bone relative to parent
-    // Quaternion orientation          : orientation of this bone relative to parent
-    // Vector3 scale                    : scale of this bone relative to parent
-    SKELETON_BONE_PARENT = 0x3000,
-    // Record of the parent of a single bone, used to build the node tree
-    // Repeating section, listed in Bone Index order, one per Bone
-    // unsigned short handle             : child bone
-    // unsigned short parentHandle   : parent bone
-    SKELETON_ANIMATION = 0x4000,
-    // A single animation for this skeleton
-    // char* name                      : Name of the animation
-    // float length                   : Length of the animation in seconds
-    SKELETON_ANIMATION_BASEINFO = 0x4010,
-    // [Optional] base keyframe information
-    // char* baseAnimationName (blank for self)
-    // float baseKeyFrameTime
-    SKELETON_ANIMATION_TRACK = 0x4100,
-    // A single animation track (relates to a single bone)
-    // Repeating section (within SKELETON_ANIMATION)
-    // unsigned short boneIndex  : Index of bone to apply to
-    SKELETON_ANIMATION_TRACK_KEYFRAME = 0x4110,
-    // A single keyframe within the track
-    // Repeating section
-    // float time                   : The time position (seconds)
-    // Quaternion rotate            : Rotation to apply at this keyframe
-    // Vector3 translate            : Translation to apply at this keyframe
-    // Vector3 scale                : Scale to apply at this keyframe
-    SKELETON_ANIMATION_LINK = 0x5000
-    // Link to another skeleton, to re-use its animations
-    // char* skeletonName                   : name of skeleton to get animations from
-    // float scale                          : scale to apply to trans/scale keys
-};
-
-/*
-static std::string SkeletonHeaderToString(SkeletonChunkId id)
-{
-    switch(id)
-    {
-        case SKELETON_HEADER:                   return "HEADER";
-        case SKELETON_BLENDMODE:                return "BLENDMODE";
-        case SKELETON_BONE:                     return "BONE";
-        case SKELETON_BONE_PARENT:              return "BONE_PARENT";
-        case SKELETON_ANIMATION:                return "ANIMATION";
-        case SKELETON_ANIMATION_BASEINFO:       return "ANIMATION_BASEINFO";
-        case SKELETON_ANIMATION_TRACK:          return "ANIMATION_TRACK";
-        case SKELETON_ANIMATION_TRACK_KEYFRAME: return "ANIMATION_TRACK_KEYFRAME";
-        case SKELETON_ANIMATION_LINK:           return "ANIMATION_LINK";
-    }
-    return "Unknown_SkeletonChunkId";
-}
-*/
-} // namespace Ogre
-} // namespace Assimp
-
-#endif // ASSIMP_BUILD_NO_OGRE_IMPORTER
-#endif // AI_OGREBINARYSERIALIZER_H_INC
diff --git a/libs/assimp/code/AssetLib/Ogre/OgreImporter.cpp b/libs/assimp/code/AssetLib/Ogre/OgreImporter.cpp
deleted file mode 100644
index 860aed7..0000000
--- a/libs/assimp/code/AssetLib/Ogre/OgreImporter.cpp
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
-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_BUILD_NO_OGRE_IMPORTER
-
-#include "OgreImporter.h"
-#include "OgreBinarySerializer.h"
-#include "OgreXmlSerializer.h"
-#include <assimp/importerdesc.h>
-#include <assimp/Importer.hpp>
-#include <memory>
-
-static const aiImporterDesc desc = {
-    "Ogre3D Mesh Importer",
-    "",
-    "",
-    "",
-    aiImporterFlags_SupportTextFlavour | aiImporterFlags_SupportBinaryFlavour,
-    0,
-    0,
-    0,
-    0,
-    "mesh mesh.xml"
-};
-
-namespace Assimp {
-namespace Ogre {
-
-const aiImporterDesc *OgreImporter::GetInfo() const {
-    return &desc;
-}
-
-void OgreImporter::SetupProperties(const Importer *pImp) {
-    m_userDefinedMaterialLibFile = pImp->GetPropertyString(AI_CONFIG_IMPORT_OGRE_MATERIAL_FILE, "Scene.material");
-    m_detectTextureTypeFromFilename = pImp->GetPropertyBool(AI_CONFIG_IMPORT_OGRE_TEXTURETYPE_FROM_FILENAME, false);
-}
-
-bool OgreImporter::CanRead(const std::string &pFile, Assimp::IOSystem *pIOHandler, bool /*checkSig*/) const {
-    if (EndsWith(pFile, ".mesh.xml", false)) {
-        static const char *tokens[] = { "<mesh>" };
-        return SearchFileHeaderForToken(pIOHandler, pFile, tokens, AI_COUNT_OF(tokens));
-    }
-
-    /// @todo Read and validate first header chunk?
-    return EndsWith(pFile, ".mesh", false);
-}
-
-void OgreImporter::InternReadFile(const std::string &pFile, aiScene *pScene, Assimp::IOSystem *pIOHandler) {
-    // Open source file
-    IOStream *f = pIOHandler->Open(pFile, "rb");
-    if (!f) {
-        throw DeadlyImportError("Failed to open file ", pFile);
-    }
-
-    // Binary .mesh import
-    if (EndsWith(pFile, ".mesh", false)) {
-        /// @note MemoryStreamReader takes ownership of f.
-        MemoryStreamReader reader(f);
-
-        // Import mesh
-        std::unique_ptr<Mesh> mesh(OgreBinarySerializer::ImportMesh(&reader));
-
-        // Import skeleton
-        OgreBinarySerializer::ImportSkeleton(pIOHandler, mesh.get());
-
-        // Import mesh referenced materials
-        ReadMaterials(pFile, pIOHandler, pScene, mesh.get());
-
-        // Convert to Assimp
-        mesh->ConvertToAssimpScene(pScene);
-        return;
-    }
-    // XML .mesh.xml import
-    /// @note XmlReader does not take ownership of f, hence the scoped ptr.
-    std::unique_ptr<IOStream> scopedFile(f);
-    XmlParser xmlParser;
-
-    //std::unique_ptr<CIrrXML_IOStreamReader> xmlStream(new CIrrXML_IOStreamReader(scopedFile.get()));
-    //std::unique_ptr<XmlReader> reader(irr::io::createIrrXMLReader(xmlStream.get()));
-    xmlParser.parse(scopedFile.get());
-    // Import mesh
-    std::unique_ptr<MeshXml> mesh(OgreXmlSerializer::ImportMesh(&xmlParser));
-
-    // Import skeleton
-    OgreXmlSerializer::ImportSkeleton(pIOHandler, mesh.get());
-
-    // Import mesh referenced materials
-    ReadMaterials(pFile, pIOHandler, pScene, mesh.get());
-
-    // Convert to Assimp
-    mesh->ConvertToAssimpScene(pScene);
-}
-
-} // namespace Ogre
-} // namespace Assimp
-
-#endif // ASSIMP_BUILD_NO_OGRE_IMPORTER
diff --git a/libs/assimp/code/AssetLib/Ogre/OgreImporter.h b/libs/assimp/code/AssetLib/Ogre/OgreImporter.h
deleted file mode 100644
index dc8b090..0000000
--- a/libs/assimp/code/AssetLib/Ogre/OgreImporter.h
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
-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
-#ifndef AI_OGREIMPORTER_H_INC
-#define AI_OGREIMPORTER_H_INC
-
-#ifndef ASSIMP_BUILD_NO_OGRE_IMPORTER
-
-#include <assimp/BaseImporter.h>
-#include <assimp/material.h>
-
-#include "OgreParsingUtils.h"
-#include "OgreStructs.h"
-
-namespace Assimp {
-namespace Ogre {
-
-/** Importer for Ogre mesh, skeleton and material formats.
-    @todo Support vertex colors.
-    @todo Support poses/animations from the mesh file.
-    Currently only skeleton file animations are supported. */
-class OgreImporter : public BaseImporter {
-public:
-    /// BaseImporter override.
-    virtual bool CanRead(const std::string &pFile, IOSystem *pIOHandler, bool checkSig) const override;
-
-protected:
-    /// BaseImporter override.
-    virtual void InternReadFile(const std::string &pFile, aiScene *pScene, IOSystem *pIOHandler) override;
-
-    /// BaseImporter override.
-    virtual const aiImporterDesc *GetInfo() const override;
-
-    /// BaseImporter override.
-    virtual void SetupProperties(const Importer *pImp) override;
-
-private:
-    /// Read materials referenced by the @c mesh to @c pScene.
-    void ReadMaterials(const std::string &pFile, Assimp::IOSystem *pIOHandler, aiScene *pScene, Mesh *mesh);
-    void ReadMaterials(const std::string &pFile, Assimp::IOSystem *pIOHandler, aiScene *pScene, MeshXml *mesh);
-    void AssignMaterials(aiScene *pScene, std::vector<aiMaterial *> &materials);
-
-    /// Reads material
-    aiMaterial *ReadMaterial(const std::string &pFile, Assimp::IOSystem *pIOHandler, const std::string &MaterialName);
-
-    // These functions parse blocks from a material file from @c ss. Starting parsing from "{" and ending it to "}".
-    bool ReadTechnique(const std::string &techniqueName, std::stringstream &ss, aiMaterial *material);
-    bool ReadPass(const std::string &passName, std::stringstream &ss, aiMaterial *material);
-    bool ReadTextureUnit(const std::string &textureUnitName, std::stringstream &ss, aiMaterial *material);
-
-private:
-    std::string m_userDefinedMaterialLibFile;
-    bool m_detectTextureTypeFromFilename;
-    std::map<aiTextureType, unsigned int> m_textures;
-};
-} // namespace Ogre
-} // namespace Assimp
-
-#endif // ASSIMP_BUILD_NO_OGRE_IMPORTER
-#endif // AI_OGREIMPORTER_H_INC
diff --git a/libs/assimp/code/AssetLib/Ogre/OgreMaterial.cpp b/libs/assimp/code/AssetLib/Ogre/OgreMaterial.cpp
deleted file mode 100644
index 7478a80..0000000
--- a/libs/assimp/code/AssetLib/Ogre/OgreMaterial.cpp
+++ /dev/null
@@ -1,500 +0,0 @@
-/*
-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_BUILD_NO_OGRE_IMPORTER
-
-#include "OgreImporter.h"
-#include <assimp/StringUtils.h>
-#include <assimp/TinyFormatter.h>
-#include <assimp/fast_atof.h>
-#include <assimp/material.h>
-#include <assimp/scene.h>
-#include <assimp/DefaultLogger.hpp>
-
-#include <memory>
-#include <sstream>
-#include <vector>
-
-using namespace std;
-
-namespace Assimp {
-namespace Ogre {
-
-static const string partComment = "//";
-static const string partBlockStart = "{";
-static const string partBlockEnd = "}";
-
-void OgreImporter::ReadMaterials(const std::string &pFile, Assimp::IOSystem *pIOHandler, aiScene *pScene, Mesh *mesh) {
-    std::vector<aiMaterial *> materials;
-
-    // Create materials that can be found and parsed via the IOSystem.
-    for (size_t i = 0, len = mesh->NumSubMeshes(); i < len; ++i) {
-        SubMesh *submesh = mesh->GetSubMesh(i);
-        if (submesh && !submesh->materialRef.empty()) {
-            aiMaterial *material = ReadMaterial(pFile, pIOHandler, submesh->materialRef);
-            if (material) {
-                submesh->materialIndex = static_cast<int>(materials.size());
-                materials.push_back(material);
-            }
-        }
-    }
-
-    AssignMaterials(pScene, materials);
-}
-
-void OgreImporter::ReadMaterials(const std::string &pFile, Assimp::IOSystem *pIOHandler, aiScene *pScene, MeshXml *mesh) {
-    std::vector<aiMaterial *> materials;
-
-    // Create materials that can be found and parsed via the IOSystem.
-    for (size_t i = 0, len = mesh->NumSubMeshes(); i < len; ++i) {
-        SubMeshXml *submesh = mesh->GetSubMesh(static_cast<uint16_t>(i));
-        if (submesh && !submesh->materialRef.empty()) {
-            aiMaterial *material = ReadMaterial(pFile, pIOHandler, submesh->materialRef);
-            if (material) {
-                submesh->materialIndex = static_cast<int>(materials.size());
-                materials.push_back(material);
-            }
-        }
-    }
-
-    AssignMaterials(pScene, materials);
-}
-
-void OgreImporter::AssignMaterials(aiScene *pScene, std::vector<aiMaterial *> &materials) {
-    pScene->mNumMaterials = static_cast<unsigned int>(materials.size());
-    if (pScene->mNumMaterials > 0) {
-        pScene->mMaterials = new aiMaterial *[pScene->mNumMaterials];
-        for (size_t i = 0; i < pScene->mNumMaterials; ++i) {
-            pScene->mMaterials[i] = materials[i];
-        }
-    }
-}
-
-aiMaterial *OgreImporter::ReadMaterial(const std::string &pFile, Assimp::IOSystem *pIOHandler, const std::string &materialName) {
-    if (materialName.empty()) {
-        return 0;
-    }
-
-    // Full reference and examples of Ogre Material Script
-    // can be found from http://www.ogre3d.org/docs/manual/manual_14.html
-
-    /*and here is another one:
-
-    import * from abstract_base_passes_depth.material
-    import * from abstract_base.material
-    import * from mat_shadow_caster.material
-    import * from mat_character_singlepass.material
-
-    material hero/hair/caster : mat_shadow_caster_skin_areject
-    {
-      set $diffuse_map "hero_hair_alpha_c.dds"
-    }
-
-    material hero/hair_alpha : mat_char_cns_singlepass_areject_4weights
-    {
-      set $diffuse_map  "hero_hair_alpha_c.dds"
-      set $specular_map "hero_hair_alpha_s.dds"
-      set $normal_map   "hero_hair_alpha_n.dds"
-      set $light_map    "black_lightmap.dds"
-
-      set $shadow_caster_material "hero/hair/caster"
-    }
-    */
-
-    stringstream ss;
-
-    // Scope for scopre_ptr auto release
-    {
-        /* There are three .material options in priority order:
-            1) File with the material name (materialName)
-            2) File with the mesh files base name (pFile)
-            3) Optional user defined material library file (m_userDefinedMaterialLibFile) */
-        std::vector<string> potentialFiles;
-        potentialFiles.push_back(materialName + ".material");
-        potentialFiles.push_back(pFile.substr(0, pFile.rfind(".mesh")) + ".material");
-        if (!m_userDefinedMaterialLibFile.empty())
-            potentialFiles.push_back(m_userDefinedMaterialLibFile);
-
-        IOStream *materialFile = 0;
-        for (size_t i = 0; i < potentialFiles.size(); ++i) {
-            materialFile = pIOHandler->Open(potentialFiles[i]);
-            if (materialFile) {
-                break;
-            }
-            ASSIMP_LOG_VERBOSE_DEBUG("Source file for material '", materialName, "' ", potentialFiles[i], " does not exist");
-        }
-        if (!materialFile) {
-            ASSIMP_LOG_ERROR("Failed to find source file for material '", materialName, "'");
-            return 0;
-        }
-
-        std::unique_ptr<IOStream> stream(materialFile);
-        if (stream->FileSize() == 0) {
-            ASSIMP_LOG_WARN("Source file for material '", materialName, "' is empty (size is 0 bytes)");
-            return 0;
-        }
-
-        // Read bytes
-        vector<char> data(stream->FileSize());
-        stream->Read(&data[0], stream->FileSize(), 1);
-
-        // Convert to UTF-8 and terminate the string for ss
-        BaseImporter::ConvertToUTF8(data);
-        data.push_back('\0');
-
-        ss << &data[0];
-    }
-
-    ASSIMP_LOG_VERBOSE_DEBUG("Reading material '", materialName, "'");
-
-    aiMaterial *material = new aiMaterial();
-    m_textures.clear();
-
-    aiString matName(materialName);
-    material->AddProperty(&matName, AI_MATKEY_NAME);
-
-    // The stringstream will push words from a line until newline.
-    // It will also trim whitespace from line start and between words.
-    string linePart;
-    ss >> linePart;
-
-    const string partMaterial = "material";
-    const string partTechnique = "technique";
-
-    while (!ss.eof()) {
-        // Skip commented lines
-        if (linePart == partComment) {
-            NextAfterNewLine(ss, linePart);
-            continue;
-        }
-        if (linePart != partMaterial) {
-            ss >> linePart;
-            continue;
-        }
-
-        ss >> linePart;
-        if (linePart != materialName) {
-            ss >> linePart;
-            continue;
-        }
-
-        NextAfterNewLine(ss, linePart);
-        if (linePart != partBlockStart) {
-            ASSIMP_LOG_ERROR("Invalid material: block start missing near index ", ss.tellg());
-            return material;
-        }
-
-        ASSIMP_LOG_VERBOSE_DEBUG("material '", materialName, "'");
-
-        while (linePart != partBlockEnd) {
-            // Proceed to the first technique
-            ss >> linePart;
-
-            if (linePart == partTechnique) {
-                std::string techniqueName = SkipLine(ss);
-                ReadTechnique(ai_trim(techniqueName), ss, material);
-            }
-
-            // Read information from a custom material
-            /** @todo This "set $x y" does not seem to be a official Ogre material system feature.
-                Materials can inherit other materials and override texture units by using the (unique)
-                parent texture unit name in your cloned material.
-                This is not yet supported and below code is probably some hack from the original
-                author of this Ogre importer. Should be removed? */
-            if (linePart == "set") {
-                ss >> linePart;
-                if (linePart == "$specular") //todo load this values:
-                {
-                } else if (linePart == "$diffuse") {
-                } else if (linePart == "$ambient") {
-                } else if (linePart == "$colormap") {
-                    ss >> linePart;
-                    aiString cm(linePart);
-                    material->AddProperty(&cm, AI_MATKEY_TEXTURE(aiTextureType_DIFFUSE, 0));
-                } else if (linePart == "$normalmap") {
-                    ss >> linePart;
-                    aiString nm(linePart);
-                    material->AddProperty(&nm, AI_MATKEY_TEXTURE(aiTextureType_NORMALS, 0));
-                } else if (linePart == "$shininess_strength") {
-                    ss >> linePart;
-                    float Shininess = fast_atof(linePart.c_str());
-                    material->AddProperty(&Shininess, 1, AI_MATKEY_SHININESS_STRENGTH);
-                } else if (linePart == "$shininess_exponent") {
-                    ss >> linePart;
-                    float Shininess = fast_atof(linePart.c_str());
-                    material->AddProperty(&Shininess, 1, AI_MATKEY_SHININESS);
-                }
-                //Properties from Venetica:
-                else if (linePart == "$diffuse_map") {
-                    ss >> linePart;
-                    if (linePart[0] == '"') // "file" -> file
-                        linePart = linePart.substr(1, linePart.size() - 2);
-                    aiString ts(linePart);
-                    material->AddProperty(&ts, AI_MATKEY_TEXTURE(aiTextureType_DIFFUSE, 0));
-                } else if (linePart == "$specular_map") {
-                    ss >> linePart;
-                    if (linePart[0] == '"') // "file" -> file
-                        linePart = linePart.substr(1, linePart.size() - 2);
-                    aiString ts(linePart);
-                    material->AddProperty(&ts, AI_MATKEY_TEXTURE(aiTextureType_SHININESS, 0));
-                } else if (linePart == "$normal_map") {
-                    ss >> linePart;
-                    if (linePart[0] == '"') // "file" -> file
-                        linePart = linePart.substr(1, linePart.size() - 2);
-                    aiString ts(linePart);
-                    material->AddProperty(&ts, AI_MATKEY_TEXTURE(aiTextureType_NORMALS, 0));
-                } else if (linePart == "$light_map") {
-                    ss >> linePart;
-                    if (linePart[0] == '"') {
-                        linePart = linePart.substr(1, linePart.size() - 2);
-                    }
-                    aiString ts(linePart);
-                    material->AddProperty(&ts, AI_MATKEY_TEXTURE(aiTextureType_LIGHTMAP, 0));
-                }
-            }
-        }
-        ss >> linePart;
-    }
-
-    return material;
-}
-
-bool OgreImporter::ReadTechnique(const std::string &techniqueName, stringstream &ss, aiMaterial *material) {
-    string linePart;
-    ss >> linePart;
-
-    if (linePart != partBlockStart) {
-        ASSIMP_LOG_ERROR("Invalid material: Technique block start missing near index ", ss.tellg());
-        return false;
-    }
-
-    ASSIMP_LOG_VERBOSE_DEBUG(" technique '", techniqueName, "'");
-
-    const string partPass = "pass";
-
-    while (linePart != partBlockEnd) {
-        ss >> linePart;
-
-        // Skip commented lines
-        if (linePart == partComment) {
-            SkipLine(ss);
-            continue;
-        }
-
-        /// @todo Techniques have other attributes than just passes.
-        if (linePart == partPass) {
-            string passName = SkipLine(ss);
-            ReadPass(ai_trim(passName), ss, material);
-        }
-    }
-    return true;
-}
-
-bool OgreImporter::ReadPass(const std::string &passName, stringstream &ss, aiMaterial *material) {
-    string linePart;
-    ss >> linePart;
-
-    if (linePart != partBlockStart) {
-        ASSIMP_LOG_ERROR("Invalid material: Pass block start missing near index ", ss.tellg());
-        return false;
-    }
-
-    ASSIMP_LOG_VERBOSE_DEBUG("  pass '", passName, "'");
-
-    const string partAmbient = "ambient";
-    const string partDiffuse = "diffuse";
-    const string partSpecular = "specular";
-    const string partEmissive = "emissive";
-    const string partTextureUnit = "texture_unit";
-
-    while (linePart != partBlockEnd) {
-        ss >> linePart;
-
-        // Skip commented lines
-        if (linePart == partComment) {
-            SkipLine(ss);
-            continue;
-        }
-
-        // Colors
-        /// @todo Support alpha via aiColor4D.
-        if (linePart == partAmbient || linePart == partDiffuse || linePart == partSpecular || linePart == partEmissive) {
-            float r, g, b;
-            ss >> r >> g >> b;
-            const aiColor3D color(r, g, b);
-
-            ASSIMP_LOG_VERBOSE_DEBUG("   ", linePart, " ", r, " ", g, " ", b);
-
-            if (linePart == partAmbient) {
-                material->AddProperty(&color, 1, AI_MATKEY_COLOR_AMBIENT);
-            } else if (linePart == partDiffuse) {
-                material->AddProperty(&color, 1, AI_MATKEY_COLOR_DIFFUSE);
-            } else if (linePart == partSpecular) {
-                material->AddProperty(&color, 1, AI_MATKEY_COLOR_SPECULAR);
-            } else if (linePart == partEmissive) {
-                material->AddProperty(&color, 1, AI_MATKEY_COLOR_EMISSIVE);
-            }
-        } else if (linePart == partTextureUnit) {
-            string textureUnitName = SkipLine(ss);
-            ReadTextureUnit(ai_trim(textureUnitName), ss, material);
-        }
-    }
-    return true;
-}
-
-bool OgreImporter::ReadTextureUnit(const std::string &textureUnitName, stringstream &ss, aiMaterial *material) {
-    string linePart;
-    ss >> linePart;
-
-    if (linePart != partBlockStart) {
-        ASSIMP_LOG_ERROR("Invalid material: Texture unit block start missing near index ", ss.tellg());
-        return false;
-    }
-
-    ASSIMP_LOG_VERBOSE_DEBUG("   texture_unit '", textureUnitName, "'");
-
-    const string partTexture = "texture";
-    const string partTextCoordSet = "tex_coord_set";
-    const string partColorOp = "colour_op";
-
-    aiTextureType textureType = aiTextureType_NONE;
-    std::string textureRef;
-    int uvCoord = 0;
-
-    while (linePart != partBlockEnd) {
-        ss >> linePart;
-
-        // Skip commented lines
-        if (linePart == partComment) {
-            SkipLine(ss);
-            continue;
-        }
-
-        if (linePart == partTexture) {
-            ss >> linePart;
-            textureRef = linePart;
-
-            // User defined Assimp config property to detect texture type from filename.
-            if (m_detectTextureTypeFromFilename) {
-                size_t posSuffix = textureRef.find_last_of('.');
-                size_t posUnderscore = textureRef.find_last_of('_');
-
-                if (posSuffix != string::npos && posUnderscore != string::npos && posSuffix > posUnderscore) {
-                    string identifier = ai_tolower(textureRef.substr(posUnderscore, posSuffix - posUnderscore));
-                    ASSIMP_LOG_VERBOSE_DEBUG("Detecting texture type from filename postfix '", identifier, "'");
-
-                    if (identifier == "_n" || identifier == "_nrm" || identifier == "_nrml" || identifier == "_normal" || identifier == "_normals" || identifier == "_normalmap") {
-                        textureType = aiTextureType_NORMALS;
-                    } else if (identifier == "_s" || identifier == "_spec" || identifier == "_specular" || identifier == "_specularmap") {
-                        textureType = aiTextureType_SPECULAR;
-                    } else if (identifier == "_l" || identifier == "_light" || identifier == "_lightmap" || identifier == "_occ" || identifier == "_occlusion") {
-                        textureType = aiTextureType_LIGHTMAP;
-                    } else if (identifier == "_disp" || identifier == "_displacement") {
-                        textureType = aiTextureType_DISPLACEMENT;
-                    } else {
-                        textureType = aiTextureType_DIFFUSE;
-                    }
-                } else {
-                    textureType = aiTextureType_DIFFUSE;
-                }
-            }
-            // Detect from texture unit name. This cannot be too broad as
-            // authors might give names like "LightSaber" or "NormalNinja".
-            else {
-                string unitNameLower = ai_tolower(textureUnitName);
-                if (unitNameLower.find("normalmap") != string::npos) {
-                    textureType = aiTextureType_NORMALS;
-                } else if (unitNameLower.find("specularmap") != string::npos) {
-                    textureType = aiTextureType_SPECULAR;
-                } else if (unitNameLower.find("lightmap") != string::npos) {
-                    textureType = aiTextureType_LIGHTMAP;
-                } else if (unitNameLower.find("displacementmap") != string::npos) {
-                    textureType = aiTextureType_DISPLACEMENT;
-                } else {
-                    textureType = aiTextureType_DIFFUSE;
-                }
-            }
-        } else if (linePart == partTextCoordSet) {
-            ss >> uvCoord;
-        }
-        /// @todo Implement
-        else if (linePart == partColorOp) {
-            /*
-            ss >> linePart;
-            if("replace"==linePart)//I don't think, assimp has something for this...
-            {
-            }
-            else if("modulate"==linePart)
-            {
-                //TODO: set value
-                //material->AddProperty(aiTextureOp_Multiply)
-            }
-            */
-        }
-    }
-
-    if (textureRef.empty()) {
-        ASSIMP_LOG_WARN("Texture reference is empty, ignoring texture_unit.");
-        return false;
-    }
-    if (textureType == aiTextureType_NONE) {
-        ASSIMP_LOG_WARN("Failed to detect texture type for '", textureRef, "', ignoring texture_unit.");
-        return false;
-    }
-
-    unsigned int textureTypeIndex = m_textures[textureType];
-    m_textures[textureType]++;
-
-    ASSIMP_LOG_VERBOSE_DEBUG("    texture '", textureRef, "' type ", textureType,
-            " index ", textureTypeIndex, " UV ", uvCoord);
-
-    aiString assimpTextureRef(textureRef);
-    material->AddProperty(&assimpTextureRef, AI_MATKEY_TEXTURE(textureType, textureTypeIndex));
-    material->AddProperty(&uvCoord, 1, AI_MATKEY_UVWSRC(textureType, textureTypeIndex));
-
-    return true;
-}
-
-} // namespace Ogre
-} // namespace Assimp
-
-#endif // ASSIMP_BUILD_NO_OGRE_IMPORTER
diff --git a/libs/assimp/code/AssetLib/Ogre/OgreParsingUtils.h b/libs/assimp/code/AssetLib/Ogre/OgreParsingUtils.h
deleted file mode 100644
index 60dd5cf..0000000
--- a/libs/assimp/code/AssetLib/Ogre/OgreParsingUtils.h
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
-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 AI_OGREPARSINGUTILS_H_INC
-#define AI_OGREPARSINGUTILS_H_INC
-
-#ifndef ASSIMP_BUILD_NO_OGRE_IMPORTER
-
-#include <assimp/ParsingUtils.h>
-#include <cstdint>
-#include <algorithm>
-#include <cctype>
-#include <functional>
-#include <sstream>
-
-namespace Assimp {
-namespace Ogre {
-
-
-/// Returns if @c s ends with @c suffix. If @c caseSensitive is false, both strings will be lower cased before matching.
-static inline bool EndsWith(const std::string &s, const std::string &suffix, bool caseSensitive = true) {
-    if (s.empty() || suffix.empty()) {
-        return false;
-    } else if (s.length() < suffix.length()) {
-        return false;
-    }
-
-    if (!caseSensitive) {
-        return EndsWith(ai_tolower(s), ai_tolower(suffix), true);
-    }
-
-    size_t len = suffix.length();
-    std::string sSuffix = s.substr(s.length() - len, len);
-
-    return (ASSIMP_stricmp(sSuffix, suffix) == 0);
-}
-
-// Skips a line from current @ss position until a newline. Returns the skipped part.
-static inline std::string SkipLine(std::stringstream &ss) {
-    std::string skipped;
-    getline(ss, skipped);
-    return skipped;
-}
-
-// Skips a line and reads next element from @c ss to @c nextElement.
-/** @return Skipped line content until newline. */
-static inline std::string NextAfterNewLine(std::stringstream &ss, std::string &nextElement) {
-    std::string skipped = SkipLine(ss);
-    ss >> nextElement;
-    return skipped;
-}
-
-} // namespace Ogre
-} // namespace Assimp
-
-#endif // ASSIMP_BUILD_NO_OGRE_IMPORTER
-#endif // AI_OGREPARSINGUTILS_H_INC
diff --git a/libs/assimp/code/AssetLib/Ogre/OgreStructs.cpp b/libs/assimp/code/AssetLib/Ogre/OgreStructs.cpp
deleted file mode 100644
index d63dd93..0000000
--- a/libs/assimp/code/AssetLib/Ogre/OgreStructs.cpp
+++ /dev/null
@@ -1,1076 +0,0 @@
-/*
-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_BUILD_NO_OGRE_IMPORTER
-
-#include "OgreStructs.h"
-#include <assimp/Exceptional.h>
-#include <assimp/TinyFormatter.h>
-#include <assimp/scene.h>
-#include <assimp/DefaultLogger.hpp>
-
-namespace Assimp {
-namespace Ogre {
-
-// VertexElement
-
-VertexElement::VertexElement() :
-        index(0),
-        source(0),
-        offset(0),
-        type(VET_FLOAT1),
-        semantic(VES_POSITION) {
-}
-
-size_t VertexElement::Size() const {
-    return TypeSize(type);
-}
-
-size_t VertexElement::ComponentCount() const {
-    return ComponentCount(type);
-}
-
-size_t VertexElement::ComponentCount(Type type) {
-    switch (type) {
-    case VET_COLOUR:
-    case VET_COLOUR_ABGR:
-    case VET_COLOUR_ARGB:
-    case VET_FLOAT1:
-    case VET_DOUBLE1:
-    case VET_SHORT1:
-    case VET_USHORT1:
-    case VET_INT1:
-    case VET_UINT1:
-        return 1;
-    case VET_FLOAT2:
-    case VET_DOUBLE2:
-    case VET_SHORT2:
-    case VET_USHORT2:
-    case VET_INT2:
-    case VET_UINT2:
-        return 2;
-    case VET_FLOAT3:
-    case VET_DOUBLE3:
-    case VET_SHORT3:
-    case VET_USHORT3:
-    case VET_INT3:
-    case VET_UINT3:
-        return 3;
-    case VET_FLOAT4:
-    case VET_DOUBLE4:
-    case VET_SHORT4:
-    case VET_USHORT4:
-    case VET_INT4:
-    case VET_UINT4:
-    case VET_UBYTE4:
-        return 4;
-    }
-    return 0;
-}
-
-size_t VertexElement::TypeSize(Type type) {
-    switch (type) {
-    case VET_COLOUR:
-    case VET_COLOUR_ABGR:
-    case VET_COLOUR_ARGB:
-        return sizeof(unsigned int);
-    case VET_FLOAT1:
-        return sizeof(float);
-    case VET_FLOAT2:
-        return sizeof(float) * 2;
-    case VET_FLOAT3:
-        return sizeof(float) * 3;
-    case VET_FLOAT4:
-        return sizeof(float) * 4;
-    case VET_DOUBLE1:
-        return sizeof(double);
-    case VET_DOUBLE2:
-        return sizeof(double) * 2;
-    case VET_DOUBLE3:
-        return sizeof(double) * 3;
-    case VET_DOUBLE4:
-        return sizeof(double) * 4;
-    case VET_SHORT1:
-        return sizeof(short);
-    case VET_SHORT2:
-        return sizeof(short) * 2;
-    case VET_SHORT3:
-        return sizeof(short) * 3;
-    case VET_SHORT4:
-        return sizeof(short) * 4;
-    case VET_USHORT1:
-        return sizeof(unsigned short);
-    case VET_USHORT2:
-        return sizeof(unsigned short) * 2;
-    case VET_USHORT3:
-        return sizeof(unsigned short) * 3;
-    case VET_USHORT4:
-        return sizeof(unsigned short) * 4;
-    case VET_INT1:
-        return sizeof(int);
-    case VET_INT2:
-        return sizeof(int) * 2;
-    case VET_INT3:
-        return sizeof(int) * 3;
-    case VET_INT4:
-        return sizeof(int) * 4;
-    case VET_UINT1:
-        return sizeof(unsigned int);
-    case VET_UINT2:
-        return sizeof(unsigned int) * 2;
-    case VET_UINT3:
-        return sizeof(unsigned int) * 3;
-    case VET_UINT4:
-        return sizeof(unsigned int) * 4;
-    case VET_UBYTE4:
-        return sizeof(unsigned char) * 4;
-    }
-    return 0;
-}
-
-std::string VertexElement::TypeToString() {
-    return TypeToString(type);
-}
-
-std::string VertexElement::TypeToString(Type type) {
-    switch (type) {
-    case VET_COLOUR: return "COLOUR";
-    case VET_COLOUR_ABGR: return "COLOUR_ABGR";
-    case VET_COLOUR_ARGB: return "COLOUR_ARGB";
-    case VET_FLOAT1: return "FLOAT1";
-    case VET_FLOAT2: return "FLOAT2";
-    case VET_FLOAT3: return "FLOAT3";
-    case VET_FLOAT4: return "FLOAT4";
-    case VET_DOUBLE1: return "DOUBLE1";
-    case VET_DOUBLE2: return "DOUBLE2";
-    case VET_DOUBLE3: return "DOUBLE3";
-    case VET_DOUBLE4: return "DOUBLE4";
-    case VET_SHORT1: return "SHORT1";
-    case VET_SHORT2: return "SHORT2";
-    case VET_SHORT3: return "SHORT3";
-    case VET_SHORT4: return "SHORT4";
-    case VET_USHORT1: return "USHORT1";
-    case VET_USHORT2: return "USHORT2";
-    case VET_USHORT3: return "USHORT3";
-    case VET_USHORT4: return "USHORT4";
-    case VET_INT1: return "INT1";
-    case VET_INT2: return "INT2";
-    case VET_INT3: return "INT3";
-    case VET_INT4: return "INT4";
-    case VET_UINT1: return "UINT1";
-    case VET_UINT2: return "UINT2";
-    case VET_UINT3: return "UINT3";
-    case VET_UINT4: return "UINT4";
-    case VET_UBYTE4: return "UBYTE4";
-    }
-    return "Uknown_VertexElement::Type";
-}
-
-std::string VertexElement::SemanticToString() {
-    return SemanticToString(semantic);
-}
-
-std::string VertexElement::SemanticToString(Semantic semantic) {
-    switch (semantic) {
-    case VES_POSITION: return "POSITION";
-    case VES_BLEND_WEIGHTS: return "BLEND_WEIGHTS";
-    case VES_BLEND_INDICES: return "BLEND_INDICES";
-    case VES_NORMAL: return "NORMAL";
-    case VES_DIFFUSE: return "DIFFUSE";
-    case VES_SPECULAR: return "SPECULAR";
-    case VES_TEXTURE_COORDINATES: return "TEXTURE_COORDINATES";
-    case VES_BINORMAL: return "BINORMAL";
-    case VES_TANGENT: return "TANGENT";
-    }
-    return "Uknown_VertexElement::Semantic";
-}
-
-// IVertexData
-
-IVertexData::IVertexData() :
-        count(0) {
-}
-
-bool IVertexData::HasBoneAssignments() const {
-    return !boneAssignments.empty();
-}
-
-void IVertexData::AddVertexMapping(uint32_t oldIndex, uint32_t newIndex) {
-    BoneAssignmentsForVertex(oldIndex, newIndex, boneAssignmentsMap[newIndex]);
-    vertexIndexMapping[oldIndex].push_back(newIndex);
-}
-
-void IVertexData::BoneAssignmentsForVertex(uint32_t currentIndex, uint32_t newIndex, VertexBoneAssignmentList &dest) const {
-    for (const auto &boneAssign : boneAssignments) {
-        if (boneAssign.vertexIndex == currentIndex) {
-            VertexBoneAssignment a = boneAssign;
-            a.vertexIndex = newIndex;
-            dest.push_back(a);
-        }
-    }
-}
-
-AssimpVertexBoneWeightList IVertexData::AssimpBoneWeights(size_t vertices) {
-    AssimpVertexBoneWeightList weights;
-    for (size_t vi = 0; vi < vertices; ++vi) {
-        VertexBoneAssignmentList &vertexWeights = boneAssignmentsMap[static_cast<unsigned int>(vi)];
-        for (VertexBoneAssignmentList::const_iterator iter = vertexWeights.begin(), end = vertexWeights.end();
-                iter != end; ++iter) {
-            std::vector<aiVertexWeight> &boneWeights = weights[iter->boneIndex];
-            boneWeights.push_back(aiVertexWeight(static_cast<unsigned int>(vi), iter->weight));
-        }
-    }
-    return weights;
-}
-
-std::set<uint16_t> IVertexData::ReferencedBonesByWeights() const {
-    std::set<uint16_t> referenced;
-    for (const auto &boneAssign : boneAssignments) {
-        referenced.insert(boneAssign.boneIndex);
-    }
-    return referenced;
-}
-
-// VertexData
-
-VertexData::VertexData() {
-}
-
-VertexData::~VertexData() {
-    Reset();
-}
-
-void VertexData::Reset() {
-    // Releases shared ptr memory streams.
-    vertexBindings.clear();
-    vertexElements.clear();
-}
-
-uint32_t VertexData::VertexSize(uint16_t source) const {
-    uint32_t size = 0;
-    for (const auto &element : vertexElements) {
-        if (element.source == source)
-            size += static_cast<uint32_t>(element.Size());
-    }
-    return size;
-}
-
-MemoryStream *VertexData::VertexBuffer(uint16_t source) {
-    if (vertexBindings.find(source) != vertexBindings.end())
-        return vertexBindings[source].get();
-    return 0;
-}
-
-VertexElement *VertexData::GetVertexElement(VertexElement::Semantic semantic, uint16_t index) {
-    for (auto &element : vertexElements) {
-        if (element.semantic == semantic && element.index == index)
-            return &element;
-    }
-    return 0;
-}
-
-// VertexDataXml
-
-VertexDataXml::VertexDataXml() {
-}
-
-bool VertexDataXml::HasPositions() const {
-    return !positions.empty();
-}
-
-bool VertexDataXml::HasNormals() const {
-    return !normals.empty();
-}
-
-bool VertexDataXml::HasTangents() const {
-    return !tangents.empty();
-}
-
-bool VertexDataXml::HasUvs() const {
-    return !uvs.empty();
-}
-
-size_t VertexDataXml::NumUvs() const {
-    return uvs.size();
-}
-
-// IndexData
-
-IndexData::IndexData() :
-        count(0),
-        faceCount(0),
-        is32bit(false) {
-}
-
-IndexData::~IndexData() {
-    Reset();
-}
-
-void IndexData::Reset() {
-    // Release shared ptr memory stream.
-    buffer.reset();
-}
-
-size_t IndexData::IndexSize() const {
-    return (is32bit ? sizeof(uint32_t) : sizeof(uint16_t));
-}
-
-size_t IndexData::FaceSize() const {
-    return IndexSize() * 3;
-}
-
-// Mesh
-
-Mesh::Mesh() :
-        hasSkeletalAnimations(false),
-        skeleton(nullptr),
-        sharedVertexData(nullptr),
-        subMeshes(),
-        animations(),
-        poses() {
-}
-
-Mesh::~Mesh() {
-    Reset();
-}
-
-void Mesh::Reset() {
-    OGRE_SAFE_DELETE(skeleton)
-    OGRE_SAFE_DELETE(sharedVertexData)
-
-    for (auto &mesh : subMeshes) {
-        OGRE_SAFE_DELETE(mesh)
-    }
-    subMeshes.clear();
-    for (auto &anim : animations) {
-        OGRE_SAFE_DELETE(anim)
-    }
-    animations.clear();
-    for (auto &pose : poses) {
-        OGRE_SAFE_DELETE(pose)
-    }
-    poses.clear();
-}
-
-size_t Mesh::NumSubMeshes() const {
-    return subMeshes.size();
-}
-
-SubMesh *Mesh::GetSubMesh(size_t index) const {
-    for (size_t i = 0; i < subMeshes.size(); ++i) {
-        if (subMeshes[i]->index == index) {
-            return subMeshes[i];
-        }
-    }
-    return 0;
-}
-
-void Mesh::ConvertToAssimpScene(aiScene *dest) {
-    if (nullptr == dest) {
-        return;
-    }
-
-    // Setup
-    dest->mNumMeshes = static_cast<unsigned int>(NumSubMeshes());
-    dest->mMeshes = new aiMesh *[dest->mNumMeshes];
-
-    // Create root node
-    dest->mRootNode = new aiNode();
-    dest->mRootNode->mNumMeshes = dest->mNumMeshes;
-    dest->mRootNode->mMeshes = new unsigned int[dest->mRootNode->mNumMeshes];
-
-    // Export meshes
-    for (size_t i = 0; i < dest->mNumMeshes; ++i) {
-        dest->mMeshes[i] = subMeshes[i]->ConvertToAssimpMesh(this);
-        dest->mRootNode->mMeshes[i] = static_cast<unsigned int>(i);
-    }
-
-    // Export skeleton
-    if (skeleton) {
-        // Bones
-        if (!skeleton->bones.empty()) {
-            BoneList rootBones = skeleton->RootBones();
-            dest->mRootNode->mNumChildren = static_cast<unsigned int>(rootBones.size());
-            dest->mRootNode->mChildren = new aiNode *[dest->mRootNode->mNumChildren];
-
-            for (size_t i = 0, len = rootBones.size(); i < len; ++i) {
-                dest->mRootNode->mChildren[i] = rootBones[i]->ConvertToAssimpNode(skeleton, dest->mRootNode);
-            }
-        }
-
-        // Animations
-        if (!skeleton->animations.empty()) {
-            dest->mNumAnimations = static_cast<unsigned int>(skeleton->animations.size());
-            dest->mAnimations = new aiAnimation *[dest->mNumAnimations];
-
-            for (size_t i = 0, len = skeleton->animations.size(); i < len; ++i) {
-                dest->mAnimations[i] = skeleton->animations[i]->ConvertToAssimpAnimation();
-            }
-        }
-    }
-}
-
-// ISubMesh
-
-ISubMesh::ISubMesh() :
-        index(0),
-        materialIndex(-1),
-        usesSharedVertexData(false),
-        operationType(OT_POINT_LIST) {
-}
-
-// SubMesh
-
-SubMesh::SubMesh() :
-        vertexData(0),
-        indexData(new IndexData()) {
-}
-
-SubMesh::~SubMesh() {
-    Reset();
-}
-
-void SubMesh::Reset(){
-    OGRE_SAFE_DELETE(vertexData)
-            OGRE_SAFE_DELETE(indexData)
-}
-
-aiMesh *SubMesh::ConvertToAssimpMesh(Mesh *parent) {
-    if (operationType != OT_TRIANGLE_LIST) {
-        throw DeadlyImportError("Only mesh operation type OT_TRIANGLE_LIST is supported. Found ", operationType);
-    }
-
-    aiMesh *dest = new aiMesh();
-    dest->mPrimitiveTypes = aiPrimitiveType_TRIANGLE;
-
-    if (!name.empty())
-        dest->mName = name;
-
-    // Material index
-    if (materialIndex != -1)
-        dest->mMaterialIndex = materialIndex;
-
-    // Pick source vertex data from shader geometry or from internal geometry.
-    VertexData *src = (!usesSharedVertexData ? vertexData : parent->sharedVertexData);
-
-    VertexElement *positionsElement = src->GetVertexElement(VertexElement::VES_POSITION);
-    VertexElement *normalsElement = src->GetVertexElement(VertexElement::VES_NORMAL);
-    VertexElement *uv1Element = src->GetVertexElement(VertexElement::VES_TEXTURE_COORDINATES, 0);
-    VertexElement *uv2Element = src->GetVertexElement(VertexElement::VES_TEXTURE_COORDINATES, 1);
-
-    // Sanity checks
-    if (!positionsElement) {
-        throw DeadlyImportError("Failed to import Ogre VertexElement::VES_POSITION. Mesh does not have vertex positions!");
-    } else if (positionsElement->type != VertexElement::VET_FLOAT3) {
-        throw DeadlyImportError("Ogre Mesh position vertex element type != VertexElement::VET_FLOAT3. This is not supported.");
-    } else if (normalsElement && normalsElement->type != VertexElement::VET_FLOAT3) {
-        throw DeadlyImportError("Ogre Mesh normal vertex element type != VertexElement::VET_FLOAT3. This is not supported.");
-    }
-
-    // Faces
-    dest->mNumFaces = indexData->faceCount;
-    dest->mFaces = new aiFace[dest->mNumFaces];
-
-    // Assimp required unique vertices, we need to convert from Ogres shared indexing.
-    size_t uniqueVertexCount = dest->mNumFaces * 3;
-    dest->mNumVertices = static_cast<unsigned int>(uniqueVertexCount);
-    dest->mVertices = new aiVector3D[dest->mNumVertices];
-
-    // Source streams
-    MemoryStream *positions = src->VertexBuffer(positionsElement->source);
-    MemoryStream *normals = (normalsElement ? src->VertexBuffer(normalsElement->source) : 0);
-    MemoryStream *uv1 = (uv1Element ? src->VertexBuffer(uv1Element->source) : 0);
-    MemoryStream *uv2 = (uv2Element ? src->VertexBuffer(uv2Element->source) : 0);
-
-    // Element size
-    const size_t sizePosition = positionsElement->Size();
-    const size_t sizeNormal = (normalsElement ? normalsElement->Size() : 0);
-    const size_t sizeUv1 = (uv1Element ? uv1Element->Size() : 0);
-    const size_t sizeUv2 = (uv2Element ? uv2Element->Size() : 0);
-
-    // Vertex width
-    const size_t vWidthPosition = src->VertexSize(positionsElement->source);
-    const size_t vWidthNormal = (normalsElement ? src->VertexSize(normalsElement->source) : 0);
-    const size_t vWidthUv1 = (uv1Element ? src->VertexSize(uv1Element->source) : 0);
-    const size_t vWidthUv2 = (uv2Element ? src->VertexSize(uv2Element->source) : 0);
-
-    bool boneAssignments = src->HasBoneAssignments();
-
-    // Prepare normals
-    if (normals)
-        dest->mNormals = new aiVector3D[dest->mNumVertices];
-
-    // Prepare UVs, ignoring incompatible UVs.
-    if (uv1) {
-        if (uv1Element->type == VertexElement::VET_FLOAT2 || uv1Element->type == VertexElement::VET_FLOAT3) {
-            dest->mNumUVComponents[0] = static_cast<unsigned int>(uv1Element->ComponentCount());
-            dest->mTextureCoords[0] = new aiVector3D[dest->mNumVertices];
-        } else {
-            ASSIMP_LOG_WARN("Ogre imported UV0 type ", uv1Element->TypeToString(), " is not compatible with Assimp. Ignoring UV.");
-            uv1 = 0;
-        }
-    }
-    if (uv2) {
-        if (uv2Element->type == VertexElement::VET_FLOAT2 || uv2Element->type == VertexElement::VET_FLOAT3) {
-            dest->mNumUVComponents[1] = static_cast<unsigned int>(uv2Element->ComponentCount());
-            dest->mTextureCoords[1] = new aiVector3D[dest->mNumVertices];
-        } else {
-            ASSIMP_LOG_WARN("Ogre imported UV0 type ", uv2Element->TypeToString(), " is not compatible with Assimp. Ignoring UV.");
-            uv2 = 0;
-        }
-    }
-
-    aiVector3D *uv1Dest = (uv1 ? dest->mTextureCoords[0] : 0);
-    aiVector3D *uv2Dest = (uv2 ? dest->mTextureCoords[1] : 0);
-
-    MemoryStream *faces = indexData->buffer.get();
-    for (size_t fi = 0, isize = indexData->IndexSize(), fsize = indexData->FaceSize();
-            fi < dest->mNumFaces; ++fi) {
-        // Source Ogre face
-        aiFace ogreFace;
-        ogreFace.mNumIndices = 3;
-        ogreFace.mIndices = new unsigned int[3];
-
-        faces->Seek(fi * fsize, aiOrigin_SET);
-        if (indexData->is32bit) {
-            faces->Read(&ogreFace.mIndices[0], isize, 3);
-        } else {
-            uint16_t iout = 0;
-            for (size_t ii = 0; ii < 3; ++ii) {
-                faces->Read(&iout, isize, 1);
-                ogreFace.mIndices[ii] = static_cast<unsigned int>(iout);
-            }
-        }
-
-        // Destination Assimp face
-        aiFace &face = dest->mFaces[fi];
-        face.mNumIndices = 3;
-        face.mIndices = new unsigned int[3];
-
-        const size_t pos = fi * 3;
-        for (size_t v = 0; v < 3; ++v) {
-            const size_t newIndex = pos + v;
-
-            // Write face index
-            face.mIndices[v] = static_cast<unsigned int>(newIndex);
-
-            // Ogres vertex index to ref into the source buffers.
-            const size_t ogreVertexIndex = ogreFace.mIndices[v];
-            src->AddVertexMapping(static_cast<uint32_t>(ogreVertexIndex), static_cast<uint32_t>(newIndex));
-
-            // Position
-            positions->Seek((vWidthPosition * ogreVertexIndex) + positionsElement->offset, aiOrigin_SET);
-            positions->Read(&dest->mVertices[newIndex], sizePosition, 1);
-
-            // Normal
-            if (normals) {
-                normals->Seek((vWidthNormal * ogreVertexIndex) + normalsElement->offset, aiOrigin_SET);
-                normals->Read(&dest->mNormals[newIndex], sizeNormal, 1);
-            }
-            // UV0
-            if (uv1 && uv1Dest) {
-                uv1->Seek((vWidthUv1 * ogreVertexIndex) + uv1Element->offset, aiOrigin_SET);
-                uv1->Read(&uv1Dest[newIndex], sizeUv1, 1);
-                uv1Dest[newIndex].y = (uv1Dest[newIndex].y * -1) + 1; // Flip UV from Ogre to Assimp form
-            }
-            // UV1
-            if (uv2 && uv2Dest) {
-                uv2->Seek((vWidthUv2 * ogreVertexIndex) + uv2Element->offset, aiOrigin_SET);
-                uv2->Read(&uv2Dest[newIndex], sizeUv2, 1);
-                uv2Dest[newIndex].y = (uv2Dest[newIndex].y * -1) + 1; // Flip UV from Ogre to Assimp form
-            }
-        }
-    }
-
-    // Bones and bone weights
-    if (parent->skeleton && boneAssignments) {
-        AssimpVertexBoneWeightList weights = src->AssimpBoneWeights(dest->mNumVertices);
-        std::set<uint16_t> referencedBones = src->ReferencedBonesByWeights();
-
-        dest->mNumBones = static_cast<unsigned int>(referencedBones.size());
-        dest->mBones = new aiBone *[dest->mNumBones];
-
-        size_t assimpBoneIndex = 0;
-        for (std::set<uint16_t>::const_iterator rbIter = referencedBones.begin(), rbEnd = referencedBones.end(); rbIter != rbEnd; ++rbIter, ++assimpBoneIndex) {
-            Bone *bone = parent->skeleton->BoneById((*rbIter));
-            dest->mBones[assimpBoneIndex] = bone->ConvertToAssimpBone(parent->skeleton, weights[bone->id]);
-        }
-    }
-
-    return dest;
-}
-
-// MeshXml
-
-MeshXml::MeshXml() :
-        skeleton(0),
-        sharedVertexData(0) {
-}
-
-MeshXml::~MeshXml() {
-    Reset();
-}
-
-void MeshXml::Reset() {
-    OGRE_SAFE_DELETE(skeleton)
-    OGRE_SAFE_DELETE(sharedVertexData)
-
-    for (auto &mesh : subMeshes) {
-        OGRE_SAFE_DELETE(mesh)
-    }
-    subMeshes.clear();
-}
-
-size_t MeshXml::NumSubMeshes() const {
-    return subMeshes.size();
-}
-
-SubMeshXml *MeshXml::GetSubMesh(uint16_t index) const {
-    for (size_t i = 0; i < subMeshes.size(); ++i)
-        if (subMeshes[i]->index == index)
-            return subMeshes[i];
-    return 0;
-}
-
-void MeshXml::ConvertToAssimpScene(aiScene *dest) {
-    // Setup
-    dest->mNumMeshes = static_cast<unsigned int>(NumSubMeshes());
-    dest->mMeshes = new aiMesh *[dest->mNumMeshes];
-
-    // Create root node
-    dest->mRootNode = new aiNode();
-    dest->mRootNode->mNumMeshes = dest->mNumMeshes;
-    dest->mRootNode->mMeshes = new unsigned int[dest->mRootNode->mNumMeshes];
-
-    // Export meshes
-    for (size_t i = 0; i < dest->mNumMeshes; ++i) {
-        dest->mMeshes[i] = subMeshes[i]->ConvertToAssimpMesh(this);
-        dest->mRootNode->mMeshes[i] = static_cast<unsigned int>(i);
-    }
-
-    // Export skeleton
-    if (skeleton) {
-        // Bones
-        if (!skeleton->bones.empty()) {
-            BoneList rootBones = skeleton->RootBones();
-            dest->mRootNode->mNumChildren = static_cast<unsigned int>(rootBones.size());
-            dest->mRootNode->mChildren = new aiNode *[dest->mRootNode->mNumChildren];
-
-            for (size_t i = 0, len = rootBones.size(); i < len; ++i) {
-                dest->mRootNode->mChildren[i] = rootBones[i]->ConvertToAssimpNode(skeleton, dest->mRootNode);
-            }
-        }
-
-        // Animations
-        if (!skeleton->animations.empty()) {
-            dest->mNumAnimations = static_cast<unsigned int>(skeleton->animations.size());
-            dest->mAnimations = new aiAnimation *[dest->mNumAnimations];
-
-            for (size_t i = 0, len = skeleton->animations.size(); i < len; ++i) {
-                dest->mAnimations[i] = skeleton->animations[i]->ConvertToAssimpAnimation();
-            }
-        }
-    }
-}
-
-// SubMeshXml
-
-SubMeshXml::SubMeshXml() :
-        indexData(new IndexDataXml()),
-        vertexData(0) {
-}
-
-SubMeshXml::~SubMeshXml() {
-    Reset();
-}
-
-void SubMeshXml::Reset(){
-    OGRE_SAFE_DELETE(indexData)
-            OGRE_SAFE_DELETE(vertexData)
-}
-
-aiMesh *SubMeshXml::ConvertToAssimpMesh(MeshXml *parent) {
-    aiMesh *dest = new aiMesh();
-    dest->mPrimitiveTypes = aiPrimitiveType_TRIANGLE;
-
-    if (!name.empty())
-        dest->mName = name;
-
-    // Material index
-    if (materialIndex != -1)
-        dest->mMaterialIndex = materialIndex;
-
-    // Faces
-    dest->mNumFaces = indexData->faceCount;
-    dest->mFaces = new aiFace[dest->mNumFaces];
-
-    // Assimp required unique vertices, we need to convert from Ogres shared indexing.
-    size_t uniqueVertexCount = dest->mNumFaces * 3;
-    dest->mNumVertices = static_cast<unsigned int>(uniqueVertexCount);
-    dest->mVertices = new aiVector3D[dest->mNumVertices];
-
-    VertexDataXml *src = (!usesSharedVertexData ? vertexData : parent->sharedVertexData);
-    bool boneAssignments = src->HasBoneAssignments();
-    bool normals = src->HasNormals();
-    size_t uvs = src->NumUvs();
-
-    // Prepare normals
-    if (normals)
-        dest->mNormals = new aiVector3D[dest->mNumVertices];
-
-    // Prepare UVs
-    for (size_t uvi = 0; uvi < uvs; ++uvi) {
-        dest->mNumUVComponents[uvi] = 2;
-        dest->mTextureCoords[uvi] = new aiVector3D[dest->mNumVertices];
-    }
-
-    for (size_t fi = 0; fi < dest->mNumFaces; ++fi) {
-        // Source Ogre face
-        aiFace &ogreFace = indexData->faces[fi];
-
-        // Destination Assimp face
-        aiFace &face = dest->mFaces[fi];
-        face.mNumIndices = 3;
-        face.mIndices = new unsigned int[3];
-
-        const size_t pos = fi * 3;
-        for (size_t v = 0; v < 3; ++v) {
-            const size_t newIndex = pos + v;
-
-            // Write face index
-            face.mIndices[v] = static_cast<unsigned int>(newIndex);
-
-            // Ogres vertex index to ref into the source buffers.
-            const size_t ogreVertexIndex = ogreFace.mIndices[v];
-            src->AddVertexMapping(static_cast<uint32_t>(ogreVertexIndex), static_cast<uint32_t>(newIndex));
-
-            // Position
-            dest->mVertices[newIndex] = src->positions[ogreVertexIndex];
-
-            // Normal
-            if (normals)
-                dest->mNormals[newIndex] = src->normals[ogreVertexIndex];
-
-            // UVs
-            for (size_t uvi = 0; uvi < uvs; ++uvi) {
-                aiVector3D *uvDest = dest->mTextureCoords[uvi];
-                std::vector<aiVector3D> &uvSrc = src->uvs[uvi];
-                uvDest[newIndex] = uvSrc[ogreVertexIndex];
-            }
-        }
-    }
-
-    // Bones and bone weights
-    if (parent->skeleton && boneAssignments) {
-        AssimpVertexBoneWeightList weights = src->AssimpBoneWeights(dest->mNumVertices);
-        std::set<uint16_t> referencedBones = src->ReferencedBonesByWeights();
-
-        dest->mNumBones = static_cast<unsigned int>(referencedBones.size());
-        dest->mBones = new aiBone *[dest->mNumBones];
-
-        size_t assimpBoneIndex = 0;
-        for (std::set<uint16_t>::const_iterator rbIter = referencedBones.begin(), rbEnd = referencedBones.end(); rbIter != rbEnd; ++rbIter, ++assimpBoneIndex) {
-            Bone *bone = parent->skeleton->BoneById((*rbIter));
-            dest->mBones[assimpBoneIndex] = bone->ConvertToAssimpBone(parent->skeleton, weights[bone->id]);
-        }
-    }
-
-    return dest;
-}
-
-// Animation
-
-Animation::Animation(Skeleton *parent) :
-        parentMesh(nullptr),
-        parentSkeleton(parent),
-        length(0.0f),
-        baseTime(-1.0f) {
-    // empty
-}
-
-Animation::Animation(Mesh *parent) :
-        parentMesh(parent),
-        parentSkeleton(0),
-        length(0.0f),
-        baseTime(-1.0f) {
-    // empty
-}
-
-VertexData *Animation::AssociatedVertexData(VertexAnimationTrack *track) const {
-    if (nullptr == parentMesh) {
-        return nullptr;
-    }
-
-    bool sharedGeom = (track->target == 0);
-    if (sharedGeom) {
-        return parentMesh->sharedVertexData;
-    }
-
-    return parentMesh->GetSubMesh(track->target - 1)->vertexData;
-}
-
-aiAnimation *Animation::ConvertToAssimpAnimation() {
-    aiAnimation *anim = new aiAnimation();
-    anim->mName = name;
-    anim->mDuration = static_cast<double>(length);
-    anim->mTicksPerSecond = 1.0;
-
-    // Tracks
-    if (!tracks.empty()) {
-        anim->mNumChannels = static_cast<unsigned int>(tracks.size());
-        anim->mChannels = new aiNodeAnim *[anim->mNumChannels];
-
-        for (size_t i = 0, len = tracks.size(); i < len; ++i) {
-            anim->mChannels[i] = tracks[i].ConvertToAssimpAnimationNode(parentSkeleton);
-        }
-    }
-    return anim;
-}
-
-// Skeleton
-
-Skeleton::Skeleton() :
-        bones(),
-        animations(),
-        blendMode(ANIMBLEND_AVERAGE) {
-}
-
-Skeleton::~Skeleton() {
-    Reset();
-}
-
-void Skeleton::Reset() {
-    for (auto &bone : bones) {
-        OGRE_SAFE_DELETE(bone)
-    }
-    bones.clear();
-    for (auto &anim : animations) {
-        OGRE_SAFE_DELETE(anim)
-    }
-    animations.clear();
-}
-
-BoneList Skeleton::RootBones() const {
-    BoneList rootBones;
-    for (BoneList::const_iterator iter = bones.begin(); iter != bones.end(); ++iter) {
-        if (!(*iter)->IsParented())
-            rootBones.push_back((*iter));
-    }
-    return rootBones;
-}
-
-size_t Skeleton::NumRootBones() const {
-    size_t num = 0;
-    for (BoneList::const_iterator iter = bones.begin(); iter != bones.end(); ++iter) {
-        if (!(*iter)->IsParented())
-            num++;
-    }
-    return num;
-}
-
-Bone *Skeleton::BoneByName(const std::string &name) const {
-    for (BoneList::const_iterator iter = bones.begin(); iter != bones.end(); ++iter) {
-        if ((*iter)->name == name)
-            return (*iter);
-    }
-    return 0;
-}
-
-Bone *Skeleton::BoneById(uint16_t id) const {
-    for (BoneList::const_iterator iter = bones.begin(); iter != bones.end(); ++iter) {
-        if ((*iter)->id == id)
-            return (*iter);
-    }
-    return 0;
-}
-
-// Bone
-
-Bone::Bone() :
-        id(0),
-        parent(0),
-        parentId(-1),
-        scale(1.0f, 1.0f, 1.0f) {
-}
-
-bool Bone::IsParented() const {
-    return (parentId != -1 && parent != 0);
-}
-
-uint16_t Bone::ParentId() const {
-    return static_cast<uint16_t>(parentId);
-}
-
-void Bone::AddChild(Bone *bone) {
-    if (!bone)
-        return;
-    if (bone->IsParented())
-        throw DeadlyImportError("Attaching child Bone that is already parented: ", bone->name);
-
-    bone->parent = this;
-    bone->parentId = id;
-    children.push_back(bone->id);
-}
-
-void Bone::CalculateWorldMatrixAndDefaultPose(Skeleton *skeleton) {
-    if (!IsParented())
-        worldMatrix = aiMatrix4x4(scale, rotation, position).Inverse();
-    else
-        worldMatrix = aiMatrix4x4(scale, rotation, position).Inverse() * parent->worldMatrix;
-
-    defaultPose = aiMatrix4x4(scale, rotation, position);
-
-    // Recursively for all children now that the parent matrix has been calculated.
-    for (auto boneId : children) {
-        Bone *child = skeleton->BoneById(boneId);
-        if (!child) {
-            throw DeadlyImportError("CalculateWorldMatrixAndDefaultPose: Failed to find child bone ", boneId, " for parent ", id, " ", name);
-        }
-        child->CalculateWorldMatrixAndDefaultPose(skeleton);
-    }
-}
-
-aiNode *Bone::ConvertToAssimpNode(Skeleton *skeleton, aiNode *parentNode) {
-    // Bone node
-    aiNode *node = new aiNode(name);
-    node->mParent = parentNode;
-    node->mTransformation = defaultPose;
-
-    // Children
-    if (!children.empty()) {
-        node->mNumChildren = static_cast<unsigned int>(children.size());
-        node->mChildren = new aiNode *[node->mNumChildren];
-
-        for (size_t i = 0, len = children.size(); i < len; ++i) {
-            Bone *child = skeleton->BoneById(children[i]);
-            if (!child) {
-                throw DeadlyImportError("ConvertToAssimpNode: Failed to find child bone ", children[i], " for parent ", id, " ", name);
-            }
-            node->mChildren[i] = child->ConvertToAssimpNode(skeleton, node);
-        }
-    }
-    return node;
-}
-
-aiBone *Bone::ConvertToAssimpBone(Skeleton * /*parent*/, const std::vector<aiVertexWeight> &boneWeights) {
-    aiBone *bone = new aiBone();
-    bone->mName = name;
-    bone->mOffsetMatrix = worldMatrix;
-
-    if (!boneWeights.empty()) {
-        bone->mNumWeights = static_cast<unsigned int>(boneWeights.size());
-        bone->mWeights = new aiVertexWeight[boneWeights.size()];
-        memcpy(bone->mWeights, &boneWeights[0], boneWeights.size() * sizeof(aiVertexWeight));
-    }
-
-    return bone;
-}
-
-// VertexAnimationTrack
-
-VertexAnimationTrack::VertexAnimationTrack() :
-        type(VAT_NONE),
-        target(0) {
-}
-
-aiNodeAnim *VertexAnimationTrack::ConvertToAssimpAnimationNode(Skeleton *skeleton) {
-    if (boneName.empty() || type != VAT_TRANSFORM) {
-        throw DeadlyImportError("VertexAnimationTrack::ConvertToAssimpAnimationNode: Cannot convert track that has no target bone name or is not type of VAT_TRANSFORM");
-    }
-
-    aiNodeAnim *nodeAnim = new aiNodeAnim();
-    nodeAnim->mNodeName = boneName;
-
-    Bone *bone = skeleton->BoneByName(boneName);
-    if (!bone) {
-        throw DeadlyImportError("VertexAnimationTrack::ConvertToAssimpAnimationNode: Failed to find bone ", boneName, " from parent Skeleton");
-    }
-
-    // Keyframes
-    size_t numKeyframes = transformKeyFrames.size();
-
-    nodeAnim->mPositionKeys = new aiVectorKey[numKeyframes];
-    nodeAnim->mRotationKeys = new aiQuatKey[numKeyframes];
-    nodeAnim->mScalingKeys = new aiVectorKey[numKeyframes];
-    nodeAnim->mNumPositionKeys = static_cast<unsigned int>(numKeyframes);
-    nodeAnim->mNumRotationKeys = static_cast<unsigned int>(numKeyframes);
-    nodeAnim->mNumScalingKeys = static_cast<unsigned int>(numKeyframes);
-
-    for (size_t kfi = 0; kfi < numKeyframes; ++kfi) {
-        TransformKeyFrame &kfSource = transformKeyFrames[kfi];
-
-        // Calculate the complete transformation from world space to bone space
-        aiVector3D pos;
-        aiQuaternion rot;
-        aiVector3D scale;
-
-        aiMatrix4x4 finalTransform = bone->defaultPose * kfSource.Transform();
-        finalTransform.Decompose(scale, rot, pos);
-
-        double t = static_cast<double>(kfSource.timePos);
-        nodeAnim->mPositionKeys[kfi].mTime = t;
-        nodeAnim->mRotationKeys[kfi].mTime = t;
-        nodeAnim->mScalingKeys[kfi].mTime = t;
-
-        nodeAnim->mPositionKeys[kfi].mValue = pos;
-        nodeAnim->mRotationKeys[kfi].mValue = rot;
-        nodeAnim->mScalingKeys[kfi].mValue = scale;
-    }
-
-    return nodeAnim;
-}
-
-// TransformKeyFrame
-
-TransformKeyFrame::TransformKeyFrame() :
-        timePos(0.0f),
-        scale(1.0f, 1.0f, 1.0f) {
-}
-
-aiMatrix4x4 TransformKeyFrame::Transform() {
-    return aiMatrix4x4(scale, rotation, position);
-}
-
-} // namespace Ogre
-} // namespace Assimp
-
-#endif // ASSIMP_BUILD_NO_OGRE_IMPORTER
diff --git a/libs/assimp/code/AssetLib/Ogre/OgreStructs.h b/libs/assimp/code/AssetLib/Ogre/OgreStructs.h
deleted file mode 100644
index be9ffa0..0000000
--- a/libs/assimp/code/AssetLib/Ogre/OgreStructs.h
+++ /dev/null
@@ -1,696 +0,0 @@
-/*
-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 AI_OGRESTRUCTS_H_INC
-#define AI_OGRESTRUCTS_H_INC
-
-#ifndef ASSIMP_BUILD_NO_OGRE_IMPORTER
-
-#include <assimp/MemoryIOWrapper.h>
-#include <memory>
-#include <assimp/mesh.h>
-#include <map>
-#include <vector>
-#include <set>
-
-struct aiNodeAnim;
-struct aiAnimation;
-struct aiNode;
-struct aiMaterial;
-struct aiScene;
-
-/** @note Parts of this implementation, for example enums, deserialization constants and logic
-    has been copied directly with minor modifications from the MIT licensed Ogre3D code base.
-    See more from https://bitbucket.org/sinbad/ogre. */
-
-namespace Assimp
-{
-namespace Ogre
-{
-
-// Forward decl
-class Mesh;
-class MeshXml;
-class SubMesh;
-class SubMeshXml;
-class Skeleton;
-
-#define OGRE_SAFE_DELETE(p) delete p; p=0;
-
-// Typedefs
-typedef Assimp::MemoryIOStream MemoryStream;
-typedef std::shared_ptr<MemoryStream> MemoryStreamPtr;
-typedef std::map<uint16_t, MemoryStreamPtr> VertexBufferBindings;
-
-// Ogre Vertex Element
-class VertexElement
-{
-public:
-    /// Vertex element semantics, used to identify the meaning of vertex buffer contents
-    enum Semantic {
-        /// Position, 3 reals per vertex
-        VES_POSITION = 1,
-        /// Blending weights
-        VES_BLEND_WEIGHTS = 2,
-        /// Blending indices
-        VES_BLEND_INDICES = 3,
-        /// Normal, 3 reals per vertex
-        VES_NORMAL = 4,
-        /// Diffuse colours
-        VES_DIFFUSE = 5,
-        /// Specular colours
-        VES_SPECULAR = 6,
-        /// Texture coordinates
-        VES_TEXTURE_COORDINATES = 7,
-        /// Binormal (Y axis if normal is Z)
-        VES_BINORMAL = 8,
-        /// Tangent (X axis if normal is Z)
-        VES_TANGENT = 9,
-        /// The  number of VertexElementSemantic elements (note - the first value VES_POSITION is 1)
-        VES_COUNT = 9
-    };
-
-    /// Vertex element type, used to identify the base types of the vertex contents
-    enum Type
-    {
-        VET_FLOAT1 = 0,
-        VET_FLOAT2 = 1,
-        VET_FLOAT3 = 2,
-        VET_FLOAT4 = 3,
-        /// alias to more specific colour type - use the current rendersystem's colour packing
-        VET_COLOUR = 4,
-        VET_SHORT1 = 5,
-        VET_SHORT2 = 6,
-        VET_SHORT3 = 7,
-        VET_SHORT4 = 8,
-        VET_UBYTE4 = 9,
-        /// D3D style compact colour
-        VET_COLOUR_ARGB = 10,
-        /// GL style compact colour
-        VET_COLOUR_ABGR = 11,
-        VET_DOUBLE1 = 12,
-        VET_DOUBLE2 = 13,
-        VET_DOUBLE3 = 14,
-        VET_DOUBLE4 = 15,
-        VET_USHORT1 = 16,
-        VET_USHORT2 = 17,
-        VET_USHORT3 = 18,
-        VET_USHORT4 = 19,
-        VET_INT1 = 20,
-        VET_INT2 = 21,
-        VET_INT3 = 22,
-        VET_INT4 = 23,
-        VET_UINT1 = 24,
-        VET_UINT2 = 25,
-        VET_UINT3 = 26,
-        VET_UINT4 = 27
-    };
-
-    VertexElement();
-
-    /// Size of the vertex element in bytes.
-    size_t Size() const;
-
-    /// Count of components in this element, eg. VET_FLOAT3 return 3.
-    size_t ComponentCount() const;
-
-    /// Type as string.
-    std::string TypeToString();
-
-    /// Semantic as string.
-    std::string SemanticToString();
-
-    static size_t TypeSize(Type type);
-    static size_t ComponentCount(Type type);
-    static std::string TypeToString(Type type);
-    static std::string SemanticToString(Semantic semantic);
-
-    uint16_t index;
-    uint16_t source;
-    uint16_t offset;
-    Type type;
-    Semantic semantic;
-};
-typedef std::vector<VertexElement> VertexElementList;
-
-/// Ogre Vertex Bone Assignment
-struct VertexBoneAssignment
-{
-    uint32_t vertexIndex;
-    uint16_t boneIndex;
-    float weight;
-};
-typedef std::vector<VertexBoneAssignment> VertexBoneAssignmentList;
-typedef std::map<uint32_t, VertexBoneAssignmentList > VertexBoneAssignmentsMap;
-typedef std::map<uint16_t, std::vector<aiVertexWeight> > AssimpVertexBoneWeightList;
-
-// Ogre Vertex Data interface, inherited by the binary and XML implementations.
-class IVertexData
-{
-public:
-    IVertexData();
-
-    /// Returns if bone assignments are available.
-    bool HasBoneAssignments() const;
-
-    /// Add vertex mapping from old to new index.
-    void AddVertexMapping(uint32_t oldIndex, uint32_t newIndex);
-
-    /// Returns re-mapped bone assignments.
-    /** @note Uses mappings added via AddVertexMapping. */
-    AssimpVertexBoneWeightList AssimpBoneWeights(size_t vertices);
-
-    /// Returns a set of bone indexes that are referenced by bone assignments (weights).
-    std::set<uint16_t> ReferencedBonesByWeights() const;
-
-    /// Vertex count.
-    uint32_t count;
-
-    /// Bone assignments.
-    VertexBoneAssignmentList boneAssignments;
-
-private:
-    void BoneAssignmentsForVertex(uint32_t currentIndex, uint32_t newIndex, VertexBoneAssignmentList &dest) const;
-
-    std::map<uint32_t, std::vector<uint32_t> > vertexIndexMapping;
-    VertexBoneAssignmentsMap boneAssignmentsMap;
-};
-
-// Ogre Vertex Data
-class VertexData : public IVertexData
-{
-public:
-    VertexData();
-    ~VertexData();
-
-    /// Releases all memory that this data structure owns.
-    void Reset();
-
-    /// Get vertex size for @c source.
-    uint32_t VertexSize(uint16_t source) const;
-
-    /// Get vertex buffer for @c source.
-    MemoryStream *VertexBuffer(uint16_t source);
-
-    /// Get vertex element for @c semantic for @c index.
-    VertexElement *GetVertexElement(VertexElement::Semantic semantic, uint16_t index = 0);
-
-    /// Vertex elements.
-    VertexElementList vertexElements;
-
-    /// Vertex buffers mapped to bind index.
-    VertexBufferBindings vertexBindings;
-};
-
-// Ogre Index Data
-class IndexData
-{
-public:
-    IndexData();
-    ~IndexData();
-
-    /// Releases all memory that this data structure owns.
-    void Reset();
-
-    /// Index size in bytes.
-    size_t IndexSize() const;
-
-    /// Face size in bytes.
-    size_t FaceSize() const;
-
-    /// Index count.
-    uint32_t count;
-
-    /// Face count.
-    uint32_t faceCount;
-
-    /// If has 32-bit indexes.
-    bool is32bit;
-
-    /// Index buffer.
-    MemoryStreamPtr buffer;
-};
-
-/// Ogre Pose
-class Pose
-{
-public:
-    struct Vertex
-    {
-        uint32_t index;
-        aiVector3D offset;
-        aiVector3D normal;
-    };
-    typedef std::map<uint32_t, Vertex> PoseVertexMap;
-
-    Pose() : target(0), hasNormals(false) {}
-
-    /// Name.
-    std::string name;
-
-    /// Target.
-    uint16_t target;
-
-    /// Does vertices map have normals.
-    bool hasNormals;
-
-    /// Vertex offset and normals.
-    PoseVertexMap vertices;
-};
-typedef std::vector<Pose*> PoseList;
-
-/// Ogre Pose Key Frame Ref
-struct PoseRef
-{
-    uint16_t index;
-    float influence;
-};
-typedef std::vector<PoseRef> PoseRefList;
-
-/// Ogre Pose Key Frame
-struct PoseKeyFrame
-{
-    /// Time position in the animation.
-    float timePos;
-
-    PoseRefList references;
-};
-typedef std::vector<PoseKeyFrame> PoseKeyFrameList;
-
-/// Ogre Morph Key Frame
-struct MorphKeyFrame
-{
-    /// Time position in the animation.
-    float timePos;
-
-    MemoryStreamPtr buffer;
-};
-typedef std::vector<MorphKeyFrame> MorphKeyFrameList;
-
-/// Ogre animation key frame
-struct TransformKeyFrame
-{
-    TransformKeyFrame();
-
-    aiMatrix4x4 Transform();
-
-    float timePos;
-
-    aiQuaternion rotation;
-    aiVector3D position;
-    aiVector3D scale;
-};
-typedef std::vector<TransformKeyFrame> TransformKeyFrameList;
-
-/// Ogre Animation Track
-struct VertexAnimationTrack
-{
-    enum Type
-    {
-        /// No animation
-        VAT_NONE = 0,
-        /// Morph animation is made up of many interpolated snapshot keyframes
-        VAT_MORPH = 1,
-        /// Pose animation is made up of a single delta pose keyframe
-        VAT_POSE = 2,
-        /// Keyframe that has its on pos, rot and scale for a time position
-        VAT_TRANSFORM = 3
-    };
-
-    VertexAnimationTrack();
-
-    /// Convert to Assimp node animation.
-    aiNodeAnim *ConvertToAssimpAnimationNode(Skeleton *skeleton);
-
-    // Animation type.
-    Type type;
-
-    /// Vertex data target.
-    /**  0 == shared geometry
-        >0 == submesh index + 1 */
-    uint16_t target;
-
-    /// Only valid for VAT_TRANSFORM.
-    std::string boneName;
-
-    /// Only one of these will contain key frames, depending on the type enum.
-    PoseKeyFrameList poseKeyFrames;
-    MorphKeyFrameList morphKeyFrames;
-    TransformKeyFrameList transformKeyFrames;
-};
-typedef std::vector<VertexAnimationTrack> VertexAnimationTrackList;
-
-/// Ogre Animation
-class Animation
-{
-public:
-    explicit Animation(Skeleton *parent);
-    explicit Animation(Mesh *parent);
-
-    /// Returns the associated vertex data for a track in this animation.
-    /** @note Only valid to call when parent Mesh is set. */
-    VertexData *AssociatedVertexData(VertexAnimationTrack *track) const;
-
-    /// Convert to Assimp animation.
-    aiAnimation *ConvertToAssimpAnimation();
-
-    /// Parent mesh.
-    /** @note Set only when animation is read from a mesh. */
-    Mesh *parentMesh;
-
-    /// Parent skeleton.
-    /** @note Set only when animation is read from a skeleton. */
-    Skeleton *parentSkeleton;
-
-    /// Animation name.
-    std::string name;
-
-    /// Base animation name.
-    std::string baseName;
-
-    /// Length in seconds.
-    float length;
-
-    /// Base animation key time.
-    float baseTime;
-
-    /// Animation tracks.
-    VertexAnimationTrackList tracks;
-};
-typedef std::vector<Animation*> AnimationList;
-
-/// Ogre Bone
-class Bone
-{
-public:
-    Bone();
-
-    /// Returns if this bone is parented.
-    bool IsParented() const;
-
-    /// Parent index as uint16_t. Internally int32_t as -1 means unparented.
-    uint16_t ParentId() const;
-
-    /// Add child bone.
-    void AddChild(Bone *bone);
-
-    /// Calculates the world matrix for bone and its children.
-    void CalculateWorldMatrixAndDefaultPose(Skeleton *skeleton);
-
-    /// Convert to Assimp node (animation nodes).
-    aiNode *ConvertToAssimpNode(Skeleton *parent, aiNode *parentNode = 0);
-
-    /// Convert to Assimp bone (mesh bones).
-    aiBone *ConvertToAssimpBone(Skeleton *parent, const std::vector<aiVertexWeight> &boneWeights);
-
-    uint16_t id;
-    std::string name;
-
-    Bone *parent;
-    int32_t parentId;
-    std::vector<uint16_t> children;
-
-    aiVector3D position;
-    aiQuaternion rotation;
-    aiVector3D scale;
-
-    aiMatrix4x4 worldMatrix;
-    aiMatrix4x4 defaultPose;
-};
-typedef std::vector<Bone*> BoneList;
-
-/// Ogre Skeleton
-class Skeleton
-{
-public:
-    enum BlendMode
-    {
-        /// Animations are applied by calculating a weighted average of all animations
-        ANIMBLEND_AVERAGE = 0,
-        /// Animations are applied by calculating a weighted cumulative total
-        ANIMBLEND_CUMULATIVE = 1
-    };
-
-    Skeleton();
-    ~Skeleton();
-
-    /// Releases all memory that this data structure owns.
-    void Reset();
-
-    /// Returns unparented root bones.
-    BoneList RootBones() const;
-
-    /// Returns number of unparented root bones.
-    size_t NumRootBones() const;
-
-    /// Get bone by name.
-    Bone *BoneByName(const std::string &name) const;
-
-    /// Get bone by id.
-    Bone *BoneById(uint16_t id) const;
-
-    BoneList bones;
-    AnimationList animations;
-
-    /// @todo Take blend mode into account, but where?
-    BlendMode blendMode;
-};
-
-/// Ogre Sub Mesh interface, inherited by the binary and XML implementations.
-class ISubMesh
-{
-public:
-    /// @note Full list of Ogre types, not all of them are supported and exposed to Assimp.
-    enum OperationType
-    {
-        /// A list of points, 1 vertex per point
-        OT_POINT_LIST = 1,
-        /// A list of lines, 2 vertices per line
-        OT_LINE_LIST = 2,
-        /// A strip of connected lines, 1 vertex per line plus 1 start vertex
-        OT_LINE_STRIP = 3,
-        /// A list of triangles, 3 vertices per triangle
-        OT_TRIANGLE_LIST = 4,
-        /// A strip of triangles, 3 vertices for the first triangle, and 1 per triangle after that
-        OT_TRIANGLE_STRIP = 5,
-        /// A fan of triangles, 3 vertices for the first triangle, and 1 per triangle after that
-        OT_TRIANGLE_FAN = 6
-    };
-
-    ISubMesh();
-
-    /// SubMesh index.
-    unsigned int index;
-
-    /// SubMesh name.
-    std::string name;
-
-    /// Material used by this submesh.
-    std::string materialRef;
-
-    /// Texture alias information.
-    std::string textureAliasName;
-    std::string textureAliasRef;
-
-    /// Assimp scene material index used by this submesh.
-    /** -1 if no material or material could not be imported. */
-    int materialIndex;
-
-    /// If submesh uses shared geometry from parent mesh.
-    bool usesSharedVertexData;
-
-    /// Operation type.
-    OperationType operationType;
-};
-
-/// Ogre SubMesh
-class SubMesh : public ISubMesh
-{
-public:
-    SubMesh();
-    ~SubMesh();
-
-    /// Releases all memory that this data structure owns.
-    /** @note Vertex and index data contains shared ptrs
-        that are freed automatically. In practice the ref count
-        should be 0 after this reset. */
-    void Reset();
-
-    /// Convert to Assimp mesh.
-    aiMesh *ConvertToAssimpMesh(Mesh *parent);
-
-    /// Vertex data.
-    VertexData *vertexData;
-
-    /// Index data.
-    IndexData *indexData;
-};
-typedef std::vector<SubMesh*> SubMeshList;
-
-/// Ogre Mesh
-class Mesh
-{
-public:
-    /// Constructor.
-    Mesh();
-
-    /// Destructor.
-    ~Mesh();
-
-    /// Releases all memory that this data structure owns.
-    void Reset();
-
-    /// Returns number of subMeshes.
-    size_t NumSubMeshes() const;
-
-    /// Returns submesh for @c index.
-    SubMesh *GetSubMesh( size_t index) const;
-
-    /// Convert mesh to Assimp scene.
-    void ConvertToAssimpScene(aiScene* dest);
-
-    /// Mesh has skeletal animations.
-    bool hasSkeletalAnimations;
-
-    /// Skeleton reference.
-    std::string skeletonRef;
-
-    /// Skeleton.
-    Skeleton *skeleton;
-
-    /// Vertex data
-    VertexData *sharedVertexData;
-
-    /// Sub meshes.
-    SubMeshList subMeshes;
-
-    /// Animations
-    AnimationList animations;
-
-    /// Poses
-    PoseList poses;
-};
-
-/// Ogre XML Vertex Data
-class VertexDataXml : public IVertexData
-{
-public:
-    VertexDataXml();
-
-    bool HasPositions() const;
-    bool HasNormals() const;
-    bool HasTangents() const;
-    bool HasUvs() const;
-    size_t NumUvs() const;
-
-    std::vector<aiVector3D> positions;
-    std::vector<aiVector3D> normals;
-    std::vector<aiVector3D> tangents;
-    std::vector<std::vector<aiVector3D> > uvs;
-};
-
-/// Ogre XML Index Data
-class IndexDataXml
-{
-public:
-    IndexDataXml() : faceCount(0) {}
-
-    /// Face count.
-    uint32_t faceCount;
-
-    std::vector<aiFace> faces;
-};
-
-/// Ogre XML SubMesh
-class SubMeshXml : public ISubMesh
-{
-public:
-    SubMeshXml();
-    ~SubMeshXml();
-
-    /// Releases all memory that this data structure owns.
-    void Reset();
-
-    aiMesh *ConvertToAssimpMesh(MeshXml *parent);
-
-    IndexDataXml *indexData;
-    VertexDataXml *vertexData;
-};
-typedef std::vector<SubMeshXml*> SubMeshXmlList;
-
-/// Ogre XML Mesh
-class MeshXml
-{
-public:
-    MeshXml();
-    ~MeshXml();
-
-    /// Releases all memory that this data structure owns.
-    void Reset();
-
-    /// Returns number of subMeshes.
-    size_t NumSubMeshes() const;
-
-    /// Returns submesh for @c index.
-    SubMeshXml *GetSubMesh(uint16_t index) const;
-
-    /// Convert mesh to Assimp scene.
-    void ConvertToAssimpScene(aiScene* dest);
-
-    /// Skeleton reference.
-    std::string skeletonRef;
-
-    /// Skeleton.
-    Skeleton *skeleton;
-
-    /// Vertex data
-    VertexDataXml *sharedVertexData;
-
-    /// Sub meshes.
-    SubMeshXmlList subMeshes;
-};
-
-} // Ogre
-} // Assimp
-
-#endif // ASSIMP_BUILD_NO_OGRE_IMPORTER
-#endif // AI_OGRESTRUCTS_H_INC
diff --git a/libs/assimp/code/AssetLib/Ogre/OgreXmlSerializer.cpp b/libs/assimp/code/AssetLib/Ogre/OgreXmlSerializer.cpp
deleted file mode 100644
index 545107e..0000000
--- a/libs/assimp/code/AssetLib/Ogre/OgreXmlSerializer.cpp
+++ /dev/null
@@ -1,755 +0,0 @@
-/*
-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 "OgreXmlSerializer.h"
-#include "OgreBinarySerializer.h"
-#include "OgreParsingUtils.h"
-
-#include <assimp/TinyFormatter.h>
-#include <assimp/DefaultLogger.hpp>
-
-#include <memory>
-
-#ifndef ASSIMP_BUILD_NO_OGRE_IMPORTER
-
-// Define as 1 to get verbose logging.
-#define OGRE_XML_SERIALIZER_DEBUG 0
-
-namespace Assimp {
-namespace Ogre {
-
-//AI_WONT_RETURN void ThrowAttibuteError(const XmlParser *reader, const std::string &name, const std::string &error = "") AI_WONT_RETURN_SUFFIX;
-
-AI_WONT_RETURN void ThrowAttibuteError(const std::string &nodeName, const std::string &name, const std::string &error) {
-    if (!error.empty()) {
-        throw DeadlyImportError(error, " in node '", nodeName, "' and attribute '", name, "'");
-    } else {
-        throw DeadlyImportError("Attribute '", name, "' does not exist in node '", nodeName, "'");
-    }
-}
-
-template <>
-int32_t OgreXmlSerializer::ReadAttribute<int32_t>(XmlNode &xmlNode, const char *name) const {
-    if (!XmlParser::hasAttribute(xmlNode, name)) {
-        ThrowAttibuteError(xmlNode.name(), name, "Not found");
-    }
-    pugi::xml_attribute attr = xmlNode.attribute(name);
-    return static_cast<int32_t>(attr.as_int());
-}
-
-template <>
-uint32_t OgreXmlSerializer::ReadAttribute<uint32_t>(XmlNode &xmlNode, const char *name) const {
-    if (!XmlParser::hasAttribute(xmlNode, name)) {
-        ThrowAttibuteError(xmlNode.name(), name, "Not found");
-    }
-
-    // @note This is hackish. But we are never expecting unsigned values that go outside the
-    //       int32_t range. Just monitor for negative numbers and kill the import.
-    int32_t temp = ReadAttribute<int32_t>(xmlNode, name);
-    if (temp < 0) {
-        ThrowAttibuteError(xmlNode.name(), name, "Found a negative number value where expecting a uint32_t value");
-    }
-
-    return static_cast<uint32_t>(temp);
-}
-
-template <>
-uint16_t OgreXmlSerializer::ReadAttribute<uint16_t>(XmlNode &xmlNode, const char *name) const {
-    if (!XmlParser::hasAttribute(xmlNode, name)) {
-        ThrowAttibuteError(xmlNode.name(), name, "Not found");
-    }
-
-    return static_cast<uint16_t>(xmlNode.attribute(name).as_int());
-}
-
-template <>
-float OgreXmlSerializer::ReadAttribute<float>(XmlNode &xmlNode, const char *name) const {
-    if (!XmlParser::hasAttribute(xmlNode, name)) {
-        ThrowAttibuteError(xmlNode.name(), name, "Not found");
-    }
-
-    return xmlNode.attribute(name).as_float();
-}
-
-template <>
-std::string OgreXmlSerializer::ReadAttribute<std::string>(XmlNode &xmlNode, const char *name) const {
-    if (!XmlParser::hasAttribute(xmlNode, name)) {
-        ThrowAttibuteError(xmlNode.name(), name, "Not found");
-    }
-
-    return xmlNode.attribute(name).as_string();
-}
-
-template <>
-bool OgreXmlSerializer::ReadAttribute<bool>(XmlNode &xmlNode, const char *name) const {
-    std::string value = ai_tolower(ReadAttribute<std::string>(xmlNode, name));
-    if (ASSIMP_stricmp(value, "true") == 0) {
-        return true;
-    } else if (ASSIMP_stricmp(value, "false") == 0) {
-        return false;
-    }
-
-    ThrowAttibuteError(xmlNode.name(), name, "Boolean value is expected to be 'true' or 'false', encountered '" + value + "'");
-    return false;
-}
-
-// Mesh XML constants
-
-// <mesh>
-static const char *nnMesh = "mesh";
-static const char *nnSharedGeometry = "sharedgeometry";
-static const char *nnSubMeshes = "submeshes";
-static const char *nnSubMesh = "submesh";
-//static const char *nnSubMeshNames = "submeshnames";
-static const char *nnSkeletonLink = "skeletonlink";
-//static const char *nnLOD = "levelofdetail";
-//static const char *nnExtremes = "extremes";
-//static const char *nnPoses = "poses";
-static const char *nnAnimations = "animations";
-
-// <submesh>
-static const char *nnFaces = "faces";
-static const char *nnFace = "face";
-static const char *nnGeometry = "geometry";
-//static const char *nnTextures = "textures";
-
-// <mesh/submesh>
-static const char *nnBoneAssignments = "boneassignments";
-
-// <sharedgeometry/geometry>
-static const char *nnVertexBuffer = "vertexbuffer";
-
-// <vertexbuffer>
-//static const char *nnVertex = "vertex";
-static const char *nnPosition = "position";
-static const char *nnNormal = "normal";
-static const char *nnTangent = "tangent";
-//static const char *nnBinormal = "binormal";
-static const char *nnTexCoord = "texcoord";
-//static const char *nnColorDiffuse = "colour_diffuse";
-//static const char *nnColorSpecular = "colour_specular";
-
-// <boneassignments>
-static const char *nnVertexBoneAssignment = "vertexboneassignment";
-
-// Skeleton XML constants
-
-// <skeleton>
-static const char *nnSkeleton = "skeleton";
-static const char *nnBones = "bones";
-static const char *nnBoneHierarchy = "bonehierarchy";
-//static const char *nnAnimationLinks = "animationlinks";
-
-// <bones>
-static const char *nnBone = "bone";
-static const char *nnRotation = "rotation";
-static const char *nnAxis = "axis";
-static const char *nnScale = "scale";
-
-// <bonehierarchy>
-static const char *nnBoneParent = "boneparent";
-
-// <animations>
-static const char *nnAnimation = "animation";
-static const char *nnTracks = "tracks";
-
-// <tracks>
-static const char *nnTrack = "track";
-static const char *nnKeyFrames = "keyframes";
-static const char *nnKeyFrame = "keyframe";
-static const char *nnTranslate = "translate";
-static const char *nnRotate = "rotate";
-
-// Common XML constants
-static const char *anX = "x";
-static const char *anY = "y";
-static const char *anZ = "z";
-
-// Mesh
-
-OgreXmlSerializer::OgreXmlSerializer(XmlParser *parser) :
-        mParser(parser) {
-    // empty
-}
-
-MeshXml *OgreXmlSerializer::ImportMesh(XmlParser *parser) {
-    if (nullptr == parser) {
-        return nullptr;
-    }
-
-    OgreXmlSerializer serializer(parser);
-
-    MeshXml *mesh = new MeshXml();
-    serializer.ReadMesh(mesh);
-
-    return mesh;
-}
-
-void OgreXmlSerializer::ReadMesh(MeshXml *mesh) {
-    XmlNode root = mParser->getRootNode();
-    if (nullptr == root) {
-        throw DeadlyImportError("Root node is <" + std::string(root.name()) + "> expecting <mesh>");
-    }
-
-    XmlNode startNode = root.child(nnMesh);
-    if (startNode.empty()) {
-        throw DeadlyImportError("Root node is <" + std::string(root.name()) + "> expecting <mesh>");
-    }
-    for (XmlNode currentNode : startNode.children()) {
-        const std::string currentName = currentNode.name();
-        if (currentName == nnSharedGeometry) {
-            mesh->sharedVertexData = new VertexDataXml();
-            ReadGeometry(currentNode, mesh->sharedVertexData);
-        } else if (currentName == nnSubMeshes) {
-            for (XmlNode &subMeshesNode : currentNode.children()) {
-                const std::string &currentSMName = subMeshesNode.name();
-                if (currentSMName == nnSubMesh) {
-                    ReadSubMesh(subMeshesNode, mesh);
-                }
-            }
-        } else if (currentName == nnBoneAssignments) {
-            ReadBoneAssignments(currentNode, mesh->sharedVertexData);
-        } else if (currentName == nnSkeletonLink) {
-        }
-    }
-
-    ASSIMP_LOG_VERBOSE_DEBUG("Reading Mesh");
-}
-
-void OgreXmlSerializer::ReadGeometry(XmlNode &node, VertexDataXml *dest) {
-    dest->count = ReadAttribute<uint32_t>(node, "vertexcount");
-    ASSIMP_LOG_VERBOSE_DEBUG("  - Reading geometry of ", dest->count, " vertices");
-
-    for (XmlNode currentNode : node.children()) {
-        const std::string &currentName = currentNode.name();
-        if (currentName == nnVertexBuffer) {
-            ReadGeometryVertexBuffer(currentNode, dest);
-        }
-    }
-}
-
-void OgreXmlSerializer::ReadGeometryVertexBuffer(XmlNode &node, VertexDataXml *dest) {
-    bool positions = (XmlParser::hasAttribute(node, "positions") && ReadAttribute<bool>(node, "positions"));
-    bool normals = (XmlParser::hasAttribute(node, "normals") && ReadAttribute<bool>(node, "normals"));
-    bool tangents = (XmlParser::hasAttribute(node, "tangents") && ReadAttribute<bool>(node, "tangents"));
-    uint32_t uvs = (XmlParser::hasAttribute(node, "texture_coords") ? ReadAttribute<uint32_t>(node, "texture_coords") : 0);
-
-    // Not having positions is a error only if a previous vertex buffer did not have them.
-    if (!positions && !dest->HasPositions()) {
-        throw DeadlyImportError("Vertex buffer does not contain positions!");
-    }
-
-    if (positions) {
-        ASSIMP_LOG_VERBOSE_DEBUG("    - Contains positions");
-        dest->positions.reserve(dest->count);
-    }
-    if (normals) {
-        ASSIMP_LOG_VERBOSE_DEBUG("    - Contains normals");
-        dest->normals.reserve(dest->count);
-    }
-    if (tangents) {
-        ASSIMP_LOG_VERBOSE_DEBUG("    - Contains tangents");
-        dest->tangents.reserve(dest->count);
-    }
-    if (uvs > 0) {
-        ASSIMP_LOG_VERBOSE_DEBUG("    - Contains ", uvs, " texture coords");
-        dest->uvs.resize(uvs);
-        for (size_t i = 0, len = dest->uvs.size(); i < len; ++i) {
-            dest->uvs[i].reserve(dest->count);
-        }
-    }
-
-    for (XmlNode currentNode : node.children("vertex")) {
-        for (XmlNode vertexNode : currentNode.children()) {
-            const std::string &currentName = vertexNode.name();
-            if (positions && currentName == nnPosition) {
-                aiVector3D pos;
-                pos.x = ReadAttribute<float>(vertexNode, anX);
-                pos.y = ReadAttribute<float>(vertexNode, anY);
-                pos.z = ReadAttribute<float>(vertexNode, anZ);
-                dest->positions.push_back(pos);
-            } else if (normals && currentName == nnNormal) {
-                aiVector3D normal;
-                normal.x = ReadAttribute<float>(vertexNode, anX);
-                normal.y = ReadAttribute<float>(vertexNode, anY);
-                normal.z = ReadAttribute<float>(vertexNode, anZ);
-                dest->normals.push_back(normal);
-            } else if (tangents && currentName == nnTangent) {
-                aiVector3D tangent;
-                tangent.x = ReadAttribute<float>(vertexNode, anX);
-                tangent.y = ReadAttribute<float>(vertexNode, anY);
-                tangent.z = ReadAttribute<float>(vertexNode, anZ);
-                dest->tangents.push_back(tangent);
-            } else if (uvs > 0 && currentName == nnTexCoord) {
-                for (auto &curUvs : dest->uvs) {
-                    aiVector3D uv;
-                    uv.x = ReadAttribute<float>(vertexNode, "u");
-                    uv.y = (ReadAttribute<float>(vertexNode, "v") * -1) + 1; // Flip UV from Ogre to Assimp form
-                    curUvs.push_back(uv);
-                }
-            }
-        }
-    }
-
-    // Sanity checks
-    if (dest->positions.size() != dest->count) {
-        throw DeadlyImportError("Read only ", dest->positions.size(), " positions when should have read ", dest->count);
-    }
-    if (normals && dest->normals.size() != dest->count) {
-        throw DeadlyImportError("Read only ", dest->normals.size(), " normals when should have read ", dest->count);
-    }
-    if (tangents && dest->tangents.size() != dest->count) {
-        throw DeadlyImportError("Read only ", dest->tangents.size(), " tangents when should have read ", dest->count);
-    }
-    for (unsigned int i = 0; i < dest->uvs.size(); ++i) {
-        if (dest->uvs[i].size() != dest->count) {
-            throw DeadlyImportError("Read only ", dest->uvs[i].size(),
-                    " uvs for uv index ", i, " when should have read ", dest->count);
-        }
-    }
-}
-
-void OgreXmlSerializer::ReadSubMesh(XmlNode &node, MeshXml *mesh) {
-    static const char *anMaterial = "material";
-    static const char *anUseSharedVertices = "usesharedvertices";
-    static const char *anCount = "count";
-    static const char *anV1 = "v1";
-    static const char *anV2 = "v2";
-    static const char *anV3 = "v3";
-    static const char *anV4 = "v4";
-
-    SubMeshXml *submesh = new SubMeshXml();
-
-    if (XmlParser::hasAttribute(node, anMaterial)) {
-        submesh->materialRef = ReadAttribute<std::string>(node, anMaterial);
-    }
-    if (XmlParser::hasAttribute(node, anUseSharedVertices)) {
-        submesh->usesSharedVertexData = ReadAttribute<bool>(node, anUseSharedVertices);
-    }
-
-    ASSIMP_LOG_VERBOSE_DEBUG("Reading SubMesh ", mesh->subMeshes.size());
-    ASSIMP_LOG_VERBOSE_DEBUG("  - Material: '", submesh->materialRef, "'");
-    ASSIMP_LOG_VERBOSE_DEBUG("  - Uses shared geometry: ", (submesh->usesSharedVertexData ? "true" : "false"));
-
-    // TODO: maybe we have always just 1 faces and 1 geometry and always in this order. this loop will only work correct, when the order
-    // of faces and geometry changed, and not if we have more than one of one
-    /// @todo Fix above comment with better read logic below
-
-    bool quadWarned = false;
-
-    for (XmlNode &currentNode : node.children()) {
-        const std::string &currentName = currentNode.name();
-        if (currentName == nnFaces) {
-            submesh->indexData->faceCount = ReadAttribute<uint32_t>(currentNode, anCount);
-            submesh->indexData->faces.reserve(submesh->indexData->faceCount);
-            for (XmlNode currentChildNode : currentNode.children()) {
-                const std::string &currentChildName = currentChildNode.name();
-                if (currentChildName == nnFace) {
-                    aiFace face;
-                    face.mNumIndices = 3;
-                    face.mIndices = new unsigned int[3];
-                    face.mIndices[0] = ReadAttribute<uint32_t>(currentChildNode, anV1);
-                    face.mIndices[1] = ReadAttribute<uint32_t>(currentChildNode, anV2);
-                    face.mIndices[2] = ReadAttribute<uint32_t>(currentChildNode, anV3);
-                    /// @todo Support quads if Ogre even supports them in XML (I'm not sure but I doubt it)
-                    if (!quadWarned && XmlParser::hasAttribute(currentChildNode, anV4)) {
-                        ASSIMP_LOG_WARN("Submesh <face> has quads with <v4>, only triangles are supported at the moment!");
-                        quadWarned = true;
-                    }
-                    submesh->indexData->faces.push_back(face);
-                }
-            }
-            if (submesh->indexData->faces.size() == submesh->indexData->faceCount) {
-                ASSIMP_LOG_VERBOSE_DEBUG("  - Faces ", submesh->indexData->faceCount);
-            } else {
-                throw DeadlyImportError("Read only ", submesh->indexData->faces.size(), " faces when should have read ", submesh->indexData->faceCount);
-            }
-        } else if (currentName == nnGeometry) {
-            if (submesh->usesSharedVertexData) {
-                throw DeadlyImportError("Found <geometry> in <submesh> when use shared geometry is true. Invalid mesh file.");
-            }
-
-            submesh->vertexData = new VertexDataXml();
-            ReadGeometry(currentNode, submesh->vertexData);
-        } else if (currentName == nnBoneAssignments) {
-            ReadBoneAssignments(currentNode, submesh->vertexData);
-        }
-    }
-
-    submesh->index = static_cast<unsigned int>(mesh->subMeshes.size());
-    mesh->subMeshes.push_back(submesh);
-}
-
-void OgreXmlSerializer::ReadBoneAssignments(XmlNode &node, VertexDataXml *dest) {
-    if (!dest) {
-        throw DeadlyImportError("Cannot read bone assignments, vertex data is null.");
-    }
-
-    static const char *anVertexIndex = "vertexindex";
-    static const char *anBoneIndex = "boneindex";
-    static const char *anWeight = "weight";
-
-    std::set<uint32_t> influencedVertices;
-    for (XmlNode &currentNode : node.children()) {
-        const std::string &currentName = currentNode.name();
-        if (currentName == nnVertexBoneAssignment) {
-            VertexBoneAssignment ba;
-            ba.vertexIndex = ReadAttribute<uint32_t>(currentNode, anVertexIndex);
-            ba.boneIndex = ReadAttribute<uint16_t>(currentNode, anBoneIndex);
-            ba.weight = ReadAttribute<float>(currentNode, anWeight);
-
-            dest->boneAssignments.push_back(ba);
-            influencedVertices.insert(ba.vertexIndex);
-        }
-    }
-
-    /** Normalize bone weights.
-        Some exporters won't care if the sum of all bone weights
-        for a single vertex equals 1 or not, so validate here. */
-    const float epsilon = 0.05f;
-    for (const uint32_t vertexIndex : influencedVertices) {
-        float sum = 0.0f;
-        for (VertexBoneAssignmentList::const_iterator baIter = dest->boneAssignments.begin(), baEnd = dest->boneAssignments.end(); baIter != baEnd; ++baIter) {
-            if (baIter->vertexIndex == vertexIndex)
-                sum += baIter->weight;
-        }
-        if ((sum < (1.0f - epsilon)) || (sum > (1.0f + epsilon))) {
-            for (auto &boneAssign : dest->boneAssignments) {
-                if (boneAssign.vertexIndex == vertexIndex)
-                    boneAssign.weight /= sum;
-            }
-        }
-    }
-
-    ASSIMP_LOG_VERBOSE_DEBUG("  - ", dest->boneAssignments.size(), " bone assignments");
-}
-
-// Skeleton
-
-bool OgreXmlSerializer::ImportSkeleton(Assimp::IOSystem *pIOHandler, MeshXml *mesh) {
-    if (!mesh || mesh->skeletonRef.empty())
-        return false;
-
-    // Highly unusual to see in read world cases but support
-    // XML mesh referencing a binary skeleton file.
-    if (EndsWith(mesh->skeletonRef, ".skeleton", false)) {
-        if (OgreBinarySerializer::ImportSkeleton(pIOHandler, mesh))
-            return true;
-
-        /** Last fallback if .skeleton failed to be read. Try reading from
-            .skeleton.xml even if the XML file referenced a binary skeleton.
-            @note This logic was in the previous version and I don't want to break
-            old code that might depends on it. */
-        mesh->skeletonRef = mesh->skeletonRef + ".xml";
-    }
-
-    XmlParserPtr xmlParser = OpenXmlParser(pIOHandler, mesh->skeletonRef);
-    if (!xmlParser.get())
-        return false;
-
-    Skeleton *skeleton = new Skeleton();
-    OgreXmlSerializer serializer(xmlParser.get());
-    XmlNode root = xmlParser->getRootNode();
-    serializer.ReadSkeleton(root, skeleton);
-    mesh->skeleton = skeleton;
-    return true;
-}
-
-bool OgreXmlSerializer::ImportSkeleton(Assimp::IOSystem *pIOHandler, Mesh *mesh) {
-    if (!mesh || mesh->skeletonRef.empty()) {
-        return false;
-    }
-
-    XmlParserPtr xmlParser = OpenXmlParser(pIOHandler, mesh->skeletonRef);
-    if (!xmlParser.get()) {
-        return false;
-    }
-
-    Skeleton *skeleton = new Skeleton();
-    OgreXmlSerializer serializer(xmlParser.get());
-    XmlNode root = xmlParser->getRootNode();
-
-    serializer.ReadSkeleton(root, skeleton);
-    mesh->skeleton = skeleton;
-
-    return true;
-}
-
-XmlParserPtr OgreXmlSerializer::OpenXmlParser(Assimp::IOSystem *pIOHandler, const std::string &filename) {
-    if (!EndsWith(filename, ".skeleton.xml", false)) {
-        ASSIMP_LOG_ERROR("Imported Mesh is referencing to unsupported '", filename, "' skeleton file.");
-        return XmlParserPtr();
-    }
-
-    if (!pIOHandler->Exists(filename)) {
-        ASSIMP_LOG_ERROR("Failed to find skeleton file '", filename, "' that is referenced by imported Mesh.");
-        return XmlParserPtr();
-    }
-
-    std::unique_ptr<IOStream> file(pIOHandler->Open(filename));
-    if (!file.get()) {
-        throw DeadlyImportError("Failed to open skeleton file ", filename);
-    }
-
-    XmlParserPtr xmlParser = std::make_shared<XmlParser>();
-    if (!xmlParser->parse(file.get())) {
-        throw DeadlyImportError("Failed to create XML reader for skeleton file " + filename);
-    }
-    return xmlParser;
-}
-
-void OgreXmlSerializer::ReadSkeleton(XmlNode &node, Skeleton *skeleton) {
-    if (node.name() != nnSkeleton) {
-        throw DeadlyImportError("Root node is <" + std::string(node.name()) + "> expecting <skeleton>");
-    }
-
-    ASSIMP_LOG_VERBOSE_DEBUG("Reading Skeleton");
-
-    // Optional blend mode from root node
-    if (XmlParser::hasAttribute(node, "blendmode")) {
-        skeleton->blendMode = (ai_tolower(ReadAttribute<std::string>(node, "blendmode")) == "cumulative" ? Skeleton::ANIMBLEND_CUMULATIVE : Skeleton::ANIMBLEND_AVERAGE);
-    }
-
-    for (XmlNode &currentNode : node.children()) {
-        const std::string currentName = currentNode.name();
-        if (currentName == nnBones) {
-            ReadBones(currentNode, skeleton);
-        } else if (currentName == nnBoneHierarchy) {
-            ReadBoneHierarchy(currentNode, skeleton);
-        } else if (currentName == nnAnimations) {
-            ReadAnimations(currentNode, skeleton);
-        }
-    }
-}
-
-void OgreXmlSerializer::ReadAnimations(XmlNode &node, Skeleton *skeleton) {
-    if (skeleton->bones.empty()) {
-        throw DeadlyImportError("Cannot read <animations> for a Skeleton without bones");
-    }
-
-    ASSIMP_LOG_VERBOSE_DEBUG("  - Animations");
-
-    for (XmlNode &currentNode : node.children()) {
-        const std::string currentName = currentNode.name();
-        if (currentName == nnAnimation) {
-            Animation *anim = new Animation(skeleton);
-            anim->name = ReadAttribute<std::string>(currentNode, "name");
-            anim->length = ReadAttribute<float>(currentNode, "length");
-            for (XmlNode &currentChildNode : currentNode.children()) {
-                const std::string currentChildName = currentNode.name();
-                if (currentChildName == nnTracks) {
-                    ReadAnimationTracks(currentChildNode, anim);
-                    skeleton->animations.push_back(anim);
-                } else {
-                    throw DeadlyImportError("No <tracks> found in <animation> ", anim->name);
-                }
-            }
-        }
-    }
-}
-
-void OgreXmlSerializer::ReadAnimationTracks(XmlNode &node, Animation *dest) {
-    for (XmlNode &currentNode : node.children()) {
-        const std::string currentName = currentNode.name();
-        if (currentName == nnTrack) {
-            VertexAnimationTrack track;
-            track.type = VertexAnimationTrack::VAT_TRANSFORM;
-            track.boneName = ReadAttribute<std::string>(currentNode, "bone");
-            for (XmlNode &currentChildNode : currentNode.children()) {
-                const std::string currentChildName = currentNode.name();
-                if (currentChildName == nnKeyFrames) {
-                    ReadAnimationKeyFrames(currentChildNode, dest, &track);
-                    dest->tracks.push_back(track);
-                } else {
-                    throw DeadlyImportError("No <keyframes> found in <track> ", dest->name);
-                }
-            }
-        }
-    }
-}
-
-void OgreXmlSerializer::ReadAnimationKeyFrames(XmlNode &node, Animation *anim, VertexAnimationTrack *dest) {
-    const aiVector3D zeroVec(0.f, 0.f, 0.f);
-    for (XmlNode &currentNode : node.children()) {
-        TransformKeyFrame keyframe;
-        const std::string currentName = currentNode.name();
-        if (currentName == nnKeyFrame) {
-            keyframe.timePos = ReadAttribute<float>(currentNode, "time");
-            for (XmlNode &currentChildNode : currentNode.children()) {
-                const std::string currentChildName = currentNode.name();
-                if (currentChildName == nnTranslate) {
-                    keyframe.position.x = ReadAttribute<float>(currentChildNode, anX);
-                    keyframe.position.y = ReadAttribute<float>(currentChildNode, anY);
-                    keyframe.position.z = ReadAttribute<float>(currentChildNode, anZ);
-                } else if (currentChildName == nnRotate) {
-                    float angle = ReadAttribute<float>(currentChildNode, "angle");
-                    for (XmlNode &currentChildChildNode : currentNode.children()) {
-                        const std::string currentChildChildName = currentNode.name();
-                        if (currentChildChildName == nnAxis) {
-                            aiVector3D axis;
-                            axis.x = ReadAttribute<float>(currentChildChildNode, anX);
-                            axis.y = ReadAttribute<float>(currentChildChildNode, anY);
-                            axis.z = ReadAttribute<float>(currentChildChildNode, anZ);
-                            if (axis.Equal(zeroVec)) {
-                                axis.x = 1.0f;
-                                if (angle != 0) {
-                                    ASSIMP_LOG_WARN("Found invalid a key frame with a zero rotation axis in animation: ", anim->name);
-                                }
-                            }
-                            keyframe.rotation = aiQuaternion(axis, angle);
-                        }
-                    }
-                } else if (currentChildName == nnScale) {
-                    keyframe.scale.x = ReadAttribute<float>(currentChildNode, anX);
-                    keyframe.scale.y = ReadAttribute<float>(currentChildNode, anY);
-                    keyframe.scale.z = ReadAttribute<float>(currentChildNode, anZ);
-                }
-            }
-        }
-        dest->transformKeyFrames.push_back(keyframe);
-    }
-}
-
-void OgreXmlSerializer::ReadBoneHierarchy(XmlNode &node, Skeleton *skeleton) {
-    if (skeleton->bones.empty()) {
-        throw DeadlyImportError("Cannot read <bonehierarchy> for a Skeleton without bones");
-    }
-
-    for (XmlNode &currentNode : node.children()) {
-        const std::string currentName = currentNode.name();
-        if (currentName == nnBoneParent) {
-            const std::string name = ReadAttribute<std::string>(currentNode, "bone");
-            const std::string parentName = ReadAttribute<std::string>(currentNode, "parent");
-
-            Bone *bone = skeleton->BoneByName(name);
-            Bone *parent = skeleton->BoneByName(parentName);
-
-            if (bone && parent) {
-                parent->AddChild(bone);
-            } else {
-                throw DeadlyImportError("Failed to find bones for parenting: Child ", name, " for parent ", parentName);
-            }
-        }
-    }
-
-    // Calculate bone matrices for root bones. Recursively calculates their children.
-    for (size_t i = 0, len = skeleton->bones.size(); i < len; ++i) {
-        Bone *bone = skeleton->bones[i];
-        if (!bone->IsParented())
-            bone->CalculateWorldMatrixAndDefaultPose(skeleton);
-    }
-}
-
-static bool BoneCompare(Bone *a, Bone *b) {
-    ai_assert(nullptr != a);
-    ai_assert(nullptr != b);
-
-    return (a->id < b->id);
-}
-
-void OgreXmlSerializer::ReadBones(XmlNode &node, Skeleton *skeleton) {
-    ASSIMP_LOG_VERBOSE_DEBUG("  - Bones");
-
-    for (XmlNode &currentNode : node.children()) {
-        const std::string currentName = currentNode.name();
-        if (currentName == nnBone) {
-            Bone *bone = new Bone();
-            bone->id = ReadAttribute<uint16_t>(currentNode, "id");
-            bone->name = ReadAttribute<std::string>(currentNode, "name");
-            for (XmlNode &currentChildNode : currentNode.children()) {
-                const std::string currentChildName = currentNode.name();
-                if (currentChildName == nnRotation) {
-                    bone->position.x = ReadAttribute<float>(currentChildNode, anX);
-                    bone->position.y = ReadAttribute<float>(currentChildNode, anY);
-                    bone->position.z = ReadAttribute<float>(currentChildNode, anZ);
-                } else if (currentChildName == nnScale) {
-                    float angle = ReadAttribute<float>(currentChildNode, "angle");
-                    for (XmlNode currentChildChildNode : currentChildNode.children()) {
-                        const std::string &currentChildChildName = currentChildChildNode.name();
-                        if (currentChildChildName == nnAxis) {
-                            aiVector3D axis;
-                            axis.x = ReadAttribute<float>(currentChildChildNode, anX);
-                            axis.y = ReadAttribute<float>(currentChildChildNode, anY);
-                            axis.z = ReadAttribute<float>(currentChildChildNode, anZ);
-
-                            bone->rotation = aiQuaternion(axis, angle);
-                        } else {
-                            throw DeadlyImportError("No axis specified for bone rotation in bone ", bone->id);
-                        }
-                    }
-                } else if (currentChildName == nnScale) {
-                    if (XmlParser::hasAttribute(currentChildNode, "factor")) {
-                        float factor = ReadAttribute<float>(currentChildNode, "factor");
-                        bone->scale.Set(factor, factor, factor);
-                    } else {
-                        if (XmlParser::hasAttribute(currentChildNode, anX))
-                            bone->scale.x = ReadAttribute<float>(currentChildNode, anX);
-                        if (XmlParser::hasAttribute(currentChildNode, anY))
-                            bone->scale.y = ReadAttribute<float>(currentChildNode, anY);
-                        if (XmlParser::hasAttribute(currentChildNode, anZ))
-                            bone->scale.z = ReadAttribute<float>(currentChildNode, anZ);
-                    }
-                }
-            }
-            skeleton->bones.push_back(bone);
-        }
-    }
-
-    // Order bones by Id
-    std::sort(skeleton->bones.begin(), skeleton->bones.end(), BoneCompare);
-
-    // Validate that bone indexes are not skipped.
-    /** @note Left this from original authors code, but not sure if this is strictly necessary
-        as per the Ogre skeleton spec. It might be more that other (later) code in this imported does not break. */
-    for (size_t i = 0, len = skeleton->bones.size(); i < len; ++i) {
-        Bone *b = skeleton->bones[i];
-        ASSIMP_LOG_VERBOSE_DEBUG("    ", b->id, " ", b->name);
-
-        if (b->id != static_cast<uint16_t>(i)) {
-            throw DeadlyImportError("Bone ids are not in sequence starting from 0. Missing index ", i);
-        }
-    }
-}
-
-} // namespace Ogre
-} // namespace Assimp
-
-#endif // ASSIMP_BUILD_NO_OGRE_IMPORTER
diff --git a/libs/assimp/code/AssetLib/Ogre/OgreXmlSerializer.h b/libs/assimp/code/AssetLib/Ogre/OgreXmlSerializer.h
deleted file mode 100644
index 406681f..0000000
--- a/libs/assimp/code/AssetLib/Ogre/OgreXmlSerializer.h
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
-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 AI_OGREXMLSERIALIZER_H_INC
-#define AI_OGREXMLSERIALIZER_H_INC
-
-#ifndef ASSIMP_BUILD_NO_OGRE_IMPORTER
-
-#include "OgreStructs.h"
-#include <assimp/XmlParser.h>
-
-namespace Assimp {
-
-namespace Ogre {
-
-using XmlParserPtr = std::shared_ptr<::Assimp::XmlParser> ;
-
-class OgreXmlSerializer {
-public:
-    /// Imports mesh and returns the result.
-    /// @note Fatal unrecoverable errors will throw a DeadlyImportError.
-    static MeshXml *ImportMesh(XmlParser *parser);
-
-    /// Imports skeleton to @c mesh.
-    /// If mesh does not have a skeleton reference or the skeleton file
-    /// cannot be found it is not a fatal DeadlyImportError.
-    /// @return If skeleton import was successful.
-    static bool ImportSkeleton(IOSystem *pIOHandler, MeshXml *mesh);
-    static bool ImportSkeleton(IOSystem *pIOHandler, Mesh *mesh);
-
-private:
-    explicit OgreXmlSerializer(XmlParser *xmlParser);
-
-    static XmlParserPtr OpenXmlParser(Assimp::IOSystem *pIOHandler, const std::string &filename);
-
-    // Mesh
-    void ReadMesh(MeshXml *mesh);
-    void ReadSubMesh(XmlNode &node, MeshXml *mesh);
-    void ReadGeometry(XmlNode &node, VertexDataXml *dest);
-    void ReadGeometryVertexBuffer(XmlNode &node, VertexDataXml *dest);
-    void ReadBoneAssignments(XmlNode &node, VertexDataXml *dest);
-
-    // Skeleton
-    void ReadSkeleton(XmlNode &node, Skeleton *skeleton);
-    void ReadBones(XmlNode &node, Skeleton *skeleton);
-    void ReadBoneHierarchy(XmlNode &node, Skeleton *skeleton);
-    void ReadAnimations(XmlNode &node, Skeleton *skeleton);
-    void ReadAnimationTracks(XmlNode &node, Animation *dest);
-    void ReadAnimationKeyFrames(XmlNode &node, Animation *anim, VertexAnimationTrack *dest);
-
-    template <typename T>
-    T ReadAttribute(XmlNode &xmlNode, const char *name) const;
-
-private:
-    XmlParser *mParser;
-};
-
-
-} // namespace Ogre
-} // namespace Assimp
-
-#endif // ASSIMP_BUILD_NO_OGRE_IMPORTER
-#endif // AI_OGREXMLSERIALIZER_H_INC
-- 
cgit v1.2.1