From b00de10eb39a269b889936ef67dab1d12b053534 Mon Sep 17 00:00:00 2001 From: Krishty Date: Sat, 24 Apr 2021 00:17:50 +0200 Subject: [PATCH 01/83] Simplified importer search and fixed a few bugs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The search for a matching importer had a few issues, see #3791. There were two different mechanisms to determine whether an importer accepts a specific file extension: 1. `aiImporterDesc::mFileExtensions`, which was forwarded to the UI via `BaseImporter::GetExtensionList()`. 2. `BaseImporter::CanRead()` when called with `checkSig == false`, which determines whether to actually use that importer. Both were redundant and got out of sync repeatedly. I removed 2. completely and replaced it with 1., thereby syncing UI/import and shortening all `BaseImporter::CanRead()` implementations. Further bugfixes: - fixed glTF2 importer throwing exceptions when checking whether it can load a file - removed `BaseImporter::SimpleExtensionCheck()` because it is no longer used and had a bug with case sensitivity Since the `checkSig` parameter in `BaseImporter::CanRead()` is now useless, it can be removed completely. I’m not sure if this would break ABI compatiblity, so I’ll submit it with a later pull request. --- code/AssetLib/3DS/3DSLoader.cpp | 17 ++----- code/AssetLib/3MF/D3MFImporter.cpp | 20 ++------ code/AssetLib/AC/ACLoader.cpp | 15 ++---- code/AssetLib/AMF/AMFImporter.cpp | 16 ++---- code/AssetLib/ASE/ASELoader.cpp | 16 ++---- code/AssetLib/B3D/B3DImporter.cpp | 15 +----- code/AssetLib/BVH/BVHLoader.cpp | 15 ++---- code/AssetLib/Blender/BlenderLoader.cpp | 15 ++---- code/AssetLib/C4D/C4DImporter.cpp | 10 +--- code/AssetLib/COB/COBLoader.cpp | 14 ++---- code/AssetLib/CSM/CSMLoader.cpp | 15 ++---- code/AssetLib/Collada/ColladaLoader.cpp | 35 +++----------- code/AssetLib/DXF/DXFLoader.cpp | 15 ++---- code/AssetLib/FBX/FBXImporter.cpp | 16 ++---- code/AssetLib/HMP/HMPLoader.cpp | 21 +++----- code/AssetLib/IFC/IFCLoader.cpp | 19 +++----- code/AssetLib/Irr/IRRLoader.cpp | 20 ++------ code/AssetLib/Irr/IRRMeshLoader.cpp | 26 +++------- code/AssetLib/LWO/LWOLoader.cpp | 22 +++------ code/AssetLib/LWS/LWSLoader.cpp | 20 +++----- code/AssetLib/M3D/M3DImporter.cpp | 45 ++++++----------- code/AssetLib/MD2/MD2Loader.cpp | 15 ++---- code/AssetLib/MD3/MD3Loader.cpp | 15 ++---- code/AssetLib/MD5/MD5Loader.cpp | 17 ++----- code/AssetLib/MDC/MDCLoader.cpp | 16 ++---- code/AssetLib/MDL/MDLLoader.cpp | 29 +++++------ code/AssetLib/MMD/MMDImporter.cpp | 11 ++--- code/AssetLib/MS3D/MS3DLoader.cpp | 20 ++------ code/AssetLib/NDO/NDOLoader.cpp | 15 ++---- code/AssetLib/NFF/NFFLoader.cpp | 2 +- code/AssetLib/OFF/OFFLoader.cpp | 15 ++---- code/AssetLib/Obj/ObjFileImporter.cpp | 14 ++---- code/AssetLib/Ogre/OgreImporter.cpp | 12 ++--- code/AssetLib/OpenGEX/OpenGEXImporter.cpp | 13 ++--- code/AssetLib/Ply/PlyLoader.cpp | 21 ++------ code/AssetLib/Q3BSP/Q3BSPFileImporter.cpp | 8 +-- code/AssetLib/Q3D/Q3DLoader.cpp | 15 ++---- code/AssetLib/Raw/RawLoader.cpp | 4 +- code/AssetLib/SIB/SIBImporter.cpp | 4 +- code/AssetLib/SMD/SMDLoader.cpp | 4 +- code/AssetLib/STL/STLLoader.cpp | 17 ++----- code/AssetLib/Terragen/TerragenLoader.cpp | 24 ++------- code/AssetLib/Unreal/UnrealLoader.cpp | 4 +- code/AssetLib/X/XFileImporter.cpp | 14 ++---- code/AssetLib/X3D/X3DImporter.cpp | 9 +--- code/AssetLib/XGL/XGLLoader.cpp | 20 ++------ code/AssetLib/glTF/glTFImporter.cpp | 22 +++------ code/AssetLib/glTF2/glTF2Importer.cpp | 14 ++---- code/Common/BaseImporter.cpp | 30 +----------- code/Common/Importer.cpp | 59 ++++++++++++++++++++--- include/assimp/BaseImporter.h | 35 +++----------- 51 files changed, 246 insertions(+), 659 deletions(-) diff --git a/code/AssetLib/3DS/3DSLoader.cpp b/code/AssetLib/3DS/3DSLoader.cpp index 0a64f6870..b690f557d 100644 --- a/code/AssetLib/3DS/3DSLoader.cpp +++ b/code/AssetLib/3DS/3DSLoader.cpp @@ -111,20 +111,9 @@ Discreet3DSImporter::~Discreet3DSImporter() { // ------------------------------------------------------------------------------------------------ // Returns whether the class can handle the format of the given file. -bool Discreet3DSImporter::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool checkSig) const { - std::string extension = GetExtension(pFile); - if (extension == "3ds" || extension == "prj") { - return true; - } - - if (!extension.length() || checkSig) { - uint16_t token[3]; - token[0] = 0x4d4d; - token[1] = 0x3dc2; - //token[2] = 0x3daa; - return CheckMagicToken(pIOHandler, pFile, token, 2, 0, 2); - } - return false; +bool Discreet3DSImporter::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool /*checkSig*/) const { + static const uint16_t token[] = { 0x4d4d, 0x3dc2 /*, 0x3daa */ }; + return CheckMagicToken(pIOHandler, pFile, token, std::size(token), 0, sizeof token[0]); } // ------------------------------------------------------------------------------------------------ diff --git a/code/AssetLib/3MF/D3MFImporter.cpp b/code/AssetLib/3MF/D3MFImporter.cpp index f4ddb6054..5a3813d2e 100644 --- a/code/AssetLib/3MF/D3MFImporter.cpp +++ b/code/AssetLib/3MF/D3MFImporter.cpp @@ -585,22 +585,12 @@ D3MFImporter::~D3MFImporter() { // empty } -bool D3MFImporter::CanRead(const std::string &filename, IOSystem *pIOHandler, bool checkSig) const { - const std::string extension(GetExtension(filename)); - if (extension == desc.mFileExtensions) { - return true; - } else if (!extension.length() || checkSig) { - if (nullptr == pIOHandler) { - return false; - } - if (!ZipArchiveIOSystem::isZipArchive(pIOHandler, filename)) { - return false; - } - D3MF::D3MFOpcPackage opcPackage(pIOHandler, filename); - return opcPackage.validate(); +bool D3MFImporter::CanRead(const std::string &filename, IOSystem *pIOHandler, bool /*checkSig*/) const { + if (!ZipArchiveIOSystem::isZipArchive(pIOHandler, filename)) { + return false; } - - return false; + D3MF::D3MFOpcPackage opcPackage(pIOHandler, filename); + return opcPackage.validate(); } void D3MFImporter::SetupProperties(const Importer * /*pImp*/) { diff --git a/code/AssetLib/AC/ACLoader.cpp b/code/AssetLib/AC/ACLoader.cpp index cba84e8b0..c259b2eb0 100644 --- a/code/AssetLib/AC/ACLoader.cpp +++ b/code/AssetLib/AC/ACLoader.cpp @@ -152,18 +152,9 @@ AC3DImporter::~AC3DImporter() { // ------------------------------------------------------------------------------------------------ // Returns whether the class can handle the format of the given file. -bool AC3DImporter::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool checkSig) const { - std::string extension = GetExtension(pFile); - - // fixme: are acc and ac3d *really* used? Some sources say they are - if (extension == "ac" || extension == "ac3d" || extension == "acc") { - return true; - } - if (!extension.length() || checkSig) { - uint32_t token = AI_MAKE_MAGIC("AC3D"); - return CheckMagicToken(pIOHandler, pFile, &token, 1, 0); - } - return false; +bool AC3DImporter::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool /*checkSig*/) const { + static const uint32_t tokens[] = { AI_MAKE_MAGIC("AC3D") }; + return CheckMagicToken(pIOHandler, pFile, tokens, std::size(tokens)); } // ------------------------------------------------------------------------------------------------ diff --git a/code/AssetLib/AMF/AMFImporter.cpp b/code/AssetLib/AMF/AMFImporter.cpp index 1a3efba9a..0cc02a2c7 100644 --- a/code/AssetLib/AMF/AMFImporter.cpp +++ b/code/AssetLib/AMF/AMFImporter.cpp @@ -502,19 +502,9 @@ void AMFImporter::ParseNode_Metadata(XmlNode &node) { mNodeElement_List.push_back(ne); // and to node element list because its a new object in graph. } -bool AMFImporter::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool pCheckSig) const { - const std::string extension = GetExtension(pFile); - - if (extension == "amf") { - return true; - } - - if (extension.empty() || pCheckSig) { - const char *tokens[] = { " pStream(pIOHandler->Open(pFile, "rb")); - unsigned char data[4]; - if (4 != pStream->Read(data, 1, 4)) { - return false; - } - return !memcmp(data, "3DMO", 4) /* bin */ -#ifdef M3D_ASCII - || !memcmp(data, "3dmo", 4) /* ASCII */ -#endif - ; +bool M3DImporter::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool /*checkSig*/) const { + /* + * don't use CheckMagicToken because that checks with swapped bytes too, leading to false + * positives. This magic is not uint32_t, but char[4], so memcmp is the best way + */ + std::unique_ptr pStream(pIOHandler->Open(pFile, "rb")); + unsigned char data[4]; + if (4 != pStream->Read(data, 1, 4)) { + return false; } - return false; + return !memcmp(data, "3DMO", 4) /* bin */ +#ifdef M3D_ASCII + || !memcmp(data, "3dmo", 4) /* ASCII */ +#endif + ; } // ------------------------------------------------------------------------------------------------ diff --git a/code/AssetLib/MD2/MD2Loader.cpp b/code/AssetLib/MD2/MD2Loader.cpp index 9ccbcdfca..77063be29 100644 --- a/code/AssetLib/MD2/MD2Loader.cpp +++ b/code/AssetLib/MD2/MD2Loader.cpp @@ -106,19 +106,10 @@ MD2Importer::~MD2Importer() // ------------------------------------------------------------------------------------------------ // Returns whether the class can handle the format of the given file. -bool MD2Importer::CanRead( const std::string& pFile, IOSystem* pIOHandler, bool checkSig) const +bool MD2Importer::CanRead( const std::string& pFile, IOSystem* pIOHandler, bool /*checkSig*/) const { - const std::string extension = GetExtension(pFile); - if (extension == "md2") - return true; - - // if check for extension is not enough, check for the magic tokens - if (!extension.length() || checkSig) { - uint32_t tokens[1]; - tokens[0] = AI_MD2_MAGIC_NUMBER_LE; - return CheckMagicToken(pIOHandler,pFile,tokens,1); - } - return false; + static const uint32_t tokens[] = { AI_MD2_MAGIC_NUMBER_LE }; + return CheckMagicToken(pIOHandler,pFile,tokens,std::size(tokens)); } // ------------------------------------------------------------------------------------------------ diff --git a/code/AssetLib/MD3/MD3Loader.cpp b/code/AssetLib/MD3/MD3Loader.cpp index e27079766..ec47790d5 100644 --- a/code/AssetLib/MD3/MD3Loader.cpp +++ b/code/AssetLib/MD3/MD3Loader.cpp @@ -349,18 +349,9 @@ MD3Importer::~MD3Importer() {} // ------------------------------------------------------------------------------------------------ // Returns whether the class can handle the format of the given file. -bool MD3Importer::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool checkSig) const { - const std::string extension = GetExtension(pFile); - if (extension == "md3") - return true; - - // if check for extension is not enough, check for the magic tokens - if (!extension.length() || checkSig) { - uint32_t tokens[1]; - tokens[0] = AI_MD3_MAGIC_NUMBER_LE; - return CheckMagicToken(pIOHandler, pFile, tokens, 1); - } - return false; +bool MD3Importer::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool /*checkSig*/) const { + static const uint32_t tokens[] = { AI_MD3_MAGIC_NUMBER_LE }; + return CheckMagicToken(pIOHandler, pFile, tokens, std::size(tokens)); } // ------------------------------------------------------------------------------------------------ diff --git a/code/AssetLib/MD5/MD5Loader.cpp b/code/AssetLib/MD5/MD5Loader.cpp index b99638cd2..b2dbba94a 100644 --- a/code/AssetLib/MD5/MD5Loader.cpp +++ b/code/AssetLib/MD5/MD5Loader.cpp @@ -100,20 +100,9 @@ MD5Importer::~MD5Importer() { // ------------------------------------------------------------------------------------------------ // Returns whether the class can handle the format of the given file. -bool MD5Importer::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool checkSig) const { - const std::string extension = GetExtension(pFile); - - if (extension == "md5anim" || extension == "md5mesh" || extension == "md5camera") - return true; - else if (!extension.length() || checkSig) { - if (!pIOHandler) { - return true; - } - const char *tokens[] = { "MD5Version" }; - return SearchFileHeaderForToken(pIOHandler, pFile, tokens, 1); - } - - return false; +bool MD5Importer::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool /*checkSig*/) const { + static const char *tokens[] = { "MD5Version" }; + return SearchFileHeaderForToken(pIOHandler, pFile, tokens, std::size(tokens)); } // ------------------------------------------------------------------------------------------------ diff --git a/code/AssetLib/MDC/MDCLoader.cpp b/code/AssetLib/MDC/MDCLoader.cpp index 17a349768..df56c3cf6 100644 --- a/code/AssetLib/MDC/MDCLoader.cpp +++ b/code/AssetLib/MDC/MDCLoader.cpp @@ -110,19 +110,9 @@ MDCImporter::~MDCImporter() { // ------------------------------------------------------------------------------------------------ // Returns whether the class can handle the format of the given file. -bool MDCImporter::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool checkSig) const { - const std::string extension = GetExtension(pFile); - if (extension == "mdc") { - return true; - } - - // if check for extension is not enough, check for the magic tokens - if (!extension.length() || checkSig) { - uint32_t tokens[1]; - tokens[0] = AI_MDC_MAGIC_NUMBER_LE; - return CheckMagicToken(pIOHandler, pFile, tokens, 1); - } - return false; +bool MDCImporter::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool /*checkSig*/) const { + static const uint32_t tokens[] = { AI_MDC_MAGIC_NUMBER_LE }; + return CheckMagicToken(pIOHandler, pFile, tokens, std::size(tokens)); } // ------------------------------------------------------------------------------------------------ diff --git a/code/AssetLib/MDL/MDLLoader.cpp b/code/AssetLib/MDL/MDLLoader.cpp index a4286a716..701d8add9 100644 --- a/code/AssetLib/MDL/MDLLoader.cpp +++ b/code/AssetLib/MDL/MDLLoader.cpp @@ -104,23 +104,18 @@ MDLImporter::~MDLImporter() { // ------------------------------------------------------------------------------------------------ // Returns whether the class can handle the format of the given file. -bool MDLImporter::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool checkSig) const { - const std::string extension = GetExtension(pFile); - - // if check for extension is not enough, check for the magic tokens - if (extension == "mdl" || !extension.length() || checkSig) { - uint32_t tokens[8]; - tokens[0] = AI_MDL_MAGIC_NUMBER_LE_HL2a; - tokens[1] = AI_MDL_MAGIC_NUMBER_LE_HL2b; - tokens[2] = AI_MDL_MAGIC_NUMBER_LE_GS7; - tokens[3] = AI_MDL_MAGIC_NUMBER_LE_GS5b; - tokens[4] = AI_MDL_MAGIC_NUMBER_LE_GS5a; - tokens[5] = AI_MDL_MAGIC_NUMBER_LE_GS4; - tokens[6] = AI_MDL_MAGIC_NUMBER_LE_GS3; - tokens[7] = AI_MDL_MAGIC_NUMBER_LE; - return CheckMagicToken(pIOHandler, pFile, tokens, 8, 0); - } - return false; +bool MDLImporter::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool /*checkSig*/) const { + static const uint32_t tokens[] = { + AI_MDL_MAGIC_NUMBER_LE_HL2a, + AI_MDL_MAGIC_NUMBER_LE_HL2b, + AI_MDL_MAGIC_NUMBER_LE_GS7, + AI_MDL_MAGIC_NUMBER_LE_GS5b, + AI_MDL_MAGIC_NUMBER_LE_GS5a, + AI_MDL_MAGIC_NUMBER_LE_GS4, + AI_MDL_MAGIC_NUMBER_LE_GS3, + AI_MDL_MAGIC_NUMBER_LE + }; + return CheckMagicToken(pIOHandler, pFile, tokens, std::size(tokens)); } // ------------------------------------------------------------------------------------------------ diff --git a/code/AssetLib/MMD/MMDImporter.cpp b/code/AssetLib/MMD/MMDImporter.cpp index e4ecc1445..ab9e68177 100644 --- a/code/AssetLib/MMD/MMDImporter.cpp +++ b/code/AssetLib/MMD/MMDImporter.cpp @@ -89,14 +89,9 @@ MMDImporter::~MMDImporter() { // ------------------------------------------------------------------------------------------------ // Returns true, if file is an pmx file. bool MMDImporter::CanRead(const std::string &pFile, IOSystem *pIOHandler, - bool checkSig) const { - if (!checkSig) { - return SimpleExtensionCheck(pFile, "pmx"); - } else { - // Check file Header - static const char *pTokens[] = { "PMX " }; - return BaseImporter::SearchFileHeaderForToken(pIOHandler, pFile, pTokens, 1); - } + bool /*checkSig*/) const { + static const char *tokens[] = { "PMX " }; + return SearchFileHeaderForToken(pIOHandler, pFile, tokens, std::size(tokens)); } // ------------------------------------------------------------------------------------------------ diff --git a/code/AssetLib/MS3D/MS3DLoader.cpp b/code/AssetLib/MS3D/MS3DLoader.cpp index 192bcbe41..70be25fef 100644 --- a/code/AssetLib/MS3D/MS3DLoader.cpp +++ b/code/AssetLib/MS3D/MS3DLoader.cpp @@ -88,26 +88,12 @@ MS3DImporter::MS3DImporter() // Destructor, private as well MS3DImporter::~MS3DImporter() {} - // ------------------------------------------------------------------------------------------------ // Returns whether the class can handle the format of the given file. -bool MS3DImporter::CanRead( const std::string& pFile, IOSystem* pIOHandler, bool checkSig) const +bool MS3DImporter::CanRead( const std::string& pFile, IOSystem* pIOHandler, bool /*checkSig*/) const { - // first call - simple extension check - const std::string extension = GetExtension(pFile); - if (extension == "ms3d") { - return true; - } - - // second call - check for magic identifiers - else if (!extension.length() || checkSig) { - if (!pIOHandler) { - return true; - } - const char* tokens[] = {"MS3D000000"}; - return SearchFileHeaderForToken(pIOHandler,pFile,tokens,1); - } - return false; + static const char* tokens[] = { "MS3D000000" }; + return SearchFileHeaderForToken(pIOHandler,pFile,tokens,std::size(tokens)); } // ------------------------------------------------------------------------------------------------ diff --git a/code/AssetLib/NDO/NDOLoader.cpp b/code/AssetLib/NDO/NDOLoader.cpp index 77fe3e36c..05d50af1d 100644 --- a/code/AssetLib/NDO/NDOLoader.cpp +++ b/code/AssetLib/NDO/NDOLoader.cpp @@ -82,19 +82,10 @@ NDOImporter::~NDOImporter() // ------------------------------------------------------------------------------------------------ // Returns whether the class can handle the format of the given file. -bool NDOImporter::CanRead( const std::string& pFile, IOSystem* pIOHandler, bool checkSig) const +bool NDOImporter::CanRead( const std::string& pFile, IOSystem* pIOHandler, bool /*checkSig*/) const { - // check file extension - const std::string extension = GetExtension(pFile); - - if( extension == "ndo") - return true; - - if ((checkSig || !extension.length()) && pIOHandler) { - const char* tokens[] = {"nendo"}; - return SearchFileHeaderForToken(pIOHandler,pFile,tokens,1,5); - } - return false; + static const char* tokens[] = {"nendo"}; + return SearchFileHeaderForToken(pIOHandler,pFile,tokens,std::size(tokens),5); } // ------------------------------------------------------------------------------------------------ diff --git a/code/AssetLib/NFF/NFFLoader.cpp b/code/AssetLib/NFF/NFFLoader.cpp index 11cce0990..f8b6a0acd 100644 --- a/code/AssetLib/NFF/NFFLoader.cpp +++ b/code/AssetLib/NFF/NFFLoader.cpp @@ -84,7 +84,7 @@ NFFImporter::~NFFImporter() {} // ------------------------------------------------------------------------------------------------ // Returns whether the class can handle the format of the given file. bool NFFImporter::CanRead(const std::string &pFile, IOSystem * /*pIOHandler*/, bool /*checkSig*/) const { - return SimpleExtensionCheck(pFile, "nff", "enff"); + return false; } // ------------------------------------------------------------------------------------------------ diff --git a/code/AssetLib/OFF/OFFLoader.cpp b/code/AssetLib/OFF/OFFLoader.cpp index 360ffc51b..d1566b4f7 100644 --- a/code/AssetLib/OFF/OFFLoader.cpp +++ b/code/AssetLib/OFF/OFFLoader.cpp @@ -85,19 +85,10 @@ OFFImporter::~OFFImporter() // ------------------------------------------------------------------------------------------------ // Returns whether the class can handle the format of the given file. -bool OFFImporter::CanRead( const std::string& pFile, IOSystem* pIOHandler, bool checkSig) const +bool OFFImporter::CanRead( const std::string& pFile, IOSystem* pIOHandler, bool /*checkSig*/) const { - const std::string extension = GetExtension(pFile); - - if (extension == "off") - return true; - else if (!extension.length() || checkSig) - { - if (!pIOHandler)return true; - const char* tokens[] = {"off"}; - return SearchFileHeaderForToken(pIOHandler,pFile,tokens,1,3); - } - return false; + static const char* tokens[] = { "off" }; + return SearchFileHeaderForToken(pIOHandler,pFile,tokens,std::size(tokens),3); } // ------------------------------------------------------------------------------------------------ diff --git a/code/AssetLib/Obj/ObjFileImporter.cpp b/code/AssetLib/Obj/ObjFileImporter.cpp index d6232be81..fa5a77ea6 100644 --- a/code/AssetLib/Obj/ObjFileImporter.cpp +++ b/code/AssetLib/Obj/ObjFileImporter.cpp @@ -87,16 +87,10 @@ ObjFileImporter::~ObjFileImporter() { } // ------------------------------------------------------------------------------------------------ -// Returns true, if file is an obj file. -bool ObjFileImporter::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool checkSig) const { - if (!checkSig) { - //Check File Extension - return SimpleExtensionCheck(pFile, "obj"); - } else { - // Check file Header - static const char *pTokens[] = { "mtllib", "usemtl", "v ", "vt ", "vn ", "o ", "g ", "s ", "f " }; - return BaseImporter::SearchFileHeaderForToken(pIOHandler, pFile, pTokens, 9, 200, false, true); - } +// Returns true if file is an obj file. +bool ObjFileImporter::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool /*checkSig*/) const { + static const char *tokens[] = { "mtllib", "usemtl", "v ", "vt ", "vn ", "o ", "g ", "s ", "f " }; + return BaseImporter::SearchFileHeaderForToken(pIOHandler, pFile, tokens, std::size(tokens), 200, false, true); } // ------------------------------------------------------------------------------------------------ diff --git a/code/AssetLib/Ogre/OgreImporter.cpp b/code/AssetLib/Ogre/OgreImporter.cpp index d139565e8..36ee6edff 100644 --- a/code/AssetLib/Ogre/OgreImporter.cpp +++ b/code/AssetLib/Ogre/OgreImporter.cpp @@ -73,17 +73,13 @@ void OgreImporter::SetupProperties(const Importer *pImp) { 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 (!checkSig) { - return EndsWith(pFile, ".mesh.xml", false) || EndsWith(pFile, ".mesh", false); - } - +bool OgreImporter::CanRead(const std::string &pFile, Assimp::IOSystem *pIOHandler, bool /*checkSig*/) const { if (EndsWith(pFile, ".mesh.xml", false)) { - const char *tokens[] = { "" }; - return SearchFileHeaderForToken(pIOHandler, pFile, tokens, 1); + static const char *tokens[] = { "" }; + return SearchFileHeaderForToken(pIOHandler, pFile, tokens, std::size(tokens)); } else { /// @todo Read and validate first header chunk? - return EndsWith(pFile, ".mesh", false); + return false; } } diff --git a/code/AssetLib/OpenGEX/OpenGEXImporter.cpp b/code/AssetLib/OpenGEX/OpenGEXImporter.cpp index 14c9ea37f..4ee9031d7 100644 --- a/code/AssetLib/OpenGEX/OpenGEXImporter.cpp +++ b/code/AssetLib/OpenGEX/OpenGEXImporter.cpp @@ -281,16 +281,9 @@ OpenGEXImporter::~OpenGEXImporter() { } //------------------------------------------------------------------------------------------------ -bool OpenGEXImporter::CanRead(const std::string &file, IOSystem *pIOHandler, bool checkSig) const { - bool canRead(false); - if (!checkSig) { - canRead = SimpleExtensionCheck(file, "ogex"); - } else { - static const char *token[] = { "Metric", "GeometryNode", "VertexArray (attrib", "IndexArray" }; - canRead = BaseImporter::SearchFileHeaderForToken(pIOHandler, file, token, 4); - } - - return canRead; +bool OpenGEXImporter::CanRead(const std::string &file, IOSystem *pIOHandler, bool /*checkSig*/) const { + static const char *tokens[] = { "Metric", "GeometryNode", "VertexArray (attrib", "IndexArray" }; + return SearchFileHeaderForToken(pIOHandler, file, tokens, std::size(tokens)); } //------------------------------------------------------------------------------------------------ diff --git a/code/AssetLib/Ply/PlyLoader.cpp b/code/AssetLib/Ply/PlyLoader.cpp index ce52636dd..d92ffacd1 100644 --- a/code/AssetLib/Ply/PlyLoader.cpp +++ b/code/AssetLib/Ply/PlyLoader.cpp @@ -100,24 +100,9 @@ PLYImporter::~PLYImporter() { // ------------------------------------------------------------------------------------------------ // Returns whether the class can handle the format of the given file. -bool PLYImporter::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool checkSig) const { - const std::string extension = GetExtension(pFile); - - if (extension == "ply") { - return true; - } - - if (!extension.length() || checkSig) { - if (!pIOHandler) { - return true; - } - static const char *tokens[] = { - "ply" - }; - return SearchFileHeaderForToken(pIOHandler, pFile, tokens, 1); - } - - return false; +bool PLYImporter::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool /*checkSig*/) const { + static const char *tokens[] = { "ply" }; + return SearchFileHeaderForToken(pIOHandler, pFile, tokens, std::size(tokens)); } // ------------------------------------------------------------------------------------------------ diff --git a/code/AssetLib/Q3BSP/Q3BSPFileImporter.cpp b/code/AssetLib/Q3BSP/Q3BSPFileImporter.cpp index c8eaf85ce..738177037 100644 --- a/code/AssetLib/Q3BSP/Q3BSPFileImporter.cpp +++ b/code/AssetLib/Q3BSP/Q3BSPFileImporter.cpp @@ -160,12 +160,8 @@ Q3BSPFileImporter::~Q3BSPFileImporter() { } // ------------------------------------------------------------------------------------------------ -// Returns true, if the loader can read this. -bool Q3BSPFileImporter::CanRead(const std::string &rFile, IOSystem * /*pIOHandler*/, bool checkSig) const { - if (!checkSig) { - return SimpleExtensionCheck(rFile, "pk3", "bsp"); - } - +// Returns true if the loader can read this. +bool Q3BSPFileImporter::CanRead(const std::string &/*rFile*/, IOSystem * /*pIOHandler*/, bool /*checkSig*/) const { return false; } diff --git a/code/AssetLib/Q3D/Q3DLoader.cpp b/code/AssetLib/Q3D/Q3DLoader.cpp index b52f86672..74ff01ca0 100644 --- a/code/AssetLib/Q3D/Q3DLoader.cpp +++ b/code/AssetLib/Q3D/Q3DLoader.cpp @@ -83,18 +83,9 @@ Q3DImporter::~Q3DImporter() { // ------------------------------------------------------------------------------------------------ // Returns whether the class can handle the format of the given file. -bool Q3DImporter::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool checkSig) const { - const std::string extension = GetExtension(pFile); - - if (extension == "q3s" || extension == "q3o") - return true; - else if (!extension.length() || checkSig) { - if (!pIOHandler) - return true; - const char *tokens[] = { "quick3Do", "quick3Ds" }; - return SearchFileHeaderForToken(pIOHandler, pFile, tokens, 2); - } - return false; +bool Q3DImporter::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool /*checkSig*/) const { + static const char *tokens[] = { "quick3Do", "quick3Ds" }; + return SearchFileHeaderForToken(pIOHandler, pFile, tokens, std::size(tokens)); } // ------------------------------------------------------------------------------------------------ diff --git a/code/AssetLib/Raw/RawLoader.cpp b/code/AssetLib/Raw/RawLoader.cpp index 8e57912f5..27d37b7ac 100644 --- a/code/AssetLib/Raw/RawLoader.cpp +++ b/code/AssetLib/Raw/RawLoader.cpp @@ -84,8 +84,8 @@ RAWImporter::~RAWImporter() { // ------------------------------------------------------------------------------------------------ // Returns whether the class can handle the format of the given file. -bool RAWImporter::CanRead(const std::string &pFile, IOSystem * /*pIOHandler*/, bool /*checkSig*/) const { - return SimpleExtensionCheck(pFile, "raw"); +bool RAWImporter::CanRead(const std::string & /*pFile*/, IOSystem * /*pIOHandler*/, bool /*checkSig*/) const { + return false; } // ------------------------------------------------------------------------------------------------ diff --git a/code/AssetLib/SIB/SIBImporter.cpp b/code/AssetLib/SIB/SIBImporter.cpp index 6898fb65c..469948a41 100644 --- a/code/AssetLib/SIB/SIBImporter.cpp +++ b/code/AssetLib/SIB/SIBImporter.cpp @@ -217,8 +217,8 @@ SIBImporter::~SIBImporter() { // ------------------------------------------------------------------------------------------------ // Returns whether the class can handle the format of the given file. -bool SIBImporter::CanRead(const std::string &pFile, IOSystem * /*pIOHandler*/, bool /*checkSig*/) const { - return SimpleExtensionCheck(pFile, "sib"); +bool SIBImporter::CanRead(const std::string & /*pFile*/, IOSystem * /*pIOHandler*/, bool /*checkSig*/) const { + return false; } // ------------------------------------------------------------------------------------------------ diff --git a/code/AssetLib/SMD/SMDLoader.cpp b/code/AssetLib/SMD/SMDLoader.cpp index de9c65c4a..88353e85b 100644 --- a/code/AssetLib/SMD/SMDLoader.cpp +++ b/code/AssetLib/SMD/SMDLoader.cpp @@ -101,9 +101,9 @@ SMDImporter::~SMDImporter() { // ------------------------------------------------------------------------------------------------ // Returns whether the class can handle the format of the given file. -bool SMDImporter::CanRead( const std::string& pFile, IOSystem* /*pIOHandler*/, bool) const { +bool SMDImporter::CanRead( const std::string& /*pFile*/, IOSystem* /*pIOHandler*/, bool) const { // fixme: auto format detection - return SimpleExtensionCheck(pFile,"smd","vta"); + return false; } // ------------------------------------------------------------------------------------------------ diff --git a/code/AssetLib/STL/STLLoader.cpp b/code/AssetLib/STL/STLLoader.cpp index 433fb14c7..65cfc7830 100644 --- a/code/AssetLib/STL/STLLoader.cpp +++ b/code/AssetLib/STL/STLLoader.cpp @@ -141,20 +141,9 @@ STLImporter::~STLImporter() { // ------------------------------------------------------------------------------------------------ // Returns whether the class can handle the format of the given file. -bool STLImporter::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool checkSig) const { - const std::string extension = GetExtension(pFile); - - if (extension == "stl") { - return true; - } else if (!extension.length() || checkSig) { - if (!pIOHandler) { - return true; - } - const char *tokens[] = { "STL", "solid" }; - return SearchFileHeaderForToken(pIOHandler, pFile, tokens, 2); - } - - return false; +bool STLImporter::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool /*checkSig*/) const { + static const char *tokens[] = { "STL", "solid" }; + return SearchFileHeaderForToken(pIOHandler, pFile, tokens, std::size(tokens)); } // ------------------------------------------------------------------------------------------------ diff --git a/code/AssetLib/Terragen/TerragenLoader.cpp b/code/AssetLib/Terragen/TerragenLoader.cpp index e0bdbf026..16e5ac470 100644 --- a/code/AssetLib/Terragen/TerragenLoader.cpp +++ b/code/AssetLib/Terragen/TerragenLoader.cpp @@ -77,27 +77,9 @@ TerragenImporter::~TerragenImporter() {} // ------------------------------------------------------------------------------------------------ // Returns whether the class can handle the format of the given file. -bool TerragenImporter::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool checkSig) const { - // check file extension - std::string extension = GetExtension(pFile); - - if (extension == "ter") - return true; - - if (!extension.length() || checkSig) { - /* If CanRead() is called in order to check whether we - * support a specific file extension in general pIOHandler - * might be nullptr and it's our duty to return true here. - */ - if (!pIOHandler) { - return true; - } - - const char *tokens[] = { "terragen" }; - return SearchFileHeaderForToken(pIOHandler, pFile, tokens, 1); - } - - return false; +bool TerragenImporter::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool /*checkSig*/) const { + static const char *tokens[] = { "terragen" }; + return SearchFileHeaderForToken(pIOHandler, pFile, tokens, std::size(tokens)); } // ------------------------------------------------------------------------------------------------ diff --git a/code/AssetLib/Unreal/UnrealLoader.cpp b/code/AssetLib/Unreal/UnrealLoader.cpp index 499b49c05..725fdcd7d 100644 --- a/code/AssetLib/Unreal/UnrealLoader.cpp +++ b/code/AssetLib/Unreal/UnrealLoader.cpp @@ -176,8 +176,8 @@ UnrealImporter::~UnrealImporter() {} // ------------------------------------------------------------------------------------------------ // Returns whether the class can handle the format of the given file. -bool UnrealImporter::CanRead(const std::string &pFile, IOSystem * /*pIOHandler*/, bool /*checkSig*/) const { - return SimpleExtensionCheck(pFile, "3d", "uc"); +bool UnrealImporter::CanRead(const std::string & /*pFile*/, IOSystem * /*pIOHandler*/, bool /*checkSig*/) const { + return false; } // ------------------------------------------------------------------------------------------------ diff --git a/code/AssetLib/X/XFileImporter.cpp b/code/AssetLib/X/XFileImporter.cpp index cb245ed74..73cb1acda 100644 --- a/code/AssetLib/X/XFileImporter.cpp +++ b/code/AssetLib/X/XFileImporter.cpp @@ -89,17 +89,9 @@ XFileImporter::~XFileImporter() { // ------------------------------------------------------------------------------------------------ // Returns whether the class can handle the format of the given file. -bool XFileImporter::CanRead( const std::string& pFile, IOSystem* pIOHandler, bool checkSig) const { - std::string extension = GetExtension(pFile); - if(extension == "x") { - return true; - } - if (!extension.length() || checkSig) { - uint32_t token[1]; - token[0] = AI_MAKE_MAGIC("xof "); - return CheckMagicToken(pIOHandler,pFile,token,1,0); - } - return false; +bool XFileImporter::CanRead( const std::string& pFile, IOSystem* pIOHandler, bool /*checkSig*/) const { + static const uint32_t token[] = { AI_MAKE_MAGIC("xof ") }; + return CheckMagicToken(pIOHandler,pFile,token,std::size(token)); } // ------------------------------------------------------------------------------------------------ diff --git a/code/AssetLib/X3D/X3DImporter.cpp b/code/AssetLib/X3D/X3DImporter.cpp index 121b7490e..6e4606909 100644 --- a/code/AssetLib/X3D/X3DImporter.cpp +++ b/code/AssetLib/X3D/X3DImporter.cpp @@ -156,14 +156,7 @@ void X3DImporter::ParseFile(const std::string &file, IOSystem *pIOHandler) { } } -bool X3DImporter::CanRead( const std::string &pFile, IOSystem * /*pIOHandler*/, bool checkSig ) const { - if (checkSig) { - std::string::size_type pos = pFile.find_last_of(".x3d"); - if (pos != std::string::npos) { - return true; - } - } - +bool X3DImporter::CanRead( const std::string & /*pFile*/, IOSystem * /*pIOHandler*/, bool /*checkSig*/ ) const { return false; } diff --git a/code/AssetLib/XGL/XGLLoader.cpp b/code/AssetLib/XGL/XGLLoader.cpp index 824f0c2c3..7e134a054 100644 --- a/code/AssetLib/XGL/XGLLoader.cpp +++ b/code/AssetLib/XGL/XGLLoader.cpp @@ -105,23 +105,9 @@ XGLImporter::~XGLImporter() { // ------------------------------------------------------------------------------------------------ // Returns whether the class can handle the format of the given file. -bool XGLImporter::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool checkSig) const { - /* NOTE: A simple check for the file extension is not enough - * here. XGL and ZGL are ok, but xml is too generic - * and might be collada as well. So open the file and - * look for typical signal tokens. - */ - const std::string extension = GetExtension(pFile); - - if (extension == "xgl" || extension == "zgl") { - return true; - } else if (extension == "xml" || checkSig) { - ai_assert(pIOHandler != NULL); - - const char *tokens[] = { "", "", "" }; - return SearchFileHeaderForToken(pIOHandler, pFile, tokens, 3); - } - return false; +bool XGLImporter::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool /*checkSig*/) const { + static const char *tokens[] = { "", "", "" }; + return SearchFileHeaderForToken(pIOHandler, pFile, tokens, std::size(tokens)); } // ------------------------------------------------------------------------------------------------ diff --git a/code/AssetLib/glTF/glTFImporter.cpp b/code/AssetLib/glTF/glTFImporter.cpp index 5e072dd2a..0b22f78d4 100644 --- a/code/AssetLib/glTF/glTFImporter.cpp +++ b/code/AssetLib/glTF/glTFImporter.cpp @@ -93,24 +93,14 @@ const aiImporterDesc *glTFImporter::GetInfo() const { } bool glTFImporter::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool /* checkSig */) const { - const std::string &extension = GetExtension(pFile); - - if (extension != "gltf" && extension != "glb") { + glTF::Asset asset(pIOHandler); + try { + asset.Load(pFile, GetExtension(pFile) == "glb"); + std::string version = asset.asset.version; + return !version.empty() && version[0] == '1'; + } catch (...) { return false; } - - if (pIOHandler) { - glTF::Asset asset(pIOHandler); - try { - asset.Load(pFile, extension == "glb"); - std::string version = asset.asset.version; - return !version.empty() && version[0] == '1'; - } catch (...) { - return false; - } - } - - return false; } inline void SetMaterialColorProperty(std::vector &embeddedTexIdxs, Asset & /*r*/, glTF::TexProperty prop, aiMaterial *mat, diff --git a/code/AssetLib/glTF2/glTF2Importer.cpp b/code/AssetLib/glTF2/glTF2Importer.cpp index ab1f01bf8..841f61369 100644 --- a/code/AssetLib/glTF2/glTF2Importer.cpp +++ b/code/AssetLib/glTF2/glTF2Importer.cpp @@ -110,20 +110,14 @@ const aiImporterDesc *glTF2Importer::GetInfo() const { } bool glTF2Importer::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool /* checkSig */) const { - const std::string &extension = GetExtension(pFile); - - if (extension != "gltf" && extension != "glb") { - return false; - } - - if (pIOHandler) { + try { glTF2::Asset asset(pIOHandler); - asset.Load(pFile, extension == "glb"); + asset.Load(pFile, GetExtension(pFile) == "glb"); std::string version = asset.asset.version; return !version.empty() && version[0] == '2'; + } catch(...) { + return false; } - - return false; } static aiTextureMapMode ConvertWrappingMode(SamplerWrap gltfWrapMode) { diff --git a/code/Common/BaseImporter.cpp b/code/Common/BaseImporter.cpp index 0657216cf..6ef287999 100644 --- a/code/Common/BaseImporter.cpp +++ b/code/Common/BaseImporter.cpp @@ -170,7 +170,7 @@ void BaseImporter::GetExtensionList(std::set &extensions) { /*static*/ bool BaseImporter::SearchFileHeaderForToken(IOSystem *pIOHandler, const std::string &pFile, const char **tokens, - unsigned int numTokens, + std::size_t numTokens, unsigned int searchBytes /* = 200 */, bool tokensSol /* false */, bool noAlphaBeforeTokens /* false */) { @@ -238,32 +238,6 @@ void BaseImporter::GetExtensionList(std::set &extensions) { return false; } -// ------------------------------------------------------------------------------------------------ -// Simple check for file extension -/*static*/ bool BaseImporter::SimpleExtensionCheck(const std::string &pFile, - const char *ext0, - const char *ext1, - const char *ext2) { - std::string::size_type pos = pFile.find_last_of('.'); - - // no file extension - can't read - if (pos == std::string::npos) - return false; - - const char *ext_real = &pFile[pos + 1]; - if (!ASSIMP_stricmp(ext_real, ext0)) - return true; - - // check for other, optional, file extensions - if (ext1 && !ASSIMP_stricmp(ext_real, ext1)) - return true; - - if (ext2 && !ASSIMP_stricmp(ext_real, ext2)) - return true; - - return false; -} - // ------------------------------------------------------------------------------------------------ // Get file extension from path std::string BaseImporter::GetExtension(const std::string &file) { @@ -284,7 +258,7 @@ std::string BaseImporter::GetExtension(const std::string &file) { // ------------------------------------------------------------------------------------------------ // Check for magic bytes at the beginning of the file. /* static */ bool BaseImporter::CheckMagicToken(IOSystem *pIOHandler, const std::string &pFile, - const void *_magic, unsigned int num, unsigned int offset, unsigned int size) { + const void *_magic, std::size_t num, unsigned int offset, unsigned int size) { ai_assert(size <= 16); ai_assert(_magic); diff --git a/code/Common/Importer.cpp b/code/Common/Importer.cpp index db7fc9e1c..36691bdcd 100644 --- a/code/Common/Importer.cpp +++ b/code/Common/Importer.cpp @@ -617,16 +617,61 @@ const aiScene* Importer::ReadFile( const char* _pFile, unsigned int pFlags) { profiler->BeginRegion("total"); } - // Find an worker class which can handle the file - BaseImporter* imp = nullptr; + // Find an worker class which can handle the file extension. + // Multiple importers may be able to handle the same extension (.xml!); gather them all. SetPropertyInteger("importerIndex", -1); - for( unsigned int a = 0; a < pimpl->mImporter.size(); a++) { + struct ImporterAndIndex { + BaseImporter * importer; + unsigned int index; + }; + std::vector possibleImporters; + for (unsigned int a = 0; a < pimpl->mImporter.size(); a++) { + + // Every importer has a list of supported extensions. + std::set extensions; + pimpl->mImporter[a]->GetExtensionList(extensions); + + // CAUTION: Do not just search for the extension! + // GetExtension() returns the part after the *last* dot, but some extensions have dots + // inside them, e.g. ogre.mesh.xml. Compare the entire end of the string. + for (std::set::const_iterator it = extensions.cbegin(); it != extensions.cend(); ++it) { + + // Yay for C++<20 not having std::string::ends_with() + std::string extension = "." + *it; + if (extension.length() <= pFile.length()) { + // Possible optimization: Fetch the lowercase filename! + if (0 == ASSIMP_stricmp(pFile.c_str() + pFile.length() - extension.length(), extension.c_str())) { + ImporterAndIndex candidate = { pimpl->mImporter[a], a }; + possibleImporters.push_back(candidate); + break; + } + } - if( pimpl->mImporter[a]->CanRead( pFile, pimpl->mIOHandler, false)) { - imp = pimpl->mImporter[a]; - SetPropertyInteger("importerIndex", a); - break; } + + } + + // If just one importer supports this extension, pick it and close the case. + BaseImporter* imp = nullptr; + if (1 == possibleImporters.size()) { + imp = possibleImporters[0].importer; + SetPropertyInteger("importerIndex", possibleImporters[0].index); + } + // If multiple importers claim this file extension, ask them to look at the actual file data to decide. + // This can happen e.g. with XML (COLLADA vs. Irrlicht). + else { + for (std::vector::const_iterator it = possibleImporters.begin(); it < possibleImporters.end(); ++it) { + BaseImporter & importer = *it->importer; + + ASSIMP_LOG_INFO("Found a possible importer: " + std::string(importer.GetInfo()->mName) + "; trying signature-based detection"); + if (importer.CanRead( pFile, pimpl->mIOHandler, true)) { + imp = &importer; + SetPropertyInteger("importerIndex", it->index); + break; + } + + } + } if (!imp) { diff --git a/include/assimp/BaseImporter.h b/include/assimp/BaseImporter.h index 86d7ba70f..166dbdc10 100644 --- a/include/assimp/BaseImporter.h +++ b/include/assimp/BaseImporter.h @@ -97,20 +97,15 @@ public: // ------------------------------------------------------------------- /** Returns whether the class can handle the format of the given file. * - * The implementation should be as quick as possible. A check for - * the file extension is enough. If no suitable loader is found with - * this strategy, CanRead() is called again, the 'checkSig' parameter - * set to true this time. Now the implementation is expected to - * perform a full check of the file structure, possibly searching the - * first bytes of the file for magic identifiers or keywords. + * The implementation is expected to perform a full check of the file + * structure, possibly searching the first bytes of the file for magic + * identifiers or keywords. * * @param pFile Path and file name of the file to be examined. * @param pIOHandler The IO handler to use for accessing any file. - * @param checkSig Set to true if this method is called a second time. - * This time, the implementation may take more time to examine the - * contents of the file to be loaded for magic bytes, keywords, etc - * to be able to load files with unknown/not existent file extensions. - * @return true if the class can read this file, false if not. + * @param checkSig Legacy; do not use. + * @return true if the class can read this file, false if not or if + * unsure. */ virtual bool CanRead( const std::string &pFile, @@ -295,25 +290,11 @@ public: // static utilities IOSystem *pIOSystem, const std::string &file, const char **tokens, - unsigned int numTokens, + std::size_t numTokens, unsigned int searchBytes = 200, bool tokensSol = false, bool noAlphaBeforeTokens = false); - // ------------------------------------------------------------------- - /** @brief Check whether a file has a specific file extension - * @param pFile Input file - * @param ext0 Extension to check for. Lowercase characters only, no dot! - * @param ext1 Optional second extension - * @param ext2 Optional third extension - * @note Case-insensitive - */ - static bool SimpleExtensionCheck( - const std::string &pFile, - const char *ext0, - const char *ext1 = nullptr, - const char *ext2 = nullptr); - // ------------------------------------------------------------------- /** @brief Extract file extension from a string * @param pFile Input file @@ -340,7 +321,7 @@ public: // static utilities IOSystem *pIOHandler, const std::string &pFile, const void *magic, - unsigned int num, + std::size_t num, unsigned int offset = 0, unsigned int size = 4); From 628cba9490c067aa811a24f1943529bcfb490c51 Mon Sep 17 00:00:00 2001 From: Krishty Date: Sat, 24 Apr 2021 00:44:50 +0200 Subject: [PATCH 02/83] fixed warning --- code/AssetLib/NFF/NFFLoader.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/AssetLib/NFF/NFFLoader.cpp b/code/AssetLib/NFF/NFFLoader.cpp index f8b6a0acd..695a360f2 100644 --- a/code/AssetLib/NFF/NFFLoader.cpp +++ b/code/AssetLib/NFF/NFFLoader.cpp @@ -83,7 +83,7 @@ NFFImporter::~NFFImporter() {} // ------------------------------------------------------------------------------------------------ // Returns whether the class can handle the format of the given file. -bool NFFImporter::CanRead(const std::string &pFile, IOSystem * /*pIOHandler*/, bool /*checkSig*/) const { +bool NFFImporter::CanRead(const std::string & /*pFile*/, IOSystem * /*pIOHandler*/, bool /*checkSig*/) const { return false; } From b87f67db4c10d568637d19a35bd986db49e92ceb Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Mon, 3 May 2021 20:49:14 +0200 Subject: [PATCH 03/83] Add missing include --- include/assimp/BaseImporter.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/assimp/BaseImporter.h b/include/assimp/BaseImporter.h index 166dbdc10..78ac532e3 100644 --- a/include/assimp/BaseImporter.h +++ b/include/assimp/BaseImporter.h @@ -58,6 +58,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include #include +#include struct aiScene; struct aiImporterDesc; From 88d64388f8ea2538dc0597c00c6f8eab467da7df Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Mon, 3 May 2021 20:57:17 +0200 Subject: [PATCH 04/83] Update AMFImporter.cpp --- code/AssetLib/AMF/AMFImporter.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/AssetLib/AMF/AMFImporter.cpp b/code/AssetLib/AMF/AMFImporter.cpp index 0cc02a2c7..6c43944bf 100644 --- a/code/AssetLib/AMF/AMFImporter.cpp +++ b/code/AssetLib/AMF/AMFImporter.cpp @@ -504,7 +504,9 @@ void AMFImporter::ParseNode_Metadata(XmlNode &node) { bool AMFImporter::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool /*pCheckSig*/) const { static const char *tokens[] = { " Date: Wed, 5 May 2021 00:08:54 +0200 Subject: [PATCH 05/83] replaced std::size() with AI_COUNT_OF for pre-C++20 compilers --- code/AssetLib/3DS/3DSLoader.cpp | 2 +- code/AssetLib/AC/ACLoader.cpp | 2 +- code/AssetLib/AMF/AMFImporter.cpp | 2 +- code/AssetLib/ASE/ASELoader.cpp | 2 +- code/AssetLib/BVH/BVHLoader.cpp | 2 +- code/AssetLib/Blender/BlenderLoader.cpp | 2 +- code/AssetLib/COB/COBLoader.cpp | 2 +- code/AssetLib/CSM/CSMLoader.cpp | 2 +- code/AssetLib/Collada/ColladaLoader.cpp | 2 +- code/AssetLib/DXF/DXFLoader.cpp | 2 +- code/AssetLib/FBX/FBXImporter.cpp | 2 +- code/AssetLib/HMP/HMPLoader.cpp | 2 +- code/AssetLib/IFC/IFCLoader.cpp | 2 +- code/AssetLib/Irr/IRRLoader.cpp | 2 +- code/AssetLib/Irr/IRRMeshLoader.cpp | 2 +- code/AssetLib/LWO/LWOLoader.cpp | 2 +- code/AssetLib/LWS/LWSLoader.cpp | 2 +- code/AssetLib/MD2/MD2Loader.cpp | 2 +- code/AssetLib/MD3/MD3Loader.cpp | 2 +- code/AssetLib/MD5/MD5Loader.cpp | 2 +- code/AssetLib/MDC/MDCLoader.cpp | 2 +- code/AssetLib/MDL/MDLLoader.cpp | 2 +- code/AssetLib/MMD/MMDImporter.cpp | 2 +- code/AssetLib/MS3D/MS3DLoader.cpp | 2 +- code/AssetLib/NDO/NDOLoader.cpp | 2 +- code/AssetLib/OFF/OFFLoader.cpp | 2 +- code/AssetLib/Ogre/OgreImporter.cpp | 2 +- code/AssetLib/OpenGEX/OpenGEXImporter.cpp | 2 +- code/AssetLib/Ply/PlyLoader.cpp | 2 +- code/AssetLib/Q3D/Q3DLoader.cpp | 2 +- code/AssetLib/STL/STLLoader.cpp | 2 +- code/AssetLib/Terragen/TerragenLoader.cpp | 2 +- code/AssetLib/X/XFileImporter.cpp | 2 +- code/AssetLib/XGL/XGLLoader.cpp | 2 +- include/assimp/defs.h | 2 ++ 35 files changed, 36 insertions(+), 34 deletions(-) diff --git a/code/AssetLib/3DS/3DSLoader.cpp b/code/AssetLib/3DS/3DSLoader.cpp index b690f557d..89a4fbc7e 100644 --- a/code/AssetLib/3DS/3DSLoader.cpp +++ b/code/AssetLib/3DS/3DSLoader.cpp @@ -113,7 +113,7 @@ Discreet3DSImporter::~Discreet3DSImporter() { // Returns whether the class can handle the format of the given file. bool Discreet3DSImporter::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool /*checkSig*/) const { static const uint16_t token[] = { 0x4d4d, 0x3dc2 /*, 0x3daa */ }; - return CheckMagicToken(pIOHandler, pFile, token, std::size(token), 0, sizeof token[0]); + return CheckMagicToken(pIOHandler, pFile, token, AI_COUNT_OF(token), 0, sizeof token[0]); } // ------------------------------------------------------------------------------------------------ diff --git a/code/AssetLib/AC/ACLoader.cpp b/code/AssetLib/AC/ACLoader.cpp index c259b2eb0..ea097ae0d 100644 --- a/code/AssetLib/AC/ACLoader.cpp +++ b/code/AssetLib/AC/ACLoader.cpp @@ -154,7 +154,7 @@ AC3DImporter::~AC3DImporter() { // Returns whether the class can handle the format of the given file. bool AC3DImporter::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool /*checkSig*/) const { static const uint32_t tokens[] = { AI_MAKE_MAGIC("AC3D") }; - return CheckMagicToken(pIOHandler, pFile, tokens, std::size(tokens)); + return CheckMagicToken(pIOHandler, pFile, tokens, AI_COUNT_OF(tokens)); } // ------------------------------------------------------------------------------------------------ diff --git a/code/AssetLib/AMF/AMFImporter.cpp b/code/AssetLib/AMF/AMFImporter.cpp index 0cc02a2c7..9e846d473 100644 --- a/code/AssetLib/AMF/AMFImporter.cpp +++ b/code/AssetLib/AMF/AMFImporter.cpp @@ -504,7 +504,7 @@ void AMFImporter::ParseNode_Metadata(XmlNode &node) { bool AMFImporter::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool /*pCheckSig*/) const { static const char *tokens[] = { "" }; - return SearchFileHeaderForToken(pIOHandler, pFile, tokens, std::size(tokens)); + return SearchFileHeaderForToken(pIOHandler, pFile, tokens, AI_COUNT_OF(tokens)); } else { /// @todo Read and validate first header chunk? return false; diff --git a/code/AssetLib/OpenGEX/OpenGEXImporter.cpp b/code/AssetLib/OpenGEX/OpenGEXImporter.cpp index 4ee9031d7..429a03ad8 100644 --- a/code/AssetLib/OpenGEX/OpenGEXImporter.cpp +++ b/code/AssetLib/OpenGEX/OpenGEXImporter.cpp @@ -283,7 +283,7 @@ OpenGEXImporter::~OpenGEXImporter() { //------------------------------------------------------------------------------------------------ bool OpenGEXImporter::CanRead(const std::string &file, IOSystem *pIOHandler, bool /*checkSig*/) const { static const char *tokens[] = { "Metric", "GeometryNode", "VertexArray (attrib", "IndexArray" }; - return SearchFileHeaderForToken(pIOHandler, file, tokens, std::size(tokens)); + return SearchFileHeaderForToken(pIOHandler, file, tokens, AI_COUNT_OF(tokens)); } //------------------------------------------------------------------------------------------------ diff --git a/code/AssetLib/Ply/PlyLoader.cpp b/code/AssetLib/Ply/PlyLoader.cpp index d92ffacd1..86cf33703 100644 --- a/code/AssetLib/Ply/PlyLoader.cpp +++ b/code/AssetLib/Ply/PlyLoader.cpp @@ -102,7 +102,7 @@ PLYImporter::~PLYImporter() { // Returns whether the class can handle the format of the given file. bool PLYImporter::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool /*checkSig*/) const { static const char *tokens[] = { "ply" }; - return SearchFileHeaderForToken(pIOHandler, pFile, tokens, std::size(tokens)); + return SearchFileHeaderForToken(pIOHandler, pFile, tokens, AI_COUNT_OF(tokens)); } // ------------------------------------------------------------------------------------------------ diff --git a/code/AssetLib/Q3D/Q3DLoader.cpp b/code/AssetLib/Q3D/Q3DLoader.cpp index 74ff01ca0..9f41f190f 100644 --- a/code/AssetLib/Q3D/Q3DLoader.cpp +++ b/code/AssetLib/Q3D/Q3DLoader.cpp @@ -85,7 +85,7 @@ Q3DImporter::~Q3DImporter() { // Returns whether the class can handle the format of the given file. bool Q3DImporter::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool /*checkSig*/) const { static const char *tokens[] = { "quick3Do", "quick3Ds" }; - return SearchFileHeaderForToken(pIOHandler, pFile, tokens, std::size(tokens)); + return SearchFileHeaderForToken(pIOHandler, pFile, tokens, AI_COUNT_OF(tokens)); } // ------------------------------------------------------------------------------------------------ diff --git a/code/AssetLib/STL/STLLoader.cpp b/code/AssetLib/STL/STLLoader.cpp index 65cfc7830..68a2244f4 100644 --- a/code/AssetLib/STL/STLLoader.cpp +++ b/code/AssetLib/STL/STLLoader.cpp @@ -143,7 +143,7 @@ STLImporter::~STLImporter() { // Returns whether the class can handle the format of the given file. bool STLImporter::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool /*checkSig*/) const { static const char *tokens[] = { "STL", "solid" }; - return SearchFileHeaderForToken(pIOHandler, pFile, tokens, std::size(tokens)); + return SearchFileHeaderForToken(pIOHandler, pFile, tokens, AI_COUNT_OF(tokens)); } // ------------------------------------------------------------------------------------------------ diff --git a/code/AssetLib/Terragen/TerragenLoader.cpp b/code/AssetLib/Terragen/TerragenLoader.cpp index 16e5ac470..6308727f8 100644 --- a/code/AssetLib/Terragen/TerragenLoader.cpp +++ b/code/AssetLib/Terragen/TerragenLoader.cpp @@ -79,7 +79,7 @@ TerragenImporter::~TerragenImporter() {} // Returns whether the class can handle the format of the given file. bool TerragenImporter::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool /*checkSig*/) const { static const char *tokens[] = { "terragen" }; - return SearchFileHeaderForToken(pIOHandler, pFile, tokens, std::size(tokens)); + return SearchFileHeaderForToken(pIOHandler, pFile, tokens, AI_COUNT_OF(tokens)); } // ------------------------------------------------------------------------------------------------ diff --git a/code/AssetLib/X/XFileImporter.cpp b/code/AssetLib/X/XFileImporter.cpp index 73cb1acda..a2a26824a 100644 --- a/code/AssetLib/X/XFileImporter.cpp +++ b/code/AssetLib/X/XFileImporter.cpp @@ -91,7 +91,7 @@ XFileImporter::~XFileImporter() { // Returns whether the class can handle the format of the given file. bool XFileImporter::CanRead( const std::string& pFile, IOSystem* pIOHandler, bool /*checkSig*/) const { static const uint32_t token[] = { AI_MAKE_MAGIC("xof ") }; - return CheckMagicToken(pIOHandler,pFile,token,std::size(token)); + return CheckMagicToken(pIOHandler,pFile,token,AI_COUNT_OF(token)); } // ------------------------------------------------------------------------------------------------ diff --git a/code/AssetLib/XGL/XGLLoader.cpp b/code/AssetLib/XGL/XGLLoader.cpp index 7e134a054..943791ef0 100644 --- a/code/AssetLib/XGL/XGLLoader.cpp +++ b/code/AssetLib/XGL/XGLLoader.cpp @@ -107,7 +107,7 @@ XGLImporter::~XGLImporter() { // Returns whether the class can handle the format of the given file. bool XGLImporter::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool /*checkSig*/) const { static const char *tokens[] = { "", "", "" }; - return SearchFileHeaderForToken(pIOHandler, pFile, tokens, std::size(tokens)); + return SearchFileHeaderForToken(pIOHandler, pFile, tokens, AI_COUNT_OF(tokens)); } // ------------------------------------------------------------------------------------------------ diff --git a/include/assimp/defs.h b/include/assimp/defs.h index d61fd7901..dbaff24c1 100644 --- a/include/assimp/defs.h +++ b/include/assimp/defs.h @@ -322,4 +322,6 @@ static const ai_real ai_epsilon = (ai_real)0.00001; #define AI_DEBUG_INVALIDATE_PTR(x) #endif +#define AI_COUNT_OF(X) (sizeof(X) / sizeof((X)[0])) + #endif // !! AI_DEFINES_H_INC From ae93f53b514750015003a118282805ae09c737cb Mon Sep 17 00:00:00 2001 From: Krishty Date: Wed, 5 May 2021 00:57:43 +0200 Subject: [PATCH 06/83] fixed signature-based detection on unknown extensions --- code/Common/Importer.cpp | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/code/Common/Importer.cpp b/code/Common/Importer.cpp index 9c877288c..9eabe73b3 100644 --- a/code/Common/Importer.cpp +++ b/code/Common/Importer.cpp @@ -676,15 +676,12 @@ const aiScene* Importer::ReadFile( const char* _pFile, unsigned int pFlags) { if (!imp) { // not so bad yet ... try format auto detection. - const std::string::size_type s = pFile.find_last_of('.'); - if (s != std::string::npos) { - ASSIMP_LOG_INFO("File extension not known, trying signature-based detection"); - for( unsigned int a = 0; a < pimpl->mImporter.size(); a++) { - if( pimpl->mImporter[a]->CanRead( pFile, pimpl->mIOHandler, true)) { - imp = pimpl->mImporter[a]; - SetPropertyInteger("importerIndex", a); - break; - } + ASSIMP_LOG_INFO("File extension not known, trying signature-based detection"); + for( unsigned int a = 0; a < pimpl->mImporter.size(); a++) { + if( pimpl->mImporter[a]->CanRead( pFile, pimpl->mIOHandler, true)) { + imp = pimpl->mImporter[a]; + SetPropertyInteger("importerIndex", a); + break; } } // Put a proper error message if no suitable importer was found From b546dfccc7a10b9daed580c7fd6b8a194a8de399 Mon Sep 17 00:00:00 2001 From: Krishty Date: Wed, 5 May 2021 13:14:25 +0200 Subject: [PATCH 07/83] fix for 0f3e6e2941f754014d5f9f12656a9e326fca61ed MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Visual Studio’s Search All Files ignores ObjFileImporter.cpp and now I’m sure that’s a bug --- code/AssetLib/Obj/ObjFileImporter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/AssetLib/Obj/ObjFileImporter.cpp b/code/AssetLib/Obj/ObjFileImporter.cpp index fa5a77ea6..b850b1a6a 100644 --- a/code/AssetLib/Obj/ObjFileImporter.cpp +++ b/code/AssetLib/Obj/ObjFileImporter.cpp @@ -90,7 +90,7 @@ ObjFileImporter::~ObjFileImporter() { // Returns true if file is an obj file. bool ObjFileImporter::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool /*checkSig*/) const { static const char *tokens[] = { "mtllib", "usemtl", "v ", "vt ", "vn ", "o ", "g ", "s ", "f " }; - return BaseImporter::SearchFileHeaderForToken(pIOHandler, pFile, tokens, std::size(tokens), 200, false, true); + return BaseImporter::SearchFileHeaderForToken(pIOHandler, pFile, tokens, AI_COUNT_OF(tokens), 200, false, true); } // ------------------------------------------------------------------------------------------------ From 8b78a63b5005866fb6c99dedfdab7afcf8638796 Mon Sep 17 00:00:00 2001 From: Thomas Nicky Thulesen Date: Tue, 23 Nov 2021 20:39:48 +0100 Subject: [PATCH 08/83] Allow dlclose of so library by avoiding unique symbols. --- code/CMakeLists.txt | 1 + code/Common/IOSystem.cpp | 56 +++++++++++++++++++++++++++++++++++++ include/assimp/IOSystem.hpp | 9 ------ 3 files changed, 57 insertions(+), 9 deletions(-) create mode 100644 code/Common/IOSystem.cpp diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index e45bf8a2a..43bd5b825 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -174,6 +174,7 @@ SET( Common_SRCS Common/ImporterRegistry.cpp Common/DefaultProgressHandler.h Common/DefaultIOStream.cpp + Common/IOSystem.cpp Common/DefaultIOSystem.cpp Common/ZipArchiveIOSystem.cpp Common/PolyTools.h diff --git a/code/Common/IOSystem.cpp b/code/Common/IOSystem.cpp new file mode 100644 index 000000000..582485f95 --- /dev/null +++ b/code/Common/IOSystem.cpp @@ -0,0 +1,56 @@ +/* +--------------------------------------------------------------------------- +Open Asset Import Library (assimp) +--------------------------------------------------------------------------- + +Copyright (c) 2006-2019, assimp team + + + +All rights reserved. + +Redistribution and use of this software in source and binary forms, +with or without modification, are permitted provided that the following +conditions are met: + +* Redistributions of source code must retain the above + copyright notice, this list of conditions and the + following disclaimer. + +* Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the + following disclaimer in the documentation and/or other + materials provided with the distribution. + +* Neither the name of the assimp team, nor the names of its + contributors may be used to endorse or promote products + derived from this software without specific prior + written permission of the assimp team. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +--------------------------------------------------------------------------- +*/ +/** @file Default implementation of IOSystem using the standard C file functions */ + +#include + +using namespace Assimp; + +//const std::string Assimp::StaticDummyString; +const std::string &IOSystem::CurrentDirectory() const { + if ( m_pathStack.empty() ) { + static const std::string Dummy = std::string(); + return Dummy; + } + return m_pathStack[ m_pathStack.size()-1 ]; +} diff --git a/include/assimp/IOSystem.hpp b/include/assimp/IOSystem.hpp index dda0718e6..1c127ed73 100644 --- a/include/assimp/IOSystem.hpp +++ b/include/assimp/IOSystem.hpp @@ -288,15 +288,6 @@ AI_FORCE_INLINE bool IOSystem::PushDirectory( const std::string &path ) { return true; } -// ---------------------------------------------------------------------------- -AI_FORCE_INLINE const std::string &IOSystem::CurrentDirectory() const { - if ( m_pathStack.empty() ) { - static const std::string Dummy; - return Dummy; - } - return m_pathStack[ m_pathStack.size()-1 ]; -} - // ---------------------------------------------------------------------------- AI_FORCE_INLINE size_t IOSystem::StackSize() const { return m_pathStack.size(); From 690e558b88d9c88a1635b1cf626bc625a8444fd4 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Thu, 25 Nov 2021 09:32:52 +0100 Subject: [PATCH 09/83] Update IOSystem.cpp --- code/Common/IOSystem.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/code/Common/IOSystem.cpp b/code/Common/IOSystem.cpp index 582485f95..77305d193 100644 --- a/code/Common/IOSystem.cpp +++ b/code/Common/IOSystem.cpp @@ -5,8 +5,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2019, assimp team - - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -46,7 +44,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. using namespace Assimp; -//const std::string Assimp::StaticDummyString; const std::string &IOSystem::CurrentDirectory() const { if ( m_pathStack.empty() ) { static const std::string Dummy = std::string(); From 6e090c88b8ab0fcdc194a896ca2338a8ed33a749 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?= Date: Tue, 7 Dec 2021 12:13:31 +0100 Subject: [PATCH 10/83] fix index variable for surfaces Closes: https://github.com/assimp/assimp/issues/4209 --- code/AssetLib/LWO/LWOLoader.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/AssetLib/LWO/LWOLoader.cpp b/code/AssetLib/LWO/LWOLoader.cpp index bc62152c5..801da1d60 100644 --- a/code/AssetLib/LWO/LWOLoader.cpp +++ b/code/AssetLib/LWO/LWOLoader.cpp @@ -393,7 +393,7 @@ void LWOImporter::InternReadFile(const std::string &pFile, // If a RGB color map is explicitly requested delete the // alpha channel - it could theoretically be != 1. - if (_mSurfaces[i].mVCMapType == AI_LWO_RGB) + if (_mSurfaces[j].mVCMapType == AI_LWO_RGB) pvVC[w]->a = 1.f; pvVC[w]++; From 9a7ee0ac14b1de24c3793c3d4ba6fdb1310cbec9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?= Date: Tue, 7 Dec 2021 12:35:15 +0100 Subject: [PATCH 11/83] Throw a DeadlyImportError rather than an assertion if all materials are redundant and thus removed Closes: https://github.com/assimp/assimp/issues/4224 Closes: https://github.com/assimp/assimp/issues/4225 --- code/PostProcessing/RemoveRedundantMaterials.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/PostProcessing/RemoveRedundantMaterials.cpp b/code/PostProcessing/RemoveRedundantMaterials.cpp index 36745fb1d..f6355fcc6 100644 --- a/code/PostProcessing/RemoveRedundantMaterials.cpp +++ b/code/PostProcessing/RemoveRedundantMaterials.cpp @@ -50,6 +50,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include "ProcessHelper.h" #include "Material/MaterialSystem.h" +#include #include using namespace Assimp; @@ -171,6 +172,8 @@ void RemoveRedundantMatsProcess::Execute( aiScene* pScene) } // If the new material count differs from the original, // we need to rebuild the material list and remap mesh material indexes. + if(iNewNum < 1) + throw DeadlyImportError("No materials remaining"); if (iNewNum != pScene->mNumMaterials) { ai_assert(iNewNum > 0); aiMaterial** ppcMaterials = new aiMaterial*[iNewNum]; From 2be6bac4b022232058008658726bb2a240f3fc8a Mon Sep 17 00:00:00 2001 From: kovacsv Date: Tue, 7 Dec 2021 20:42:43 +0100 Subject: [PATCH 12/83] Bug: Export crashes when any of the meshes contains texture coordinate names #4243 --- code/Common/SceneCombiner.cpp | 20 ++++++++++++++++++++ include/assimp/SceneCombiner.h | 1 + test/unit/Common/uiScene.cpp | 17 +++++++++++++++++ 3 files changed, 38 insertions(+) diff --git a/code/Common/SceneCombiner.cpp b/code/Common/SceneCombiner.cpp index 8f10d6308..7dbbf8860 100644 --- a/code/Common/SceneCombiner.cpp +++ b/code/Common/SceneCombiner.cpp @@ -1101,6 +1101,14 @@ void SceneCombiner::Copy(aiMesh **_dest, const aiMesh *src) { // make a deep copy of all blend shapes CopyPtrArray(dest->mAnimMeshes, dest->mAnimMeshes, dest->mNumAnimMeshes); + + // make a deep copy of all texture coordinate names + if (src->mTextureCoordsNames != nullptr) { + dest->mTextureCoordsNames = new aiString *[AI_MAX_NUMBER_OF_TEXTURECOORDS] {}; + for (unsigned int i = 0; i < AI_MAX_NUMBER_OF_TEXTURECOORDS; ++i) { + Copy(&dest->mTextureCoordsNames[i], src->mTextureCoordsNames[i]); + } + } } // ------------------------------------------------------------------------------------------------ @@ -1348,6 +1356,18 @@ void SceneCombiner::Copy(aiMetadata **_dest, const aiMetadata *src) { } } +// ------------------------------------------------------------------------------------------------ +void SceneCombiner::Copy(aiString **_dest, const aiString *src) { + if (nullptr == _dest || nullptr == src) { + return; + } + + aiString *dest = *_dest = new aiString(); + + // get a flat copy + *dest = *src; +} + #if (__GNUC__ >= 8 && __GNUC_MINOR__ >= 0) #pragma GCC diagnostic pop #endif diff --git a/include/assimp/SceneCombiner.h b/include/assimp/SceneCombiner.h index 809ac30e4..874a885a5 100644 --- a/include/assimp/SceneCombiner.h +++ b/include/assimp/SceneCombiner.h @@ -361,6 +361,7 @@ public: static void Copy(aiNodeAnim **dest, const aiNodeAnim *src); static void Copy(aiMeshMorphAnim **dest, const aiMeshMorphAnim *src); static void Copy(aiMetadata **dest, const aiMetadata *src); + static void Copy(aiString **dest, const aiString *src); // recursive, of course static void Copy(aiNode **dest, const aiNode *src); diff --git a/test/unit/Common/uiScene.cpp b/test/unit/Common/uiScene.cpp index 1c531b042..af0b6ca01 100644 --- a/test/unit/Common/uiScene.cpp +++ b/test/unit/Common/uiScene.cpp @@ -42,6 +42,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "UnitTestPCH.h" #include +#include using namespace Assimp; @@ -88,5 +89,21 @@ TEST_F(utScene, getShortFilenameTest) { EXPECT_NE(nullptr, name2); } +TEST_F(utScene, deepCopyTest) { + scene->mRootNode = new aiNode(); + + scene->mNumMeshes = 1; + scene->mMeshes = new aiMesh *[scene->mNumMeshes] (); + scene->mMeshes[0] = new aiMesh (); + + scene->mMeshes[0]->SetTextureCoordsName (0, aiString ("test")); + + { + aiScene* copied = nullptr; + SceneCombiner::CopyScene(&copied,scene); + delete copied; + } +} + TEST_F(utScene, getEmbeddedTextureTest) { } From 1e4861f86ec3eef719f7aac22efbd7b37b696490 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Tue, 7 Dec 2021 20:45:21 +0100 Subject: [PATCH 13/83] Fix division by zero in PointInTriangle2D - closes https://github.com/assimp/assimp/issues/4240 --- code/Common/PolyTools.h | 39 ++++++++++++++++++--------------------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/code/Common/PolyTools.h b/code/Common/PolyTools.h index e660ce49b..31100d060 100644 --- a/code/Common/PolyTools.h +++ b/code/Common/PolyTools.h @@ -4,7 +4,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2021, assimp team - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -42,6 +41,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /** @file PolyTools.h, various utilities for our dealings with arbitrary polygons */ +#pragma once #ifndef AI_POLYTOOLS_H_INCLUDED #define AI_POLYTOOLS_H_INCLUDED @@ -55,8 +55,7 @@ namespace Assimp { * The function accepts an unconstrained template parameter for use with * both aiVector3D and aiVector2D, but generally ignores the third coordinate.*/ template -inline double GetArea2D(const T& v1, const T& v2, const T& v3) -{ +inline double GetArea2D(const T& v1, const T& v2, const T& v3) { return 0.5 * (v1.x * ((double)v3.y - v2.y) + v2.x * ((double)v1.y - v3.y) + v3.x * ((double)v2.y - v1.y)); } @@ -65,8 +64,7 @@ inline double GetArea2D(const T& v1, const T& v2, const T& v3) * The function accepts an unconstrained template parameter for use with * both aiVector3D and aiVector2D, but generally ignores the third coordinate.*/ template -inline bool OnLeftSideOfLine2D(const T& p0, const T& p1,const T& p2) -{ +inline bool OnLeftSideOfLine2D(const T& p0, const T& p1,const T& p2) { return GetArea2D(p0,p2,p1) > 0; } @@ -75,20 +73,23 @@ inline bool OnLeftSideOfLine2D(const T& p0, const T& p1,const T& p2) * The function accepts an unconstrained template parameter for use with * both aiVector3D and aiVector2D, but generally ignores the third coordinate.*/ template -inline bool PointInTriangle2D(const T& p0, const T& p1,const T& p2, const T& pp) -{ +inline bool PointInTriangle2D(const T& p0, const T& p1,const T& p2, const T& pp) { // Point in triangle test using baryzentric coordinates const aiVector2D v0 = p1 - p0; const aiVector2D v1 = p2 - p0; const aiVector2D v2 = pp - p0; - double dot00 = v0 * v0; - double dot01 = v0 * v1; - double dot02 = v0 * v2; + const double dot00 = v0 * v0; + const double dot01 = v0 * v1; + const double dot02 = v0 * v2; double dot11 = v1 * v1; double dot12 = v1 * v2; - - const double invDenom = 1 / (dot00 * dot11 - dot01 * dot01); + const double denom = dot00 * dot11 - dot01 * dot01; + if (denom == 0.0) { + return false; + } + + const double invDenom = 1.0 / denom; dot11 = (dot11 * dot02 - dot01 * dot12) * invDenom; dot00 = (dot00 * dot12 - dot01 * dot02) * invDenom; @@ -133,8 +134,7 @@ inline bool IsCCW(T* in, size_t npoints) { // in[i+2].x, in[i+2].y)) { convex_turn = AI_MATH_PI_F - theta; convex_sum += convex_turn; - } - else { + } else { convex_sum -= AI_MATH_PI_F - theta; } } @@ -161,15 +161,13 @@ inline bool IsCCW(T* in, size_t npoints) { if (OnLeftSideOfLine2D(in[npoints-2],in[1],in[0])) { convex_turn = AI_MATH_PI_F - theta; convex_sum += convex_turn; - } - else { + } else { convex_sum -= AI_MATH_PI_F - theta; } return convex_sum >= (2 * AI_MATH_PI_F); } - // ------------------------------------------------------------------------------- /** Compute the normal of an arbitrary polygon in R3. * @@ -186,8 +184,7 @@ inline bool IsCCW(T* in, size_t npoints) { * this method is much faster than the 'other' NewellNormal() */ template -inline void NewellNormal (aiVector3t& out, int num, TReal* x, TReal* y, TReal* z) -{ +inline void NewellNormal (aiVector3t& out, int num, TReal* x, TReal* y, TReal* z) { // Duplicate the first two vertices at the end x[(num+0)*ofs_x] = x[0]; x[(num+1)*ofs_x] = x[ofs_x]; @@ -224,6 +221,6 @@ inline void NewellNormal (aiVector3t& out, int num, TReal* x, TReal* y, T out = aiVector3t(sum_yz,sum_zx,sum_xy); } -} // ! Assimp +} // ! namespace Assimp -#endif +#endif // AI_POLYTOOLS_H_INCLUDED From e51feac2c5b22db763123658f221a5fc74a105af Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Tue, 7 Dec 2021 21:19:01 +0100 Subject: [PATCH 14/83] Update PolyTools.h --- code/Common/PolyTools.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/Common/PolyTools.h b/code/Common/PolyTools.h index 31100d060..15276184e 100644 --- a/code/Common/PolyTools.h +++ b/code/Common/PolyTools.h @@ -79,11 +79,11 @@ inline bool PointInTriangle2D(const T& p0, const T& p1,const T& p2, const T& pp) const aiVector2D v1 = p2 - p0; const aiVector2D v2 = pp - p0; - const double dot00 = v0 * v0; + double dot00 = v0 * v0; + double dot11 = v1 * v1; const double dot01 = v0 * v1; const double dot02 = v0 * v2; - double dot11 = v1 * v1; - double dot12 = v1 * v2; + const double dot12 = v1 * v2; const double denom = dot00 * dot11 - dot01 * dot01; if (denom == 0.0) { return false; From c2297e91999794f44862101114c7b0de651eda01 Mon Sep 17 00:00:00 2001 From: Inho Lee Date: Wed, 8 Dec 2021 13:45:35 +0100 Subject: [PATCH 15/83] Revert "FBXConverter : Fix timescales of FBX animations" The previous patch was made by misunderstanding about mTime. It is not real time value, but time ticks. This reverts commit b8bf1eac041f0bbb406019a28f310509dad51b86. --- code/AssetLib/FBX/FBXConverter.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/code/AssetLib/FBX/FBXConverter.cpp b/code/AssetLib/FBX/FBXConverter.cpp index 098ba58e2..5a3ae0ae7 100644 --- a/code/AssetLib/FBX/FBXConverter.cpp +++ b/code/AssetLib/FBX/FBXConverter.cpp @@ -79,7 +79,7 @@ using namespace Util; #define MAGIC_NODE_TAG "_$AssimpFbx$" -#define CONVERT_FBX_TIME(time) (static_cast(time) * 1000.0 / 46186158000LL) +#define CONVERT_FBX_TIME(time) static_cast(time) / 46186158000LL FBXConverter::FBXConverter(aiScene *out, const Document &doc, bool removeEmptyBones) : defaultMaterialIndex(), @@ -2618,7 +2618,7 @@ void FBXConverter::ConvertAnimationStack(const AnimationStack &st) { meshMorphAnim->mKeys[j].mNumValuesAndWeights = numValuesAndWeights; meshMorphAnim->mKeys[j].mValues = new unsigned int[numValuesAndWeights]; meshMorphAnim->mKeys[j].mWeights = new double[numValuesAndWeights]; - meshMorphAnim->mKeys[j].mTime = CONVERT_FBX_TIME(animIt.first); + meshMorphAnim->mKeys[j].mTime = CONVERT_FBX_TIME(animIt.first) * anim_fps; for (unsigned int k = 0; k < numValuesAndWeights; k++) { meshMorphAnim->mKeys[j].mValues[k] = keyData->values.at(k); meshMorphAnim->mKeys[j].mWeights[k] = keyData->weights.at(k); @@ -2636,8 +2636,8 @@ void FBXConverter::ConvertAnimationStack(const AnimationStack &st) { return; } - double start_time_fps = has_local_startstop ? CONVERT_FBX_TIME(start_time) : min_time; - double stop_time_fps = has_local_startstop ? CONVERT_FBX_TIME(stop_time) : max_time; + double start_time_fps = has_local_startstop ? (CONVERT_FBX_TIME(start_time) * anim_fps) : min_time; + double stop_time_fps = has_local_startstop ? (CONVERT_FBX_TIME(stop_time) * anim_fps) : max_time; // adjust relative timing for animation for (unsigned int c = 0; c < anim->mNumChannels; c++) { @@ -3162,7 +3162,7 @@ aiNodeAnim* FBXConverter::GenerateSimpleNodeAnim(const std::string& name, InterpolateKeys(outTranslations, keytimes, keyframeLists[TransformationComp_Translation], defTranslate, maxTime, minTime); } else { for (size_t i = 0; i < keyCount; ++i) { - outTranslations[i].mTime = CONVERT_FBX_TIME(keytimes[i]); + outTranslations[i].mTime = CONVERT_FBX_TIME(keytimes[i]) * anim_fps; outTranslations[i].mValue = defTranslate; } } @@ -3171,7 +3171,7 @@ aiNodeAnim* FBXConverter::GenerateSimpleNodeAnim(const std::string& name, InterpolateKeys(outRotations, keytimes, keyframeLists[TransformationComp_Rotation], defRotation, maxTime, minTime, rotOrder); } else { for (size_t i = 0; i < keyCount; ++i) { - outRotations[i].mTime = CONVERT_FBX_TIME(keytimes[i]); + outRotations[i].mTime = CONVERT_FBX_TIME(keytimes[i]) * anim_fps; outRotations[i].mValue = defQuat; } } @@ -3180,7 +3180,7 @@ aiNodeAnim* FBXConverter::GenerateSimpleNodeAnim(const std::string& name, InterpolateKeys(outScales, keytimes, keyframeLists[TransformationComp_Scaling], defScale, maxTime, minTime); } else { for (size_t i = 0; i < keyCount; ++i) { - outScales[i].mTime = CONVERT_FBX_TIME(keytimes[i]); + outScales[i].mTime = CONVERT_FBX_TIME(keytimes[i]) * anim_fps; outScales[i].mValue = defScale; } } @@ -3442,7 +3442,7 @@ void FBXConverter::InterpolateKeys(aiVectorKey *valOut, const KeyTimeList &keys, } // magic value to convert fbx times to seconds - valOut->mTime = CONVERT_FBX_TIME(time); + valOut->mTime = CONVERT_FBX_TIME(time) * anim_fps; min_time = std::min(min_time, valOut->mTime); max_time = std::max(max_time, valOut->mTime); From 68682d75b5323ebf45d662dd0d1de563442d147f Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Fri, 10 Dec 2021 08:39:21 +0100 Subject: [PATCH 16/83] Fix nullptr dereferencing from std::shared_ptr - Finding from fuzzer - closes https://github.com/assimp/assimp/issues/4237 --- code/AssetLib/DXF/DXFLoader.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/code/AssetLib/DXF/DXFLoader.cpp b/code/AssetLib/DXF/DXFLoader.cpp index 3b20678ad..2f1aa6961 100644 --- a/code/AssetLib/DXF/DXFLoader.cpp +++ b/code/AssetLib/DXF/DXFLoader.cpp @@ -378,6 +378,11 @@ void DXFImporter::ExpandBlockReferences(DXF::Block& bl,const DXF::BlockMap& bloc const DXF::Block& bl_src = *(*it).second; for (std::shared_ptr pl_in : bl_src.lines) { + if (!pl_in) { + ASSIMP_LOG_ERROR("DXF: PolyLine instance is nullptr, skipping."); + continue; + } + std::shared_ptr pl_out = std::shared_ptr(new DXF::PolyLine(*pl_in)); if (bl_src.base.Length() || insert.scale.x!=1.f || insert.scale.y!=1.f || insert.scale.z!=1.f || insert.angle || insert.pos.Length()) { From 33c676227233c3b543df53284e905781dbf62c10 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Fri, 10 Dec 2021 14:32:45 +0100 Subject: [PATCH 17/83] Update HMPLoader.cpp - Fix possible division by zero - closes https://github.com/assimp/assimp/issues/4235 --- code/AssetLib/HMP/HMPLoader.cpp | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/code/AssetLib/HMP/HMPLoader.cpp b/code/AssetLib/HMP/HMPLoader.cpp index 661e4d1b2..0bc152680 100644 --- a/code/AssetLib/HMP/HMPLoader.cpp +++ b/code/AssetLib/HMP/HMPLoader.cpp @@ -473,16 +473,22 @@ void HMPImporter::ReadFirstSkin(unsigned int iNumSkins, const unsigned char *szC // ------------------------------------------------------------------------------------------------ // Generate proepr texture coords -void HMPImporter::GenerateTextureCoords( - const unsigned int width, const unsigned int height) { +void HMPImporter::GenerateTextureCoords(const unsigned int width, const unsigned int height) { ai_assert(nullptr != pScene->mMeshes); ai_assert(nullptr != pScene->mMeshes[0]); ai_assert(nullptr != pScene->mMeshes[0]->mTextureCoords[0]); aiVector3D *uv = pScene->mMeshes[0]->mTextureCoords[0]; - - const float fY = (1.0f / height) + (1.0f / height) / (height - 1); - const float fX = (1.0f / width) + (1.0f / width) / (width - 1); + if (uv == nullptr) { + return; + } + + if (height == 0.0f || width == 0.0) { + return; + } + + const float fY = (1.0f / height) + (1.0f / height) / height; + const float fX = (1.0f / width) + (1.0f / width) / width; for (unsigned int y = 0; y < height; ++y) { for (unsigned int x = 0; x < width; ++x, ++uv) { From cb657e4c13f9ee9a8fd6eaf3f657c8a1abc8cb46 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Mon, 13 Dec 2021 18:06:23 +0100 Subject: [PATCH 18/83] Use correct XmlParser-methods and add some missing casts --- code/AssetLib/X3D/X3DImporter_Geometry3D.cpp | 2 +- code/AssetLib/glTF2/glTF2Exporter.cpp | 2 +- code/AssetLib/glTF2/glTF2Exporter.h | 3 +++ include/assimp/material.inl | 2 +- test/unit/utMaterialSystem.cpp | 2 +- 5 files changed, 7 insertions(+), 4 deletions(-) diff --git a/code/AssetLib/X3D/X3DImporter_Geometry3D.cpp b/code/AssetLib/X3D/X3DImporter_Geometry3D.cpp index 2db62dc64..b9fc2a4d8 100644 --- a/code/AssetLib/X3D/X3DImporter_Geometry3D.cpp +++ b/code/AssetLib/X3D/X3DImporter_Geometry3D.cpp @@ -879,7 +879,7 @@ void X3DImporter::readSphere(XmlNode &node) { X3DNodeElementBase *ne(nullptr); MACRO_ATTRREAD_CHECKUSEDEF_RET(node, def, use); - XmlParser::getFloatAttribute(node, "radius", radius); + XmlParser::getRealAttribute(node, "radius", radius); XmlParser::getBoolAttribute(node, "solid", solid); // if "USE" defined then find already defined element. diff --git a/code/AssetLib/glTF2/glTF2Exporter.cpp b/code/AssetLib/glTF2/glTF2Exporter.cpp index e5c8b4530..606a4a919 100644 --- a/code/AssetLib/glTF2/glTF2Exporter.cpp +++ b/code/AssetLib/glTF2/glTF2Exporter.cpp @@ -1410,7 +1410,7 @@ void glTF2Exporter::ExportMetadata() { } } -inline Ref GetSamplerInputRef(Asset &asset, std::string &animId, Ref &buffer, std::vector ×) { +inline Ref GetSamplerInputRef(Asset &asset, std::string &animId, Ref &buffer, std::vector ×) { return ExportData(asset, animId, buffer, (unsigned int)times.size(), ×[0], AttribType::SCALAR, AttribType::SCALAR, ComponentType_FLOAT); } diff --git a/code/AssetLib/glTF2/glTF2Exporter.h b/code/AssetLib/glTF2/glTF2Exporter.h index 6d70d915e..d328f8a80 100644 --- a/code/AssetLib/glTF2/glTF2Exporter.h +++ b/code/AssetLib/glTF2/glTF2Exporter.h @@ -66,7 +66,9 @@ class Ref; } namespace glTF2 { + class Asset; + struct TexProperty; struct TextureInfo; struct NormalTextureInfo; @@ -84,6 +86,7 @@ struct MaterialIOR; typedef float(vec2)[2]; typedef float(vec3)[3]; typedef float(vec4)[4]; + } // namespace glTF2 namespace Assimp { diff --git a/include/assimp/material.inl b/include/assimp/material.inl index 693785c3c..27f17ec28 100644 --- a/include/assimp/material.inl +++ b/include/assimp/material.inl @@ -105,7 +105,7 @@ aiReturn aiMaterial::Get(const char* pKey,unsigned int type, return AI_FAILURE; } - iNum = std::min((size_t)iNum,prop->mDataLength / sizeof(Type)); + iNum = (unsigned int)std::min((size_t)iNum,prop->mDataLength / sizeof(Type)); ::memcpy(pOut,prop->mData,iNum * sizeof(Type)); if (pMax) { *pMax = iNum; diff --git a/test/unit/utMaterialSystem.cpp b/test/unit/utMaterialSystem.cpp index 8db014d9c..6f1be1608 100644 --- a/test/unit/utMaterialSystem.cpp +++ b/test/unit/utMaterialSystem.cpp @@ -73,7 +73,7 @@ TEST_F(MaterialSystemTest, testFloatArrayProperty) { pf[0] = pf[1] = pf[2] = pf[3] = 12.0f; EXPECT_EQ(AI_SUCCESS, pcMat->Get("testKey2", 0, 0, pf, &pMax)); - EXPECT_EQ(sizeof(pf) / sizeof(float), pMax); + EXPECT_EQ(sizeof(pf) / sizeof(float), static_cast(pMax)); EXPECT_TRUE(!pf[0] && 1.0f == pf[1] && 2.0f == pf[2] && 3.0f == pf[3]); } From e4f38810cad912e2dea23e2810e6f77e00358fbf Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Mon, 13 Dec 2021 18:12:19 +0100 Subject: [PATCH 19/83] Add missing static casts --- include/assimp/material.inl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/assimp/material.inl b/include/assimp/material.inl index 27f17ec28..7f4b44575 100644 --- a/include/assimp/material.inl +++ b/include/assimp/material.inl @@ -105,7 +105,7 @@ aiReturn aiMaterial::Get(const char* pKey,unsigned int type, return AI_FAILURE; } - iNum = (unsigned int)std::min((size_t)iNum,prop->mDataLength / sizeof(Type)); + iNum = static_cast(std::min(static_cast(iNum),prop->mDataLength / sizeof(Type))); ::memcpy(pOut,prop->mData,iNum * sizeof(Type)); if (pMax) { *pMax = iNum; From 65bc801734702a977e66d9f2d16ca723f955051f Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Mon, 13 Dec 2021 18:48:58 +0100 Subject: [PATCH 20/83] Some fixes for possible divisions by zero --- include/assimp/SkeletonMeshBuilder.h | 3 +- include/assimp/color4.h | 2 - include/assimp/light.h | 1 - include/assimp/material.inl | 88 +++++++++----------------- include/assimp/texture.h | 19 +++--- include/assimp/vector2.h | 2 - include/assimp/vector3.inl | 92 ++++++++++------------------ 7 files changed, 70 insertions(+), 137 deletions(-) diff --git a/include/assimp/SkeletonMeshBuilder.h b/include/assimp/SkeletonMeshBuilder.h index 2479f4308..37d12f03d 100644 --- a/include/assimp/SkeletonMeshBuilder.h +++ b/include/assimp/SkeletonMeshBuilder.h @@ -6,7 +6,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2021, assimp team - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -102,7 +101,7 @@ protected: /** Creates a dummy material and returns it. */ aiMaterial *CreateMaterial(); -protected: +private: /** space to assemble the mesh data: points */ std::vector mVertices; diff --git a/include/assimp/color4.h b/include/assimp/color4.h index fdd8f031e..573745ed6 100644 --- a/include/assimp/color4.h +++ b/include/assimp/color4.h @@ -5,8 +5,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2021, assimp team - - All rights reserved. Redistribution and use of this software in source and binary forms, diff --git a/include/assimp/light.h b/include/assimp/light.h index f35f51e0a..46acad5fd 100644 --- a/include/assimp/light.h +++ b/include/assimp/light.h @@ -255,5 +255,4 @@ struct aiLight { } #endif - #endif // !! AI_LIGHT_H_INC diff --git a/include/assimp/material.inl b/include/assimp/material.inl index 7f4b44575..7a3cce741 100644 --- a/include/assimp/material.inl +++ b/include/assimp/material.inl @@ -44,21 +44,17 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #pragma once -#ifndef AI_MATERIAL_INL_INC -#define AI_MATERIAL_INL_INC #ifdef __GNUC__ # pragma GCC system_header #endif // --------------------------------------------------------------------------- -AI_FORCE_INLINE -aiPropertyTypeInfo ai_real_to_property_type_info(float) { +AI_FORCE_INLINE aiPropertyTypeInfo ai_real_to_property_type_info(float) { return aiPTI_Float; } -AI_FORCE_INLINE -aiPropertyTypeInfo ai_real_to_property_type_info(double) { +AI_FORCE_INLINE aiPropertyTypeInfo ai_real_to_property_type_info(double) { return aiPTI_Double; } // --------------------------------------------------------------------------- @@ -66,8 +62,7 @@ aiPropertyTypeInfo ai_real_to_property_type_info(double) { //! @cond never // --------------------------------------------------------------------------- -AI_FORCE_INLINE -aiReturn aiMaterial::GetTexture( aiTextureType type, +AI_FORCE_INLINE aiReturn aiMaterial::GetTexture( aiTextureType type, unsigned int index, C_STRUCT aiString* path, aiTextureMapping* mapping /*= NULL*/, @@ -79,15 +74,13 @@ aiReturn aiMaterial::GetTexture( aiTextureType type, } // --------------------------------------------------------------------------- -AI_FORCE_INLINE -unsigned int aiMaterial::GetTextureCount(aiTextureType type) const { +AI_FORCE_INLINE unsigned int aiMaterial::GetTextureCount(aiTextureType type) const { return ::aiGetMaterialTextureCount(this,type); } // --------------------------------------------------------------------------- template -AI_FORCE_INLINE -aiReturn aiMaterial::Get(const char* pKey,unsigned int type, +AI_FORCE_INLINE aiReturn aiMaterial::Get(const char* pKey,unsigned int type, unsigned int idx, Type* pOut, unsigned int* pMax) const { unsigned int iNum = pMax ? *pMax : 1; @@ -116,8 +109,7 @@ aiReturn aiMaterial::Get(const char* pKey,unsigned int type, // --------------------------------------------------------------------------- template -AI_FORCE_INLINE -aiReturn aiMaterial::Get(const char* pKey,unsigned int type, +AI_FORCE_INLINE aiReturn aiMaterial::Get(const char* pKey,unsigned int type, unsigned int idx,Type& pOut) const { const aiMaterialProperty* prop; const aiReturn ret = ::aiGetMaterialProperty(this,pKey,type,idx, @@ -138,34 +130,29 @@ aiReturn aiMaterial::Get(const char* pKey,unsigned int type, } // --------------------------------------------------------------------------- -AI_FORCE_INLINE -aiReturn aiMaterial::Get(const char* pKey,unsigned int type, +AI_FORCE_INLINE aiReturn aiMaterial::Get(const char* pKey,unsigned int type, unsigned int idx,ai_real* pOut, unsigned int* pMax) const { return ::aiGetMaterialFloatArray(this,pKey,type,idx,pOut,pMax); } // --------------------------------------------------------------------------- -AI_FORCE_INLINE -aiReturn aiMaterial::Get(const char* pKey,unsigned int type, +AI_FORCE_INLINE aiReturn aiMaterial::Get(const char* pKey,unsigned int type, unsigned int idx,int* pOut, unsigned int* pMax) const { return ::aiGetMaterialIntegerArray(this,pKey,type,idx,pOut,pMax); } // --------------------------------------------------------------------------- -AI_FORCE_INLINE -aiReturn aiMaterial::Get(const char* pKey,unsigned int type, +AI_FORCE_INLINE aiReturn aiMaterial::Get(const char* pKey,unsigned int type, unsigned int idx,ai_real& pOut) const { return aiGetMaterialFloat(this,pKey,type,idx,&pOut); } // --------------------------------------------------------------------------- -AI_FORCE_INLINE -aiReturn aiMaterial::Get(const char* pKey,unsigned int type, +AI_FORCE_INLINE aiReturn aiMaterial::Get(const char* pKey,unsigned int type, unsigned int idx,int& pOut) const { return aiGetMaterialInteger(this,pKey,type,idx,&pOut); } // --------------------------------------------------------------------------- -AI_FORCE_INLINE -aiReturn aiMaterial::Get(const char* pKey,unsigned int type, +AI_FORCE_INLINE aiReturn aiMaterial::Get(const char* pKey,unsigned int type, unsigned int idx,aiColor4D& pOut) const { return aiGetMaterialColor(this,pKey,type,idx,&pOut); } @@ -190,14 +177,10 @@ AI_FORCE_INLINE aiReturn aiMaterial::Get(const char* pKey,unsigned int type, // --------------------------------------------------------------------------- template -aiReturn aiMaterial::AddProperty (const TYPE* pInput, - const unsigned int pNumValues, - const char* pKey, - unsigned int type, - unsigned int index) -{ - return AddBinaryProperty((const void*)pInput, - pNumValues * sizeof(TYPE), +aiReturn aiMaterial::AddProperty (const TYPE* pInput, + const unsigned int pNumValues, const char* pKey, unsigned int type, + unsigned int index) { + return AddBinaryProperty((const void*)pInput, pNumValues * sizeof(TYPE), pKey,type,index,aiPTI_Buffer); } @@ -213,8 +196,7 @@ AI_FORCE_INLINE aiReturn aiMaterial::AddProperty(const float* pInput, } // --------------------------------------------------------------------------- -AI_FORCE_INLINE -aiReturn aiMaterial::AddProperty(const double* pInput, +AI_FORCE_INLINE aiReturn aiMaterial::AddProperty(const double* pInput, const unsigned int pNumValues, const char* pKey, unsigned int type, @@ -225,8 +207,7 @@ aiReturn aiMaterial::AddProperty(const double* pInput, } // --------------------------------------------------------------------------- -AI_FORCE_INLINE -aiReturn aiMaterial::AddProperty(const aiUVTransform* pInput, +AI_FORCE_INLINE aiReturn aiMaterial::AddProperty(const aiUVTransform* pInput, const unsigned int pNumValues, const char* pKey, unsigned int type, @@ -237,8 +218,7 @@ aiReturn aiMaterial::AddProperty(const aiUVTransform* pInput, } // --------------------------------------------------------------------------- -AI_FORCE_INLINE -aiReturn aiMaterial::AddProperty(const aiColor4D* pInput, +AI_FORCE_INLINE aiReturn aiMaterial::AddProperty(const aiColor4D* pInput, const unsigned int pNumValues, const char* pKey, unsigned int type, @@ -249,8 +229,7 @@ aiReturn aiMaterial::AddProperty(const aiColor4D* pInput, } // --------------------------------------------------------------------------- -AI_FORCE_INLINE -aiReturn aiMaterial::AddProperty(const aiColor3D* pInput, +AI_FORCE_INLINE aiReturn aiMaterial::AddProperty(const aiColor3D* pInput, const unsigned int pNumValues, const char* pKey, unsigned int type, @@ -261,8 +240,7 @@ aiReturn aiMaterial::AddProperty(const aiColor3D* pInput, } // --------------------------------------------------------------------------- -AI_FORCE_INLINE -aiReturn aiMaterial::AddProperty(const aiVector3D* pInput, +AI_FORCE_INLINE aiReturn aiMaterial::AddProperty(const aiVector3D* pInput, const unsigned int pNumValues, const char* pKey, unsigned int type, @@ -273,8 +251,7 @@ aiReturn aiMaterial::AddProperty(const aiVector3D* pInput, } // --------------------------------------------------------------------------- -AI_FORCE_INLINE -aiReturn aiMaterial::AddProperty(const int* pInput, +AI_FORCE_INLINE aiReturn aiMaterial::AddProperty(const int* pInput, const unsigned int pNumValues, const char* pKey, unsigned int type, @@ -293,8 +270,7 @@ aiReturn aiMaterial::AddProperty(const int* pInput, // --------------------------------------------------------------------------- template<> -AI_FORCE_INLINE -aiReturn aiMaterial::AddProperty(const float* pInput, +AI_FORCE_INLINE aiReturn aiMaterial::AddProperty(const float* pInput, const unsigned int pNumValues, const char* pKey, unsigned int type, @@ -306,8 +282,7 @@ aiReturn aiMaterial::AddProperty(const float* pInput, // --------------------------------------------------------------------------- template<> -AI_FORCE_INLINE -aiReturn aiMaterial::AddProperty(const double* pInput, +AI_FORCE_INLINE aiReturn aiMaterial::AddProperty(const double* pInput, const unsigned int pNumValues, const char* pKey, unsigned int type, @@ -319,8 +294,7 @@ aiReturn aiMaterial::AddProperty(const double* pInput, // --------------------------------------------------------------------------- template<> -AI_FORCE_INLINE -aiReturn aiMaterial::AddProperty(const aiUVTransform* pInput, +AI_FORCE_INLINE aiReturn aiMaterial::AddProperty(const aiUVTransform* pInput, const unsigned int pNumValues, const char* pKey, unsigned int type, @@ -332,8 +306,7 @@ aiReturn aiMaterial::AddProperty(const aiUVTransform* pInput, // --------------------------------------------------------------------------- template<> -AI_FORCE_INLINE -aiReturn aiMaterial::AddProperty(const aiColor4D* pInput, +AI_FORCE_INLINE aiReturn aiMaterial::AddProperty(const aiColor4D* pInput, const unsigned int pNumValues, const char* pKey, unsigned int type, @@ -345,8 +318,7 @@ aiReturn aiMaterial::AddProperty(const aiColor4D* pInput, // --------------------------------------------------------------------------- template<> -AI_FORCE_INLINE -aiReturn aiMaterial::AddProperty(const aiColor3D* pInput, +AI_FORCE_INLINE aiReturn aiMaterial::AddProperty(const aiColor3D* pInput, const unsigned int pNumValues, const char* pKey, unsigned int type, @@ -358,8 +330,7 @@ aiReturn aiMaterial::AddProperty(const aiColor3D* pInput, // --------------------------------------------------------------------------- template<> -AI_FORCE_INLINE -aiReturn aiMaterial::AddProperty(const aiVector3D* pInput, +AI_FORCE_INLINE aiReturn aiMaterial::AddProperty(const aiVector3D* pInput, const unsigned int pNumValues, const char* pKey, unsigned int type, @@ -371,8 +342,7 @@ aiReturn aiMaterial::AddProperty(const aiVector3D* pInput, // --------------------------------------------------------------------------- template<> -AI_FORCE_INLINE -aiReturn aiMaterial::AddProperty(const int* pInput, +AI_FORCE_INLINE aiReturn aiMaterial::AddProperty(const int* pInput, const unsigned int pNumValues, const char* pKey, unsigned int type, @@ -383,5 +353,3 @@ aiReturn aiMaterial::AddProperty(const int* pInput, } //! @endcond - -#endif //! AI_MATERIAL_INL_INC diff --git a/include/assimp/texture.h b/include/assimp/texture.h index 7a9d38cc0..ec156114b 100644 --- a/include/assimp/texture.h +++ b/include/assimp/texture.h @@ -92,22 +92,19 @@ struct aiTexel { #ifdef __cplusplus //! Comparison operator - bool operator== (const aiTexel& other) const - { + bool operator== (const aiTexel& other) const { return b == other.b && r == other.r && g == other.g && a == other.a; } //! Inverse comparison operator - bool operator!= (const aiTexel& other) const - { + bool operator!= (const aiTexel& other) const { return b != other.b || r != other.r || g != other.g || a != other.a; } //! Conversion to a floating-point 4d color - operator aiColor4D() const - { + operator aiColor4D() const { return aiColor4D(r/255.f,g/255.f,b/255.f,a/255.f); } #endif // __cplusplus @@ -202,11 +199,11 @@ struct aiTexture { } // Construction - aiTexture() AI_NO_EXCEPT - : mWidth(0) - , mHeight(0) - , pcData(nullptr) - , mFilename() { + aiTexture() AI_NO_EXCEPT : + mWidth(0), + mHeight(0), + pcData(nullptr), + mFilename() { memset(achFormatHint, 0, sizeof(achFormatHint)); } diff --git a/include/assimp/vector2.h b/include/assimp/vector2.h index 34adf894b..586d63244 100644 --- a/include/assimp/vector2.h +++ b/include/assimp/vector2.h @@ -5,8 +5,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2021, assimp team - - All rights reserved. Redistribution and use of this software in source and binary forms, diff --git a/include/assimp/vector3.inl b/include/assimp/vector3.inl index 0076d2a85..80d2c55a1 100644 --- a/include/assimp/vector3.inl +++ b/include/assimp/vector3.inl @@ -54,8 +54,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // ------------------------------------------------------------------------------------------------ /** Transformation of a vector by a 3x3 matrix */ template -AI_FORCE_INLINE -aiVector3t operator * (const aiMatrix3x3t& pMatrix, const aiVector3t& pVector) { +AI_FORCE_INLINE aiVector3t operator * (const aiMatrix3x3t& pMatrix, const aiVector3t& pVector) { aiVector3t res; res.x = pMatrix.a1 * pVector.x + pMatrix.a2 * pVector.y + pMatrix.a3 * pVector.z; res.y = pMatrix.b1 * pVector.x + pMatrix.b2 * pVector.y + pMatrix.b3 * pVector.z; @@ -66,8 +65,7 @@ aiVector3t operator * (const aiMatrix3x3t& pMatrix, const aiVector // ------------------------------------------------------------------------------------------------ /** Transformation of a vector by a 4x4 matrix */ template -AI_FORCE_INLINE -aiVector3t operator * (const aiMatrix4x4t& pMatrix, const aiVector3t& pVector) { +AI_FORCE_INLINE aiVector3t operator * (const aiMatrix4x4t& pMatrix, const aiVector3t& pVector) { aiVector3t res; res.x = pMatrix.a1 * pVector.x + pMatrix.a2 * pVector.y + pMatrix.a3 * pVector.z + pMatrix.a4; res.y = pMatrix.b1 * pVector.x + pMatrix.b2 * pVector.y + pMatrix.b3 * pVector.z + pMatrix.b4; @@ -82,36 +80,35 @@ aiVector3t::operator aiVector3t () const { } // ------------------------------------------------------------------------------------------------ template -AI_FORCE_INLINE -void aiVector3t::Set( TReal pX, TReal pY, TReal pZ) { +AI_FORCE_INLINE void aiVector3t::Set( TReal pX, TReal pY, TReal pZ) { x = pX; y = pY; z = pZ; } // ------------------------------------------------------------------------------------------------ template -AI_FORCE_INLINE -TReal aiVector3t::SquareLength() const { +AI_FORCE_INLINE TReal aiVector3t::SquareLength() const { return x*x + y*y + z*z; } // ------------------------------------------------------------------------------------------------ template -AI_FORCE_INLINE -TReal aiVector3t::Length() const { +AI_FORCE_INLINE TReal aiVector3t::Length() const { return std::sqrt( SquareLength()); } // ------------------------------------------------------------------------------------------------ template -AI_FORCE_INLINE -aiVector3t& aiVector3t::Normalize() { + aiVector3t& aiVector3t::Normalize() { + const TReal l = Length(); + if (l == 0) { + return *this; + } *this /= Length(); return *this; } // ------------------------------------------------------------------------------------------------ template -AI_FORCE_INLINE -aiVector3t& aiVector3t::NormalizeSafe() { +AI_FORCE_INLINE aiVector3t& aiVector3t::NormalizeSafe() { TReal len = Length(); if ( len > static_cast< TReal >( 0 ) ) { *this /= len; @@ -120,8 +117,7 @@ aiVector3t& aiVector3t::NormalizeSafe() { } // ------------------------------------------------------------------------------------------------ template -AI_FORCE_INLINE -const aiVector3t& aiVector3t::operator += (const aiVector3t& o) { +AI_FORCE_INLINE const aiVector3t& aiVector3t::operator += (const aiVector3t& o) { x += o.x; y += o.y; z += o.z; @@ -130,8 +126,7 @@ const aiVector3t& aiVector3t::operator += (const aiVector3t } // ------------------------------------------------------------------------------------------------ template -AI_FORCE_INLINE -const aiVector3t& aiVector3t::operator -= (const aiVector3t& o) { +AI_FORCE_INLINE const aiVector3t& aiVector3t::operator -= (const aiVector3t& o) { x -= o.x; y -= o.y; z -= o.z; @@ -140,8 +135,7 @@ const aiVector3t& aiVector3t::operator -= (const aiVector3t } // ------------------------------------------------------------------------------------------------ template -AI_FORCE_INLINE -const aiVector3t& aiVector3t::operator *= (TReal f) { +AI_FORCE_INLINE const aiVector3t& aiVector3t::operator *= (TReal f) { x *= f; y *= f; z *= f; @@ -150,8 +144,7 @@ const aiVector3t& aiVector3t::operator *= (TReal f) { } // ------------------------------------------------------------------------------------------------ template -AI_FORCE_INLINE -const aiVector3t& aiVector3t::operator /= (TReal f) { +AI_FORCE_INLINE const aiVector3t& aiVector3t::operator /= (TReal f) { if ( f == static_cast(0.0)) { return *this; } @@ -164,20 +157,17 @@ const aiVector3t& aiVector3t::operator /= (TReal f) { } // ------------------------------------------------------------------------------------------------ template -AI_FORCE_INLINE -aiVector3t& aiVector3t::operator *= (const aiMatrix3x3t& mat){ +AI_FORCE_INLINE aiVector3t& aiVector3t::operator *= (const aiMatrix3x3t& mat){ return (*this = mat * (*this)); } // ------------------------------------------------------------------------------------------------ template -AI_FORCE_INLINE -aiVector3t& aiVector3t::operator *= (const aiMatrix4x4t& mat){ +AI_FORCE_INLINE aiVector3t& aiVector3t::operator *= (const aiMatrix4x4t& mat){ return (*this = mat * (*this)); } // ------------------------------------------------------------------------------------------------ template -AI_FORCE_INLINE -TReal aiVector3t::operator[](unsigned int i) const { +AI_FORCE_INLINE TReal aiVector3t::operator[](unsigned int i) const { switch (i) { case 0: return x; @@ -192,9 +182,7 @@ TReal aiVector3t::operator[](unsigned int i) const { } // ------------------------------------------------------------------------------------------------ template -AI_FORCE_INLINE -TReal& aiVector3t::operator[](unsigned int i) { -// return *(&x + i); +AI_FORCE_INLINE TReal& aiVector3t::operator[](unsigned int i) { switch (i) { case 0: return x; @@ -209,20 +197,17 @@ TReal& aiVector3t::operator[](unsigned int i) { } // ------------------------------------------------------------------------------------------------ template -AI_FORCE_INLINE -bool aiVector3t::operator== (const aiVector3t& other) const { +AI_FORCE_INLINE bool aiVector3t::operator== (const aiVector3t& other) const { return x == other.x && y == other.y && z == other.z; } // ------------------------------------------------------------------------------------------------ template -AI_FORCE_INLINE -bool aiVector3t::operator!= (const aiVector3t& other) const { +AI_FORCE_INLINE bool aiVector3t::operator!= (const aiVector3t& other) const { return x != other.x || y != other.y || z != other.z; } // --------------------------------------------------------------------------- template -AI_FORCE_INLINE -bool aiVector3t::Equal(const aiVector3t& other, TReal epsilon) const { +AI_FORCE_INLINE bool aiVector3t::Equal(const aiVector3t& other, TReal epsilon) const { return std::abs(x - other.x) <= epsilon && std::abs(y - other.y) <= epsilon && @@ -230,77 +215,66 @@ bool aiVector3t::Equal(const aiVector3t& other, TReal epsilon) con } // ------------------------------------------------------------------------------------------------ template -AI_FORCE_INLINE -bool aiVector3t::operator < (const aiVector3t& other) const { +AI_FORCE_INLINE bool aiVector3t::operator < (const aiVector3t& other) const { return x != other.x ? x < other.x : y != other.y ? y < other.y : z < other.z; } // ------------------------------------------------------------------------------------------------ template -AI_FORCE_INLINE -const aiVector3t aiVector3t::SymMul(const aiVector3t& o) { +AI_FORCE_INLINE const aiVector3t aiVector3t::SymMul(const aiVector3t& o) { return aiVector3t(x*o.x,y*o.y,z*o.z); } // ------------------------------------------------------------------------------------------------ // symmetric addition template -AI_FORCE_INLINE -aiVector3t operator + (const aiVector3t& v1, const aiVector3t& v2) { +AI_FORCE_INLINE aiVector3t operator + (const aiVector3t& v1, const aiVector3t& v2) { return aiVector3t( v1.x + v2.x, v1.y + v2.y, v1.z + v2.z); } // ------------------------------------------------------------------------------------------------ // symmetric subtraction template -AI_FORCE_INLINE -aiVector3t operator - (const aiVector3t& v1, const aiVector3t& v2) { +AI_FORCE_INLINE aiVector3t operator - (const aiVector3t& v1, const aiVector3t& v2) { return aiVector3t( v1.x - v2.x, v1.y - v2.y, v1.z - v2.z); } // ------------------------------------------------------------------------------------------------ // scalar product template -AI_FORCE_INLINE -TReal operator * (const aiVector3t& v1, const aiVector3t& v2) { +AI_FORCE_INLINE TReal operator * (const aiVector3t& v1, const aiVector3t& v2) { return v1.x*v2.x + v1.y*v2.y + v1.z*v2.z; } // ------------------------------------------------------------------------------------------------ // scalar multiplication template -AI_FORCE_INLINE -aiVector3t operator * ( TReal f, const aiVector3t& v) { +AI_FORCE_INLINE aiVector3t operator * ( TReal f, const aiVector3t& v) { return aiVector3t( f*v.x, f*v.y, f*v.z); } // ------------------------------------------------------------------------------------------------ // and the other way around template -AI_FORCE_INLINE -aiVector3t operator * ( const aiVector3t& v, TReal f) { +AI_FORCE_INLINE aiVector3t operator * ( const aiVector3t& v, TReal f) { return aiVector3t( f*v.x, f*v.y, f*v.z); } // ------------------------------------------------------------------------------------------------ // scalar division template -AI_FORCE_INLINE -aiVector3t operator / ( const aiVector3t& v, TReal f) { +AI_FORCE_INLINE aiVector3t operator / ( const aiVector3t& v, TReal f) { return v * (1/f); } // ------------------------------------------------------------------------------------------------ // vector division template -AI_FORCE_INLINE -aiVector3t operator / ( const aiVector3t& v, const aiVector3t& v2) { +AI_FORCE_INLINE aiVector3t operator / ( const aiVector3t& v, const aiVector3t& v2) { return aiVector3t(v.x / v2.x,v.y / v2.y,v.z / v2.z); } // ------------------------------------------------------------------------------------------------ // cross product template -AI_FORCE_INLINE -aiVector3t operator ^ ( const aiVector3t& v1, const aiVector3t& v2) { +AI_FORCE_INLINE aiVector3t operator ^ ( const aiVector3t& v1, const aiVector3t& v2) { return aiVector3t( v1.y*v2.z - v1.z*v2.y, v1.z*v2.x - v1.x*v2.z, v1.x*v2.y - v1.y*v2.x); } // ------------------------------------------------------------------------------------------------ // vector negation template -AI_FORCE_INLINE -aiVector3t operator - ( const aiVector3t& v) { +AI_FORCE_INLINE aiVector3t operator - ( const aiVector3t& v) { return aiVector3t( -v.x, -v.y, -v.z); } From 92aef9236fc58277b2b6e6639e160e7cf7eeb4b2 Mon Sep 17 00:00:00 2001 From: rumgot Date: Tue, 14 Dec 2021 23:54:36 +0300 Subject: [PATCH 21/83] Fixed cmake error: No known features for C compiler when using the assimp library from another project. --- code/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index e45bf8a2a..1af9407d2 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -1172,7 +1172,7 @@ ELSE() ENDIF() # adds C_FLAGS required to compile zip.c on old GCC 4.x compiler -TARGET_COMPILE_FEATURES(assimp PUBLIC c_std_99) +TARGET_COMPILE_FEATURES(assimp PRIVATE c_std_99) TARGET_INCLUDE_DIRECTORIES ( assimp PUBLIC $ From 1afe7e625585557a38ec0ac51075ed4e52903ba8 Mon Sep 17 00:00:00 2001 From: "Vyacheslav.Vanin" Date: Thu, 16 Dec 2021 12:09:06 +0300 Subject: [PATCH 22/83] fix fbx import metalness Can't import metalness textures in fbx importer --- code/AssetLib/FBX/FBXConverter.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/code/AssetLib/FBX/FBXConverter.cpp b/code/AssetLib/FBX/FBXConverter.cpp index 5a3ae0ae7..b1be6ed37 100644 --- a/code/AssetLib/FBX/FBXConverter.cpp +++ b/code/AssetLib/FBX/FBXConverter.cpp @@ -2070,6 +2070,7 @@ void FBXConverter::SetTextureProperties(aiMaterial *out_mat, const LayeredTextur TrySetTextureProperties(out_mat, layeredTextures, "ShininessExponent", aiTextureType_SHININESS, mesh); TrySetTextureProperties(out_mat, layeredTextures, "EmissiveFactor", aiTextureType_EMISSIVE, mesh); TrySetTextureProperties(out_mat, layeredTextures, "TransparencyFactor", aiTextureType_OPACITY, mesh); + TrySetTextureProperties(out_mat, layeredTextures, "ReflectionFactor", aiTextureType_METALNESS, mesh); } aiColor3D FBXConverter::GetColorPropertyFactored(const PropertyTable &props, const std::string &colorName, From 7a29147095af60d956838f07e3f50b3b68da4091 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Thu, 16 Dec 2021 14:55:23 +0100 Subject: [PATCH 23/83] Fix a typo --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 34bcb9663..22df03370 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -762,7 +762,7 @@ if(WIN32) IF(MSVC_TOOLSET_VERSION) SET(MSVC_PREFIX "vc${MSVC_TOOLSET_VERSION}") - SET(ASSIMP_MSVC_VERSION ${MCVS_PREFIX}) + SET(ASSIMP_MSVC_VERSION ${MSVC_PREFIX}) ELSE() IF(MSVC12) SET(ASSIMP_MSVC_VERSION "vc120") From af42d53c92487badcb396e9594157dcfdb196d68 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Thu, 16 Dec 2021 19:41:15 +0100 Subject: [PATCH 24/83] Enable C++17 and C99 - closes https://github.com/assimp/assimp/issues/4257 --- CMakeLists.txt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 22df03370..b96f915bd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -182,8 +182,10 @@ SET (ASSIMP_SOVERSION 5) SET( ASSIMP_PACKAGE_VERSION "0" CACHE STRING "the package-specific version used for uploading the sources" ) if(NOT ASSIMP_HUNTER_ENABLED) - # Enable C++11 support globally - set_property( GLOBAL PROPERTY CXX_STANDARD 11 ) + # Enable C++17 support globally + set(CMAKE_CXX_STANDARD 17) + set(CMAKE_CXX_STANDARD_REQUIRED ON) + set(CMAKE_C_STANDARD 99) endif() IF(NOT ASSIMP_IGNORE_GIT_HASH) From 2ffa0c59ebc6622d018474bbb921171d541c99dc Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Thu, 16 Dec 2021 19:54:40 +0100 Subject: [PATCH 25/83] Switch to C++11 until gtest gets an update. --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b96f915bd..bbc7ee744 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -182,8 +182,8 @@ SET (ASSIMP_SOVERSION 5) SET( ASSIMP_PACKAGE_VERSION "0" CACHE STRING "the package-specific version used for uploading the sources" ) if(NOT ASSIMP_HUNTER_ENABLED) - # Enable C++17 support globally - set(CMAKE_CXX_STANDARD 17) + # Enable C++11 support globally + set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_C_STANDARD 99) endif() From d7bf8d6e07f60e91f5570835ace179b4f96cf943 Mon Sep 17 00:00:00 2001 From: sssaoi Date: Sat, 18 Dec 2021 14:50:22 +0900 Subject: [PATCH 26/83] Fix compile error when ASSIMP_BUILD_NO_X3D_IMPORTER is define. --- code/AssetLib/X3D/X3DImporter.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/AssetLib/X3D/X3DImporter.cpp b/code/AssetLib/X3D/X3DImporter.cpp index b8b9d250e..fb8ec9bc5 100644 --- a/code/AssetLib/X3D/X3DImporter.cpp +++ b/code/AssetLib/X3D/X3DImporter.cpp @@ -480,6 +480,6 @@ void X3DImporter::ParseHelper_Node_Exit() { } } -#endif // !ASSIMP_BUILD_NO_X3D_IMPORTER - } // namespace Assimp + +#endif // !ASSIMP_BUILD_NO_X3D_IMPORTER From 7fc46035798fe236b4ef8858ea0acc9980bff321 Mon Sep 17 00:00:00 2001 From: Garux Date: Sat, 18 Dec 2021 14:32:46 +0300 Subject: [PATCH 27/83] fix test/models/3DS/IMAGE1.bmp: is jpg --- test/models/3DS/{IMAGE1.bmp => IMAGE1.jpg} | Bin test/models/3DS/test1.3ds | Bin 10654 -> 10654 bytes 2 files changed, 0 insertions(+), 0 deletions(-) rename test/models/3DS/{IMAGE1.bmp => IMAGE1.jpg} (100%) diff --git a/test/models/3DS/IMAGE1.bmp b/test/models/3DS/IMAGE1.jpg similarity index 100% rename from test/models/3DS/IMAGE1.bmp rename to test/models/3DS/IMAGE1.jpg diff --git a/test/models/3DS/test1.3ds b/test/models/3DS/test1.3ds index 17bbb47d397c854c8a53ae633037593a8cee9044..5a52977b0b82b61b0b08d9700ab93950825a33b8 100644 GIT binary patch delta 15 XcmbOiJTG{{o5>rQ#5OZA&d~q>Ia~%c delta 14 WcmbOiJTG{{8)hfpfQ|3hYXAT;DF(Oz From 46f618a6ef525b075c368bc5cdb85d4943760525 Mon Sep 17 00:00:00 2001 From: Garux Date: Sat, 18 Dec 2021 15:34:58 +0300 Subject: [PATCH 28/83] add Inter-Quake Model (IQM) Importer --- code/AssetLib/IQM/IQMImporter.cpp | 321 ++++++++++++++++++++++++++++++ code/AssetLib/IQM/IQMImporter.h | 78 ++++++++ code/AssetLib/IQM/iqm.h | 134 +++++++++++++ code/CMakeLists.txt | 6 + code/Common/ImporterRegistry.cpp | 6 + test/models/IQM/Body.jpg | Bin 0 -> 369618 bytes test/models/IQM/Head.jpg | Bin 0 -> 118263 bytes test/models/IQM/mrfixit.iqm | Bin 0 -> 257808 bytes 8 files changed, 545 insertions(+) create mode 100644 code/AssetLib/IQM/IQMImporter.cpp create mode 100644 code/AssetLib/IQM/IQMImporter.h create mode 100644 code/AssetLib/IQM/iqm.h create mode 100644 test/models/IQM/Body.jpg create mode 100644 test/models/IQM/Head.jpg create mode 100644 test/models/IQM/mrfixit.iqm diff --git a/code/AssetLib/IQM/IQMImporter.cpp b/code/AssetLib/IQM/IQMImporter.cpp new file mode 100644 index 000000000..6cfc0dfef --- /dev/null +++ b/code/AssetLib/IQM/IQMImporter.cpp @@ -0,0 +1,321 @@ +/* +Open Asset Import Library (assimp) +---------------------------------------------------------------------- + +Copyright (c) 2006-2021, assimp team + +All rights reserved. + +Redistribution and use of this software in source and binary forms, +with or without modification, are permitted provided that the +following conditions are met: + +* Redistributions of source code must retain the above +copyright notice, this list of conditions and the +following disclaimer. + +* Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the +following disclaimer in the documentation and/or other +materials provided with the distribution. + +* Neither the name of the assimp team, nor the names of its +contributors may be used to endorse or promote products +derived from this software without specific prior +written permission of the assimp team. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +---------------------------------------------------------------------- +*/ + +#ifndef ASSIMP_BUILD_NO_IQM_IMPORTER + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "IQMImporter.h" +#include "iqm.h" + +// RESOURCES: +// http://sauerbraten.org/iqm/ +// https://github.com/lsalzman/iqm + + +inline void swap_block( uint32_t *block, size_t size ){ + size >>= 2; + for ( size_t i = 0; i < size; ++i ) + AI_SWAP4( block[ i ] ); +} + +static const aiImporterDesc desc = { + "Inter-Quake Model Importer", + "", + "", + "", + aiImporterFlags_SupportBinaryFlavour, + 0, + 0, + 0, + 0, + "iqm" +}; + +namespace Assimp { + +// ------------------------------------------------------------------------------------------------ +// Default constructor +IQMImporter::IQMImporter() : + mScene(nullptr) { + // empty +} + +// ------------------------------------------------------------------------------------------------ +// Returns true, if file is a binary Inter-Quake Model file. +bool IQMImporter::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool checkSig) const { + const std::string extension = GetExtension(pFile); + + if (extension == "iqm") + return true; + else if (!extension.length() || checkSig) { + if (!pIOHandler) { + return true; + } + /* + * don't use CheckMagicToken because that checks with swapped bytes too, leading to false + * positives. This magic is not uint32_t, but char[4], so memcmp is the best way + + const char* tokens[] = {"3DMO", "3dmo"}; + return CheckMagicToken(pIOHandler,pFile,tokens,2,0,4); + */ + std::unique_ptr pStream(pIOHandler->Open(pFile, "rb")); + unsigned char data[15]; + if (!pStream || 15 != pStream->Read(data, 1, 15)) { + return false; + } + return !memcmp(data, "INTERQUAKEMODEL", 15); + } + return false; +} + +// ------------------------------------------------------------------------------------------------ +const aiImporterDesc *IQMImporter::GetInfo() const { + return &desc; +} + +// ------------------------------------------------------------------------------------------------ +// Model 3D import implementation +void IQMImporter::InternReadFile(const std::string &file, aiScene *pScene, IOSystem *pIOHandler) { + // Read file into memory + std::unique_ptr pStream(pIOHandler->Open(file, "rb")); + if (!pStream.get()) { + throw DeadlyImportError("Failed to open file ", file, "."); + } + + // Get the file-size and validate it, throwing an exception when fails + const size_t fileSize = pStream->FileSize(); + if (fileSize < sizeof( iqmheader )) { + throw DeadlyImportError("IQM-file ", file, " is too small."); + } + std::vector buffer(fileSize); + unsigned char *data = buffer.data(); + if (fileSize != pStream->Read(data, 1, fileSize)) { + throw DeadlyImportError("Failed to read the file ", file, "."); + } + + // get header + iqmheader &hdr = reinterpret_cast( *data ); + swap_block( &hdr.version, sizeof( iqmheader ) - sizeof( iqmheader::magic ) ); + + // extra check for header + if (memcmp(data, IQM_MAGIC, sizeof( IQM_MAGIC ) ) + || hdr.version != IQM_VERSION + || hdr.filesize != fileSize) { + throw DeadlyImportError("Bad binary header in file ", file, "."); + } + + ASSIMP_LOG_DEBUG("IQM: loading ", file); + + // create the root node + pScene->mRootNode = new aiNode( "" ); + // Now rotate the whole scene 90 degrees around the x axis to convert to internal coordinate system + pScene->mRootNode->mTransformation = aiMatrix4x4( + 1.f, 0.f, 0.f, 0.f, + 0.f, 0.f, 1.f, 0.f, + 0.f, -1.f, 0.f, 0.f, + 0.f, 0.f, 0.f, 1.f); + pScene->mRootNode->mNumMeshes = hdr.num_meshes; + pScene->mRootNode->mMeshes = new unsigned int[hdr.num_meshes]; + std::iota( pScene->mRootNode->mMeshes, pScene->mRootNode->mMeshes + pScene->mRootNode->mNumMeshes, 0 ); + + mScene = pScene; + + // Allocate output storage + pScene->mNumMeshes = 0; + pScene->mMeshes = new aiMesh *[hdr.num_meshes](); // Set arrays to zero to ensue proper destruction if an exception is raised + + pScene->mNumMaterials = 0; + pScene->mMaterials = new aiMaterial *[hdr.num_meshes](); + + // swap vertex arrays beforehand... + for( auto array = reinterpret_cast( data + hdr.ofs_vertexarrays ), end = array + hdr.num_vertexarrays; array != end; ++array ) + { + swap_block( &array->type, sizeof( iqmvertexarray ) ); + } + + // Read all surfaces from the file + for( auto imesh = reinterpret_cast( data + hdr.ofs_meshes ), end = imesh + hdr.num_meshes; imesh != end; ++imesh ) + { + swap_block( &imesh->name, sizeof( iqmmesh ) ); + // Allocate output mesh & material + auto mesh = pScene->mMeshes[pScene->mNumMeshes++] = new aiMesh(); + mesh->mMaterialIndex = pScene->mNumMaterials; + auto mat = pScene->mMaterials[pScene->mNumMaterials++] = new aiMaterial(); + + { + auto text = reinterpret_cast( data + hdr.ofs_text ); + aiString name( text + imesh->material ); + mat->AddProperty( &name, AI_MATKEY_NAME ); + mat->AddProperty( &name, AI_MATKEY_TEXTURE_DIFFUSE(0) ); + } + + // Fill mesh information + mesh->mPrimitiveTypes = aiPrimitiveType_TRIANGLE; + mesh->mNumFaces = 0; + mesh->mFaces = new aiFace[imesh->num_triangles]; + + // Fill in all triangles + for( auto tri = reinterpret_cast( data + hdr.ofs_triangles ) + imesh->first_triangle, end = tri + imesh->num_triangles; tri != end; ++tri ) + { + swap_block( tri->vertex, sizeof( tri->vertex ) ); + auto& face = mesh->mFaces[mesh->mNumFaces++]; + face.mNumIndices = 3; + face.mIndices = new unsigned int[3]{ tri->vertex[0] - imesh->first_vertex, + tri->vertex[2] - imesh->first_vertex, + tri->vertex[1] - imesh->first_vertex }; + } + + // Fill in all vertices + for( auto array = reinterpret_cast( data + hdr.ofs_vertexarrays ), end = array + hdr.num_vertexarrays; array != end; ++array ) + { + const size_t nVerts = imesh->num_vertexes; + const size_t step = array->size; + + switch ( array->type ) + { + case IQM_POSITION: + if( array->format == IQM_FLOAT && step >= 3 ){ + mesh->mNumVertices = nVerts; + auto v = mesh->mVertices = new aiVector3D[nVerts]; + for( auto f = reinterpret_cast( data + array->offset ) + imesh->first_vertex * step, + end = f + nVerts * step; f != end; f += step, ++v ) + { + *v = { AI_BE( f[0] ), + AI_BE( f[1] ), + AI_BE( f[2] ) }; + } + } + break; + case IQM_TEXCOORD: + if( array->format == IQM_FLOAT && step >= 2) + { + auto v = mesh->mTextureCoords[0] = new aiVector3D[nVerts]; + mesh->mNumUVComponents[0] = 2; + for( auto f = reinterpret_cast( data + array->offset ) + imesh->first_vertex * step, + end = f + nVerts * step; f != end; f += step, ++v ) + { + *v = { AI_BE( f[0] ), + 1 - AI_BE( f[1] ), 0 }; + } + } + break; + case IQM_NORMAL: + if (array->format == IQM_FLOAT && step >= 3) + { + auto v = mesh->mNormals = new aiVector3D[nVerts]; + for( auto f = reinterpret_cast( data + array->offset ) + imesh->first_vertex * step, + end = f + nVerts * step; f != end; f += step, ++v ) + { + *v = { AI_BE( f[0] ), + AI_BE( f[1] ), + AI_BE( f[2] ) }; + } + } + break; + case IQM_COLOR: + if (array->format == IQM_UBYTE && step >= 3) + { + auto v = mesh->mColors[0] = new aiColor4D[nVerts]; + for( auto f = ( data + array->offset ) + imesh->first_vertex * step, + end = f + nVerts * step; f != end; f += step, ++v ) + { + *v = { ( f[0] ) / 255.f, + ( f[1] ) / 255.f, + ( f[2] ) / 255.f, + step == 3? 1 : ( f[3] ) / 255.f }; + } + } + else if (array->format == IQM_FLOAT && step >= 3) + { + auto v = mesh->mColors[0] = new aiColor4D[nVerts]; + for( auto f = reinterpret_cast( data + array->offset ) + imesh->first_vertex * step, + end = f + nVerts * step; f != end; f += step, ++v ) + { + *v = { AI_BE( f[0] ), + AI_BE( f[1] ), + AI_BE( f[2] ), + step == 3? 1 : AI_BE( f[3] ) }; + } + } + break; + case IQM_TANGENT: +#if 0 + if (array->format == IQM_FLOAT && step >= 3) + { + auto v = mesh->mTangents = new aiVector3D[nVerts]; + for( auto f = reinterpret_cast( data + array->offset ) + imesh->first_vertex * step, + end = f + nVerts * step; f != end; f += step, ++v ) + { + *v = { AI_BE( f[0] ), + AI_BE( f[1] ), + AI_BE( f[2] ) }; + } + } +#endif + break; + case IQM_BLENDINDEXES: + case IQM_BLENDWEIGHTS: + case IQM_CUSTOM: + break; // these attributes are not relevant. + + default: + break; + } + } + } +} + + +// ------------------------------------------------------------------------------------------------ + +} // Namespace Assimp + +#endif // !! ASSIMP_BUILD_NO_IQM_IMPORTER diff --git a/code/AssetLib/IQM/IQMImporter.h b/code/AssetLib/IQM/IQMImporter.h new file mode 100644 index 000000000..fbeaff8c3 --- /dev/null +++ b/code/AssetLib/IQM/IQMImporter.h @@ -0,0 +1,78 @@ +/* +Open Asset Import Library (assimp) +---------------------------------------------------------------------- + +Copyright (c) 2006-2021, assimp team + +All rights reserved. + +Redistribution and use of this software in source and binary forms, +with or without modification, are permitted provided that the +following conditions are met: + +* Redistributions of source code must retain the above +copyright notice, this list of conditions and the +following disclaimer. + +* Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the +following disclaimer in the documentation and/or other +materials provided with the distribution. + +* Neither the name of the assimp team, nor the names of its +contributors may be used to endorse or promote products +derived from this software without specific prior +written permission of the assimp team. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +---------------------------------------------------------------------- +*/ + +/** @file IQMImporter.h +* @brief Declares the importer class to read a scene from an Inter-Quake Model file +*/ + +#pragma once + +#ifndef ASSIMP_BUILD_NO_IQM_IMPORTER + +#include +#include + +namespace Assimp { + +class IQMImporter : public BaseImporter { +public: + /// \brief Default constructor + IQMImporter(); + ~IQMImporter() override {} + + /// \brief Returns whether the class can handle the format of the given file. + /// \remark See BaseImporter::CanRead() for details. + bool CanRead(const std::string &pFile, IOSystem *pIOHandler, bool checkSig) const override; + +protected: + //! \brief Appends the supported extension. + const aiImporterDesc *GetInfo() const override; + + //! \brief File import implementation. + void InternReadFile(const std::string &pFile, aiScene *pScene, IOSystem *pIOHandler) override; + +private: + aiScene *mScene = nullptr; // the scene to import to +}; + +} // Namespace Assimp + +#endif // ASSIMP_BUILD_NO_IQM_IMPORTER diff --git a/code/AssetLib/IQM/iqm.h b/code/AssetLib/IQM/iqm.h new file mode 100644 index 000000000..a450504f9 --- /dev/null +++ b/code/AssetLib/IQM/iqm.h @@ -0,0 +1,134 @@ +#ifndef __IQM_H__ +#define __IQM_H__ + +#define IQM_MAGIC "INTERQUAKEMODEL" +#define IQM_VERSION 2 + +struct iqmheader +{ + char magic[16]; + unsigned int version; + unsigned int filesize; + unsigned int flags; + unsigned int num_text, ofs_text; + unsigned int num_meshes, ofs_meshes; + unsigned int num_vertexarrays, num_vertexes, ofs_vertexarrays; + unsigned int num_triangles, ofs_triangles, ofs_adjacency; + unsigned int num_joints, ofs_joints; + unsigned int num_poses, ofs_poses; + unsigned int num_anims, ofs_anims; + unsigned int num_frames, num_framechannels, ofs_frames, ofs_bounds; + unsigned int num_comment, ofs_comment; + unsigned int num_extensions, ofs_extensions; +}; + +struct iqmmesh +{ + unsigned int name; + unsigned int material; + unsigned int first_vertex, num_vertexes; + unsigned int first_triangle, num_triangles; +}; + +enum +{ + IQM_POSITION = 0, + IQM_TEXCOORD = 1, + IQM_NORMAL = 2, + IQM_TANGENT = 3, + IQM_BLENDINDEXES = 4, + IQM_BLENDWEIGHTS = 5, + IQM_COLOR = 6, + IQM_CUSTOM = 0x10 +}; + +enum +{ + IQM_BYTE = 0, + IQM_UBYTE = 1, + IQM_SHORT = 2, + IQM_USHORT = 3, + IQM_INT = 4, + IQM_UINT = 5, + IQM_HALF = 6, + IQM_FLOAT = 7, + IQM_DOUBLE = 8 +}; + +struct iqmtriangle +{ + unsigned int vertex[3]; +}; + +struct iqmadjacency +{ + unsigned int triangle[3]; +}; + +struct iqmjointv1 +{ + unsigned int name; + int parent; + float translate[3], rotate[3], scale[3]; +}; + +struct iqmjoint +{ + unsigned int name; + int parent; + float translate[3], rotate[4], scale[3]; +}; + +struct iqmposev1 +{ + int parent; + unsigned int mask; + float channeloffset[9]; + float channelscale[9]; +}; + +struct iqmpose +{ + int parent; + unsigned int mask; + float channeloffset[10]; + float channelscale[10]; +}; + +struct iqmanim +{ + unsigned int name; + unsigned int first_frame, num_frames; + float framerate; + unsigned int flags; +}; + +enum +{ + IQM_LOOP = 1<<0 +}; + +struct iqmvertexarray +{ + unsigned int type; + unsigned int flags; + unsigned int format; + unsigned int size; + unsigned int offset; +}; + +struct iqmbounds +{ + float bbmin[3], bbmax[3]; + float xyradius, radius; +}; + +struct iqmextension +{ + unsigned int name; + unsigned int num_data, ofs_data; + unsigned int ofs_extensions; // pointer to next extension +}; + +#endif + diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index 1af9407d2..b1861acfc 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -373,6 +373,12 @@ ADD_ASSIMP_IMPORTER( IRRMESH AssetLib/Irr/IRRShared.h ) +ADD_ASSIMP_IMPORTER( IQM + AssetLib/IQM/IQMImporter.cpp + AssetLib/IQM/iqm.h + AssetLib/IQM/IQMImporter.h +) + ADD_ASSIMP_IMPORTER( IRR AssetLib/Irr/IRRLoader.cpp AssetLib/Irr/IRRLoader.h diff --git a/code/Common/ImporterRegistry.cpp b/code/Common/ImporterRegistry.cpp index 644acf29c..fda90d677 100644 --- a/code/Common/ImporterRegistry.cpp +++ b/code/Common/ImporterRegistry.cpp @@ -202,6 +202,9 @@ corresponding preprocessor flag to selectively disable formats. #ifndef ASSIMP_BUILD_NO_M3D_IMPORTER #include "AssetLib/M3D/M3DImporter.h" #endif +#ifndef ASSIMP_BUILD_NO_IQM_IMPORTER +#include "AssetLib/IQM/IQMImporter.h" +#endif namespace Assimp { @@ -370,6 +373,9 @@ void GetImporterInstanceList(std::vector &out) { #endif #ifndef ASSIMP_BUILD_NO_MMD_IMPORTER out.push_back(new MMDImporter()); +#endif +#ifndef ASSIMP_BUILD_NO_IQM_IMPORTER + out.push_back(new IQMImporter()); #endif //#ifndef ASSIMP_BUILD_NO_STEP_IMPORTER // out.push_back(new StepFile::StepFileImporter()); diff --git a/test/models/IQM/Body.jpg b/test/models/IQM/Body.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b394896d4b58222e9030b70efec87dbfc79b7bb3 GIT binary patch literal 369618 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[r~||-*%`^Sp88%pcEX5? zDnu4vUw3hU7SRB(#{Mu@i6O6Jst!@=KBkBkb?lqYnru8oH*dUpuK3#Ys+Z!^XtLVQ z^%S!_S(~Ctll9d?43rYQcNa5zXkbFZ;oLS&jRh~wFNpO6LWaec(;J`bgGBZnOS0fM zPDPzEzyVkPo;lXxzU$-IVtiE*oV_|1gCC*WPvYOTT-Xp-w~E|O=SoM-o6jdkoEn0f ze(q+XQI%CETI`c^snz{pGJ08|weDG6b>5L_DD87*kjB|%`Q~A@eaQiKL5556y+uuO zQ_kfl(Z8eW{!i?!olnB;RAx3NTMwaqy2>hDC!X(JVotGB)Yy1v``O}k!k)ghyexQ> zaibNyml#?nTLV|iS)8R$AZ?^OMl3?bV+?2YW>(#?jM2`&EWaZ~aj-`(#0mOSjJB0iXt=;P=6G)yC*QCL^oR){M;24#-hI9Dn*>Q^nx!%AIH zuh#LpHhL1~a;S))uyaU5?IrtJ`06LQ@pEvHQlpKV?VO3oP0}NOzcQP5OAt&@M~h8SBzDpO%lg+vWP!oznKu&dD|bqwpyakeRc8soebnGyUl}q5D|#mRL!(t z1|hD{9h_{>8h$jV;?mPoc;Ye~XX{Js5%}zk#dmB#sBE1l>tmPp*>h_(KRrqP0eX@# zi?6E+ki?o2z+SeYR-ck|zAUBYmnjzr#c!pKc zp_opl-1NMyHqC5A1!~VS)VH|7`ge?5hN7X$O@7Lde*jsD{=zXh=lovg=&i`dCRr2t zCb`#N;nFF?1jvgi?n#V%8l!CEYIL<=Ni7#i_Y*X+~@s+ z#*EkYR{dHja z9%H1eXzHoAde8sUtNwP%ZYKtLli0>@mfAAAb@80sMssvL2*k1vBfoj;*@D}*tJ8|q)9$vx;#zq(aArY=SvFpYx=ohZbEh>*!$xAvPJ+xD7 zXS~EUSp8k>XJ%Bi@waxX#_?n!GyG?G+CZ+wOCX-gbAxex#8yWA^e0}dc(US zpWPIbBCoZ}nH_)RM9ai0Y;5&}PB{7DF~|kj#~Ng`#C6z^uTzi9IC9Le-kLxNTh4W+ z``Iv+zR+0zX~ITKFd~REnfgB!PZ_SwR-0cbg&qsHS1k;*^3OE1f`|xaCNeJD_UUx( z!xOnR-y`>gvfEP$EkWgE`!;a>_S!FAmLt=hF&30RPSJY==$}cq{j6qKi}`KEpxmG#%ZXagNzkTti+2AJ$T-dzdp<#J?y5 znMb1QMkJJ7I;sbyu~lcXa3agEjW3!`8_W)YM8>5^RzLT@qhC z(59MCfHgP1jhY?R!}$z+lUh$1KhiV2cX>O*%#neQWTM)WUE!TiZ7ClVEY4R=j^H70 zThAH&N&C7lkk2!Y{=|9wV5PiQmAg~|v3*UzJtC(d26uHfLo2ysC}8CV8|<~O4UHTS z2N7zz{grpaE@RX7MvH=#YaEQf4)PEiO6Qm28@Wp<%VJq(hj6j)22g|uEm93oZIRiS z{^D!yHTzhKlvtJ4{h!|tPd@4C#;zP1;+q=RBm4pN?9$K7qk&;+Crh3djw@=)t2VvM zOba%)QG){|vRVYkWZcO?OqO3tbV_PXs>xB~^^HKxV#70HLn(C2;~={FS%RNYIa|Kl z!7pD9MLfGdxU>VSlmn-Q^O{M$mLad+%E^Cx#?JZ4R#w6{{PXu0(#%JMpT0GFrB;EKR=p*}%N|D4<|ZjVoV+|L?AhSzIr`lJR!Dwo zN3%Txm3STqC^|goAxDHM8W0@Bl)s77zm@r%?2G?^ZJ@K8fKf8CRx+8uOjNN zxgOrXw;>f_^b{Ms3Zo?H*-USE5vE3cUho(2U60aT=(Sv|;IAYW2b%H{-?}Q3KE;t! zhV4WvAi$TgVa{hGlR&v)#zk@iYvn!gyVZ*Enn=6zNBz2XZXz8D)7br-uT8J>T(;|b zhe{n-D;;$8HQzuS1WFthIlnVroR*KG^N(WOQ?d_grX^95F`+tq7UEESgF2&p5R{3f zMCy-*A{rI`kkU(5hUbu^auOZL6jX^Nw_q72!=4`24JtI}|Az88%Rmzs&WNTIf{UnG zE;`)bNbZcyksMbgWC#uwVNr~E{`vA*z83E(t(pdT0@3!k|#4&H$W;XJz=qKV>TqZHZ z$pSvF94r= zSonXsPGdm0AFEJUDF$=%UXA%*O^8Mbse-}K&3b6)(; z>^+gs%d>>$gs8cIo7L49{ksLksiI1rwr#Q1 zt*l(-WH=m=unsHW&by~c9I}?dMiP5;)TBwM{5njA4mBB)ZeiMKz9P%sr^e}8s4dH@ zie9uVFHP~5Rne{{lfmgGrq$lsj<`SIu})?>9hpi<2ic!MvFfwQAI9GDt*tNm z_6^b^#ihleB)Al9af%aM65QS0wYU@l1gA)Gf)yxQC{~I~A-ESU?k?Y(bI)^L+~2(~ z?tieKwddM ziwqu)!sK;k2&V?{KbY0CBsm>?`NGlu6V-pV}s3hl^YeX~Tpb^7Efq!i9xoWGwJmTHgc>D8QpFENXm@q2y#eO3?q1(cX zI1iC}w%n^tTAy2_?kjk4JZ0KJbrAnWKNqvIgu7vC24xyq-;V16lWm^<*l*j+&(Zlg z^(cIH@D};b?}+#5Ysi?X9hDS4ESL!u)OMn!^q!z(Z}EN3h$gcnS>v!u+SioZBFPp_@=XTyr>8HBD3!*$=}Y59Kut1z0t+HXDSmWHnM$b%mb zlk!elY6VQ(xXsao+*L?sWK^<;z{c7Z8OaDGp1c%oQ;SUvrGl$3$p<*8LoWVq>lBxq zoVRTWB32}&+dN+oAo*{NL`>t9*Cy!~tb)XVU9Txrd1c*T#MXlq2c`8DLgqiP`7yy69%VohgPR&=ouhB4!DV51%zwrPhl2ZIq z7pFLF^_WiCKNZ=bb;JQ809Xn4U_B#0c@O_U@qQlUTMf-zSGv`+o8n$PORAsbnNMzX z%>8qm+ulP8?&~%_l!?F&P!M~Cnb*RPKYmco>QP*S0_l_GrRXsas#0k@Hr+DuwI9aO z7xG8;LTa0?cEL;cD$`YYLRNLW7}$Py5>g9(BKtY$6(}TKH#wbkprvZrD%3dW zGqi1WN~4|+t)aH6)!#lLAJS;o667QaN*57a`G>Ulkm33 zE4bgxArKr7=`mCSR@en9$%d&5iNn11IgaFb)jN7=aWss_r)my8Bz_b(EJuB(?J-qn zAEK3OC#aU!9MT>Lf(?jJIoLy-v%a$6cU-_Fyw1{Z8m4O!G16jQ#H(X8I^kd{mVYO_ zSW;oPkpK%co`LJ{j7M=>C^3VG&uTQ4e#6`FnX5^X&wf*5drBeEzI1H2C?qf_s1h=a7J6GsZ-K*lG#Y*d8yIGL;eF$NgaD#!8_b}VOm+|TUt_g zSevSU{v0cZrCwns7e-e?tmFEBv--02^b>qhg@X9SytI^L1_?7;?C}$hDNpVl0!V_K zez$;Qaodcu>GI`LN0yW5Eu?lu*glLk7Ly5Cz15{FfCcU?YRX)(kl3s^ROQS1udEGG z5@>T~(~w}bG?x{@?D9n_)=f1oJDgi2RU8X)++Ct7PF?kU6=;=T0R0KxtYEKSUyHc9 zD=4O{(w>>2A0npoJD|n4%3*JD^J}H=AF@B-P?s#J7s#R}H$1l_|i=`W|ln zA-XL`Th*#|PNkJEND~z|%nLkkvct(%5P3SG4aI)|A!NYkx(vKYWDlFd5OuavODphi zOn>agh3VX!IjGhGU(3;$3fFIG7(_AR*|=r73p^-2^78ih*jv{N5n>%JIoiZ(5ke02 z6W4Ard2r&~IDk8M-CzN}aS$AfRMx$SgvW%3f61yh*o!>J8sDuHzH^+5Cp`;B{BRAw z!E6z$xh^S#6H?bA`6`rR_jV%7ZM1RmHkXpUCz`HI@qGWzhu#icD!d0HMDeMXS^sCq z1ntG4p@IgNI2ig0-GQCWelx*$8Ka(MFI;fhn)nyF>G20Z%*yENF&&)f-3&R?YUgzJ$xTL27)>Omf;0Ak^A7ijfTyWJTQzVxR zAKN|@W%VB#aGXYr)K-^IoGH8lceOYrvM9UrRoIv5re_U_)%q}?`qt#B2li#ZX(+FQ z!D4pWi1OB*b@a-wDMeI$gyt#!`3+T96I)Pj_Ryc;4&`3=nb8-~s@-~@0x~?Fu9vqp z?Fl!nw;U3lRHd1uKzTy1)O3V|KtUHvde?=P&^CHqXPC$Kj*i`sj#&@v_!g^$Dz>Wr z$8-u<8VU_Vg)GSn&yMOl+SXl9YsM}5e(UDhptm~TqXdq1LHz>D z18{duH8=CRhM3J5m+NoLV~GR$0O5&P95&jge*TkkH{DWliVVe3c>e469@1O3LN_8b zY#P2YO&!W4xNRj#V;r%Yo2*!E_j_YZ{T9`q1;X-he5D%E6+GnAe}i5x`_e4!vMG0{ zf5^mH#t0>~#7IgiE0~-f9fym1rF@l%)cOEGt*i)G=tfq~&?-vMiENvLBLxNIlRbAi zLSRElYV@CQQsKn>Vw!e;SC zsVxQ9voG?t5D@rR#qmCho~=(3!O@LITJs=eAvESEANvuEel^RA0bTt22?E!^&dx4k zg3=%BZ)|<GBXLEjfru1Y-$=8H5Z8WJ0o#C;3~ z&$7v5HWpZ8_4caDYULGw2EiTKayrEyW~ z=co;II3LPIFWKSr@cI#BuYJ?R=ie}SRadtO?OAWo0H*tZ>p^1R383dtj9FjE)A@Pi zU_&>~d*7^+^+1AN`*Rm0XPvyLNz9pwXZS8b`Srl0)WDohRq#et?T-bWBcl{`_goB3 zesgUx*4=d?!KF#5cX=UQm(DX|BMiI0Yg0OI#Wz0tc~4(@%5kO<&1!=MtV7Q5BG}jI z+}zv;#2@UU|Kc;T@>>6-fxG89Z)bl{%j$3bs}H3bps`Mf#Ed2%;eBlSAh$jMo%yBi zzP}jjB#=r|a-%R$AbB*d?0#67goIiR*E_Err2NHVc6K`>>`8j16<`w9s5+yoxM|#? z98O`+7#b>d)k<@!6tP5Aio(mlj2&mm!4J~sW9p>*Qwg}?ptrtRl(T(kp zdsPz>Dh6Y&2G@SKSNDhflQrc$0;OEmP_j;MCYk;<*7<2AcBQPzv_dA9mp^3huWGdd<; zS-Xz@fuJY}O)zuaAMk$IcQ#fdtkRQaP24K4rN%{{!sWASN6kU!{k&zRlkdUhO;}rlK zt66w%JY>@TDJD)yIZpejV5f^;URWYU4=x26W@0J^ik2+S4=`K|P7x}+Vz23z13A^u z=eqTwOHp@zeK-iu6K~^AY;87^ViJL9_3E=*rZT=Uvq;HYztK+G5or8OoG-G*^?agD zsf*De>*jg>va}ObdFTrUNm@2^>;~}$Mv~P)pctnilN#hdz^QjyfIo$*Hbz~t^_tHi z@1~?k78`id6sL3ZUrAK*;FL2i;DSUNcXN$i^_@1x7(e80AB15KA{`gq3ZymZ_?A=? zx0dl~DGKtUwA`lmMS-mi?Mz*0MpN`?8L0xVN9?MVYHIhu9glttFPSY(~V_M9dU=t`Zegzy)#7&7WNyZr^(=5%4R`B{HJ=aTyN( z*mn1M_i(|tWOip3wR!rU`@L3$16`dG-bP1Vu^v%WFdRIuvz|1o)x`F6;L^TCj=Aq% zYrZh3RE+#rk!OLMe4r&nP?ad1XlfFoJ?)=7tcNaaJMRvYxw|k&125nJZZdJ6EFrGoJJ&N@BB~ z$U(2H)`-AsAAY%pv(moQLJP~@1rsBYjZu3}foxMHDm3Qxj5O(w1G@-TXLZ?Cv*P&5 zH>x$;wAD#4$y<@JRIZ~QSWk+CazGAH zeuRESTs=!S;lEv6q9_NxUF8n9MS+A3;X1Hwb4jGxAgb=6VkODEUgI#nke-n7$M7WW zQtTG}74loV=3(4UX(;zs+H)K}w0`lc_cXIqfLcsL{TS2e7 zDmj(y!oL<5p6TLe&z9itRa9?)BL$9kRbs_GJ#TPdAU8$b{diJlZ0n=R)hj36jG0s zyj`q& ze_dY>RTX0qs<$Y%*IO+vW8HqIxka%zqdUhil$uW#WZNkr5c(_rFisyzp%Hn~0V#(PYWW~hc05RZ@}ZGfO;Y}y#Oh+1r!$gW zwO%#>Ilt4GZgpDxS=f_~@l$?u6ZN4o;joj97Kw$3bryv^ z>Cq;Mp;fNh2gH%J)ay+}y@unLu5lg^QF4by+8T?!Y| zpM&v9(D!UV-U4U+@oB~E%7Y>^vUUN%{A(!JEc1<(pr9g8^#~PYgzq>$f@W>(2amk#e|RojmxN*>X*UExl}r%~GyhTjeih)>|RU zJCQ~Aw^_)qP$T!IpDL{b06Ix=k@zBe-rVK^Udqz2640l3Q`*~}$7g}1YeALCFWyv* zPUle;-x^=s4BgID+H>7XO`yy7b-LTMp+}@CZnF5(nAxV56gPA7ib_XigGb@aD+9}6 zrvfX^M-ag#d9D8GdLg?s5Sp^9QKkhS*2NT;Gxxc=PW2tjnEAWbW2}S6Cc3GWLhY8i z)v^YPFmA<5z%e2v*A45BeUzL=rE0Vo3QucvUnd%3Dk4Iw&n4Ja0)?0uGx2;JrCgSM zGkxf%VYp<#<7bzFrb#lPvt44bK>Srmh#o02rm9ph$H`Faz?FTDkUcT7&k+JbUHPQ- zcbxtzh~Yh;%{yAh1@#5wlxSfz^h>=}rqe6%T+(#i;WyUuvcO)?%hKMEqFV`nzlcNk zYiqYNrQN8)36k!cbEl$#l;fO9=SEwsf~$pc1Ca83xzoCw<%sg8v9;{*vSBg}%*u;`Bq)eHstV=qwd;R4s(DUV}q0Zi51v zbRJk9Y1_X#&5mG&kq2w*3cYzX4!Q|9_vy_>CJyqNT+rK zOl&wkVNuSpq6Ejp0hRv&yes$V%JzqU3?0x=ss?Kh*S`zFc@%G@aj#`osnzx#5t-*H zC0mf|@IDghwXZ-+|7<;E#P$^YAK;>LyZ6GqEf+dnZ?q*(Ko*iSSBCWRFCUtibqp>~ zrKkV)i0|cSKlZ=lw`Wf$1O>tk{PigU5&eZFGkn_aK54N8SG1atmb&J{($1kZgms71LuYCpXV;we; z;-&X_Wl2Z0f9YXKZ&Ys|{>-k%{8Rx%RNuQ~XDn&+qHaOIlu$lYNEEF0>|rq_Cqf_9 zPInPvANHwW2?wvt^@(L<_=M~#fheFE2OImpVVRd&QkX=FD3n9a=RG3{iQwn1)b~Ly z?>rJ6|520UchAX@oN($@=fw;SjMsS1J6|k54()uToF-!Xqb z`5-t~1iwFo3OIgsPu#0?u&cDJF3u~;p?s}aDibY_#gJ416uD-JlmN#Gob%W$fk(oaJe!x~X* zj}HELC4mo)*q1YIcj~0Y?L=o_N)3uY-(8W@XV>noWr&r^<#8SKW%kG6lI3UOThGU< zCZUq>8kQmtOwSLitfe$j?!O2hVw#KcoPXWd3rl-YIXL}hVpAMRgv%?XnXm0d;L;AX^$BC~eX~kGZ%k3iYM?m1)5GlINHMPPffA<{w-3v>m_(mCz==Iak7@*3w zbtfd8otSF9xLBdx-Y%G%P!xPEqWKRxgO$8m4?TE*@6Hx? z3`W>PvA%~vlXkg(9Dmksp3OvQy0?_4F3RI-rLb(zm`Xeyl}txIBTO%Tg=OqimTj&0 z^6GeaB%IKRenLUnVNy&4Si-NR*mz}!WTj5A+5IGHdv{T-9k0kf8^Fw#K(Yw=n|mV9>b?dkQDg^KR3;yLoeANYWs5WY zd*j64KgS%+qYx_3EjobKC3yDW_~cQ)cZ^rK5JQe0PlL4;!;v)*)vP`dl)j%KjCYnR zwuc9LKF!+o)vNqYPU%gZ_gp4^@~$h-$VJ8N-Z@i;XEC^_4I~B2m3^CL0?p*8a3Qg` z66=`Ulp2l}J(qGFt@)S?`m1|#fQ_|pI0;?6Tp^=Frf*dRWiy$S^x$ z@wi!^k9Z;00#yX)!(^NGl#&xvbjwb9o6Y@EmgO>_8_Hy1;*#U2PcnlOt^FDK>{*5< zTf<4zY3WKBWL04qT0f{;de;ulUrX2|r@6_XM9Y*6{z^osi1kGEw`obC&gOJEwe)No zUcMG|Y>ey}gf5S}+B=UpH{|HU)8lmz1ges&m!FBmg`WdfbG4*&QYVGcg}IJIRe=X`W zd0{=jY`8qz%$k!nmTB!o`I1jtn6mp=XgnrMiiYe$mEbjs+CW=fVjHncUpQUm5cB)} z*SW$S!lowvsoMz+xWv)yz73X`8A8l4`(QtW}GOY^&-EB=Xi zs^@*ZlMrz=dpiRmFr2U=>QR_JpMPiyXB&evof;SPk*|vQXOb&o*T`#0mPK#nGZHc_ z^%fD}x9OZ8+l@3gYwZ~WVW=IhH9N%2e*_Z#r0Lc6!3<$brpl{V>jSZ zw_k2y8O2Ip(c=C_P2a(%C9q?ix1P-iUKX|+p5lmhzMN*V{&<$1!$>&`R{NtZ){G@~ z05mHOh)-uD6-{Zcr~S0Mt9DWm=T%YIY5nxudN?>G0 zlfS{pe|-L7a79g8uJY&J{DX43)&P)uu=vqX>JV@;Ffrbg4Axc)i>#fjAnqk{vG5-W zWWAaGW-|EG%4?AZ8&0m3jFr-ZH7)&2lQcoOwTF2gmZ6jwMZ!P{ja?mRnZ77hZG_}m z`n*%s*2Ii1-P=rT4gdmJr4qk}gxss4E_Q&glwYarhYMGh(d8X_ND~GT29y7LKF`;W zH52r!s?ZL*_00ziQDW>aX?Z2fYc9D%r4EF!QWoT^6O8f#2wyp6e=WC?OOT;akSLzEOqJ#*#KKSmqZ$VeqiFziSbHH22&5)zv2dysM2GcQyJvL?NgMb z>%ZH+1!ATggRdVO6Ym?i{uC{h=IFD;Q+ye59-JC#(%yPftEVlT&5C=?`P%qAQw-h1 z{ah^*0mY|(hhg2)HC^FwRj;IbCYrMOX)O~MX%t9CP6I;DV7Jmn9 zrq59Fk*~7y?barx*#64{fiD@9#X5ZS-8he^%&ls7=ozJQno#}BOkY`A4sM1kvp2Xu1U_HJ5t0>pQFH}~DpH_29FFUI-!kNv2i zl-n5sN}gnazF>h8atgX+EYFfqIQEFUP$`KS68x4azF)GjsK)p4jT?1i6Z{3!kmHEaNW1At2Z2N@r_=utsRC36pUM;GI@Q3 zM~KS7TG|&=WKSP8a6hLp7O75}Lr5dF^eh=@jy5HV^94;Bf`zK4zpK+#$50iesr)dpwEdh5ab-3Q}X-Cbgv(F|0RIu zNt8B#rCXxC#jp6U>PYu-ZH-R#-jbzp0N>vB>%0nRi@NmKa&=(Gzk$;*#%m!8RAfhH zCQNsX*3Ll^F|e~85~(Vw+{nhV8pqeqvwrT25)>5F79LN|60W#9f3ixr!9uD0ez-e; z1*`)3{$87O&3=h7yp?S{8>83qI;|>;o11oEqaMA?4X5a{GU4-|qd8+A(R~5!oq%F< z!uo;XLMV*8Fbb#EmQx8URNj7|z8v{RR=l4*=7nn9FpLQgS2n6UslAuInr1k;e0B6V zNPWnSazQcYpomM$vuX*JGJ~HlRZOZ}b5=qurKVH%<7Df#1^Bg_%~K+6hfqO&Fa^)j z^3w2zJTrnB;vp2}Kt14U~q2q0DCC!l8BeP)goL{olDJ8`lAGMrAmxq9$%UlKK4=?)(ulv7yi!3wVTZkxm z<>j!HGtJqtCuSO<<$epDGi)N$xr>8Ir?e+i`#>{YEyR=h3qN$9lyW65!tI{iXWPJx z)SH;(uF>>JFcVQ!K5jL(5%*B@?yyT}nHO`Fi_%<9e%W0w~}Ztwa6!9Y)efXWVAf zHdEytu4oTl19D8OK|38lF4OvLi1K>V;H1oHb`p~2d?)Wgi9=%s+Y}j3`}v;njhB;2 zDPwpoGa7A!)&~lCtd!J?vzkie5Xp$9yaAtXY^uj#;{3CvX4BEt)euj+d?FW#M)i=w ze}H$?6#MSnN<_h2Ey7gG>N0pH`t$k#v#}m)%fk>auZg*X=lIHIUJ)rMCGiw!lat(+ zCRkn+<|V}?DE07N@FSe{S8w%~nb=3=_Jx>Wg`CchxAO2iUlyW(;xBQh2Qg3h@Zm z?ZT1?<`R&B9Z?MEKZ@(f0hVx zXIJ2=B;=CW`s>R!F#v3C%jiV><$nBtn){KN=OfLFjnV#JhNVm0`C+Qq0Ok{@sysWD z;aB$f{8BcmhXTv?d&h>+-fZi5rHWJ!Kz;l67RWkxGg-Xpf{@z&w%N4cFme9KLfW%s z8L?sS*wKnUEvOD zNR9Wqet{PIs1HmQo&r5}!CYx}4NE#6=TmbY+OUmZjv~`OwyL$X}u9 zT+{FEW4@cMgp^ajhpO0FeHk>7A??kO#L&-<;u|4L*JR#8v-BMqR2&f=UhWv;Utqh>DJ zxX^SSuw(i_nR*bBd^}vtIj|`n-Nah)+es-t0p|y6giyRcLSIkAN+B(9~ z%##z(F%(Q4sc{3MmiDG{Kbk$w)__KuIr@`mB8Xjwc zpdEuT?jIccKRj%YAY7rwQogw(+WMl({3y$q`6cbAYk=e8Q!26)FZ(~hlP+p(2GPxd zE9#b3z<*rfs%%@zuO7Zs#MnH@b*%SOMyAb;w>2S+{tXrB-#{WMgro_Uce@xu%1t6f ze=3>8{`)tl2GhC{-ohkr6I5J?;xX>Yn-&BoS7gw_If)i# zIjD^$n`JHkm(bwLtf((yP>u+wok6-7#b*Z%7rj*K%`cKPvb;hjHDbl4n!bBEgLz&m zNVEgsrE)f6JAyA41XO^O;~uZxdkN2jv)wy+J~pX&yUW)ApEpej??g`$ zGvxQ^NnK`3KN43NCF@ceB}-;4uBFVdZ+bQlPa(&lA2nXF2m4_hBpQ~7E+qYO{bjN6 za2R*`P^JB=i#ouv+K^58#i9_$dqsKsQVGbX6xe&=>6^ue-md4QN7Q<0zCK%yS4>lbBgyhS1LdI1 zVtm@m4Z89N0lxy4*kA_EOu-E0y!zMqmD(Df0#?K{<&u4X9*OOcAOFa4(=|)GiP$ZJ z{Nt5)8O{mk5`(_=HKG)pw=fmQ$o~K=KOPhRID%fVRD@N%w$w~b+37#js1w`G=MyNF z*n6$VLH=fjZsFxdg2K>IZLmOk5v1cMb9H*-dCsd+P7k0$V}~tlnK)^;BC=Wjs`_j4 z5c8E)$bW#lqZ$K!&{7g!8oX%Irr3F>%x}pnVoISTH&g~i)-!NwtZ!sfQ?^oQ)Bj`= zJRos9Wu1B`*G5Xlr(_1paDac5X0S0qn*eHQ%3cYq%GQm5^m}Q$A|nn16K&I3{t5h5 zx8cx~;b&Y%Z@@ks0jb7liC^6LQn{r7`%l4*#LPNUk7h7FQCmqW!`8|}MqeGf=rUHO zW=Pc=6)`{B?pZn|@PpyeqUH!gt&gQl&)Tg_fF`k<^lbi-#y(F@ zEUW~~47RM0W=uw@j<5jxkQfga*7(Y(e9UT?b5#^|mMy#A+i2mQO_6UatmwS)OhRUT zc$Q`p?w2#S+iH=HUc)QB%u3NrZ#aF9#z!~*b|E#%eR1Q#kcn5XW2XLQVMH7g*7rBd zu^lRV?5V=+j$eWoDIvpeg15MxW*eNsxPBeH9@mz#=2A4p13ig=l? zGiVk0IGc_yHC?5Q*Phqz z45AB>PosU@XF*u&x3F@3+Fy$c=0LaZL?(^T zP?BZ&7qYHNykL12v52eb{?vu}{jv&!B1Kh;Q3pQ13ri1;hJp~k!P(J=5`FsvDC9WF zDZ*WTVCbmg=*L^-kty8tWc8a@H3BY)bVyLhvYWj4(`CAFcG)=`M%ja@RPA9%3zKkv zyyVWP5s!(`G$rNv|F`Jc?#=B1#( zP{%tGlW3#y^Sa5}Y`y;}6{Led(5dQmQq27(8%?1;$UI+rF&O_&?Z>iL!?Az{qq5k+ zjxs2V`VD;ytlM#Wm2Z=tbmU^~{Qd9pL`fO;D|I6lgRC$;X&LNC;&&dS>Yd&-ECpOj zO=`@nzsG?Ludm13@(nl#*wsdhW?CH{q9)Dtw(z$rdMpnm&#L|Fruu@WtWr|_?UACs zwirP93A;k=e-_R(lHaY%B84f@!L;ZR`Mb0eNaa`+4>>tJfPC>NtF{BWsO|E(sDt5> zhgQiFX&ARU>2!@CUsbp^X2yhb-?ObDMPbX(jk}BU5J_xLRzyoX?}Sr9p4{&rD)RSv zaSC!=Mkv(o0@vMDI)gr$kNy@1yPJ!>GT+&$9T%f8~2^j-`f~4!|Hp3DTd&#h< zd__8?oS{mU>aG}3$4vfmF!jj0Cz8b-UQN5jnb>VrMQ-J^m0d% zWzDcoTF|@RZ~@*ZFa>V-klglVdcTqkFKNT&d8Ns+X_B{GUoUzH?dLiFlEg20Fu@E+ zzh-taYx|t1veq(1O#ul&NjbnvW`fCz_6>~wvKCGW&KMcH%X#K$-#kblF@KQAzAtZ4 zspJ%^$7H#_yXtsr9>z=A1{Bi~d!kvnFX+oVQ~f=Z|1uMDS-El~<9&JGACJRcb8#rx zB*wG!5|}JdmBCGj)+r%=B?{$U&s1?z)Rg|ml5eed4M5h7C@u`$=hE@VSyQ=*(HNS=8$|1`XOvEqF||5Zs?QSG7X7e3`R^LKHOC|Ek6ooyK>`~^ zMcZ2g80Z>!uO)Yz)A@cW6JLP+DL-UXs2r{2;w4(8qT~#+Y+j;7DSNZwNn7 zlkf(c_|jZ7l3?|4)hd50_mjx8@AyCy4DIR)z2)7?ge-ABVMwLkl)Y6+iURpytUvod z8ytsVE7*UZ|0b?$D8~Wm8+q}=L>j<1x;81#4-edD@tjubRIqtfEcfE(d0Pi+w*wcp zx_H&OV||o*QZTWpR>2g_W?|uTk>MeUJ!fk*?*B*Z9j&Bgvx%5a$0}1Kr>RGaY)S@S z#IN@X!0C?@NRz;W9|$(CDd#E=c94VyTx+zueu(9qYRlRo;79Gj`G-woDt+bkVYNgr z7{mYk5WOrFaSGmo8d6DP)*WkzFNEIB=r{K-6e}HQ($}i%dS6Y^)t-75iJ6teD^#`_ zkmR3V@nNk%)#L36{0DGeStk9ibv0#@Q*>x6!94D!=m`@7!UTZAfpeGID*fS*!iVpyD-23Dx#b{p$b-rT+U`$gIOMUKCve*XKbEuLhOY6*q@0u2amd@5KQ-6;*fZD{#d-Ddq`W%ZjfZZ;Ro6e217-)26E|24KBEr-7C373ito^ zRMD&UfYXBFkjBpxk=efQ@&+ZP&Qi$O|xH(47F9j6GKjP32voWrx=9kuUml+b~Wc>&G3K} zCb5BGe&=PP$6OCdV`&J|c<|pp3#g+|bKmaq71;(qg@rGxnb4NcllM<@RXlI4Mcagr zi6p_R(jVA6g|&|brnlc9Z-X~~FPkDFG^UAv%FO(ZNgoIX%Aw9jv1QZk7U=?{AwBdQZ-jfn>^I_f%=IZK zEpZivpWmL1m&%>#UPgyIuF|TdGstrEsuaeO3!IzB&<;*P%1VnJgtov5pIoB7f6-jC z|B6Vk*Hu^lbzwSK?=7B?m0$Q-T;!z}uVT_$i8}t1YUvRs{USu1^f1qBIhJ?*SoDAP z1D)r8XlO~{B{TUZH+_5kuUG!Ctp`=xc7o{M>D*+awIG}wS@bALNuf!#lQu1_VwWamCxY?1zJY1vXd8ntz9B*AI>Zzil4# zZ^y_+$p1vs_kpEJEiB*x;-X0W+vQAQ^hwC3}2_R?sEpX9b*mV`3&iP?r ziTgWdr-q3f{n8QN+mrtQ*b7rdKQv0b>is=s?ewte-6MxOatjneq2f-d5D28}ODC1z zrf#;G({uKHu0zK0(*1h+>ub_NyApc`<}xddejQFeBD5if8=*;soA{v|&4pYZ?vAMO zkKH#S8I?cpNExI%AY$LR6e0CZ$3CmPflnwkq&WbQeG*2Byi6s3$(fsc_SJe z6g%?nV{ZB36})mQOar~~G6KUVcmgGnOVgT?N0L~1xY2IYl>?W~sjTvxs;=G&BIUoY zn#()Ldg2cMjEo5F3JT0~%A|IFAud~_x4}%VXqkA!m*f%hqrjTIbnW>?S@I5>J(at@ zxYM?=%wUhd1(wrOh(wND75gzCWKKbmT*rzR|H}eVs7f9??E3mpfGOw;guMrkc~k3L z5hqOsFEI8$KvT#YB|%xT?jfBra5iR_uXbL?`pZMC?TS^fPOr=CIw)`Jf}6y}iaJv9 zBh!TWCBR;YDSsQNDsE)M@RefyGj1#)P-rXlq>!~{>W*}(xZ#+Mmea&&lIk@&*0MRD zD+|jM4oas`pe=UpAN99fab{bOTI>Pu!Ly>X-1Q(FVmKe(Rs|7)miSzNxFJbFL3yqi zL+TWSTfeyF`!Gi5DJ&TR3yx|tMBJ2y^iDj6EQ*tOvbR?;K8elt@7#y2?dmwn0;(F) zt-*CuPNIIh_m0f^q=MdL$|G8s=t0T;dPB~Lq!95tWVVhXSKU&lw?3%%$ZWd=t$PGEB}!&Xm1N0#rMbv2o*m??bC>SH1X)f1G6^4)()#Xr^%Vd zur)r#v8bD)i~cl}GHN5gNcv+!)&}SW2FjHquCT090L5O{5sA~I;bl)@cE5kz0}3ea zUwZLW*~q_?*6+lkpA*RmGU-kYC})V7kP$>k?qUcaV_tV#I8H=tCg#7t%T zi(kTj`geI9qW_x1H`Wr7{6|~mB6i}7ST#>++sQ?R$fD2;DCeUu>5ih(eb#Qc`gV<` zGyChT*-x@TLuFx~@T`5!u#E`R#YhtwX81bqMvj)(5muQ0tCEks^J|?NgdP&MY-|-$ zX2Mb>J2ttlFdiI4&OEEWHqFdwHw=MfV^`7+@loj7{{X7?1LSO=TOjiTaM;*U?#8gB zq~2m2Y`GFAR0~d5r|Yq{iel z$fi7KMpHn~;#|=mC8Ao4LGgt?V-;{c>h1^ND_#4g1rwW;BXaD->PeEzWBPNJ517v5 zrE9H{BNG+cNk0iL1oCH?cBpietKJ4%oL-N-S=o+{3_+SbHxID@moYLZQ4i|>&_`WZ zRU4mRhTY=>pu;&7zDIk!>hJNKF}&@XU#oDWi~453u_!n#6!t$s2UOlx6$XYs#m46~ zS@A+*BAza@$$N@Mwf08d{F~fU|9&(sQGH5X-N9OEajstr_HGWBdPOdM#}}6Wk%W`0 z=Sff_a`3W9*wmhOy2V+yG=1?d#OCn~fvv6@+bz4&N(2^~Q$9rw?@xSpHqQS?Mu!5+ z$68n|{@z4Hg6p`a{Osbe_PuSY9^Z4*p93doZ57Y8`Pg@dE##%N-kG3a6#w*5bn}^Y;g7JitHJHM8JO`BTm#aJ^as`vMA>LqDKH4vi^K;&^`@rCI z(-&ucIT{$9_>ywWmKzUG=$uZwLwKIPWl>6LDLju`z0D{&@&yCNY2d|K`2#51f}~H} z4%3yWUvXD>))sswg{!I`38yHe^Ky#pw2s^O#U0#pLwB$7ZRNTdG>n9Av2>CQLQ z%+HwYp#Ugw^XhNjs-f^_-DmV30i_HQV6WGTKIdeW9n^94IXGlg`c#(}_(OG8TK{I! zCY?VASZZq^)oGfqH@?0H+O+^y`Xj6If5*uWUpdQ$dhu4A+kA3?QnD}q&4jjBYLDoQ z@QGP(TEncc7@k8mFJ?!hpHV&=5DBFf*eY30v~YbrK(97Fd}h>vqSs0(v5N7n76qaEF+oF3 zMQy5%Jy>5pC9Be|RR6;U#PT+^go;gjY*HYOJ<1;U6Evok!C`(qz5ME`PWg|c zq?V}k<&>;-0+E!}i?rvw%fZ!o`jt8ykiRqqOrcpKXA)nW@vWV-(*70u>GU9+60o?w z-qIW@jz4|X%Lz5y!Ya^kHS^cP5^0~8H$`{&bIe_yxJ4@aI~*{)@Qe!oQ~P%hTY>a` z_%uW|^)hKDIxg(`-cjuGTxn9AeIU*qQl$`GDM!H|Qeh5P!x_&V6C-cz2Q%S7(WLiN z;GkE7-oSdQ5!Oazk-0<~hc<~y&5xQ~N!~HyDBXp$nVdw3{U20UxoUHdil8M!PuI8*UO^4SA_@98Bvl}M$G6%*qQWRdEbv<#HWh4!t_)p zPkA%qA7U>*Z0E0qx^AAZkL>7pI8)uf&H6vW{{LIUfWcmUNKEvdGzz8FctraKdCC)G zDLegD-sQ0TRsSTDRc0EY84p>cv=|Tm-WGeaxn$ycB!SrYQ_Z{MdT!V?{+aiiVCId# z3kkdSWMrI0Un<-71oGl2kM&q3)Z5?cJm^zDYa08OkID^8*f+p+=@^ynmsAFBGyRUwBofgGr;N{0!UYOCvHu?N*W^E5 z9-#l@!1o=Ium8AGaiZbFX`f8|W4U0E(*wMn+2iI!2dP9Fz>tb zE|XK18Q>i&Rp7l&I+S;le4}^A9ox{!Sw7DXBCTitO3PdWeeqc&?&L=(_31EU;KlTI zXp2?}-IC4G$!Fik_%_iihGV!a*aC>Y#J8nYnU|=?XI+|L#$*Dk(s`XPJ4DW#FC5Gh zM0P^3?o2T%8K)aJ(X*LtlI^LKz?d!GA#I{c8}Sig<~J7-4?j_pqB2%NBEXFd9NGfi zXYBP`tumwr5)z_$)^9zvwe)3Kmeb*B9^?j_u=YIJjN4T=mZ1Nt9lr-tY9UOj@RU!+ z(anA%l=c}%bN1QO;k~1+rvK6t$j_(6+sq1qG|-&KSz4mSP$RXbNCEc&`F&5R^bs0O z=@DA9Ink7hYyYcv)Crq)htcI|0)%}+X>z+ED38B&6bTJxk+*ajo({yw1;rD@S^&u- zmO@5Qnx6#nAGy{ywsZ!xLyZasu$A}ek)k_vbr{AGeX)x7AX+nemReU#;g1a;WVsVt zl##qd2hq!8^E?i&Bo&Kk_)+(uE>STpP2hplFDMBIt{#@+mUIT0NRo#{|M_DH__~oH z-Z-R(=_9>~CQN$IjQ|$(Q%&ow#K^C|i$RFx`^GPES{dWXJTBr*gVMHdyoJLaLMb(E z4Pk*|@a?w+<{48vI{S&ggC5Jaa7E!ye5v*$D1cHWjT+gGPu;ZO9_RT6*i*JeMl*=V zyDpec-%k+PGHnYF70Q{Sk| zo>{LN4s#3EETr#unU9walSG9G{E224q*=k|vYN3MB}u~P1ED6C4k<#AA=(+TuH4cj z9V##=(4Uwp$-tEw5iGrm3l+(E_w;a2rybwSyrAfarGO7}n)|LqTkdHR_Baoaw6FaRv&`z#pXvM z`2P(3Qd(iC@m&rbY;`Dd$dH>$ni%!{67%c|3zxiFq?&jpN%wN+tD)cXocEJMI5&20 za+zeR?&ROU?V8KtTNB3Iz=!@{Vii5sf30e=DN6R)1y4DmbRa7mSP}Cy;_pohXUK0d z2kTF~$fF1|t)wxn(6(i~(z0rrCdGOV_b;9@yaxck)5vZlh&$Tv@Yzj_#v zJSKZ|HM_ER>{nW_{h}kLjK_=_9zCL$4A}BLArl$i%5|QN+%7Wsco)AWYiA0GDG3gy z_{^%aW(1TS^UJ|(t|dDVHVwf)p!lXOmSpF-!W<8VJ#X~RTY_`&+$S(=gpDJ~v%r^; zSMwqR-nW*3#c!RJb3SLtMWsIWFIRuTWOKBM#v)&CxhNuTR}cg-x_$Y%=(fm@{|w=q;ZupbLrQW zAg9>6OxwU#*zm)su$}FkZojdO)%Cyuw6=(!*YcKTL9Oo9Jk|Zn)%hg1=Hx)^=ky6JZ~xj*phWx02S|!rAuX#9S^l};a*j6; zUa!B6E^l_mcmJj&V{s^*$WCNUz8!g%ryOUhVyx@*SXhp{ml>T=wEH6yD9NjAIng=U^vO?AOE{JcW|#Araf{x~#0q=h z54#lb$z*YT5sR(#woor{nnM)+l=^d9*62Wr^&LCcYF=_g16l&DMloP$6lAYF)D)Jq zRh=fptu~`zE=8QIJ{pUl*k>pVGWdrz*i_n3+!ei}nW&KRA(DZEGTYUIBik3E~Uf5uc_Ll@%ZTjWa&W(;@fw1fi4 zbvC}pl{w1ytl-`~Ei(vGsw&9yDGn$IcCbh&ePKYzpAy}qBG101H~m9ft1E)h(KNk+ zS0v^`cm!D`IMoU(t>9PB3+gn#YW0 zCju$ZNB_-fHp-75BGq+`6f!I1k~5pcjSy=ap?~aRA8SY43Q!w<(_G8m6bA9jDwplv zLxzcX$yH4or3W{Q0{Xahw>c$yY$kk)#*>G$FM*VU+3>VYQ%qTRC^Vx{nl>8c;pjw6 z3pR`)`A$pHS<8ZWy{=WI>;Lf6nF{x6e&Z~=ff71ZRPi`CBkhZhJt@BDgtW+h%lj62KzA{pzY1h8 zR$%m6C{aAwV&q=O$qirGCo6XiSJeYK@83N{=6_|BZz!8`bPeR|V zdq?&NKQiGd0PM6~*A{lFB|p``G#cJtGkAFGVF>*YP;z-_V1XvgfRLX@xB@oWi5|_L;{$lM*akv^S(i zJQdEdoNK8p#fhd*v5|v0c+1QRa$CC)TWQ)cS$%tT+6~Sn?n@RrjAHDFVwqRe6Oo3T zo%Bk6=HB;|C7yDH>3A?XyL5-Xz`39)YMSSHdJjb2Dne?wQyr-UZH# zT0$i+|F+8YuS;pQtaCrf{=@;XL8v0k6R<@bp3?<+O)_#%BW%nQ=r(=<9SqeI02lx~ zt`#aPtw$R2q4Z_ZiRjn3GNZn)Jl|GHqOSv|Kng+%toqb(N(X}xlbeGLcAqtt8jFFf z-^ocCsT#(bB*w6c9J-1-KcWn%C^Zh5L`($X6e-+E$-cs>k)`xGc}yeOEHVR!(L#@{`hn{>7SjQ5TrfJ43)pKKv$`C=)THu#BxVi-@Msouf-Gw48l2hT?0QL> z+|Lm^nF85x09bz;{6_y0vcKeaw2`6_cNrAg@6()OOYWwgU6dp8~3;3#O zAmhC_BZE}8y*feNpH+7%eXyrR!z3IlUQQR@Ty(GF{8!f0*e|*2qF|G-m$+CWIV7no zs^@iLZZ^cRh7hfpA6SXd|0>J80o~F)&rT#n67#<-cYq2-=}5bLfm!$pl0JoVJ3!dZ z)MA(ttN(26o|ZA}qLg@IC=MR)_mD2;t>i&uvbPsniwcG_ri|-0TslUhUJj(KlKfZJ z>92Z|0E`hSW1dJP{?fx67jdAt@$@z@h;@gK3LrYOL&KdJWiS?@i3#s(Wq~Z4A1U05 zOKtMeQ~S^jkI=D8?Omw~x*#EkOK~I;&woIFDC>Uys^+V_lBHv^a@x#0#U3lk6i2vOS0)L0SL=d@Q_#caP40O6 z_V2f`s?bG@Q)3=0JE`dRl;|tf?6ZJ1IqcOk))&M9Qj|e4AW&&@&HjC z;ae=#hyV|^U!euR-@Ny2e3M8QnGpRv((`7h5QJPQJqS2A%oVJPAKf)q!O!9~nJ$#{ zR6`ld;|qQ)4wv4wK%?l`5CsG>4F(;;g_xd-amzIiu-HcP^gSs1K)bWYix6e3kAdQK zp4ZE%4=W|*S%ts{@drR~>cfc@)>M_6jF{kbvx~s&Hk%NR%uden?%)sR^rPngxStE8 zB&Y3P;zgxZHBvC9_JeKmpmgVlW2ynTCCO-nLhxbI`@@>gyT@TNCq_#vP^(237|2UF zJu4*zlO!nIy1^KPzZ7PtH${}8UKYE)9K``CJokM^-ZIBvIoL?+X||VL0#=gnE`3B` z)i=q${r;{|fXe8lPUF*lC2X98$E%|f7qf}L0xr2?rBV7!{X$9<9IsQ@;|v@Yxdkdm zF1w(~MPH>2IkU5-?L0wc{s>DXV40<|>IlcPjZ!m^E@lR{kPHs@h%}+kC z9=TFy$-|d=o4zoU0kIq>mjn-wmXR3rd{O^+z6w!$Tb*1n!Y{}`M_yS*5ELdZ?W(`M zvRn6TdPUE)YDbbc4M=#hK^b~F+Oof>CuT&QN-kWGLGkk^Cni{HwR|dYXFz|+k3{TA zZ7d%az((^X?)C5_N@IkbcKO3wldNAYsF@foza)qm!6m0g3!PzMu}s>j`u@`-e`S)r zA)AR*qo*Z*Y;|zjJaLbtleS88I*Lm5N;scHtbtmsQ?FzOd)euRPA{fidA~~_VCsEv zY||`36Uhs?b+i3fe>i6By8Sc~N0RG->U9m-3OqEAY!2k)3iZx)F(LJrY42So52@oe zpZg%hYCsURFg_1a+w@tHnRgFqWdhp~h?FD``GQ)>=t5kf_}oG|lA?{{6X{*8KgnU0 z5gxUQ#Xq>{<9oN&f9RXpDKL2z?aYq7meMfbe)9NjFX8^a+K%WRHX-j5EXy<(Y z<{tBOWtFKM+|y=kS_)^zW2eml2}?*A+qZP)b*8TeVwszeV)HWRG$E}KS})C8A4ETs z1CZ-0&31{K9*O87sS%!GZDsuKCe;$sVo`4OHr(!Y&UYYfMLAy_DIkHd2N#+n66-qi8Qr`g2(1tq#Vtp-n9 zw2JCz_~r19x59nELD%R`XGxYRi%?(}=qj@OvkaqU{NH&b_y288#)pq(UQ`?#RHV-h z6gKPQW$o&g;;}6~o|V6RWpg}oF=y#n>>`>vek(ZH{73YeAxzd!P0ji1RG&+sd|+vU zv6P1Mvxh7^^cV8sAbH8@R2}8yf{rPIc{WyYQ!Kv;Y0C5Ykrl(uS;5<@Y?yALvoT^( zfk6p7!CqjuJbWK_3+FzdO>{){Scyg;{>DpI(6=9NUo7>@YwT1KA5 zl!wf9-3NDr*mQ42=+nTh5RB+gY`PDh_Q|%WOn!s0)_7i!k;_wWvR97|qoiFuzuP4` zIrFe_*nxgY^D$MdZ~;@c1wJKo>JxF3xD`NFQF#PP0=cAnS@KP z0&yQYwgo#wu;>%xU~it7yYHCd& zIm>WWiLJYfoWScRvnj4s#OT3!ZhCt6_sm-cnd19siNW$qGrb)cBE5*W;@$CLRK@At z8Pu{Ycrw&>?uIvnEv3YE)Q$uj*8cGZ+o$r)ugn5c;g=8vL*3R>1}qOr|Q1{Q^&4l z%XGd;B)u!KB9Yd$Obc+peH*>%pk{MA*xo5%#I(D&ZQrVgP0DyqXhZ@fifJTn;AW}^ zOm0_)8<-ugvn=dcZWo?JmYWr}>kL%OfPopS(E(M1(ezt{T)`&zBTc9C{c zUT9b1e^}F` zW!shhI$O-*Z`Yaf-+A@*|7V+f{6CA`VDR-1{DODiN%(^-W>-yySW=u#SHQx`&sp&4ozF@Ykxf#eycr`IA;^c`k7T8*7t;ZbtuE_G5gr%~dYTOnKpw~A5{ zpAdGy4l)sfP~^W(7r$SurWL*yT0EJ$)%Oy$wOkxj_8n+7y)BdNovFI!C~2XapGWP7 ze0iOH#rG9Hi7(HtYh*}igm26h&SeW9>1Bk9Nl#I6QGfYL(0o8L{_WZDQpC5d<_WSy zDGhnUM@7tL|F8;$Pj8rr1n%G2OPm!dh&uR@#46hJ5kOyGNqNGBhbwszgm|h(pK)ds zhHZ`lJoK5677%oaxw}D?_{K0f{UzT5oNMK;|6GZR7%hf`*bavWm8j$6;2Qx;E?BvG z3lx(CmrA{dk4Z#G>ZNkF?nMg?jQB*)4w)~(BC3EjMRK299gHvC6`p~uBci~ylC2i1 zd`ic8r!Pv2-a%+FWPy(x4(mP%PdEA?MNr+?@PPawbI z{2__|^U=5U^35f_kz@cxA@8#=hxRd8zW6|UOuO*d{^amng;Sh5XRI4BF7w-&_)EqU za=NSOa-hKFjgo3=lLL?9T+ue8A9huIk#_riJPV2R_UGko-a=Pfj>l{ZaRqX(xpG*1 z4k4;{H8t_|kf-&!MZ>)TN8KO^CMW1`S#iUc;{)(uE<7EvuT%wSmlKU7 z*q~oe8XVU1Lu+J0+1>$vLN2S}Cw*}tRDDq2H0~4}_YZ41$qQvr=F%%Jz$AF=H`y}e;bHj_KGM>ox6VsfB0d#&V)F$QR76j z6NgsA7m@FbUO0TxhAUop#kH$-LUo3dtx7zW(R};;1v&v=%+4vclGPB zXL3Jf$Zlo}5i|(a7e8b8hLv5ZA6;WNFQ?gvRy(Y((?er4^|12?!~WUr*RZ^?-3skGZjnpzGK?#vLd)~j=mU)5 z-Mv^6UuwV`QVCRp_RsyJ_$)(w=@CI`53X*T<8r>xAyOP8F>%EhBh5UMnY{2_>84?r zVObb1rKWlsT!8*P=Vr{KCb6w!q01gre7VQoNl4u{(C7VE70x3gH}_&>^X=!S9K1{V z(4Rjct)Km0kKEqXj+}uX%)Kmh;5OC^u$LUR@tWIUoUtd;xmuQ^htVNR>O?z=I zHLc+qjPZq=FtlNh$&?tH+1d4rv9gSd(b;3>ET@=f8ln&~0Na7BBgCp+`~|o?FE#@t z;%tUY#zGQ$=LE-S1tq_hswxuhzD5NXWPjOZsbwEU@I}vh|TEX$`In0t<&v_0>Z8rMY zE-D4g3*Lf7)D^QfO(kT)T~cjf*ewEJOwM2Vzy(=aGk||4AnmsXs&*9nA6Dmv{qY2% z)BT(`nW_GX#t=(Z;1_({Wa(VRU&?@t9h%A)-GL<}K(^Wrf@-VxWviL|U4$Tr!BT?X>Lu zI%;h_i(UH6@Sp3Y6@gEG7dtXdNITWyEbTNZygn7ov|w{jS2R@{8^P=((*Yj!OCLZe zK#hu+x~Ux`FO}_oKjT_@mk@3T=%Ti9UC5Kq@L3#Ou0?qX6o-CMbzJAftMyL5q1WFM z!^?-yqJ(8fE~QRo*NXpC`VL8Yg#E+%`a=^GF^-Nkp!+*t$judMp1*yt3Z{W2Kk4yp z!Lht7Ds$$2H`)L1JJLZyqDO6vG&nH|nDDXIWJ{^RF2~C1Gth6VI;*LwEx`ZjQ2%$4vrvu$ z(uf_5W8M3EYb+zcw{in&?nnQyD!kye0>%y+p#cCK%J|#_x~)YPZDHs!K}llrYo$_- z(i9a)1Q-g_6f)s}*N`vHN`1!pQj_R!?Gw;y)~8WYAxF zv9f-8{d9ym@R8T}5xTb7L1up^mXlpfpg}K& z6MY#GDG=Z$M#T&)P3QCyrI?cZ{qe^wQ}|H7n4nR4y2|qY$(u;dzt=uf)`dgxt*Lp9 zX{APGU&hU_$m;BK77$V>o>C_h4~R><*rnDp(V8RoND8{aE2frnGG@e}(Nk^Y>nr{K zOm?uklO?dI8k!DuIjO-YBABVxo7tP`l`CR>n#`e?7bngn~h0mxQ#dAU|ffsE@IHxFb~URE3#lNekidd`sO z`y;0!|1ht*SZ;SW%5!cb9Mvczu-OnRP6^P-k005>{~I!xZ79a198I&8%I`Mr)zBpI z5UFhn_e`Ps^%qiI>FSK;K`!SyFwlE@_e8vV*XCv-lVTK7cS6q&c6e{M_*Y>zvHOW8 zk{!1?Q};VP?_4u?pLM`b*?cs3xTk21ki_0hBoE_sFNq&(bK4<85&A zKf9T*VqRaAxR{0wh#9G64S!r}z-KrSS$LpCzCbh2y1PSe(}Q<@{u0M!2j`Vf?pBpF zBy|wbh&+>f-wc<#KmSU9Vb7b$(rZ`lprCu4TbIW%9&WefWFSgYhAu!5+VUnnBKTcT z6+N_Fl!LM$%1-4Fn1jC$5IqwK(E-yqbMhCiaDbWuIFAhZC=IlU4_V(i zb6Rh%(p6>5x|bbGiYWTaj@kK<1`KKMB2gNhq+*8pA=C_+vf6~B!;lsBg>8?Mu9G*_ zl|Kl-M0YeLmkbK4u*I=s2BZ8f`Y{yBXteHOW(lR-D%3T-u#UNA4nkk4n|q+?j0R_> zGMvhT0y5mih`d)L-uWCB?fl(LteAj2A|*td@G~$k1wP;L5bSU+<(_&f1Aj8;n3!u4 zdcbPW3S?xK2JcAy2ENuDGVtVM%yi~Rf>c3=ZgxBdmQ10jrOG8cGiQ1U-uKwQ?A-tv z&m(hOt1NLJ(IeDz!I=V-O-khX7g9f?8~%RgLK&-d^gP_anpA@|${-WIosEulD1bL@ zRvD^aXbk7JhFC`D$n zU(HkYY6gAqX$?+tm}@zGFUSa&bqb4%A$;`MY=PZwSzSH}KLv^j(HPqI_|X)V7Qy9) zxKk#_{Zp((HI0#8utqzsUZ90#&*zUO@n^3-RLhx0wqKn)m~l}xZ=5z7)_ykt%$$vp zc(K~Ynx@cl#p0g4-k)fgM^U(V+L6*H|L>-T?bi3u(Rt-Ib9C;d)2DIn&Bq@Z{(fAS z)_T?ciBC$h!p3fsKMVS@&`~2)r(?UVjfX8IXJ$$wozqtcMqZ`%!*f3OxCSpTUfv_l zNEDez%6BJuO|zC`dnr|_84w8yey=8ArEcYdEKp{cCLB6=COIa!M&ffI#&Ky%Z%1WN zrb2Yuf}d0(FA&Vwa^i9#;|CENsV9|4G?0Du3sB(zUndz)%&F7uAVDl`cle4q#|4T# zZB6yY^8N(1kXxaz;>>O1%_`xOMrpn*hPlQh#RXGP_`Q#{D(6bA;`JCba*Y5_w?~}} zdt)G=Qg>I|CD(`Uy{z(ZqJYtYbhq+|F{6$&!H3Zpm|yBG~uiFNRG6rIKauUzmY*PFZ1Yx)P= zPRUb?5op<7lDm@k@I=V!?T$tUe~M66t2YV@0{95_$qDS46|;;3ht(^xrOv9J)sFFp z5fy5Q^W5C)h&BK{<1%fbnH-s4|Ag?RT-V7hO#QL28fVFRlb8XkR)a|es@D=w2#q0r zO6=he!cBQrPnnVO>UvGI&s>HE{iQ8lsK2v>07_vY_AtXIfG74v_H~vk-#`;WMMWjc zg3CPixrSi1hEQl&u3}9qNfEnmiL0HMsF-e10x#ecNb7`qffc^P*%a+iWXkhqgngX4 z*nZ;mVbUe4cQ2QiyGV8Zr`)kx1AKCL?5u1EJDq$6>)3-@;ZF3=cVF zmH?BPtFT#gyP6a_VF%`hh(v8giQM}~p!2`D2HKEWki@PhXN?-J=!E1Zh zw6i@1n`p%*IT2*Bo2|w6LKtOM0w72MTZzn!og;qoXltt}ogs+c+^j@pke&CXPFSu< z^Ee#fSfZ!p5W~A*tm1E0;!m>9j!9#PSUc3jYqc#cb4uBK^vB_W`Y;JXR4&B^1n3FE z^()}1+^yxTy92TKd_=4)(R<=g@5qS~-jIBoJl{cmX_iLU9jQx_FOqAu(3@XS=LBxKR)3wjpX*|RfXne&KMqTIRn?_AQFHW3QhuoWKKSO#R0-Ap zceb0E2c9*m>=;$UKlo3LKl6)Zxa_%kG$Pk$w3(+Yc<=(X9^zYk*`4xBN-FUX)x{F| zZI+66_8I+G5p~*Rg)BKiZd1iL3>&)P;WH2=h5 z2EXLf$+uD=XFmiv^fIBcBaD&SuU$n~R;?_@Z~h>VMo0HgoM->M#^Itr_=n}>^*DV} zv5P(6%_G+htB3w6LzOEkjQx%y{#CqOUi4(kJj0L}NITyrNo4T=^F8^(SE|sGfL-&5 zBQXI5<&;OkK>VN?*F%)DVL8}{A6y$3Yf7?V7d<3(M7OSoT>WXB(57MPwyh%ll)ciS zsh(g2_oQ?K;z30lr$GnP5+te)627y(eSciJv)oS|php?Hjc(DM)9pKKT_=uN=pB-U zW-0lnFPo-*t7H!vRt3kD=0S%RjanA#I65j*-&P=UM+v2?DSdc#eh*)vM&C6De$g=h z3m=yteBo;rse=*3%3_3d`v4v;lW!;xZR~4jEY{%VQ}B-5yQ1+=4DBx+78wy+I7fMQ zgCDk&;U}!}dLdCm{B<$9d*SQyR+Dz@Xfp^{f+`s-3qL;r8dC0u^+$O%Q8*5}^ z){#*Rb8dE$4)RIbk#?yx&~M{yh$HmbF&*K{dB-2-8oKPx@dJSZGP`aVP{a^7Mer`2 zo`}UpMT`{2QfWP+H6{Tt_nq`kq>L_KP`?t-tOPRFCS=mBjodH2XSRr52Gy-M<><{$ z50BSs6n9kpExP%7d_LQ9jqy0So6L8kng9klP?qE?s*cto&3 zdtfiu&*B}B-)5*-QPAgESYDtwqGb<>Tc^_}YWBtNo#~+RAm%UENHwSvps{i*k#txG z-;>qp=y~ozvKIoFNJRsL1^9m(_UzL-@~YbmUrje0^6Dz6_^L0k;o$ChYuwS$Tli{R z(=`<;#lTQ=V^nGEqghz_YtOfK@BU$RHD-xZtyxctKXa`E>ESHgtL7U|eB&#(paMti z2p<`#_C!66NB3d4Q`%Xql+-m%&uRPIaXq|!Ru&Zl+~P1U#c_=ysubEVbzAb>uULz! zLN^d$mvQH!Q! z7pm%#c#d7oeoYQpeP0f?_?bSUs#jke-jd)_^rg&s+ED+fiR?gP@C*76@6QxBTrlf0 zQIjyi1*2cpRes}?f$@hj7g989j$A*#>h}-WA-G}d#=9zjbae1to~TTS*^^N^OM-`m zY1g8PFR@ytz(1(_gXlFfNb9N^T>vAL+*WAiWXii8z5Tjv##jxcVc{pHzek`hAq~aO z^Sm0K;~>-kz6id$!%J-yhx*OSyRs19xC4QnEwU%oTzD$DrdsRC4sr-`I!pAXtj9&& zF-!SyVjr~_^yN$YLcA?+Y0s2)mWKw?Fmj?>iDidb0Vfx=0-u-djF4A8~F-VRq zowp<|l>70(w@~z{l%w0CCT$c4uLh4Uf#rjiB5Z;7+};UdH-8nF+Fyt1_`ff$CWi;l z&^a%5re>t<_BDS{qpG?q*{W)dcwewr>H#n-I@x=K8bcKQU-7Y7G4wQC+`PEL{5z6& zJ=c=T+Yinq!4%gOwkAheezXTq2?-PHd!X&Kv|an6AgpKcM;O?UK%0;6v*ja?0)A)t ztllt#EW=tDuMU!?1Us#|Wi`3prgLUB#edq*qWwXy0nf55wH;z9_E|a@{POf+i>fv1 z;Sw7FISJgF0m{|~O!dmOc-0Z1ms09Y#xxG~KpJE0-0DpdjA6MJ{6RDY324rs6gzEcGGb+JRo zEL)Y@zKir`G&AbGU9JgO8QPoG%(_dIQA9PUE&4E$M$qdi9w~nguA&L_Ah#M0tIXD&J!`5_zy8+5b|PXAfavK0heB<6<%E{A2w{J=j`mU z#NAx4y;j}O$ldkaX`?b|Q*UDLZ@#&0V41{LYT;Pl?P#%u?sw<%wbF7|KR|o&BYXX4 zeom>WBhvwUHS|5aS%{~%9YZVvLuIKe2A=vWM+__M$iL`XOx~MJ8Lpk{K6if*|F4H- zXuhDKmA^iX7%{({ZG}T3Mn-ZrGTXA*t*%lOFKK(*pz>(trLM6=!MF0sNtD*ZQQFK& z_wos+d>e#?%QFOk_$f7SsU9290=>-qO69;5-*=t&f$VA;?q{Ii;YW>*$Ffr3-*{lY z?^*JC4Hib*c60uN_T!tGa0mY zMfhz}0J)aJ-esX-_oCGtLCV4}7Jk$X<36z8xW33{Uf~b!G%ym@1bRZ6D6of-m`HmJ zYa>9`!tZ33$I+TbhVW&G#K!wWu#2U4KRS8Dv+)}br*T?L545Llh-=3md}_tJjrS^5 zxM4vx#ozcuPilCSLIC<0zjdDaxTa66su;GbfFr^^j(JykcIWec-%f8y zHG(Eqtb$wFXUbOR89Y>Q|L_z(e}5plXr=fetsqN?oHNBXCb0zZvRz?>6lN+8+N@E% zPZQXlV-lRprD=XlN+Nn`PqLY=$3UACyC*9WB#W{4@+x_VET8#?!UVVto$)>G{>)Px z@<^!F&+%iGz1pf0tR-1YZX) zS~p#(tmhh0XIFBwQ3c9%w5qFcOu!AEPS3TD#06ln8Lq})S7!9sC-_~`ht@V*q?7x~`HN!tsACnrkZEUBgeL-&NiBX$658r7s*vVsow}6NQ zWD@I6A=fGe`AM&QbeV}gA9a8{cKN#~`F}~@|^iyq$XJEa;r04e0 zoRLkLZbCuz&A;2AvsYRFu)YPI^m9D2ek2VaB$JceG6$kw{f#$n90p#zVc9P=uOz=$ z0VyD@wng1YH+4{+sq(b+dZD%#L)f2E7wD**Zg$?5Vjn0@xfb1{ysq?bSnTwoBK~28 zcf1Rhag#rSpGvFnUT}TH$I-lhOKvqB@cRb2eyW&v6!G0a_&avpU_bv*(9UCd1cq}I z<)t9A4T!a)TiQSft+Z@u-aE>xN*ygNqi=2#q*w@Q48Akeg%rF{s?@D@9272;ols}d z+O6_Wic5cyR#?2_iNu{o<=+-Jz9tpD|Lht05o*DBI)O|FI>OLhEEIRag~gwKE#4Eh zTcWGmx-TG;yp!LMVBREa(Nev60Z{>d6|>=QIWUo%aJNF-e5w?9d!U}zJW-;QqysKn zk$pO&{rc_B@hP+&*=u)*%D6m9W}!JM;B0hKZeR(Ixuntb0=}r|tJz zXiGeEErFv9&CR-QXs*~TuH(GPxqi*Zzx1Q!c2Qy>$vbaxf?rCd+ss*l)amDOQnYcJ zRywuh+XTBu*0(H|X1^O7hsGxls*Z?5@oR08%JyqW*XiNNc~QiV#lyqv{Y!cuUSqSp zz#%hs2k)tvq7FL=e2kxh>#}2`hRFkxJ-U@Rd`psczeYM;y%`DPgfzKOsMsZXS)q*ae|kkPO&zG||AW#DovhksZ&(%WDCOUuiE^d9v#J#e|;13A&0 z3*rF%gaPu;b!i$Rhu|$)XlC&OJ99bd=HF3gVB~c zO^Y=q)kGAr;bCuS1)OLHeDWQIyrNtQ=nAD9G6-~@LyHk6vYDD{--12febLgD%+ zaw3Z-bNVjU&a1iMc>)T_;x7p#CO1pa>X4n=tP!?p_30vT1-HIACm#9yx|B|uCLhZR zTa$2cJmVHd={Fx65}GNiTqVYj!gn-XoM26r*}r(6ay}cg;zfP17CY{%>iY#-BYK1p zBWBe~EsjW@T+*gA^felVp45+g)Dxy$!NFjuQpV8>MgwY_^->{2?8kPgh#@lly(<$RhRA~Joz@zyrrS0g-?0M z==cQ06yY0;j4yvUh#mo(2t}Ao*xz}VZbVim{;CW{!Z5zvNE+3oarBmiJ|-$uZpR;J zAR{EJ(UABD3oEmkKUzmR38J}{DXH&AYiu}4#caao()3DqPNv}=ALV~>wRGdUi=QdPa_@XbJ|EcX zWDwA8a-Q?e6S-qPy7vyZEF%r{&?ryz@cu2PMcz?@esAl%b-C$U5yYJLPb7r}U*kck zD134rRZp3*x^0JjUvWeAGU~kqfQ+R2GX}%zSgxm2%><0kmVLSh*rPO+l)D_|vfJ%X zPxGfYx@q!Wm~1LZ-TGe~lD+-1M>zo?=lYBzFt zRQn}vkQ~dNRO4*LViILUEGr9lu{WbbAiradp)o+LSX=PpV7xH0o4PZH_i-vN7mkcK z{2@UWBKc=E==x9%$4_Myc;?jTlv#so;dKd?j(BRj!%;}UTj(*UICKt>HD*HKOzAeb zA*{UT2L{J+F@~koFsxyY40Bn6;<-!G)w_oW-AbQRY2Ij-XdZISsWa0t?UI1g2G~sv zx(g@waK_mt>Dd_T(N{Q3Xjj zm%(5JTAFORC!BP7zZLT^)}n5Y)#Z?n(f+`xnfsec9G;UOLPqL6qtU57Tisp7-08sP z-@?&Gc0dM#R>}QCh*PTGf_>IcA{E{-cHs}Hzaf%(;7hC^uG)#5=^4Yyf{eM|X z?|mdz?Y5MVE9V05HR&pSi-;)RhofAAE3x zxt^OQiwq@uhwypchU-hyzQKi)8a)ix{9jd#F1B}w~ZoR&1XcV0{N!iE%Jc36Dye^K5 zjEby=rv2JX#O8r`ZE!t*STnRij?LTU0<;F@JCP*7dLx~ z&^h(RP#tJae(oc8C)*oE^76Yz9u{pq-ER&RDY)a&g_r_!Iq02VP8okIC;tf2dkqmP zex2~7A4cNI-X&LRAy5s?U`sPJR2<0g9uGTRQM6k({+^X?URyuYTs+T5Pl6qIG1PJ? zrAllhQEHJkYHlVgR4r@uhTQ9JC$!v9W4E3t>s6eXYm-o(;MmD*Gd1oV`MUrXzou#B z?`rjmqwVa9Ej^6e20?Dor4fmZ7qe8*AMC6S{6MCKyNJi-K|53kC2jgw%SSSEe*GWF zR?-97aWm34>juL0ju7-8VViDCy$QcR)Al~B&~H2oQ_-&e(kH5-E>C}npscu9NVDR` zI3x(ud)dawTllXu2Lx4=@cBP+jgwR?cD@V?C9ko#$HcLI*Q154K6d77xW- z7$P)R6FfV&M-h3u6}bW$w8LdCGTpbpJEh&7C3)@FKM!&>LwD>@Or$94=Ij{#NyD?b zza-FPB?e5q0oibT8#HdFP9-`W&(fj-xw}oHm*> z*Mv)o>GBma+O%HG91ROHGhbD#lgH+=|HC3(kZQ}?M8R^uPj?zAeDR~%akH~hJUHP6qG-Gr&YUhqkAs%EXF?=OYUv0{o`tT9FNvZh?!s1{~ zpIFjzpL?^mNUW?Pg>FNn+q58pt{c{w^WIN(H6nKf>+p@@3)`*k6dGn`_cgK-C$fr> z=Jtam_IFyPr9-jfs*tT?qEL&s_}1CwEV*`y?EG4H z%-DJF{wcX0JBUhqAhp?|{z%WQmN2rMg!$NN=S zeGW;|Bz|5=9=fY8O$+?M6S$=}>Yob#3{v zmvx^OPK_amEzcoj`~?t|J!YIb$kQxie7gH_&%8H2McgvHw_N@M{)2`4gpL{0C0tYu z)NqKTt`6HWtwCNsy&;U#=pvv@+K8M)Kk;Z4C2+T*vGmL@SWCajZ8YyKPRoz976LI zO{17CC@H+d1ZbqkbFRs5|L{5x z=dZ-!k-Yr~Je+y0iKnT2u9L zz`$C3H@?Tldp#RY=1+|dm066%R3i9|{}#xfQUWxglD7DM*E{p;RfCCh4a?7%1T$r+ zo`2`jijG|bzX!t#Z*O;LTKB2kr}>7xnaj&us$+?r#$J>8Aq=e=lpBL14|OBsN!HO*)EAMWXx)a; z)Z^5ud-3iws7{{6Yk489&NZmtBh`rx!Z#3dNE{q|@u=Fpig(22n_%3#KNbgVG*;C^ zzkvx{t0gcgMc7Qz5a zah)pJ@*-);8LO&U_sI3aL$e$3bGQx;J&zj4?Ietciegxz?oywN1GoPGIx5vr?fMN~ z>zEiMaGXd~??SEgR>!}=(_?;WY{VGTtLJi*?AZRtP0*Pa)a;9@zeyY{uJN)fBQq%g z?H`wJ{{WVtu6JeS3(IfT5dcLH;eR@P^(WV{99y@Eje4J#EDVl@S_TiP2i>>%xfX2}UDwh9IkUI6vvB>t&`2 z3L#N8=-MV9^$!Q0LDFZ*{**%I%Kre3zBF{dg;Z@w)Ua1wE2)IEG?2CoO`aN3KMH+2 zx3?UREA=N*Ub?pTQPf>UUiCF~FS=P@`Y0aC2LKMkUa#!Nf#TD>O!=1|1^)moeiT!h zY08j=J+9?f6HiTVnd3#=@+?PcjDeDS0g^wSo<{k*B2l{YjZ!ytU#j`*IWls#Kl2l_qL8$tRLdIE{SR7#Sk8N0=VR#|x?D5L4AVf?I zjyrSMeCfAO-EUnVeTMsEsg@b(<^_DRM&Lh%y@)-Ib#>ZtVonjs3TLW3Eb&r<#7>fy z;S|1ATS{VjCBr;Pz#Y5i*y`0iBr7l77L6kwUhUI9(}C`D$EvdN;Rp(I%1(YBCE znI2fzYXZu?Zg2@XE%ntcBtw;KIF6}jW|YI}a;ueo4m*ttai$V1(Zw3PigI^mM#lq= z$~3gt-CG(>R~tz09Og+SNm?+(kj$9R9B2Ks z{ZXQ)idB`~YJkNIk`GAE0mh?I%Gf0oog)yebd-|L>mZINWlf{iG??eVI2>|yrsgQm zExsCwWCLnU$7-LSu0Ou0Tf4dyu9nT+qo%?&JVBMl*CQctIUswS@uxHt=%^-@OOdoZ zj@*C;VXN@M_hZK1s^YkL9VGZ8XbHjU)?#3o3cJI3(n^*Hbz~ z-E2!y)A_8@8gsRZs4CoX+-dDQQ~8TDaK^79kWO-JV2? z%S?^I0r&XH*6#y(k~>K5>I8Y&!mcxbK7F(c9;mZtrHU0uW`=FjelQed0&#)$#6{WVte(y-KhLe1VlCdYy6t@@|{{U@Mx`xeJGtAI!*bv}gVMk%D zSY)E@kI>@wDi?bkAN2gSY!BWu9PU2A0j@vduZCV~waSt|Q?WgVZ*$*W{{RftJUP>S z%=2AQIQ7PYS_#ZjAs9aTvUCl?s@k;Ix+Wrfbz;pEDFA|`F#fvsnWUaL%i@R7rt>xM zXQ%$xGz--a)BZhlg&Id>>pMzSLA3t>)0`c(Fu%hj`@tU$hxoO{I!4VUm#rb{vpl|9 zhK{P4Djp$G8w@l|$U!Q@g1O{ztMt$NHR)sIwL3bGiask|JYVX$`o8aNp`&@$IAWu= zQY;ko(8h}#aYl>6qN1vS-;Q#5(@F_xrBtbA~&Pksh;?~<_#z0}W36iXJ;2Ousn z^wdPrGp6{*An}j<=u8In$nL(d7qAJQ=S(T>$y+wU6;AAzW2+Dn%@lUqT#>`Eq~HS~ z7;mrTs2Hp!w6#S|BFKS=Vn#te_|vVxYdwm~M>w7B(W-~_1Ord{c1!12i@kqNT5c6o zeLqIEce^-0qOwN)p9mZAw`UrZlHe}PLq~3DcBK?*ap@a)&$gV>K?2Ocp!Da3 z93PzzU>?UELgipp0rBsj>!;S}=8q2eBeC3Y4v+`3%4#CQpyc43dwzP6qLLUb(n&JM z@TyOLohTIl02Hjpt1Z#f58aS4jl2zAt{yq{1^G9B`1iYPDwwXVWxgBb#(_+ zU*?j`@--xKyl}SG8~sC`e=hpw>*TtUH)x{ztm4;c{_}I5ZQ0C(1M`kF-&*mif?orX zmGxzl__E32w?NnR-%vwpraoE|x_W}SSX14P`N`L!ES7psoV2G;*kV|qqx?$aYq{VV z53>{B{{R~D-aV=7%N!k+@Amrmmf?ohS!~wn;;0f-?l8*74vI33@Ywd%$EWC6Czcy- z?a`GdAp8;WuPvFTi{W=@x7#hqJf{?_U02Ki`j$oQ$2=WP(p#viF;fG1Wsqf%{{R{+aU{;C+a?Qn@EMb zvuS9z?|7j?sQCgl!2tId)@mb`B^6RpiBRxeQw|0=1P`v6H0yH9xziDz1ym4-va1)R zLgcW|Z=oLAPFfmg@|r4#k|qaZXAG_INbGdh(H5&=oT)M@O$|Ja=1c3}g3A8tN4PlD zb;Ki6`H({`J1HJw$?5=S@eVVMG=L&5z|wyW0|riq%OoV3Uz zz%0j+`Rhh574S42OL7`nX*|_NW>U+Mv%28+)*vEaV`CV^gvyg0ynKxr@yRPDbiByc zLsJqfHClw)>WhurRlUC~kJDPr)bK|fY$jCm!z&i!Kk2N=dJ$?+`2|hBHK{&aEX;>^ z&mu)W*w1|{O-V;76;QBNQlO*MA}w?#E`~xVyxN$dVESY5`DtjXZ1Qv7oA!luVtA zs%>yFz$4%D)qN?_vfH`SH*2h61R^}D#C9M6mKhv<2-2qEO5Rh!StO9KK3i_XD|`|= z9Tg-+#5?hZ8Guc)Cgd9Wn3?xcB(FQ@^Z#67^&s9WTw z_8Hx}jsZ}{c?)k~T0~>d>V35nS=185%~4M)OoB2Lvz|xitD%o&d=HJ(m5~*f`U%|` zW_aIbRK`x_=L8X`YP;P`Vn$k#x+9Ytjg7|{9>-c?4$?)9rxG%vy0%K9(lazt6Nf>{ zAA^r=IH9ylg?hc{j^znFf<2CXw9}Mf9g3H!VWhH9(9H3L8`XeDW*{*65CoI%)WpvN*dwehZfVz5+^Ax{oy0 z%GY}H)E#A8TT@wIA(l{p26Z6e_Z*Jn0dN2VkBwOcE0cba9uUn_YC6mkGj#~kC0Jc7?o6eM(N zicq=UdHQ~O%Q?zzJ3DysLkxOihY(ozCiRS?6PDUBpPHD%1B|3MhA5x zApC=kBh}P2aoiT~Xr&O)Tmwx@684MKLr2`7N#mYzjcCCqD4c&6#=Ns%A}2Ffk0QUnrmg&j_h#-y?Ay2A9{QDhe)IF&5UKb9G z7wTGVlyb3bMtwjKbKBpr)WjCrSmMB77!2V@bN;%(_In*WPj)#<7IqQ2+N!wxByrA{ ztfGPhF$e}!4XcdqKVR2K-svGz*|Ch4nG7MD(g-YH9sV^RRb^MsO21cNA(>%whN!!o3(@@_PwXM|tkQ-g;64hYwu`$?mD zH1X9zZylxb?fLEZoGo@fjZWS7Eb_xhsZldhZ3>DN6*P*k?mzz*3~Z(s+&`POM;+@acA4u$%vdX)Rs z#+^wm{{To2N{;v+(>hfzkxZVyEhBk&+PK<-u=<@;;FkzxvrN`&{Br>;5F}Bz6yWel z2bVe}yj2R7h*qp9Q_RTa+k@@xsOU>)xnyMJCNYxn0A_Jfu_GIIF5<+Wa&+FZ?$1dA zDx$`rj_H`30rdIKokw+Ir{&yfRdI=FOqEQ+S38vvfjB?JelRrBc`cy%L<1uz-MHlB zVB^0$ewuixb`dAQ-OE-=W*BlG5Jq_<)+DkaF$E$F`Ny zTkcyKIW}qJKnqAE*pZE)lrdsYxjH9-+Li@a)JCC>W+dQ#U!IQWRQ$V|R8z+tA$pL) zSLIO{6NCImf{$OgEdb80q zZ40BAyrJcyj26lFC+V)18Plkh*P4zy;-`mEQlYG)iZV&d2>Hj;`D&5URbR7ia!^hH z4l)TnvHd^z*S6ATdYubh(K=}?ddRDv>?o2Y{Vx;bim|+A|IBrY_L={W*QMN#@hsDY+rgj_f~) zak)q#lo74EZ1ID)!{^}5TAWQXrwwwX3zEgcWRAg4#x$iJL+mDL57TkiL8B1(N{tRWT_uIIf930?kCaNcD(+w0%?Ti5$WwY^(HwX!f zPlLWD^;TZh(v?mXH)5cK&*Y@;{+hGfe$5^{RlyAfCx_QJE~S&nwoi!%=IW#M2U(W4 z6ZaFB$A$Q^-(@7X*p_dw2ii(Ya#u;w6*08A+Y_RKKDghcJSqDbeWQFG@k)cm2s|zQ zr9BNtodp%ffhwt*RplN?ixqvXh5>;Y1B0nr$1n7LXg!rXOtN+V0NFq7apFztv#&a% zrz)ndxmU?kRUt*)B#y+2*Hh*fLES1N1$P zt%j!_Nht9BAJ*c$a!Sqq>|I0C$O0+k6UXPJ7U$;3qC^E^^e7#Utq^@Ih_ETiFS9ru zhv}%{GolkLjltkHl^_wStwx1}@}^1kJ2yD`eR$NDOL%G4y-*&ag3Th*qHk)6(1lh1 z0J!`QslfW`Cz2SIv7;9!u#M{Gy)#Eu(tRO&Sr(>c7h1)O4NzD36}^`y2O8&nOIWbd zOCv_0MwvtdAPjId#>+RGDb~XeWr?PyW%j?YH()YQllD3D~5f3O|N z_5(WVI9`f1n_$0(A2-iA;N$ll|z+o*ex zjLRGwo7jY8O}bMk2P#o`LU#y@X*M{Nj97^%L(CI+n>u!DyV02 z&m@oNOvdD7f_e7#)2Sfo+j1_Zo6pTI)Q)jJ3NC$UM{o%F)q3S>krrxZrU|`B^b^7E z2-VP)IwOtB-P+GAl<`iA+k%j#k0gVFzspf;Na9Ip+DQb8zq)1zC;tFx*3~5_(AKFT zVo^_=R)iOImeJ+J~1e|yF)*P@`NK}<>DgOW^3ZzwR z;Zy>W1M5-#qf7~)^};If!92)WjyHZs-|95j-0Na4xf_duB#4z2rZUO3BnKul?fPkG zuhPXRl6Lb$AO>WAaoCmowR?w9iLrBigUph6N;HNtQ+H=4^3uZh6F})jU9%{xfRZ*g zdu01_sOWoIFNLRLnYxU#u{(kz(^$i=U*3-A8=W#G6vB!LWrjcW5 zY*hIhweXmvV^Jp3LoATD;csu#8fQOH%*CDR9288(>;WM6J-xMLV6TE}ZN_qSPo0{5 z%N*-51r(e*k=z5Qsqb?ImYl`6dXeZp{>K`+IMUgI+i{fA*4M!du!h{KKw^2wI4k_L zr8SPOvE-(bR`WvUBK_EW9Otcl0P(9r8c}w;9J8nxeDP#TO0gQJg5wPsi6?oRV&P9J8N&)p|V*6 zZai*0pOcM8TD^#?WxFu3c)(HYIl($~7D3&uakf1Qfq2FM zCyhkOQ1jVpI(ABSm+tOrXxTr2rMye+{fY=`t;A>LFm?_%m$XArE1#P z=~g)yGmZXI7GS@`Kpz7qK`C3Jabc#r-d^EFOk<`e%Yro=nABio{y=KiWwRD5BY+f> zwE^#qV9%4xdhI?X3@Se&%R>TyZ~}&0F;)KnGyedcNx?-=1ZkK_at8;4jBrk|`M51@ z51!gcQtmKE1=|Gw0G~S6qK#o(7;IP5ee`ty09N%UN!Qc$&rMevd!4@!)TRz5hk!SX`jq|_{W~3B99Z*V zmMQNUDmmUK2P{f!lzMBzPZqjo#Ez6}^&tNM?2SCz?o=+^!6R@8AH=8lTl74QTBLH5 zGSsfZMoZ5oRA;wse8X9#$)wd!6!}iR?%#@N<;ABI#A;D)Ej%gZq-+*7XOQP$IXGWz z>N2;d=;squ(nQJ$3XDJ*$8(?b8cb7o_WJBJV{)tDjU6#n9LON<7m}&MbIB*%=^-tB zJ50mU9q>wyaqKm|Ib%JTy;nonFLT=@f?0z}Gdp=`Ml#;r_`uVsFH=JcefFa=6#?C( z$pn%><5ANWxDRQ1hA7q0$r6&AS<0Q<0B|wSKRSIye@*ctF<90@>=}n34EFdMs&I5O zgG$8LsOm0B5RNbUk}~>6cBg#&Yg)_v9(?mj-^vJ8PYAgloco`hN3-d4zPBbDZXr?B zgqJuWSrsCPK2&4h>&}y&`%_aPqlL_DPS+uFPq_elX_hp%WKB@oTh%JDSfFC^xDw0U zmG~Ibs%w=zB3P0V^1c!@><7+${{TG_jH{omgjdNUM{^L;w3PH}6;2G@ixZ3i^#1^D zY|2eX-QG4QZ!aV9liL7m6xRHWvvzMZRHi9B*UK2f2uUYu?(Thn(11PsZA3Nwy*CtL%sZ7*ZL zHAFFBB)gCij>lfF!7}wt!SKp5N}Oc77S5Zv(pS?)&9FsMm}bWukALf~mEk{%z9;xM zLoKJEukqB_ZZ0Oe^mYD>RoiO`P)m7F{{T)xJ319%>~*pkC5CkP?s^=sj%X+N9V##W z^?w}mZK|x3!k(v)fdm(MntMH4=LAPr%&>F769-ZM0C?3?#2>R4iryF3mFf!&vQRh= zOLL5Frl^m&c;`}LkRO$E`fI6!P@x_7k8g+kexD+AL24ORKWiL>$QBfSijM~>G+i_Qhe+? zgTs#sdSxmrI?u$IZW2Ql^`hzcjcl@hL=}t<-^6|OE7SfX^e0c*1viJ@3$<*l+nT?r zstU0{fBY061(lM+5Om zVTEZ^1Dp{U3`S4SzkODolJjwIy7d*}@o*^Y=xeTWxeVRN^%LJ*>FXr@-M=$*G_a35 zi5`ceNIZw0u@*)wBa*$xt38K5%UZ8Phflgx+$s@DgR}O7vj9gUAnLWQ&FWeGEB6H9~yF&ODrl3Rh5dl9;|Rk^)2kkSTOfR zg2mzojolAX6?cc8IrU8tdCZR?@BqKljD&-&%DS*muOMRe<$}M^A3*yJ~{c*L0abI=AHuk*| z#QW=+sn#y8mAm@-uf*S{({0rFIko0$cv+%`6%lqrj2`&M>DYZW&pPVp9~4nB1>CfN zA7R@@mM&S9jjWo6mS2HdJZsZF1b8^!7+4dkuaKd<++pR`Y^^jTWJWQ@#lZ2+b@c} z$$L~JM5@`2dUj~s5(t$JFvI-z)Qk`ZgLNG&GL(K-b1N%*f<6fN)qVcHz5>ZyhtSic z#bt&F*g{BX*|`bG#(U&xYDKA78aj_9)6E7Z2Oivjf36OrYNkb8w+LhN%Fzf&nlXsj z5$pHIZElcLRm$+<1k`Ko^Euq_72`th=h8m|rkvQ0`8Qi4j7&_KkIVt6M z=-N^qP<*|+NMJLO@;@z0r2Ygp=`o|J-0Lh3vUz)v)3G4ngZXKYF>OMUY+@ZSqi?6< z2fnAbsO_$iox%yL7A>^}%x(Lb831%_dx77!qi+rxXytPX7du;OounT59^C3dea$M&OxaW{RKKjuIYm&XxwixD~7~IK5 zPbX`}#G{X91bz|@wUyznhwk2MBFX$x5#Q>29&}FX`7EZvnqx+}i_55q%x5xg4UzIS z4_^gKQkki!(fqc{FCmbQ2qWN)CK*LN*u5@J$l2kjmSqsrq4N92`Q5bk8Sjy%@YG!( ziQ=kA*+ipf1QEsv&-!b8Wd^B=mCJJrT~Y$lNdqj=E)lc%hkuPJ71b(aWRG-jvl}D? zh8@WIX_{Q2+w2kbJg}jLs#Ro(#>FY>Q;slonJ)7|BS%Lpq&$G^BWVqc?jJfj5`P9O zdnO_-^%Aowr;tcv-5aN3LFYQwnATK<^2!ov}O*^-d z%D&99d=dw?q+;pk^CPNg5QZESI1TbKteG>%geyyd>)R;l;f{2H2=hH*ebkN)mvk{K zWYa6gaG~TSN-^!~_Zc78SsdKCVyCqmm?Wq&!#%Adbaulg8A$je^YwOZ6$D%QFhb>9&U7;(l&u^##Dja`dnuusgI8TFmElAgXRy{-mIE0jWb z6@c_N@yEv=md^vQBT)L@c?reBZZEKETE`7dEhARbOv^P+=weU^J2C2f;~4hf=RehC z`eNC3lOMIzMn4kCW3)*eDJ#dnX!rDi^~d?&R_iKn{rreZ_Cx?EQ-CC)L=<*iuc)RQa81(zFx^f0yezYBW4pQw6Pw4`#NsGyUQlhd*M4h}aC zHjr`1$o4w*4~1SS**syjMPFn^r>dsM?K&19ye>iENj{`K!+xFh!2405>c<^if77%1 zJ|Eon`_C^6i*S95RFYL7l(42qB8USSQsvHj9Csw^N#1CpR;nuUj1)jX3&wC1eNMbW zQSD{+xi)N5(nSfGNZGXS>|41x(gN15V@VSw`AFg5k@L@ON|#RLMylBzQPWh@yplBP z&lxK0t{Cp`v>x1PoZT-fRTQG6Dyl&QpHcZb*^f}x&ta{orZJL|_d^to<*K{3#okL5 z$^QUtXtLC-s*<>U>_JY%fIfYOwJE|%&`MWG%U&vE{{WPRA%u(9E)W)0tewyFfzYi&q`BUZgPhUG=nj-%_8s@BN@oj zJdlbd-EMC~W2#8P#`7}AC<++hGm(Mc;A&P2J!Dd<{r%J;HvOb}K{+`3ol}!ETi}So z_aqE(#?gxUh~SB1S7R%jpMW*9)x>5E1IAK6Q_N1)2ONx@WLGI)U{UoHqPa^_43zB; zl*|H_7*asspP!vNq?S_%%Y&)qZ<}T zXb#ZhK3F8<9FkAJ<*ItN^e$4QJg0)TD5Z6YRoV6_a!%Zy{{YKQprTftVR_Zej6sZd zAZOp$XzE;|WhBxSGNS`Y5-!-G{pXP(3amKBee|l+!$n8tOBs?*0F9WCxf##Y=-!g` zBKQiK4KzzvGsGoj{oG?7g&yZb2<;mIG=ZH7cR_$MG07b2D{Cdn<6Y!DWOi9zzDSeHJ7ZjK+D|9wPxjE-Zs%lBJ^lTLrEIKtu9ZxLxkEIuw6wlYlvr#mFryDf zV_6}PM^h2wcqa;1>OKBP<*xq#h358JylpOBekOTSi$^^0-sbN&?6#Bsl$+yI*n`}E zpE~MYHB@AVI;KM9No^@g9zOC`2!$@Sb_*3GA-pxZk<(`3RNvCBXou(!Q4s(p-Sn%p+gXQRG z&4M|8WX*q%e`q_UGt=FA_SqF6I7OrBibxtG@{Ey!4t@0lb-i6WnY{j`>WZrKEQMKW z=4V%9#yQ{*p!OQSCc7-xl~G1LCOEzK5?d_=y3``JK@=$;e@Fl@{JVDc)3}4ivD8BX z{p)5%#^9WGKTUJooVokWi735|UI}T^H?8v7RdblK7?a8193SbXv)m>~JlJAplg$X* zRFVb`0XV_^Gyb}il%K#j*mVT$a|rdZh}&_%kY{kmVemDpM(T{vFk;R&>}-Vx+dlXo zrj=~ym%6idMtK#BCz~4KRfg=Jk~b2QA^|eI{lHeBQH^nWU$+(cwkgr!~}0;IP9SPGtVcTRQiy8>ody0 zEMo+ms05tnC$}BGnx`JmsJZX5D1BL13+{B3xQ!dkWhZD{ej$%=2DwdrTUXXeRNuzj z4E7${?r0;+IQ}U=EMmKekO;xosk|2JPxz<83JQwm6Uj^(imgc`qo5lY{%N%5^Vd7= zE-t++Cb?4mSMx_N7c@xFVXIOYV><}n8*jl@9^X-`ou(4(wU9PmAOit|xk%TM%e7ge zDK5q0#GX-tY6%OZkGsn_91+-q_4w72fgz1vrU=}^W?wR%S-lIMGCmJ|b0uwzx4I=@ zqe!Y&SYVa_TVOdJmIPxB@u>kEj?T%JkT>sPW3-%mgQdG^vEt;=_8}uyqf>ztvvD+R zavQffKKatH#u21hsn=s3c1PHrInTl8QA_UBO*=HS>~_WyaJ`s!4TJo&f`sx76!JMp+suiH zJOV$bzJ6^(s6QosCF`$+cv87xP!<+&*KI2hQ zd_BR^NQ`hdZHlK1t>z-_Be3HHe{C|YsYzl#d#6@hL6PJ!h-Q}J* zBe4hhai%mgQq|2VA(jak2Z~4Bh)-km!PV_G2G=2bx+DZr!5u{`EXh+GnGn0?DH(nb zbvXWGOGvRa@z$8z?$t4sbzboi!OzGV$lrfoq+2WL>P${bN*bDKVhG>mvOB^{ZX=aH z>&CR2f`Vm^N~$*5PziZAf&s^W=c!Yg5hYF7gtj_B>SAG^FK9AkXZ-onRb4i!rgWrl zH8JSk2_W~zt&Vrxn5QmA^&K}uA!U@Xib#9;eaJnJ!5Y-`T!~JRNL;4v@RIw7ZrpY{ zwQ5{e;n1VA98uU{hMGE&P*@PeNQWhJ>_P9y)RNG(6Zwlt6kYCRaC4 zVymPd@-*dTnwmrj2Ne*p4hDG#o_{TGih5b&5iqKxs%!$}j5+?tRe78J!F4{yQkGR| zDQW3s#XIDzo~$SMbcvFVo|0Obsss=eK53AEiRu70SmANc(^8w48wNHZed-&<+~Fz24q7OV2rTZtmjk#^a!x(D*O{*ui?2{!C%xY5(DbpzHkl6k@;g$uN-xd8hw=1%}>$J2C- z{{ZuKD(+b03_-~GVtMw?yIQGvXzchtHRhWq=xC9fY-_>E1K9rnuB>+3WG@(WFS(o4 z7u%1Ypw>Az6m|QPOHJiY8f+3k+8>s{`No}!VK@;-5CJ(dWRCpf8l#G2K4?)&$GSvS z-;KE-;C^54tr7!J!bcfkdkzMDw8?btM=VaNm;~f*0G-X>pYUordPIUnmYC)C5=Ymc z?Ws>{>`!tA=}r-e+J@QHZ`mSH-RbcZG2tB)lpV#x%@ovx}0(jP{hHE^o&mnO1 zd2$gS`28cfDggR(r~$~%x)|NT9&f~P^lDr6+};QzshugJ1ALAZbMj6Gtdx{al|Dq? zQl&UBkGrudN}gLM8PB=LJZil}nupB0!eFJH%h48Fd$*K;D*?tc?f!AACA|~L1ea~t z+Qgh=o_}BT*Ez) z0M{CnPXj7|hA#-s3_w)?4&M9^%OB5H$9frTLdi#4ak5m=qoWI86QaK3AdI%w3+xmU82)-~(fwh6 z=uV)6sk&~n$*F+*jI4@#qmSZK?myR^ZI(D{FgQ(ZB~0@A=zBd>sPunC{iwVx>R2L% z`%@*FvubXFsYru(10iHwj1!()2VEB1UvInBzq)#C~+*OI0jNC-Wgi&l0vtWAA`vhBmq(t#7GX}c>G88*14{p1X7~OM^eucyj2Am*-)M`eaQN1$xTrr%lCBJ zs7I%3Wtd~w1IN_s6ym#uC&?pBujKji#?qXqL}$kbj34&X`Y7rpi}r01c-lz!Ly^V?c{*`TD269624_-pEQ_~!_aJ-?9PLy) zZ6rCTrZ7b6>Y*SCTYBWX5s*3h>t&`j4J7rupK<-^S$NO58jhvO5q8xY$kgnoen+4N zaGB=^0DT6wiDi}&kmYk8;?JGKj1SA-Q&g>!B*bTi60o9|m63yaM3aT=3DQ;6^EE?? zsSLhS=gB}YFgp@B_|bItAy-mFeQXHfQd1i48>J`kssq5!zv-yj$xU9=nnh@q7IPZI z=qLC_JDnAKkkW7DK;6;m#2#S#MOk zdlA&iCsY?`{K%!)&cR9JKO}3Fc>QsetZ>{8pXsj8(vFlnW?4@7<87*|kfnwWPrp3 z#P8SmFBV$47DcHMl8yM}CnE}bJEDk$V#*x(i126)NGYy+!hqRAcFe}P4E}hz2+w-1qp?dCd}T&=`dvh}Pe6cHLLAB7QW&?xs&Y>qn#U=7I4NPZp)VOwwKLj4%kr>v;&82TTiMJ*cm}KDN z>BoIbz8L!^!X|hsQaPlFR$x{q4p~`GvG^dK+Db@e@|7{RXxD2Y7z`KOADu?Y*;h{c z5z~mN;67|m2qSXI68;~MN4WRWZo)WCG}S(AWtgFiZcz9KgZw!fm%1$S(HA`4T98Ad zN4o{0J6(J2C)-i=#7Gbr8!iFdvISs%pE{bSWiQl$yG>6qHD7(1e6xiufrj`a*y^Kq zs%Rh%>aL8$Ge;=OpPt`cUx{{PJ`q&BSIDd)nr|_8aOk}8-#OO(GaOYWKv|t#usqel z&#*t9wdC^Rv>Qc}qGzXdf~Yjg2302K@Q=fv=dG#5Bo%2r6ObdBzVSsU&{;Xb2N8M@U5KBs9jL0@g87fh|{)8OsF)WZy^zRFLWz34K7lZs*?b}Dqmt%2n zb6VJI}5Ens8-#`P$Z6lb|As;z3>Ugz&hz@JSSP=68_St_ivB+ z`4c%tE0dY^C))4CYm2;nGfhoviIAX?hu$XJoR3p+$NvCZu6NXZW7VBsQq_G?)OEG) z$0zSK49Y(x>^q*r-(K^>{2NE%{%EV8tNpzU(#YhfjnU6wKTUOnC!U_J)SvLw@TxR5 z1?pr+$Y#L6KF4qS>ceQKj6wIcjnp}^mq;E6KolZU2oc7bm6(otI6xV&LGmql%RT+K4 z-7gJLuafIc4*vkz&>Dvu_TT~(bNR5;rJrkNhw8Ib)6nn^Znd=Zr8Phi@OQK6PVOLUcl1_Jbge zkEmy8IUT!dvvZGfmMWx&2Xph!<(^Nzt%BHV+=I83w_ekADR}BbLsAN5q!JCkt}~JC zk*ei=4MnoLYi(K;mI+!p6p_IP9@^i9+ztRP%;l!jv~(Vm`&4+9V3|$%X)log-kS6(`6Isg@t@Qkbl#5p zVDt^k%ZI2as%(`FE?%YK`@~6+g215N!0qYRk?}9HDtA3A{{Z!Wv;Kb)=ww&9(7IEq zx?`)LH61V1Fx(*piFm39rE)S#gSZp$esv%=3OA^!Qjr&OH+Cbi9Q^CZWyg~aR|%?; z>|ES=M&fk)vaKpQ$ugBPWB`B=Zx}nf_Xs8B}T%D5DcosZ)4l)dD5oZDo(Mx7pAGGfRNRnvyACULen%6Y5My5E{CU0bn6M#L> zx8ya>$roROa4ao7RIq-kMD-I_)W6KN5XfC25e{{W_%R=#7lrLd%x5ujKS zV$(|INf>8pe1ECZi%PRFgj7oLA`+`93%vWYd=I9h-QI{zMn>|{BHQdO2)n>j&;Y~WRP7u=}muI{+Q5w$N<0l0@qd-Yp2OT*1F=q zsMpoJe7Bky#9kH6BF3d2j~cbmnJjL2z~0f1Fay5_0%a?iGLYfV@%~n?HIYuD)+4Z9 zUAtVjygH0M--p?c5Rf5(u_rJT?34sk;*I?rDOh=xSldMw?N*tvZ^%{fcY{EIl`Ed} z4>l(eA`?!xCUPv!-yE^)=#UoePTaAJlQ@|BOcSW)rNJyITfbB9G55Z+;nXF~C6)(e zkdPFHaO#iJMssYwkbF=Uooepe|g*9E-G`o2ftnd%GNrvwNIyYSnfT&treFw zoYvNtw@ko1Pbo|&yJ+;9l|3b9Xv1I6Jin-sH-=Ej% zl=Wl&Q7fL>AKB*}w7-ZNJ{Ewo-zL&NcIPBhH%Mh3jz$J0XUvV6uR5LT%--;VjYDTl zwQ(yflN~wHZB~_p2Erqjy|(m:{9X%l}r&Av@+8Bg&E)6%*r&Cwt1FAq%FB2Jpj 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�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%0Aih& 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

lwyOMC)k$Ix$4(> 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 b{sVOCLZx-{{VMyb$|ca?iy{z literal 0 HcmV?d00001 diff --git a/test/models/IQM/mrfixit.iqm b/test/models/IQM/mrfixit.iqm new file mode 100644 index 0000000000000000000000000000000000000000..bb94f5afec1b05308a3c0753ba724f8dd411257c GIT binary patch literal 257808 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%0DQ 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�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

P80ta^kdCwb(dzB<~VHJm4Kc<+c1m+ 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 Y#*TsUt*)^b@PYWeZM_Oy+9Cx12ka Date: Sat, 18 Dec 2021 21:30:04 +0100 Subject: [PATCH 29/83] Update version to 5.1.4 --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bbc7ee744..570c29305 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -56,7 +56,7 @@ IF(ASSIMP_HUNTER_ENABLED) add_definitions(-DASSIMP_USE_HUNTER) ENDIF() -PROJECT(Assimp VERSION 5.1.3) +PROJECT(Assimp VERSION 5.1.4) # All supported options ############################################### From 19371af6e65608ffc968df646bf20278e6d99414 Mon Sep 17 00:00:00 2001 From: Rene Sepulveda Date: Mon, 20 Dec 2021 13:43:46 -0500 Subject: [PATCH 30/83] Support PBR properties/maps in Obj importer --- code/AssetLib/Obj/ObjFileData.h | 29 ++++++++++- code/AssetLib/Obj/ObjFileImporter.cpp | 39 +++++++++++++++ code/AssetLib/Obj/ObjFileMtlImporter.cpp | 61 ++++++++++++++++++++++++ include/assimp/material.h | 3 ++ 4 files changed, 131 insertions(+), 1 deletion(-) diff --git a/code/AssetLib/Obj/ObjFileData.h b/code/AssetLib/Obj/ObjFileData.h index b14250020..bc65058ac 100644 --- a/code/AssetLib/Obj/ObjFileData.h +++ b/code/AssetLib/Obj/ObjFileData.h @@ -133,6 +133,10 @@ struct Material { aiString textureSpecularity; aiString textureOpacity; aiString textureDisp; + aiString textureRoughness; + aiString textureMetallic; + aiString textureSheen; + aiString textureRMA; enum TextureType { TextureDiffuseType = 0, @@ -151,6 +155,10 @@ struct Material { TextureSpecularityType, TextureOpacityType, TextureDispType, + TextureRoughnessType, + TextureMetallicType, + TextureSheenType, + TextureRMAType, TextureTypeCount }; bool clamp[TextureTypeCount]; @@ -174,6 +182,19 @@ struct Material { //! Transparency color aiColor3D transparent; + //! PBR Roughness + ai_real roughness; + //! PBR Metallic + ai_real metallic; + //! PBR Metallic + aiColor3D sheen; + //! PBR Clearcoat Thickness + ai_real clearcoat_thickness; + //! PBR Clearcoat Rougness + ai_real clearcoat_roughness; + //! PBR Anisotropy + ai_real anisotropy; + //! Constructor Material() : diffuse(ai_real(0.6), ai_real(0.6), ai_real(0.6)), @@ -181,7 +202,13 @@ struct Material { shineness(ai_real(0.0)), illumination_model(1), ior(ai_real(1.0)), - transparent(ai_real(1.0), ai_real(1.0), ai_real(1.0)) { + transparent(ai_real(1.0), ai_real(1.0), ai_real(1.0)), + roughness(ai_real(1.0)), + metallic(ai_real(0.0)), + sheen(ai_real(1.0), ai_real(1.0), ai_real(1.0)), + clearcoat_thickness(ai_real(0.0)), + clearcoat_roughness(ai_real(0.0)), + anisotropy(ai_real(0.0)) { std::fill_n(clamp, static_cast(TextureTypeCount), false); } diff --git a/code/AssetLib/Obj/ObjFileImporter.cpp b/code/AssetLib/Obj/ObjFileImporter.cpp index 4e943fb5f..3e56e3137 100644 --- a/code/AssetLib/Obj/ObjFileImporter.cpp +++ b/code/AssetLib/Obj/ObjFileImporter.cpp @@ -618,6 +618,12 @@ void ObjFileImporter::createMaterials(const ObjFile::Model *pModel, aiScene *pSc mat->AddProperty(&pCurrentMaterial->shineness, 1, AI_MATKEY_SHININESS); mat->AddProperty(&pCurrentMaterial->alpha, 1, AI_MATKEY_OPACITY); mat->AddProperty(&pCurrentMaterial->transparent, 1, AI_MATKEY_COLOR_TRANSPARENT); + mat->AddProperty(&pCurrentMaterial->roughness, 1, AI_MATKEY_ROUGHNESS_FACTOR); + mat->AddProperty(&pCurrentMaterial->metallic, 1, AI_MATKEY_METALLIC_FACTOR); + mat->AddProperty(&pCurrentMaterial->sheen, 1, AI_MATKEY_SHEEN_COLOR_FACTOR); + mat->AddProperty(&pCurrentMaterial->clearcoat_thickness, 1, AI_MATKEY_CLEARCOAT_FACTOR); + mat->AddProperty(&pCurrentMaterial->clearcoat_roughness, 1, AI_MATKEY_CLEARCOAT_ROUGHNESS_FACTOR); + mat->AddProperty(&pCurrentMaterial->anisotropy, 1, AI_MATKEY_ANISOTROPY_FACTOR); // Adding refraction index mat->AddProperty(&pCurrentMaterial->ior, 1, AI_MATKEY_REFRACTI); @@ -709,6 +715,39 @@ void ObjFileImporter::createMaterials(const ObjFile::Model *pModel, aiScene *pSc } } + if (0 != pCurrentMaterial->textureRoughness.length) { + mat->AddProperty(&pCurrentMaterial->textureRoughness, _AI_MATKEY_TEXTURE_BASE, aiTextureType_DIFFUSE_ROUGHNESS, 0); + mat->AddProperty(&uvwIndex, 1, _AI_MATKEY_UVWSRC_BASE, aiTextureType_DIFFUSE_ROUGHNESS, 0 ); + if (pCurrentMaterial->clamp[ObjFile::Material::TextureRoughnessType]) { + addTextureMappingModeProperty(mat, aiTextureType_DIFFUSE_ROUGHNESS); + } + } + + if (0 != pCurrentMaterial->textureMetallic.length) { + mat->AddProperty(&pCurrentMaterial->textureMetallic, _AI_MATKEY_TEXTURE_BASE, aiTextureType_METALNESS, 0); + mat->AddProperty(&uvwIndex, 1, _AI_MATKEY_UVWSRC_BASE, aiTextureType_METALNESS, 0 ); + if (pCurrentMaterial->clamp[ObjFile::Material::TextureMetallicType]) { + addTextureMappingModeProperty(mat, aiTextureType_METALNESS); + } + } + + if (0 != pCurrentMaterial->textureSheen.length) { + mat->AddProperty(&pCurrentMaterial->textureSheen, _AI_MATKEY_TEXTURE_BASE, aiTextureType_SHEEN, 0); + mat->AddProperty(&uvwIndex, 1, _AI_MATKEY_UVWSRC_BASE, aiTextureType_SHEEN, 0 ); + if (pCurrentMaterial->clamp[ObjFile::Material::TextureSheenType]) { + addTextureMappingModeProperty(mat, aiTextureType_SHEEN); + } + } + + if (0 != pCurrentMaterial->textureRMA.length) { + // NOTE: glTF importer places Rough/Metal/AO texture in Unknown so doing the same here for consistency. + mat->AddProperty(&pCurrentMaterial->textureRMA, _AI_MATKEY_TEXTURE_BASE, aiTextureType_UNKNOWN, 0); + mat->AddProperty(&uvwIndex, 1, _AI_MATKEY_UVWSRC_BASE, aiTextureType_UNKNOWN, 0 ); + if (pCurrentMaterial->clamp[ObjFile::Material::TextureRMAType]) { + addTextureMappingModeProperty(mat, aiTextureType_UNKNOWN); + } + } + // Store material property info in material array in scene pScene->mMaterials[pScene->mNumMaterials] = mat; pScene->mNumMaterials++; diff --git a/code/AssetLib/Obj/ObjFileMtlImporter.cpp b/code/AssetLib/Obj/ObjFileMtlImporter.cpp index 548401d01..7d5930594 100644 --- a/code/AssetLib/Obj/ObjFileMtlImporter.cpp +++ b/code/AssetLib/Obj/ObjFileMtlImporter.cpp @@ -67,6 +67,10 @@ static const std::string ReflectionTexture = "refl"; static const std::string DisplacementTexture1 = "map_disp"; static const std::string DisplacementTexture2 = "disp"; static const std::string SpecularityTexture = "map_ns"; +static const std::string RoughnessTexture = "map_Pr"; +static const std::string MetallicTexture = "map_Pm"; +static const std::string SheenTexture = "map_Ps"; +static const std::string RMATexture = "map_Ps"; // texture option specific token static const std::string BlendUOption = "-blendu"; @@ -178,10 +182,45 @@ void ObjFileMtlImporter::load() { case 'e': // New material createMaterial(); break; + case 'o': // Norm texture + --m_DataIt; + getTexture(); + break; } m_DataIt = skipLine(m_DataIt, m_DataItEnd, m_uiLine); } break; + case 'P': + { + ++m_DataIt; + switch(*m_DataIt) + { + case 'r': + ++m_DataIt; + getFloatValue(m_pModel->m_pCurrentMaterial->roughness); + break; + case 'm': + ++m_DataIt; + getFloatValue(m_pModel->m_pCurrentMaterial->metallic); + break; + case 's': + ++m_DataIt; + getColorRGBA(&m_pModel->m_pCurrentMaterial->sheen); + break; + case 'c': + ++m_DataIt; + if (*m_DataIt == 'r') { + ++m_DataIt; + getFloatValue(m_pModel->m_pCurrentMaterial->clearcoat_roughness); + } else { + getFloatValue(m_pModel->m_pCurrentMaterial->clearcoat_thickness); + } + break; + } + m_DataIt = skipLine(m_DataIt, m_DataItEnd, m_uiLine); + } + break; + case 'm': // Texture case 'b': // quick'n'dirty - for 'bump' sections case 'r': // quick'n'dirty - for 'refl' sections @@ -197,6 +236,12 @@ void ObjFileMtlImporter::load() { m_DataIt = skipLine(m_DataIt, m_DataItEnd, m_uiLine); } break; + case 'a': // Anisotropy + { + getFloatValue(m_pModel->m_pCurrentMaterial->anisotropy); + m_DataIt = skipLine(m_DataIt, m_DataItEnd, m_uiLine); + } break; + default: { m_DataIt = skipLine(m_DataIt, m_DataItEnd, m_uiLine); } break; @@ -334,6 +379,22 @@ void ObjFileMtlImporter::getTexture() { // Specularity scaling (glossiness) out = &m_pModel->m_pCurrentMaterial->textureSpecularity; clampIndex = ObjFile::Material::TextureSpecularityType; + } else if ( !ASSIMP_strincmp( pPtr, RoughnessTexture.c_str(), static_cast(RoughnessTexture.size()))) { + // PBR Roughness texture + out = & m_pModel->m_pCurrentMaterial->textureRoughness; + clampIndex = ObjFile::Material::TextureRoughnessType; + } else if ( !ASSIMP_strincmp( pPtr, MetallicTexture.c_str(), static_cast(MetallicTexture.size()))) { + // PBR Metallic texture + out = & m_pModel->m_pCurrentMaterial->textureMetallic; + clampIndex = ObjFile::Material::TextureMetallicType; + } else if (!ASSIMP_strincmp( pPtr, SheenTexture.c_str(), static_cast(SheenTexture.size()))) { + // PBR Sheen (reflectance) texture + out = & m_pModel->m_pCurrentMaterial->textureSheen; + clampIndex = ObjFile::Material::TextureSheenType; + } else if (!ASSIMP_strincmp( pPtr, RMATexture.c_str(), static_cast(RMATexture.size()))) { + // PBR Rough/Metal/AO texture + out = & m_pModel->m_pCurrentMaterial->textureRMA; + clampIndex = ObjFile::Material::TextureRMAType; } else { ASSIMP_LOG_ERROR("OBJ/MTL: Encountered unknown texture type"); return; diff --git a/include/assimp/material.h b/include/assimp/material.h index 4e55e4894..4f98b4697 100644 --- a/include/assimp/material.h +++ b/include/assimp/material.h @@ -989,6 +989,9 @@ extern "C" { // Roughness factor. 0.0 = Perfectly Smooth, 1.0 = Completely Rough #define AI_MATKEY_ROUGHNESS_FACTOR "$mat.roughnessFactor", 0, 0 #define AI_MATKEY_ROUGHNESS_TEXTURE aiTextureType_DIFFUSE_ROUGHNESS, 0 +// Anisotropy factor. 0.0 = isotropic, 1.0 = anisotropy along tangent direction, +// -1.0 = anisotropy along bitangent direction +#define AI_MATKEY_ANISOTROPY_FACTOR "$mat.anisotropyFactor", 0, 0 // Specular/Glossiness Workflow // --------------------------- From 2eb86d75b86baff7c81b3dcb53de9a6c47dea5f8 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Wed, 22 Dec 2021 19:45:19 +0100 Subject: [PATCH 31/83] Make sure no overflow can happen - During UTF32 LE with BOM make sure that the byteswap operation will have enough space when iterating through the text buffer, which shall get encoded. - closes https://github.com/assimp/assimp/issues/4230 --- code/Common/BaseImporter.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/code/Common/BaseImporter.cpp b/code/Common/BaseImporter.cpp index d7e24afab..c0a87b632 100644 --- a/code/Common/BaseImporter.cpp +++ b/code/Common/BaseImporter.cpp @@ -65,6 +65,7 @@ using namespace Assimp; // Constructor to be privately used by Importer BaseImporter::BaseImporter() AI_NO_EXCEPT : m_progress() { + // empty } // ------------------------------------------------------------------------------------------------ @@ -371,11 +372,16 @@ void BaseImporter::ConvertToUTF8(std::vector &data) { } // UTF 16 BE with BOM + size_t index = 0; if (*((uint16_t *)&data.front()) == 0xFFFE) { - // swap the endianness .. for (uint16_t *p = (uint16_t *)&data.front(), *end = (uint16_t *)&data.back(); p <= end; ++p) { - ByteSwap::Swap2(p); + // Check to ensure no overflow can happen + if ((index+2) < data.Size()) { + // Swap the data + ByteSwap::Swap2(p); + index += 2; + } } } From 215f4e1f4dcca57f1dee9f18519df1af659ad62c Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Wed, 22 Dec 2021 20:02:29 +0100 Subject: [PATCH 32/83] Fix typo --- code/Common/BaseImporter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/Common/BaseImporter.cpp b/code/Common/BaseImporter.cpp index c0a87b632..570ba7f7b 100644 --- a/code/Common/BaseImporter.cpp +++ b/code/Common/BaseImporter.cpp @@ -377,7 +377,7 @@ void BaseImporter::ConvertToUTF8(std::vector &data) { // swap the endianness .. for (uint16_t *p = (uint16_t *)&data.front(), *end = (uint16_t *)&data.back(); p <= end; ++p) { // Check to ensure no overflow can happen - if ((index+2) < data.Size()) { + if ((index+2) < data.size()) { // Swap the data ByteSwap::Swap2(p); index += 2; From 2c66d4d3a2c7b9b6c74f38c8a4ef847f4e624740 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Wed, 22 Dec 2021 20:43:44 +0100 Subject: [PATCH 33/83] Optimize the check --- code/Common/BaseImporter.cpp | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/code/Common/BaseImporter.cpp b/code/Common/BaseImporter.cpp index 570ba7f7b..82b8f12fc 100644 --- a/code/Common/BaseImporter.cpp +++ b/code/Common/BaseImporter.cpp @@ -372,16 +372,14 @@ void BaseImporter::ConvertToUTF8(std::vector &data) { } // UTF 16 BE with BOM - size_t index = 0; if (*((uint16_t *)&data.front()) == 0xFFFE) { + // Check to ensure no overflow can happen + if(data.size() % 2 != 0) { + return; + } // swap the endianness .. for (uint16_t *p = (uint16_t *)&data.front(), *end = (uint16_t *)&data.back(); p <= end; ++p) { - // Check to ensure no overflow can happen - if ((index+2) < data.size()) { - // Swap the data - ByteSwap::Swap2(p); - index += 2; - } + ByteSwap::Swap2(p); } } From 635153b3a4d5e203e446f0b1f547365f7c2769c4 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Wed, 22 Dec 2021 21:08:28 +0100 Subject: [PATCH 34/83] LWS-Import: Avoid access to empty string token - Fix invalid access to string pointer when string token is empty - closes https://github.com/assimp/assimp/issues/4222 --- code/AssetLib/LWS/LWSLoader.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/code/AssetLib/LWS/LWSLoader.cpp b/code/AssetLib/LWS/LWSLoader.cpp index cb07787fa..cf04579b0 100644 --- a/code/AssetLib/LWS/LWSLoader.cpp +++ b/code/AssetLib/LWS/LWSLoader.cpp @@ -537,6 +537,11 @@ void LWSImporter::InternReadFile(const std::string &pFile, aiScene *pScene, IOSy // get file format version and print to log ++it; + + if ((*it).tokens[0].empty()) { + ASSIMP_LOG_ERROR("Invalid LWS file detectedm abort import."); + return; + } unsigned int version = strtoul10((*it).tokens[0].c_str()); ASSIMP_LOG_INFO("LWS file format version is ", (*it).tokens[0]); first = 0.; From db2500c39341f8169ffd4fbd2e26cd4aee293437 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Thu, 23 Dec 2021 12:28:43 +0100 Subject: [PATCH 35/83] MDL: Do not try to copy empty embedded texture - When an embedded texture is empty, skip it instead of trying to copy it. This must fail. - closes https://github.com/assimp/assimp/issues/4238 - Found from the Google fuzzer. --- code/AssetLib/MDL/MDLMaterialLoader.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/code/AssetLib/MDL/MDLMaterialLoader.cpp b/code/AssetLib/MDL/MDLMaterialLoader.cpp index 62320814a..4f441a054 100644 --- a/code/AssetLib/MDL/MDLMaterialLoader.cpp +++ b/code/AssetLib/MDL/MDLMaterialLoader.cpp @@ -463,8 +463,12 @@ void MDLImporter::ParseSkinLump_3DGS_MDL7( ASSIMP_LOG_WARN("Found a reference to an embedded DDS texture, " "but texture height is not equal to 1, which is not supported by MED"); } - - pcNew.reset(new aiTexture()); + if (iWidth == 0) { + ASSIMP_LOG_ERROR("Found a reference to an embedded DDS texture, but texture width is zero, aborting import."); + return; + } + + pcNew.reset(new aiTexture); pcNew->mHeight = 0; pcNew->mWidth = iWidth; From d11d2fc60d651ee41102a0261a0970c53ffa90f3 Mon Sep 17 00:00:00 2001 From: Garux Date: Fri, 24 Dec 2021 18:27:52 +0300 Subject: [PATCH 36/83] fix Inter-Quake Model (IQM) Importer MSVC warnings --- code/AssetLib/IQM/IQMImporter.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/code/AssetLib/IQM/IQMImporter.cpp b/code/AssetLib/IQM/IQMImporter.cpp index 6cfc0dfef..2bea66c6b 100644 --- a/code/AssetLib/IQM/IQMImporter.cpp +++ b/code/AssetLib/IQM/IQMImporter.cpp @@ -61,6 +61,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. inline void swap_block( uint32_t *block, size_t size ){ + (void)block; // suppress 'unreferenced formal parameter' MSVC warning size >>= 2; for ( size_t i = 0; i < size; ++i ) AI_SWAP4( block[ i ] ); @@ -182,7 +183,7 @@ void IQMImporter::InternReadFile(const std::string &file, aiScene *pScene, IOSys } // Read all surfaces from the file - for( auto imesh = reinterpret_cast( data + hdr.ofs_meshes ), end = imesh + hdr.num_meshes; imesh != end; ++imesh ) + for( auto imesh = reinterpret_cast( data + hdr.ofs_meshes ), end_ = imesh + hdr.num_meshes; imesh != end_; ++imesh ) { swap_block( &imesh->name, sizeof( iqmmesh ) ); // Allocate output mesh & material @@ -214,10 +215,10 @@ void IQMImporter::InternReadFile(const std::string &file, aiScene *pScene, IOSys } // Fill in all vertices - for( auto array = reinterpret_cast( data + hdr.ofs_vertexarrays ), end = array + hdr.num_vertexarrays; array != end; ++array ) + for( auto array = reinterpret_cast( data + hdr.ofs_vertexarrays ), end__ = array + hdr.num_vertexarrays; array != end__; ++array ) { - const size_t nVerts = imesh->num_vertexes; - const size_t step = array->size; + const unsigned int nVerts = imesh->num_vertexes; + const unsigned int step = array->size; switch ( array->type ) { From d44641398fff18f151d5f7d986736b7d5b0450d5 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Sun, 26 Dec 2021 11:16:02 +0100 Subject: [PATCH 37/83] Add console progresshandler --- code/Common/DefaultProgressHandler.h | 17 ++++++++------- code/Common/Importer.cpp | 2 +- include/assimp/ProgressHandler.hpp | 1 + tools/assimp_cmd/Main.cpp | 31 ++++++++++++++++++++++++---- 4 files changed, 38 insertions(+), 13 deletions(-) diff --git a/code/Common/DefaultProgressHandler.h b/code/Common/DefaultProgressHandler.h index 4626204af..ebf4a0e74 100644 --- a/code/Common/DefaultProgressHandler.h +++ b/code/Common/DefaultProgressHandler.h @@ -4,7 +4,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2021, assimp team - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -48,18 +47,20 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include -namespace Assimp { +namespace Assimp { // ------------------------------------------------------------------------------------ -/** @brief Internal default implementation of the #ProgressHandler interface. */ +/** + * @brief Internal default implementation of the #ProgressHandler interface. + */ class DefaultProgressHandler : public ProgressHandler { - - virtual bool Update(float /*percentage*/) { +public: + /// @brief Ignores the update callback. + bool Update(float) override { return false; } +}; - -}; // !class DefaultProgressHandler } // Namespace Assimp -#endif +#endif // INCLUDED_AI_DEFAULTPROGRESSHANDLER_H diff --git a/code/Common/Importer.cpp b/code/Common/Importer.cpp index 41b73fd12..2f9c23bec 100644 --- a/code/Common/Importer.cpp +++ b/code/Common/Importer.cpp @@ -329,7 +329,7 @@ bool Importer::IsDefaultIOHandler() const { // ------------------------------------------------------------------------------------------------ // Supplies a custom progress handler to get regular callbacks during importing -void Importer::SetProgressHandler ( ProgressHandler* pHandler ) { +void Importer::SetProgressHandler(ProgressHandler* pHandler) { ai_assert(nullptr != pimpl); ASSIMP_BEGIN_EXCEPTION_REGION(); diff --git a/include/assimp/ProgressHandler.hpp b/include/assimp/ProgressHandler.hpp index a42015400..40661fba8 100644 --- a/include/assimp/ProgressHandler.hpp +++ b/include/assimp/ProgressHandler.hpp @@ -74,6 +74,7 @@ protected: public: /// @brief Virtual destructor. virtual ~ProgressHandler () { + // empty } // ------------------------------------------------------------------- diff --git a/tools/assimp_cmd/Main.cpp b/tools/assimp_cmd/Main.cpp index 8d76e1f5e..87467579f 100644 --- a/tools/assimp_cmd/Main.cpp +++ b/tools/assimp_cmd/Main.cpp @@ -5,8 +5,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2021, assimp team - - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -47,6 +45,25 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "Main.h" +#include +#include + +class ConsoleProgressHandler : public ProgressHandler { +public: + ConsoleProgressHandler() : + ProgressHandler() { + // empty + } + + ~ConsoleProgressHandler() override { + // empty + } + + bool Update(float percentage) override { + std::cout << percentage * 100.0f << " %\n"; + return true; + } +}; const char* AICMD_MSG_ABOUT = "------------------------------------------------------ \n" "Open Asset Import Library (\"Assimp\", https://github.com/assimp/assimp) \n" @@ -73,10 +90,10 @@ const char* AICMD_MSG_HELP = "\n Use \'assimp --help\' for detailed help on a command.\n" ; -/*extern*/ Assimp::Importer* globalImporter = NULL; +/*extern*/ Assimp::Importer* globalImporter = nullptr; #ifndef ASSIMP_BUILD_NO_EXPORT -/*extern*/ Assimp::Exporter* globalExporter = NULL; +/*extern*/ Assimp::Exporter* globalExporter = nullptr; #endif // ------------------------------------------------------------------------------ @@ -286,6 +303,9 @@ const aiScene* ImportModel( // do the actual import, measure time const clock_t first = clock(); + ConsoleProgressHandler *ph = new ConsoleProgressHandler; + globalImporter->SetProgressHandler(ph); + const aiScene* scene = globalImporter->ReadFile(path,imp.ppFlags); if (imp.showLog) { @@ -305,6 +325,9 @@ const aiScene* ImportModel( if (imp.log) { FreeLogStreams(); } + globalImporter->SetProgressHandler(nullptr); + delete ph; + return scene; } From 81fc50f6122bbc445fc1aef9c9238e613b9f2186 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Tue, 28 Dec 2021 14:59:37 +0100 Subject: [PATCH 38/83] CMake: Replace CMAKE_COMPILER_IS_MINGW by MINGW See https://discourse.cmake.org/t/cmake-compiler-is-mingw-removed/4539 and https://cmake.org/cmake/help/latest/variable/MINGW.html --- CMakeLists.txt | 4 ++-- code/CMakeLists.txt | 4 ++-- contrib/android-cmake/android.toolchain.cmake | 1 + 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 570c29305..13b2ef936 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -246,7 +246,7 @@ IF( UNIX ) ENDIF() # Grouped compiler settings ######################################## -IF ((CMAKE_C_COMPILER_ID MATCHES "GNU") AND NOT CMAKE_COMPILER_IS_MINGW) +IF ((CMAKE_C_COMPILER_ID MATCHES "GNU") AND NOT MINGW) IF(NOT ASSIMP_HUNTER_ENABLED) SET(CMAKE_CXX_STANDARD 11) SET(CMAKE_POSITION_INDEPENDENT_CODE ON) @@ -283,7 +283,7 @@ ELSEIF (CMAKE_CXX_COMPILER_ID MATCHES "Clang" ) ENDIF() SET(CMAKE_CXX_FLAGS "-fvisibility=hidden -fno-strict-aliasing -Wall -Wno-long-long ${CMAKE_CXX_FLAGS}" ) SET(CMAKE_C_FLAGS "-fno-strict-aliasing ${CMAKE_C_FLAGS}") -ELSEIF( CMAKE_COMPILER_IS_MINGW ) +ELSEIF( MINGW ) IF (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 7.0) message(FATAL_ERROR "MinGW is too old to be supported. Please update MinGW and try again.") ELSEIF(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 7.3) diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index 1af9407d2..08efd28df 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -557,7 +557,7 @@ ADD_ASSIMP_IMPORTER( IFC if (ASSIMP_BUILD_IFC_IMPORTER) if (MSVC) set_source_files_properties(Importer/IFC/IFCReaderGen1_2x3.cpp Importer/IFC/IFCReaderGen2_2x3.cpp PROPERTIES COMPILE_FLAGS "/bigobj") - elseif(CMAKE_COMPILER_IS_MINGW) + elseif(MINGW) set_source_files_properties(Importer/IFC/IFCReaderGen1_2x3.cpp Importer/IFC/IFCReaderGen2_2x3.cpp PROPERTIES COMPILE_FLAGS "-O2 -Wa,-mbig-obj") endif() endif () @@ -862,7 +862,7 @@ ADD_ASSIMP_IMPORTER( MMD # optimizations that take up extra space. Given that the issue is a string table overflowing, -Os seemed appropriate # Also, I'm not positive if both link & compile flags are needed, but this hopefully ensures that the issue should not # recur for edge cases such as static builds. -if ((CMAKE_COMPILER_IS_MINGW) AND (CMAKE_BUILD_TYPE MATCHES Debug)) +if ((MINGW) AND (CMAKE_BUILD_TYPE MATCHES Debug)) message("-- Applying MinGW StepFileGen1.cpp Debug Workaround") SET_SOURCE_FILES_PROPERTIES(Importer/StepFile/StepFileGen1.cpp PROPERTIES COMPILE_FLAGS -Os ) SET_SOURCE_FILES_PROPERTIES(Importer/StepFile/StepFileGen1.cpp PROPERTIES LINK_FLAGS -Os ) diff --git a/contrib/android-cmake/android.toolchain.cmake b/contrib/android-cmake/android.toolchain.cmake index ffa26126a..c2b8a0730 100644 --- a/contrib/android-cmake/android.toolchain.cmake +++ b/contrib/android-cmake/android.toolchain.cmake @@ -1616,6 +1616,7 @@ endif() if( CMAKE_GENERATOR MATCHES "Ninja" AND CMAKE_HOST_WIN32 ) # it is a bad hack after all # CMake generates Ninja makefiles with UNIX paths only if it thinks that we are going to build with MinGW + set( MINGW TRUE ) # tell CMake that we are MinGW set( CMAKE_COMPILER_IS_MINGW TRUE ) # tell CMake that we are MinGW set( CMAKE_CROSSCOMPILING TRUE ) # stop recursion enable_language( C ) From a099fe7cd331a839137115db5df1733c4c1c8070 Mon Sep 17 00:00:00 2001 From: Peter Seiderer Date: Thu, 30 Dec 2021 18:01:54 +0100 Subject: [PATCH 39/83] BlenderScene: use explicit namespace instead of using namespace Fixes (using g++ Sourcery CodeBench Lite 2014.05-29 - 4.8.3 20140320): .../build/assimp-5.1.4/code/AssetLib/Blender/BlenderScene.cpp:101:33: error: specialization of 'template void Assimp::Blender::Structure::Convert(T&, const Assimp::Blender::FileDatabase&) const' in different namespace [-fpermissive] const FileDatabase &db) const { ^ In file included from .../build/assimp-5.1.4/code/AssetLib/Blender/BlenderScene.h:49:0, from .../build/assimp-5.1.4/code/AssetLib/Blender/BlenderScene.cpp:47: .../build/assimp-5.1.4/code/AssetLib/Blender/BlenderDNA.h:266:10: error: from definition of 'template void Assimp::Blender::Structure::Convert(T&, const Assimp::Blender::FileDatabase&) const' [-fpermissive] void Convert(T &dest, const FileDatabase &db) const; ^ .../build/assimp-5.1.4/code/AssetLib/Blender/BlenderScene.cpp:121:33: error: specialization of 'template void Assimp::Blender::Structure::Convert(T&, const Assimp::Blender::FileDatabase&) const' in different namespace [-fpermissive] const FileDatabase &db) const { ^ In file included from .../build/assimp-5.1.4/code/AssetLib/Blender/BlenderScene.h:49:0, from .../build/assimp-5.1.4/code/AssetLib/Blender/BlenderScene.cpp:47: .../build/assimp-5.1.4/code/AssetLib/Blender/BlenderDNA.h:266:10: error: from definition of 'template void Assimp::Blender::Structure::Convert(T&, const Assimp::Blender::FileDatabase&) const' [-fpermissive] void Convert(T &dest, const FileDatabase &db) const; ^ Signed-off-by: Peter Seiderer --- code/AssetLib/Blender/BlenderScene.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/code/AssetLib/Blender/BlenderScene.cpp b/code/AssetLib/Blender/BlenderScene.cpp index c93d913fc..9ad086fe6 100644 --- a/code/AssetLib/Blender/BlenderScene.cpp +++ b/code/AssetLib/Blender/BlenderScene.cpp @@ -49,8 +49,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "BlenderDNA.h" #include "BlenderSceneGen.h" -using namespace Assimp; -using namespace Assimp::Blender; +namespace Assimp { +namespace Blender { //-------------------------------------------------------------------------------- template <> @@ -885,4 +885,7 @@ void DNA::RegisterConverters() { converters["CollectionObject"] = DNA::FactoryPair(&Structure::Allocate, &Structure::Convert); } +} // namespace Blender +} //namespace Assimp + #endif // ASSIMP_BUILD_NO_BLEND_IMPORTER From bbe12240caec793e165a1fc8d37372904269c97f Mon Sep 17 00:00:00 2001 From: kovacsv Date: Sun, 2 Jan 2022 19:47:43 +0100 Subject: [PATCH 40/83] Move Base64 encode/decode functionality to the common folder. --- code/AssetLib/glTF/glTFAsset.inl | 5 +- code/AssetLib/glTF/glTFAssetWriter.inl | 4 +- code/AssetLib/glTF/glTFCommon.cpp | 78 ---------- code/AssetLib/glTF/glTFCommon.h | 31 ---- code/AssetLib/glTF2/glTF2Asset.inl | 5 +- code/AssetLib/glTF2/glTF2AssetWriter.inl | 3 +- code/CMakeLists.txt | 2 + code/Common/Base64.cpp | 181 +++++++++++++++++++++++ include/assimp/Base64.hpp | 66 +++++++++ test/CMakeLists.txt | 2 + test/unit/Common/utBase64.cpp | 72 +++++++++ 11 files changed, 334 insertions(+), 115 deletions(-) create mode 100644 code/Common/Base64.cpp create mode 100644 include/assimp/Base64.hpp create mode 100644 test/unit/Common/utBase64.cpp diff --git a/code/AssetLib/glTF/glTFAsset.inl b/code/AssetLib/glTF/glTFAsset.inl index 10be7c78e..352bbe7e8 100644 --- a/code/AssetLib/glTF/glTFAsset.inl +++ b/code/AssetLib/glTF/glTFAsset.inl @@ -45,6 +45,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // Header files, Assimp #include +#include #ifdef ASSIMP_IMPORTER_GLTF_USE_OPEN3DGC // Header files, Open3DGC. @@ -194,7 +195,7 @@ inline void Buffer::Read(Value &obj, Asset &r) { if (ParseDataURI(uri, it->GetStringLength(), dataURI)) { if (dataURI.base64) { uint8_t *data = 0; - this->byteLength = Util::DecodeBase64(dataURI.data, dataURI.dataLength, data); + this->byteLength = Base64::Decode(dataURI.data, dataURI.dataLength, data); this->mData.reset(data, std::default_delete()); if (statedLength > 0 && this->byteLength != statedLength) { @@ -513,7 +514,7 @@ inline void Image::Read(Value &obj, Asset &r) { mimeType = dataURI.mediaType; if (dataURI.base64) { uint8_t *ptr = nullptr; - mDataLength = glTFCommon::Util::DecodeBase64(dataURI.data, dataURI.dataLength, ptr); + mDataLength = Base64::Decode(dataURI.data, dataURI.dataLength, ptr); mData.reset(ptr); } } else { diff --git a/code/AssetLib/glTF/glTFAssetWriter.inl b/code/AssetLib/glTF/glTFAssetWriter.inl index a8efdd35a..5e1e2a8fe 100644 --- a/code/AssetLib/glTF/glTFAssetWriter.inl +++ b/code/AssetLib/glTF/glTFAssetWriter.inl @@ -39,6 +39,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ---------------------------------------------------------------------- */ +#include + #include #include #include @@ -237,7 +239,7 @@ namespace glTF { else if (img.HasData()) { uri = "data:" + (img.mimeType.empty() ? "application/octet-stream" : img.mimeType); uri += ";base64,"; - glTFCommon::Util::EncodeBase64(img.GetData(), img.GetDataLength(), uri); + Base64::Encode(img.GetData(), img.GetDataLength(), uri); } else { uri = img.uri; diff --git a/code/AssetLib/glTF/glTFCommon.cpp b/code/AssetLib/glTF/glTFCommon.cpp index 6c63c01d9..620471297 100644 --- a/code/AssetLib/glTF/glTFCommon.cpp +++ b/code/AssetLib/glTF/glTFCommon.cpp @@ -48,84 +48,6 @@ using namespace glTFCommon::Util; namespace Util { -size_t DecodeBase64(const char *in, size_t inLength, uint8_t *&out) { - if (inLength % 4 != 0) { - throw DeadlyImportError("Invalid base64 encoded data: \"", std::string(in, std::min(size_t(32), inLength)), "\", length:", inLength); - } - - if (inLength < 4) { - out = nullptr; - return 0; - } - - int nEquals = int(in[inLength - 1] == '=') + - int(in[inLength - 2] == '='); - - size_t outLength = (inLength * 3) / 4 - nEquals; - out = new uint8_t[outLength]; - memset(out, 0, outLength); - - size_t i, j = 0; - - for (i = 0; i + 4 < inLength; i += 4) { - uint8_t b0 = DecodeCharBase64(in[i]); - uint8_t b1 = DecodeCharBase64(in[i + 1]); - uint8_t b2 = DecodeCharBase64(in[i + 2]); - uint8_t b3 = DecodeCharBase64(in[i + 3]); - - out[j++] = (uint8_t)((b0 << 2) | (b1 >> 4)); - out[j++] = (uint8_t)((b1 << 4) | (b2 >> 2)); - out[j++] = (uint8_t)((b2 << 6) | b3); - } - - { - uint8_t b0 = DecodeCharBase64(in[i]); - uint8_t b1 = DecodeCharBase64(in[i + 1]); - uint8_t b2 = DecodeCharBase64(in[i + 2]); - uint8_t b3 = DecodeCharBase64(in[i + 3]); - - out[j++] = (uint8_t)((b0 << 2) | (b1 >> 4)); - if (b2 < 64) out[j++] = (uint8_t)((b1 << 4) | (b2 >> 2)); - if (b3 < 64) out[j++] = (uint8_t)((b2 << 6) | b3); - } - - return outLength; -} - -void EncodeBase64(const uint8_t *in, size_t inLength, std::string &out) { - size_t outLength = ((inLength + 2) / 3) * 4; - - size_t j = out.size(); - out.resize(j + outLength); - - for (size_t i = 0; i < inLength; i += 3) { - uint8_t b = (in[i] & 0xFC) >> 2; - out[j++] = EncodeCharBase64(b); - - b = (in[i] & 0x03) << 4; - if (i + 1 < inLength) { - b |= (in[i + 1] & 0xF0) >> 4; - out[j++] = EncodeCharBase64(b); - - b = (in[i + 1] & 0x0F) << 2; - if (i + 2 < inLength) { - b |= (in[i + 2] & 0xC0) >> 6; - out[j++] = EncodeCharBase64(b); - - b = in[i + 2] & 0x3F; - out[j++] = EncodeCharBase64(b); - } else { - out[j++] = EncodeCharBase64(b); - out[j++] = '='; - } - } else { - out[j++] = EncodeCharBase64(b); - out[j++] = '='; - out[j++] = '='; - } - } -} - bool ParseDataURI(const char *const_uri, size_t uriLen, DataURI &out) { if (nullptr == const_uri) { return false; diff --git a/code/AssetLib/glTF/glTFCommon.h b/code/AssetLib/glTF/glTFCommon.h index 14b82aa29..6762ca6a1 100644 --- a/code/AssetLib/glTF/glTFCommon.h +++ b/code/AssetLib/glTF/glTFCommon.h @@ -232,37 +232,6 @@ struct DataURI { //! Check if a uri is a data URI bool ParseDataURI(const char *const_uri, size_t uriLen, DataURI &out); -template -struct DATA { - static const uint8_t tableDecodeBase64[128]; -}; - -template -const uint8_t DATA::tableDecodeBase64[128] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 63, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 0, 0, 0, 64, 0, 0, - 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, 0, 0, 0, 0, - 0, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 0, 0, 0, 0, 0 -}; - -inline char EncodeCharBase64(uint8_t b) { - return "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="[size_t(b)]; -} - -inline uint8_t DecodeCharBase64(char c) { - if (c & 0x80) { - throw DeadlyImportError("Invalid base64 char value: ", size_t(c)); - } - return DATA::tableDecodeBase64[size_t(c & 0x7F)]; // TODO faster with lookup table or ifs? -} - -size_t DecodeBase64(const char *in, size_t inLength, uint8_t *&out); - -void EncodeBase64(const uint8_t *in, size_t inLength, std::string &out); } // namespace Util #define CHECK_EXT(EXT) \ diff --git a/code/AssetLib/glTF2/glTF2Asset.inl b/code/AssetLib/glTF2/glTF2Asset.inl index f35a47efa..f6c3aa87a 100644 --- a/code/AssetLib/glTF2/glTF2Asset.inl +++ b/code/AssetLib/glTF2/glTF2Asset.inl @@ -44,6 +44,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include #include +#include // clang-format off #ifdef ASSIMP_ENABLE_DRACO @@ -563,7 +564,7 @@ inline void Buffer::Read(Value &obj, Asset &r) { if (ParseDataURI(uri, it->GetStringLength(), dataURI)) { if (dataURI.base64) { uint8_t *data = nullptr; - this->byteLength = glTFCommon::Util::DecodeBase64(dataURI.data, dataURI.dataLength, data); + this->byteLength = Base64::Decode(dataURI.data, dataURI.dataLength, data); this->mData.reset(data, std::default_delete()); if (statedLength > 0 && this->byteLength != statedLength) { @@ -1062,7 +1063,7 @@ inline void Image::Read(Value &obj, Asset &r) { mimeType = dataURI.mediaType; if (dataURI.base64) { uint8_t *ptr = nullptr; - mDataLength = glTFCommon::Util::DecodeBase64(dataURI.data, dataURI.dataLength, ptr); + mDataLength = Base64::Decode(dataURI.data, dataURI.dataLength, ptr); mData.reset(ptr); } } else { diff --git a/code/AssetLib/glTF2/glTF2AssetWriter.inl b/code/AssetLib/glTF2/glTF2AssetWriter.inl index b91553fbe..8a2b73d03 100644 --- a/code/AssetLib/glTF2/glTF2AssetWriter.inl +++ b/code/AssetLib/glTF2/glTF2AssetWriter.inl @@ -39,6 +39,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ---------------------------------------------------------------------- */ +#include #include #include #include @@ -260,7 +261,7 @@ namespace glTF2 { if (img.HasData()) { uri = "data:" + (img.mimeType.empty() ? "application/octet-stream" : img.mimeType); uri += ";base64,"; - glTFCommon::Util::EncodeBase64(img.GetData(), img.GetDataLength(), uri); + Base64::Encode(img.GetData(), img.GetDataLength(), uri); } else { uri = img.uri; diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index 1af9407d2..0c462f4ed 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -142,6 +142,7 @@ SET( PUBLIC_HEADERS ${HEADER_PATH}/MathFunctions.h ${HEADER_PATH}/Exceptional.h ${HEADER_PATH}/ByteSwapper.h + ${HEADER_PATH}/Base64.hpp ) SET( Core_SRCS @@ -201,6 +202,7 @@ SET( Common_SRCS Common/material.cpp Common/AssertHandler.cpp Common/Exceptional.cpp + Common/Base64.cpp ) SOURCE_GROUP(Common FILES ${Common_SRCS}) diff --git a/code/Common/Base64.cpp b/code/Common/Base64.cpp new file mode 100644 index 000000000..2916cae7f --- /dev/null +++ b/code/Common/Base64.cpp @@ -0,0 +1,181 @@ +/* +--------------------------------------------------------------------------- +Open Asset Import Library (assimp) +--------------------------------------------------------------------------- + +Copyright (c) 2006-2021, assimp team + +All rights reserved. + +Redistribution and use of this software in source and binary forms, +with or without modification, are permitted provided that the following +conditions are met: + +* Redistributions of source code must retain the above + copyright notice, this list of conditions and the + following disclaimer. + +* Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the + following disclaimer in the documentation and/or other + materials provided with the distribution. + +* Neither the name of the assimp team, nor the names of its + contributors may be used to endorse or promote products + derived from this software without specific prior + written permission of the assimp team. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +--------------------------------------------------------------------------- +*/ + +#include +#include + +namespace Assimp { + +namespace Base64 { + +static const uint8_t tableDecodeBase64[128] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 63, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 0, 0, 0, 64, 0, 0, + 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, 0, 0, 0, 0, + 0, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 0, 0, 0, 0, 0 +}; + +static const char* tableEncodeBase64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; + +static inline char EncodeChar(uint8_t b) { + return tableEncodeBase64[size_t(b)]; +} + +inline uint8_t DecodeChar(char c) { + if (c & 0x80) { + throw DeadlyImportError("Invalid base64 char value: ", size_t(c)); + } + return tableDecodeBase64[size_t(c & 0x7F)]; // TODO faster with lookup table or ifs? +} + +void Encode(const uint8_t *in, size_t inLength, std::string &out) { + size_t outLength = ((inLength + 2) / 3) * 4; + + size_t j = out.size(); + out.resize(j + outLength); + + for (size_t i = 0; i < inLength; i += 3) { + uint8_t b = (in[i] & 0xFC) >> 2; + out[j++] = EncodeChar(b); + + b = (in[i] & 0x03) << 4; + if (i + 1 < inLength) { + b |= (in[i + 1] & 0xF0) >> 4; + out[j++] = EncodeChar(b); + + b = (in[i + 1] & 0x0F) << 2; + if (i + 2 < inLength) { + b |= (in[i + 2] & 0xC0) >> 6; + out[j++] = EncodeChar(b); + + b = in[i + 2] & 0x3F; + out[j++] = EncodeChar(b); + } else { + out[j++] = EncodeChar(b); + out[j++] = '='; + } + } else { + out[j++] = EncodeChar(b); + out[j++] = '='; + out[j++] = '='; + } + } +} + +void Encode(const std::vector& in, std::string &out) { + Encode (in.data (), in.size (), out); +} + +std::string Encode (const std::vector& in) { + std::string encoded; + Encode (in, encoded); + return encoded; +} + + +size_t Decode(const char *in, size_t inLength, uint8_t *&out) { + if (inLength % 4 != 0) { + throw DeadlyImportError("Invalid base64 encoded data: \"", std::string(in, std::min(size_t(32), inLength)), "\", length:", inLength); + } + + if (inLength < 4) { + out = nullptr; + return 0; + } + + int nEquals = int(in[inLength - 1] == '=') + + int(in[inLength - 2] == '='); + + size_t outLength = (inLength * 3) / 4 - nEquals; + out = new uint8_t[outLength]; + memset(out, 0, outLength); + + size_t i, j = 0; + + for (i = 0; i + 4 < inLength; i += 4) { + uint8_t b0 = DecodeChar(in[i]); + uint8_t b1 = DecodeChar(in[i + 1]); + uint8_t b2 = DecodeChar(in[i + 2]); + uint8_t b3 = DecodeChar(in[i + 3]); + + out[j++] = (uint8_t)((b0 << 2) | (b1 >> 4)); + out[j++] = (uint8_t)((b1 << 4) | (b2 >> 2)); + out[j++] = (uint8_t)((b2 << 6) | b3); + } + + { + uint8_t b0 = DecodeChar(in[i]); + uint8_t b1 = DecodeChar(in[i + 1]); + uint8_t b2 = DecodeChar(in[i + 2]); + uint8_t b3 = DecodeChar(in[i + 3]); + + out[j++] = (uint8_t)((b0 << 2) | (b1 >> 4)); + if (b2 < 64) out[j++] = (uint8_t)((b1 << 4) | (b2 >> 2)); + if (b3 < 64) out[j++] = (uint8_t)((b2 << 6) | b3); + } + + return outLength; +} + +size_t Decode(const std::string& in, std::vector& out) { + uint8_t* outPtr = nullptr; + size_t decodedSize = Decode (in.data (), in.size (), outPtr); + if (outPtr == nullptr) { + return 0; + } + out.assign (outPtr, outPtr + decodedSize); + delete[] outPtr; + return decodedSize; +} + +std::vector Decode (const std::string& in) { + std::vector result; + Decode (in, result); + return result; +} + +} + +} diff --git a/include/assimp/Base64.hpp b/include/assimp/Base64.hpp new file mode 100644 index 000000000..9db71c314 --- /dev/null +++ b/include/assimp/Base64.hpp @@ -0,0 +1,66 @@ +/* +--------------------------------------------------------------------------- +Open Asset Import Library (assimp) +--------------------------------------------------------------------------- + +Copyright (c) 2006-2021, assimp team + +All rights reserved. + +Redistribution and use of this software in source and binary forms, +with or without modification, are permitted provided that the following +conditions are met: + +* Redistributions of source code must retain the above + copyright notice, this list of conditions and the + following disclaimer. + +* Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the + following disclaimer in the documentation and/or other + materials provided with the distribution. + +* Neither the name of the assimp team, nor the names of its + contributors may be used to endorse or promote products + derived from this software without specific prior + written permission of the assimp team. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +--------------------------------------------------------------------------- +*/ + +#pragma once +#ifndef AI_BASE64_HPP_INC +#define AI_BASE64_HPP_INC + +#include +#include +#include + +namespace Assimp { + +namespace Base64 { + +void Encode(const uint8_t *in, size_t inLength, std::string &out); +void Encode(const std::vector& in, std::string &out); +std::string Encode(const std::vector& in); + +size_t Decode(const char *in, size_t inLength, uint8_t *&out); +size_t Decode(const std::string& in, std::vector& out); +std::vector Decode(const std::string& in); + +} + +} + +#endif // AI_BASE64_HPP_INC diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 5e573ed7c..fde051275 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -97,6 +97,7 @@ SET( COMMON unit/Common/utSpatialSort.cpp unit/Common/utAssertHandler.cpp unit/Common/utXmlParser.cpp + unit/Common/utBase64.cpp ) SET( IMPORTERS @@ -208,6 +209,7 @@ add_executable( unit unit/CCompilerTest.c unit/Main.cpp ../code/Common/Version.cpp + ../code/Common/Base64.cpp ${COMMON} ${IMPORTERS} ${MATERIAL} diff --git a/test/unit/Common/utBase64.cpp b/test/unit/Common/utBase64.cpp new file mode 100644 index 000000000..6ac960364 --- /dev/null +++ b/test/unit/Common/utBase64.cpp @@ -0,0 +1,72 @@ +/* +--------------------------------------------------------------------------- +Open Asset Import Library (assimp) +--------------------------------------------------------------------------- + +Copyright (c) 2006-2021, assimp team + +All rights reserved. + +Redistribution and use of this software in source and binary forms, +with or without modification, are permitted provided that the following +conditions are met: + +* Redistributions of source code must retain the above +copyright notice, this list of conditions and the +following disclaimer. + +* Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the +following disclaimer in the documentation and/or other +materials provided with the distribution. + +* Neither the name of the assimp team, nor the names of its +contributors may be used to endorse or promote products +derived from this software without specific prior +written permission of the assimp team. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +--------------------------------------------------------------------------- +*/ + +#include "UnitTestPCH.h" +#include "TestIOSystem.h" + +#include + +using namespace std; +using namespace Assimp; + +class Base64Test : public ::testing::Test { +public: + virtual void SetUp() { + } + + virtual void TearDown() { + } +}; + +static const std::vector assimpStringBinary = { 97, 115, 115, 105, 109, 112 }; +static const std::string assimpStringEncoded = "YXNzaW1w"; + +TEST_F( Base64Test, encodeTest ) { + EXPECT_EQ( "", Base64::Encode (std::vector{}) ); + EXPECT_EQ( "Vg==", Base64::Encode (std::vector{ 86 }) ); + EXPECT_EQ( assimpStringEncoded, Base64::Encode (assimpStringBinary) ); +} + +TEST_F( Base64Test, decodeTest ) { + EXPECT_EQ( std::vector {}, Base64::Decode ("") ); + EXPECT_EQ( std::vector { 86 }, Base64::Decode ("Vg==") ); + EXPECT_EQ( assimpStringBinary, Base64::Decode (assimpStringEncoded) ); +} From 87e9dbac40b0972880efa4fded94918f34fc279b Mon Sep 17 00:00:00 2001 From: Colin Reeder Date: Mon, 3 Jan 2022 16:32:34 -0700 Subject: [PATCH 41/83] Fix bone fitted check in gltf2 exporter --- code/AssetLib/glTF2/glTF2Exporter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/AssetLib/glTF2/glTF2Exporter.cpp b/code/AssetLib/glTF2/glTF2Exporter.cpp index 606a4a919..a2b5e9848 100644 --- a/code/AssetLib/glTF2/glTF2Exporter.cpp +++ b/code/AssetLib/glTF2/glTF2Exporter.cpp @@ -972,7 +972,7 @@ void ExportSkin(Asset &mAsset, const aiMesh *aimesh, Ref &meshRef, Ref 3) { int boneIndexFitted = FitBoneWeight(vertexWeightData[vertexId], vertWeight); - if (boneIndexFitted) { + if (boneIndexFitted != -1) { vertexJointData[vertexId][boneIndexFitted] = static_cast(jointNamesIndex); } }else { From a591944c047cae1e79bb75999f0d1f0a522946f2 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Tue, 4 Jan 2022 17:32:18 +0100 Subject: [PATCH 42/83] Add link to used enum for a better understandability for the mesh morphing method. --- include/assimp/mesh.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/assimp/mesh.h b/include/assimp/mesh.h index 42312a2c7..9d4ddf97b 100644 --- a/include/assimp/mesh.h +++ b/include/assimp/mesh.h @@ -740,6 +740,7 @@ struct aiMesh { /** * Method of morphing when anim-meshes are specified. + * @see aiMorphingMethod to learn more about the provided morphing targets. */ unsigned int mMethod; From 04d2d13172bb0a442a04023420727bfb5ee029da Mon Sep 17 00:00:00 2001 From: tanolino Date: Wed, 5 Jan 2022 10:10:38 +0100 Subject: [PATCH 43/83] Locale independent meter scale `XmlParser::getRealAttribute(...)` will call `strtod` (or `wcstod`) which are both locale dependent. So on a German locale system a scale of 0.01 meter will be parsed to 0. In order to avoid that I use the `fast_atoreal_move()` method. --- code/AssetLib/Collada/ColladaParser.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/code/AssetLib/Collada/ColladaParser.cpp b/code/AssetLib/Collada/ColladaParser.cpp index 8bbdf02cc..971b2a4a1 100644 --- a/code/AssetLib/Collada/ColladaParser.cpp +++ b/code/AssetLib/Collada/ColladaParser.cpp @@ -331,7 +331,16 @@ void ColladaParser::ReadAssetInfo(XmlNode &node) { const std::string ¤tName = currentNode.name(); if (currentName == "unit") { mUnitSize = 1.f; - XmlParser::getRealAttribute(currentNode, "meter", mUnitSize); + std::string tUnitSizeString; + if (XmlParser::getStdStrAttribute(currentNode, "meter", tUnitSizeString)) { + try { + fast_atoreal_move(tUnitSizeString.data(), mUnitSize); + } catch (DeadlyImportError die) { + std::string warning("Collada: Failed to parse meter parameter to real number. Exception:\n"); + warning.append(die.what()); + ASSIMP_LOG_WARN(warning.data()); + } + } } else if (currentName == "up_axis") { std::string v; if (!XmlParser::getValueAsString(currentNode, v)) { From 089fc7311aa1eabd232ddea8a20e31747dee864e Mon Sep 17 00:00:00 2001 From: tanolino Date: Wed, 5 Jan 2022 10:34:27 +0100 Subject: [PATCH 44/83] GCC might have an issue with value type Errors --- code/AssetLib/Collada/ColladaParser.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/AssetLib/Collada/ColladaParser.cpp b/code/AssetLib/Collada/ColladaParser.cpp index 971b2a4a1..64c4ffa9e 100644 --- a/code/AssetLib/Collada/ColladaParser.cpp +++ b/code/AssetLib/Collada/ColladaParser.cpp @@ -335,7 +335,7 @@ void ColladaParser::ReadAssetInfo(XmlNode &node) { if (XmlParser::getStdStrAttribute(currentNode, "meter", tUnitSizeString)) { try { fast_atoreal_move(tUnitSizeString.data(), mUnitSize); - } catch (DeadlyImportError die) { + } catch (const DeadlyImportError& die) { std::string warning("Collada: Failed to parse meter parameter to real number. Exception:\n"); warning.append(die.what()); ASSIMP_LOG_WARN(warning.data()); From 34d8fba10054c150be1be7d492b6b3d9c7a659da Mon Sep 17 00:00:00 2001 From: Alex Rebert Date: Wed, 5 Jan 2022 10:01:46 -0500 Subject: [PATCH 45/83] Fix stack overflow in ZipArchiveIOSystem::MapArchive The function allocates a filename buffer of 256, and copies the filename extracted from the zip file into it. However, a filename might be larger than 256 characters, in which case the function would write out of bounds. This commit skips any file whose name is larger than 256 to avoid the overflow. Fix https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=38870 Fix #4228 --- code/Common/ZipArchiveIOSystem.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/Common/ZipArchiveIOSystem.cpp b/code/Common/ZipArchiveIOSystem.cpp index 7df51b8aa..03ff6ce81 100644 --- a/code/Common/ZipArchiveIOSystem.cpp +++ b/code/Common/ZipArchiveIOSystem.cpp @@ -372,7 +372,7 @@ void ZipArchiveIOSystem::Implement::MapArchive() { unz_file_info fileInfo; if (unzGetCurrentFileInfo(m_ZipFileHandle, &fileInfo, filename, FileNameSize, nullptr, 0, nullptr, 0) == UNZ_OK) { - if (fileInfo.uncompressed_size != 0) { + if (fileInfo.uncompressed_size != 0 && fileInfo.size_filename <= FileNameSize) { std::string filename_string(filename, fileInfo.size_filename); SimplifyFilename(filename_string); m_ArchiveMap.emplace(filename_string, ZipFileInfo(m_ZipFileHandle, fileInfo.uncompressed_size)); From 310c81aaa20b7328ce7a354897db817f8becac3a Mon Sep 17 00:00:00 2001 From: Alex Rebert Date: Wed, 5 Jan 2022 15:10:11 -0500 Subject: [PATCH 46/83] Add support for spanned archives Without it, assimp would crash on some inputs by jumping to a NULL opendisk function. This commit adds an opendisk implementation, which required adding a filename member to ZipFile. Fix https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=38873 Fix #4229 --- code/Common/ZipArchiveIOSystem.cpp | 86 +++++++++++++++++++----------- 1 file changed, 56 insertions(+), 30 deletions(-) diff --git a/code/Common/ZipArchiveIOSystem.cpp b/code/Common/ZipArchiveIOSystem.cpp index 03ff6ce81..9870fa9d0 100644 --- a/code/Common/ZipArchiveIOSystem.cpp +++ b/code/Common/ZipArchiveIOSystem.cpp @@ -59,11 +59,38 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. namespace Assimp { +// ---------------------------------------------------------------- +// A read-only file inside a ZIP + +class ZipFile : public IOStream { + friend class ZipFileInfo; + explicit ZipFile(std::string &filename, size_t size); + +public: + std::string m_Filename; + virtual ~ZipFile(); + + // IOStream interface + size_t Read(void *pvBuffer, size_t pSize, size_t pCount) override; + size_t Write(const void * /*pvBuffer*/, size_t /*pSize*/, size_t /*pCount*/) override { return 0; } + size_t FileSize() const override; + aiReturn Seek(size_t pOffset, aiOrigin pOrigin) override; + size_t Tell() const override; + void Flush() override {} + +private: + size_t m_Size = 0; + size_t m_SeekPtr = 0; + std::unique_ptr m_Buffer; +}; + + // ---------------------------------------------------------------- // Wraps an existing Assimp::IOSystem for unzip class IOSystem2Unzip { public: static voidpf open(voidpf opaque, const char *filename, int mode); + static voidpf opendisk(voidpf opaque, voidpf stream, uint32_t number_disk, int mode); static uLong read(voidpf opaque, voidpf stream, void *buf, uLong size); static uLong write(voidpf opaque, voidpf stream, const void *buf, uLong size); static long tell(voidpf opaque, voidpf stream); @@ -92,6 +119,28 @@ voidpf IOSystem2Unzip::open(voidpf opaque, const char *filename, int mode) { return (voidpf)io_system->Open(filename, mode_fopen); } +voidpf IOSystem2Unzip::opendisk(voidpf opaque, voidpf stream, uint32_t number_disk, int mode) { + ZipFile *io_stream = (ZipFile *)stream; + voidpf ret = NULL; + size_t i; + + char *disk_filename = (char*)malloc(io_stream->m_Filename.length() + 1); + strncpy(disk_filename, io_stream->m_Filename.c_str(), io_stream->m_Filename.length() + 1); + for (i = io_stream->m_Filename.length() - 1; i >= 0; i -= 1) + { + if (disk_filename[i] != '.') + continue; + snprintf(&disk_filename[i], io_stream->m_Filename.length() - i, ".z%02u", number_disk + 1); + break; + } + + if (i >= 0) + ret = open(opaque, disk_filename, mode); + + free(disk_filename); + return ret; +} + uLong IOSystem2Unzip::read(voidpf /*opaque*/, voidpf stream, void *buf, uLong size) { IOStream *io_stream = (IOStream *)stream; @@ -147,6 +196,7 @@ zlib_filefunc_def IOSystem2Unzip::get(IOSystem *pIOHandler) { zlib_filefunc_def mapping; mapping.zopen_file = (open_file_func)open; + mapping.zopendisk_file = (opendisk_file_func)opendisk; mapping.zread_file = (read_file_func)read; mapping.zwrite_file = (write_file_func)write; mapping.ztell_file = (tell_file_func)tell; @@ -159,30 +209,6 @@ zlib_filefunc_def IOSystem2Unzip::get(IOSystem *pIOHandler) { return mapping; } -// ---------------------------------------------------------------- -// A read-only file inside a ZIP - -class ZipFile : public IOStream { - friend class ZipFileInfo; - explicit ZipFile(size_t size); - -public: - virtual ~ZipFile(); - - // IOStream interface - size_t Read(void *pvBuffer, size_t pSize, size_t pCount) override; - size_t Write(const void * /*pvBuffer*/, size_t /*pSize*/, size_t /*pCount*/) override { return 0; } - size_t FileSize() const override; - aiReturn Seek(size_t pOffset, aiOrigin pOrigin) override; - size_t Tell() const override; - void Flush() override {} - -private: - size_t m_Size = 0; - size_t m_SeekPtr = 0; - std::unique_ptr m_Buffer; -}; - // ---------------------------------------------------------------- // Info about a read-only file inside a ZIP class ZipFileInfo { @@ -190,7 +216,7 @@ public: explicit ZipFileInfo(unzFile zip_handle, size_t size); // Allocate and Extract data from the ZIP - ZipFile *Extract(unzFile zip_handle) const; + ZipFile *Extract(std::string &filename, unzFile zip_handle) const; private: size_t m_Size = 0; @@ -206,7 +232,7 @@ ZipFileInfo::ZipFileInfo(unzFile zip_handle, size_t size) : unzGetFilePos(zip_handle, &(m_ZipFilePos)); } -ZipFile *ZipFileInfo::Extract(unzFile zip_handle) const { +ZipFile *ZipFileInfo::Extract(std::string &filename, unzFile zip_handle) const { // Find in the ZIP. This cannot fail unz_file_pos_s *filepos = const_cast(&(m_ZipFilePos)); if (unzGoToFilePos(zip_handle, filepos) != UNZ_OK) @@ -215,7 +241,7 @@ ZipFile *ZipFileInfo::Extract(unzFile zip_handle) const { if (unzOpenCurrentFile(zip_handle) != UNZ_OK) return nullptr; - ZipFile *zip_file = new ZipFile(m_Size); + ZipFile *zip_file = new ZipFile(filename, m_Size); // Unzip has a limit of UINT16_MAX bytes buffer uint16_t unzipBufferSize = zip_file->m_Size <= UINT16_MAX ? static_cast(zip_file->m_Size) : UINT16_MAX; @@ -245,8 +271,8 @@ ZipFile *ZipFileInfo::Extract(unzFile zip_handle) const { return zip_file; } -ZipFile::ZipFile(size_t size) : - m_Size(size) { +ZipFile::ZipFile(std::string &filename, size_t size) : + m_Filename(filename), m_Size(size) { ai_assert(m_Size != 0); m_Buffer = std::unique_ptr(new uint8_t[m_Size]); } @@ -422,7 +448,7 @@ IOStream *ZipArchiveIOSystem::Implement::OpenFile(std::string &filename) { return nullptr; const ZipFileInfo &zip_file = (*zip_it).second; - return zip_file.Extract(m_ZipFileHandle); + return zip_file.Extract(filename, m_ZipFileHandle); } inline void ReplaceAll(std::string &data, const std::string &before, const std::string &after) { From b14b34d2b8954f6cc7fd25a8f7d20ad8f94faa27 Mon Sep 17 00:00:00 2001 From: Alex Rebert Date: Wed, 5 Jan 2022 15:19:06 -0500 Subject: [PATCH 47/83] LWSLoader: Fix out of bounds iterator access Fix https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=38947 Fix #4222 --- code/AssetLib/LWS/LWSLoader.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/AssetLib/LWS/LWSLoader.cpp b/code/AssetLib/LWS/LWSLoader.cpp index cf04579b0..e046b6f58 100644 --- a/code/AssetLib/LWS/LWSLoader.cpp +++ b/code/AssetLib/LWS/LWSLoader.cpp @@ -537,8 +537,8 @@ void LWSImporter::InternReadFile(const std::string &pFile, aiScene *pScene, IOSy // get file format version and print to log ++it; - - if ((*it).tokens[0].empty()) { + + if (it == root.children.end() || (*it).tokens[0].empty()) { ASSIMP_LOG_ERROR("Invalid LWS file detectedm abort import."); return; } From 776130534bb66cb64c6f11b92a1375df9604ba83 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Thu, 6 Jan 2022 22:35:32 +0100 Subject: [PATCH 48/83] Fix nullptr-dereferencing - Fix a possible nullptr-exception. --- code/AssetLib/X3D/X3DImporter.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/AssetLib/X3D/X3DImporter.cpp b/code/AssetLib/X3D/X3DImporter.cpp index fb8ec9bc5..f32f485df 100644 --- a/code/AssetLib/X3D/X3DImporter.cpp +++ b/code/AssetLib/X3D/X3DImporter.cpp @@ -264,6 +264,9 @@ void X3DImporter::InternReadFile(const std::string &pFile, aiScene *pScene, IOSy //search for root node element mNodeElementCur = NodeElement_List.front(); + if (mNodeElementCur == nullptr) { + return; + } while (mNodeElementCur->Parent != nullptr) { mNodeElementCur = mNodeElementCur->Parent; } From 9c4255b486f9c1d39c6d70bd37d967f81c94ce93 Mon Sep 17 00:00:00 2001 From: Dan Rosser Date: Sun, 9 Jan 2022 18:19:33 +1100 Subject: [PATCH 49/83] Assimp Android LTS NDK 23 Fix --- contrib/unzip/crypt.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/contrib/unzip/crypt.h b/contrib/unzip/crypt.h index e627b3bee..78146eb83 100644 --- a/contrib/unzip/crypt.h +++ b/contrib/unzip/crypt.h @@ -17,8 +17,10 @@ #define _MINICRYPT_H #if ZLIB_VERNUM < 0x1270 +#if !defined(Z_U4) typedef unsigned long z_crc_t; #endif +#endif #ifdef __cplusplus extern "C" { From 1d8667bfdc140df93b6255c926a6d9e21877482c Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Sun, 9 Jan 2022 18:06:33 +0100 Subject: [PATCH 50/83] Update to 5.1.6 --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 13b2ef936..39233fe88 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -56,7 +56,7 @@ IF(ASSIMP_HUNTER_ENABLED) add_definitions(-DASSIMP_USE_HUNTER) ENDIF() -PROJECT(Assimp VERSION 5.1.4) +PROJECT(Assimp VERSION 5.1.6) # All supported options ############################################### From 30f1583dde8ef34c02a73e4fb1b5d8e604e671ee Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Sun, 9 Jan 2022 21:06:05 +0100 Subject: [PATCH 51/83] Update utVersion.cpp --- test/unit/utVersion.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/test/unit/utVersion.cpp b/test/unit/utVersion.cpp index 6577c7758..790611556 100644 --- a/test/unit/utVersion.cpp +++ b/test/unit/utVersion.cpp @@ -49,17 +49,21 @@ TEST_F( utVersion, aiGetLegalStringTest ) { std::string text( lv ); size_t pos = text.find(std::string("2021")); - EXPECT_NE( pos, std::string::npos ); + EXPECT_NE(pos, std::string::npos); } TEST_F( utVersion, aiGetVersionMinorTest ) { - EXPECT_EQ( aiGetVersionMinor(), 1U ); + EXPECT_EQ(aiGetVersionMinor(), 1U); } TEST_F( utVersion, aiGetVersionMajorTest ) { EXPECT_EQ( aiGetVersionMajor(), 5U ); } +TEST_F( utVersion, aiGetVersionPatchTest ) { + EXPECT_EQ(aiGetVersionPatch(), 6U ); +} + TEST_F( utVersion, aiGetCompileFlagsTest ) { EXPECT_NE( aiGetCompileFlags(), 0U ); } @@ -71,5 +75,3 @@ TEST_F( utVersion, aiGetVersionRevisionTest ) { TEST_F( utVersion, aiGetBranchNameTest ) { EXPECT_NE( nullptr, aiGetBranchName() ); } - - From 629c8850ecddf60a976b8c31d712aa90060ec8c3 Mon Sep 17 00:00:00 2001 From: Ben Wolsieffer Date: Sun, 9 Jan 2022 19:25:02 -0500 Subject: [PATCH 52/83] Fix imported target include directory Fix the imported target include directory when the headers are not installed in '${CMAKE_INSTALL_PREFIX}/include'. --- code/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index 08efd28df..373470ef9 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -1177,7 +1177,7 @@ TARGET_COMPILE_FEATURES(assimp PRIVATE c_std_99) TARGET_INCLUDE_DIRECTORIES ( assimp PUBLIC $ $ - $ + $ ) IF(ASSIMP_HUNTER_ENABLED) @@ -1311,7 +1311,7 @@ INSTALL( TARGETS assimp RUNTIME DESTINATION ${ASSIMP_BIN_INSTALL_DIR} FRAMEWORK DESTINATION ${ASSIMP_LIB_INSTALL_DIR} COMPONENT ${LIBASSIMP_COMPONENT} - INCLUDES DESTINATION include + INCLUDES DESTINATION ${ASSIMP_INCLUDE_INSTALL_DIR} ) INSTALL( FILES ${PUBLIC_HEADERS} DESTINATION ${ASSIMP_INCLUDE_INSTALL_DIR}/assimp COMPONENT assimp-dev) INSTALL( FILES ${COMPILER_HEADERS} DESTINATION ${ASSIMP_INCLUDE_INSTALL_DIR}/assimp/Compiler COMPONENT assimp-dev) From 50c7301a38a99283cfa5baec38c5ae8af49c4546 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Mon, 10 Jan 2022 21:13:43 +0100 Subject: [PATCH 53/83] Update copyrights --- CMakeLists.txt | 2 +- code/AssetLib/3DS/3DSConverter.cpp | 2 +- code/AssetLib/3DS/3DSExporter.cpp | 2 +- code/AssetLib/3DS/3DSExporter.h | 2 +- code/AssetLib/3DS/3DSHelper.h | 2 +- code/AssetLib/3DS/3DSLoader.cpp | 2 +- code/AssetLib/3DS/3DSLoader.h | 2 +- code/AssetLib/3MF/3MFTypes.h | 2 +- code/AssetLib/3MF/3MFXmlTags.h | 2 +- code/AssetLib/3MF/D3MFExporter.cpp | 2 +- code/AssetLib/3MF/D3MFExporter.h | 2 +- code/AssetLib/3MF/D3MFImporter.cpp | 2 +- code/AssetLib/3MF/D3MFImporter.h | 2 +- code/AssetLib/3MF/D3MFOpcPackage.cpp | 2 +- code/AssetLib/3MF/D3MFOpcPackage.h | 2 +- code/AssetLib/3MF/XmlSerializer.cpp | 2 +- code/AssetLib/3MF/XmlSerializer.h | 2 +- code/AssetLib/AC/ACLoader.cpp | 2 +- code/AssetLib/AC/ACLoader.h | 2 +- code/AssetLib/AMF/AMFImporter.cpp | 2 +- code/AssetLib/AMF/AMFImporter.hpp | 2 +- code/AssetLib/AMF/AMFImporter_Geometry.cpp | 2 +- code/AssetLib/AMF/AMFImporter_Material.cpp | 2 +- code/AssetLib/AMF/AMFImporter_Node.hpp | 2 +- code/AssetLib/AMF/AMFImporter_Postprocess.cpp | 2 +- code/AssetLib/ASE/ASELoader.cpp | 2 +- code/AssetLib/ASE/ASELoader.h | 2 +- code/AssetLib/ASE/ASEParser.cpp | 2 +- code/AssetLib/ASE/ASEParser.h | 2 +- code/AssetLib/Assbin/AssbinExporter.cpp | 2 +- code/AssetLib/Assbin/AssbinExporter.h | 2 +- code/AssetLib/Assbin/AssbinFileWriter.cpp | 2 +- code/AssetLib/Assbin/AssbinFileWriter.h | 2 +- code/AssetLib/Assbin/AssbinLoader.cpp | 2 +- code/AssetLib/Assbin/AssbinLoader.h | 2 +- code/AssetLib/Assxml/AssxmlExporter.cpp | 2 +- code/AssetLib/Assxml/AssxmlExporter.h | 2 +- code/AssetLib/Assxml/AssxmlFileWriter.cpp | 2 +- code/AssetLib/Assxml/AssxmlFileWriter.h | 2 +- code/AssetLib/B3D/B3DImporter.cpp | 2 +- code/AssetLib/B3D/B3DImporter.h | 2 +- code/AssetLib/BVH/BVHLoader.cpp | 2 +- code/AssetLib/BVH/BVHLoader.h | 2 +- code/AssetLib/Blender/BlenderBMesh.cpp | 2 +- code/AssetLib/Blender/BlenderBMesh.h | 2 +- code/AssetLib/Blender/BlenderDNA.cpp | 2 +- code/AssetLib/Blender/BlenderDNA.h | 2 +- code/AssetLib/Blender/BlenderDNA.inl | 2 +- code/AssetLib/Blender/BlenderIntermediate.h | 2 +- code/AssetLib/Blender/BlenderLoader.cpp | 2 +- code/AssetLib/Blender/BlenderLoader.h | 2 +- code/AssetLib/Blender/BlenderModifier.cpp | 2 +- code/AssetLib/Blender/BlenderModifier.h | 2 +- code/AssetLib/Blender/BlenderScene.h | 2 +- code/AssetLib/Blender/BlenderTessellator.cpp | 2 +- code/AssetLib/Blender/BlenderTessellator.h | 2 +- code/AssetLib/COB/COBLoader.cpp | 2 +- code/AssetLib/COB/COBLoader.h | 2 +- code/AssetLib/COB/COBScene.h | 2 +- code/AssetLib/CSM/CSMLoader.cpp | 2 +- code/AssetLib/CSM/CSMLoader.h | 2 +- code/AssetLib/Collada/ColladaExporter.cpp | 2 +- code/AssetLib/Collada/ColladaExporter.h | 2 +- code/AssetLib/Collada/ColladaHelper.cpp | 2 +- code/AssetLib/Collada/ColladaHelper.h | 2 +- code/AssetLib/Collada/ColladaLoader.cpp | 2 +- code/AssetLib/Collada/ColladaLoader.h | 2 +- code/AssetLib/Collada/ColladaParser.cpp | 2 +- code/AssetLib/Collada/ColladaParser.h | 2 +- code/AssetLib/DXF/DXFHelper.h | 2 +- code/AssetLib/DXF/DXFLoader.cpp | 2 +- code/AssetLib/DXF/DXFLoader.h | 2 +- code/AssetLib/FBX/FBXAnimation.cpp | 2 +- code/AssetLib/FBX/FBXBinaryTokenizer.cpp | 2 +- code/AssetLib/FBX/FBXCommon.h | 2 +- code/AssetLib/FBX/FBXCompileConfig.h | 2 +- code/AssetLib/FBX/FBXConverter.cpp | 2 +- code/AssetLib/FBX/FBXConverter.h | 2 +- code/AssetLib/FBX/FBXDeformer.cpp | 2 +- code/AssetLib/FBX/FBXDocument.cpp | 2 +- code/AssetLib/FBX/FBXDocument.h | 2 +- code/AssetLib/FBX/FBXDocumentUtil.cpp | 2 +- code/AssetLib/FBX/FBXExportNode.cpp | 2 +- code/AssetLib/FBX/FBXExportNode.h | 2 +- code/AssetLib/FBX/FBXExportProperty.cpp | 2 +- code/AssetLib/FBX/FBXExportProperty.h | 2 +- code/AssetLib/FBX/FBXExporter.cpp | 2 +- code/AssetLib/FBX/FBXExporter.h | 2 +- code/AssetLib/FBX/FBXImportSettings.h | 2 +- code/AssetLib/FBX/FBXImporter.cpp | 2 +- code/AssetLib/FBX/FBXImporter.h | 2 +- code/AssetLib/FBX/FBXMaterial.cpp | 2 +- code/AssetLib/FBX/FBXMeshGeometry.cpp | 2 +- code/AssetLib/FBX/FBXMeshGeometry.h | 2 +- code/AssetLib/FBX/FBXModel.cpp | 2 +- code/AssetLib/FBX/FBXNodeAttribute.cpp | 2 +- code/AssetLib/FBX/FBXParser.cpp | 2 +- code/AssetLib/FBX/FBXParser.h | 2 +- code/AssetLib/FBX/FBXProperties.cpp | 2 +- code/AssetLib/FBX/FBXProperties.h | 2 +- code/AssetLib/FBX/FBXTokenizer.cpp | 2 +- code/AssetLib/FBX/FBXTokenizer.h | 2 +- code/AssetLib/FBX/FBXUtil.cpp | 2 +- code/AssetLib/FBX/FBXUtil.h | 2 +- code/AssetLib/HMP/HMPFileData.h | 2 +- code/AssetLib/HMP/HMPLoader.cpp | 2 +- code/AssetLib/HMP/HMPLoader.h | 2 +- code/AssetLib/HMP/HalfLifeFileData.h | 2 +- code/AssetLib/IFC/IFCBoolean.cpp | 2 +- code/AssetLib/IFC/IFCCurve.cpp | 2 +- code/AssetLib/IFC/IFCGeometry.cpp | 2 +- code/AssetLib/IFC/IFCLoader.cpp | 2 +- code/AssetLib/IFC/IFCLoader.h | 2 +- code/AssetLib/IFC/IFCMaterial.cpp | 2 +- code/AssetLib/IFC/IFCOpenings.cpp | 2 +- code/AssetLib/IFC/IFCProfile.cpp | 2 +- code/AssetLib/IFC/IFCUtil.cpp | 2 +- code/AssetLib/IFC/IFCUtil.h | 2 +- code/AssetLib/Irr/IRRLoader.cpp | 2 +- code/AssetLib/Irr/IRRLoader.h | 2 +- code/AssetLib/Irr/IRRMeshLoader.cpp | 2 +- code/AssetLib/Irr/IRRMeshLoader.h | 2 +- code/AssetLib/Irr/IRRShared.cpp | 2 +- code/AssetLib/LWO/LWOAnimation.cpp | 2 +- code/AssetLib/LWO/LWOAnimation.h | 2 +- code/AssetLib/LWO/LWOBLoader.cpp | 2 +- code/AssetLib/LWO/LWOFileData.h | 2 +- code/AssetLib/LWO/LWOLoader.cpp | 2 +- code/AssetLib/LWO/LWOLoader.h | 2 +- code/AssetLib/LWO/LWOMaterial.cpp | 2 +- code/AssetLib/LWS/LWSLoader.cpp | 2 +- code/AssetLib/LWS/LWSLoader.h | 2 +- code/AssetLib/M3D/M3DExporter.cpp | 2 +- code/AssetLib/M3D/M3DExporter.h | 2 +- code/AssetLib/M3D/M3DImporter.cpp | 2 +- code/AssetLib/M3D/M3DImporter.h | 2 +- code/AssetLib/M3D/M3DMaterials.h | 2 +- code/AssetLib/M3D/M3DWrapper.cpp | 2 +- code/AssetLib/M3D/M3DWrapper.h | 2 +- code/AssetLib/MD2/MD2FileData.h | 2 +- code/AssetLib/MD2/MD2Loader.cpp | 2 +- code/AssetLib/MD2/MD2Loader.h | 2 +- code/AssetLib/MD2/MD2NormalTable.h | 2 +- code/AssetLib/MD3/MD3FileData.h | 2 +- code/AssetLib/MD3/MD3Loader.cpp | 2 +- code/AssetLib/MD3/MD3Loader.h | 2 +- code/AssetLib/MD5/MD5Loader.cpp | 2 +- code/AssetLib/MD5/MD5Loader.h | 2 +- code/AssetLib/MD5/MD5Parser.cpp | 2 +- code/AssetLib/MD5/MD5Parser.h | 2 +- code/AssetLib/MDC/MDCFileData.h | 2 +- code/AssetLib/MDC/MDCLoader.cpp | 2 +- code/AssetLib/MDC/MDCLoader.h | 2 +- code/AssetLib/MDL/HalfLife/HL1FileData.h | 2 +- .../MDL/HalfLife/HL1ImportDefinitions.h | 2 +- .../AssetLib/MDL/HalfLife/HL1ImportSettings.h | 2 +- code/AssetLib/MDL/HalfLife/HL1MDLLoader.cpp | 2 +- code/AssetLib/MDL/HalfLife/HL1MDLLoader.h | 2 +- code/AssetLib/MDL/HalfLife/HL1MeshTrivert.h | 2 +- .../MDL/HalfLife/HalfLifeMDLBaseHeader.h | 2 +- code/AssetLib/MDL/HalfLife/LogFunctions.h | 2 +- .../MDL/HalfLife/UniqueNameGenerator.cpp | 2 +- .../MDL/HalfLife/UniqueNameGenerator.h | 2 +- code/AssetLib/MDL/MDLDefaultColorMap.h | 2 +- code/AssetLib/MDL/MDLFileData.h | 2 +- code/AssetLib/MDL/MDLLoader.cpp | 2 +- code/AssetLib/MDL/MDLLoader.h | 2 +- code/AssetLib/MDL/MDLMaterialLoader.cpp | 2 +- code/AssetLib/MMD/MMDCpp14.h | 2 +- code/AssetLib/MMD/MMDImporter.cpp | 2 +- code/AssetLib/MMD/MMDImporter.h | 2 +- code/AssetLib/MMD/MMDPmdParser.h | 2 +- code/AssetLib/MMD/MMDPmxParser.cpp | 2 +- code/AssetLib/MMD/MMDPmxParser.h | 2 +- code/AssetLib/MMD/MMDVmdParser.h | 2 +- code/AssetLib/MS3D/MS3DLoader.cpp | 2 +- code/AssetLib/MS3D/MS3DLoader.h | 2 +- code/AssetLib/NDO/NDOLoader.cpp | 2 +- code/AssetLib/NDO/NDOLoader.h | 2 +- code/AssetLib/NFF/NFFLoader.cpp | 2 +- code/AssetLib/NFF/NFFLoader.h | 2 +- code/AssetLib/OFF/OFFLoader.cpp | 2 +- code/AssetLib/OFF/OFFLoader.h | 2 +- code/AssetLib/Ogre/OgreBinarySerializer.cpp | 2 +- code/AssetLib/Ogre/OgreBinarySerializer.h | 2 +- code/AssetLib/Ogre/OgreImporter.cpp | 2 +- code/AssetLib/Ogre/OgreImporter.h | 2 +- code/AssetLib/Ogre/OgreMaterial.cpp | 2 +- code/AssetLib/Ogre/OgreParsingUtils.h | 2 +- code/AssetLib/Ogre/OgreStructs.cpp | 2 +- code/AssetLib/Ogre/OgreStructs.h | 2 +- code/AssetLib/Ogre/OgreXmlSerializer.cpp | 2 +- code/AssetLib/Ogre/OgreXmlSerializer.h | 2 +- code/AssetLib/OpenGEX/OpenGEXExporter.cpp | 2 +- code/AssetLib/OpenGEX/OpenGEXExporter.h | 2 +- code/AssetLib/OpenGEX/OpenGEXImporter.cpp | 242 +++++++++--------- code/AssetLib/OpenGEX/OpenGEXImporter.h | 2 +- code/AssetLib/OpenGEX/OpenGEXStructs.h | 2 +- code/AssetLib/Ply/PlyExporter.cpp | 2 +- code/AssetLib/Ply/PlyExporter.h | 2 +- code/AssetLib/Ply/PlyLoader.cpp | 2 +- code/AssetLib/Ply/PlyLoader.h | 2 +- code/AssetLib/Ply/PlyParser.cpp | 2 +- code/AssetLib/Ply/PlyParser.h | 2 +- code/AssetLib/Q3BSP/Q3BSPFileData.h | 2 +- code/AssetLib/Q3BSP/Q3BSPFileImporter.cpp | 2 +- code/AssetLib/Q3BSP/Q3BSPFileImporter.h | 2 +- code/AssetLib/Q3BSP/Q3BSPFileParser.cpp | 2 +- code/AssetLib/Q3BSP/Q3BSPFileParser.h | 2 +- code/AssetLib/Q3D/Q3DLoader.cpp | 2 +- code/AssetLib/Q3D/Q3DLoader.h | 2 +- code/AssetLib/Raw/RawLoader.cpp | 2 +- code/AssetLib/Raw/RawLoader.h | 2 +- code/AssetLib/SIB/SIBImporter.cpp | 2 +- code/AssetLib/SIB/SIBImporter.h | 2 +- code/AssetLib/SMD/SMDLoader.cpp | 2 +- code/AssetLib/SMD/SMDLoader.h | 2 +- code/AssetLib/STEPParser/STEPFileEncoding.cpp | 2 +- code/AssetLib/STEPParser/STEPFileEncoding.h | 2 +- code/AssetLib/STEPParser/STEPFileReader.cpp | 2 +- code/AssetLib/STEPParser/STEPFileReader.h | 2 +- code/AssetLib/STL/STLExporter.cpp | 2 +- code/AssetLib/STL/STLExporter.h | 2 +- code/AssetLib/STL/STLLoader.cpp | 2 +- code/AssetLib/STL/STLLoader.h | 2 +- code/AssetLib/Step/StepExporter.cpp | 2 +- code/AssetLib/Step/StepExporter.h | 2 +- code/AssetLib/Terragen/TerragenLoader.cpp | 2 +- code/AssetLib/Terragen/TerragenLoader.h | 2 +- code/AssetLib/Unreal/UnrealLoader.cpp | 2 +- code/AssetLib/Unreal/UnrealLoader.h | 2 +- code/AssetLib/X/XFileExporter.cpp | 2 +- code/AssetLib/X/XFileExporter.h | 2 +- code/AssetLib/X/XFileHelper.h | 2 +- code/AssetLib/X/XFileImporter.cpp | 2 +- code/AssetLib/X/XFileImporter.h | 2 +- code/AssetLib/X/XFileParser.cpp | 2 +- code/AssetLib/X/XFileParser.h | 2 +- code/AssetLib/X3D/X3DImporter.cpp | 2 +- code/AssetLib/X3D/X3DImporter.hpp | 2 +- code/AssetLib/XGL/XGLLoader.cpp | 2 +- code/AssetLib/XGL/XGLLoader.h | 2 +- code/AssetLib/glTF/glTFAsset.h | 2 +- code/AssetLib/glTF/glTFAsset.inl | 2 +- code/AssetLib/glTF/glTFAssetWriter.h | 2 +- code/AssetLib/glTF/glTFAssetWriter.inl | 2 +- code/AssetLib/glTF/glTFCommon.cpp | 2 +- code/AssetLib/glTF/glTFCommon.h | 2 +- code/AssetLib/glTF/glTFExporter.cpp | 2 +- code/AssetLib/glTF/glTFExporter.h | 2 +- code/AssetLib/glTF/glTFImporter.cpp | 2 +- code/AssetLib/glTF/glTFImporter.h | 2 +- code/AssetLib/glTF2/glTF2Asset.h | 2 +- code/AssetLib/glTF2/glTF2Asset.inl | 2 +- code/AssetLib/glTF2/glTF2AssetWriter.h | 2 +- code/AssetLib/glTF2/glTF2AssetWriter.inl | 2 +- code/AssetLib/glTF2/glTF2Exporter.cpp | 2 +- code/AssetLib/glTF2/glTF2Exporter.h | 2 +- code/AssetLib/glTF2/glTF2Importer.cpp | 2 +- code/AssetLib/glTF2/glTF2Importer.h | 2 +- code/CApi/AssimpCExport.cpp | 2 +- code/CApi/CInterfaceIOWrapper.cpp | 2 +- code/CApi/CInterfaceIOWrapper.h | 2 +- code/CMakeLists.txt | 2 +- code/Common/AssertHandler.cpp | 2 +- code/Common/Assimp.cpp | 2 +- code/Common/BaseImporter.cpp | 2 +- code/Common/BaseProcess.cpp | 2 +- code/Common/BaseProcess.h | 2 +- code/Common/Bitmap.cpp | 2 +- code/Common/CreateAnimMesh.cpp | 2 +- code/Common/DefaultIOStream.cpp | 2 +- code/Common/DefaultIOSystem.cpp | 2 +- code/Common/DefaultLogger.cpp | 2 +- code/Common/DefaultProgressHandler.h | 2 +- code/Common/Exceptional.cpp | 2 +- code/Common/Exporter.cpp | 2 +- code/Common/FileLogStream.h | 2 +- code/Common/Importer.cpp | 2 +- code/Common/Importer.h | 2 +- code/Common/ImporterRegistry.cpp | 2 +- code/Common/PolyTools.h | 2 +- code/Common/PostStepRegistry.cpp | 2 +- code/Common/RemoveComments.cpp | 2 +- code/Common/SGSpatialSort.cpp | 2 +- code/Common/SceneCombiner.cpp | 2 +- code/Common/ScenePreprocessor.cpp | 2 +- code/Common/ScenePreprocessor.h | 2 +- code/Common/ScenePrivate.h | 2 +- code/Common/SkeletonMeshBuilder.cpp | 2 +- code/Common/SpatialSort.cpp | 2 +- code/Common/StandardShapes.cpp | 2 +- code/Common/StdOStreamLogStream.h | 2 +- code/Common/Subdivision.cpp | 2 +- code/Common/TargetAnimation.cpp | 2 +- code/Common/TargetAnimation.h | 2 +- code/Common/Version.cpp | 2 +- code/Common/VertexTriangleAdjacency.cpp | 2 +- code/Common/VertexTriangleAdjacency.h | 2 +- code/Common/Win32DebugLogStream.h | 2 +- code/Common/ZipArchiveIOSystem.cpp | 2 +- code/Common/material.cpp | 2 +- code/Common/scene.cpp | 2 +- code/Common/simd.cpp | 2 +- code/Common/simd.h | 2 +- code/Material/MaterialSystem.cpp | 2 +- code/Material/MaterialSystem.h | 2 +- code/Pbrt/PbrtExporter.cpp | 2 +- code/Pbrt/PbrtExporter.h | 2 +- code/PostProcessing/ArmaturePopulate.cpp | 2 +- code/PostProcessing/ArmaturePopulate.h | 2 +- code/PostProcessing/CalcTangentsProcess.cpp | 2 +- code/PostProcessing/CalcTangentsProcess.h | 2 +- .../ComputeUVMappingProcess.cpp | 2 +- code/PostProcessing/ComputeUVMappingProcess.h | 2 +- code/PostProcessing/ConvertToLHProcess.cpp | 2 +- code/PostProcessing/ConvertToLHProcess.h | 2 +- code/PostProcessing/DeboneProcess.cpp | 2 +- code/PostProcessing/DeboneProcess.h | 2 +- .../PostProcessing/DropFaceNormalsProcess.cpp | 2 +- code/PostProcessing/DropFaceNormalsProcess.h | 2 +- code/PostProcessing/EmbedTexturesProcess.cpp | 2 +- code/PostProcessing/EmbedTexturesProcess.h | 2 +- code/PostProcessing/FindDegenerates.cpp | 2 +- code/PostProcessing/FindDegenerates.h | 2 +- code/PostProcessing/FindInstancesProcess.cpp | 2 +- code/PostProcessing/FindInstancesProcess.h | 2 +- .../PostProcessing/FindInvalidDataProcess.cpp | 2 +- code/PostProcessing/FindInvalidDataProcess.h | 2 +- code/PostProcessing/FixNormalsStep.cpp | 2 +- code/PostProcessing/FixNormalsStep.h | 2 +- .../GenBoundingBoxesProcess.cpp | 2 +- code/PostProcessing/GenBoundingBoxesProcess.h | 2 +- code/PostProcessing/GenFaceNormalsProcess.cpp | 2 +- code/PostProcessing/GenFaceNormalsProcess.h | 2 +- .../GenVertexNormalsProcess.cpp | 2 +- code/PostProcessing/GenVertexNormalsProcess.h | 2 +- code/PostProcessing/ImproveCacheLocality.cpp | 2 +- code/PostProcessing/ImproveCacheLocality.h | 2 +- code/PostProcessing/JoinVerticesProcess.cpp | 2 +- code/PostProcessing/JoinVerticesProcess.h | 2 +- .../LimitBoneWeightsProcess.cpp | 2 +- code/PostProcessing/LimitBoneWeightsProcess.h | 2 +- code/PostProcessing/MakeVerboseFormat.cpp | 2 +- code/PostProcessing/MakeVerboseFormat.h | 2 +- code/PostProcessing/OptimizeGraph.cpp | 2 +- code/PostProcessing/OptimizeGraph.h | 2 +- code/PostProcessing/OptimizeMeshes.cpp | 2 +- code/PostProcessing/OptimizeMeshes.h | 2 +- code/PostProcessing/PretransformVertices.cpp | 2 +- code/PostProcessing/PretransformVertices.h | 2 +- code/PostProcessing/ProcessHelper.cpp | 2 +- code/PostProcessing/ProcessHelper.h | 2 +- .../RemoveRedundantMaterials.cpp | 2 +- .../PostProcessing/RemoveRedundantMaterials.h | 2 +- code/PostProcessing/RemoveVCProcess.cpp | 2 +- code/PostProcessing/RemoveVCProcess.h | 2 +- code/PostProcessing/ScaleProcess.cpp | 2 +- code/PostProcessing/ScaleProcess.h | 2 +- code/PostProcessing/SortByPTypeProcess.cpp | 2 +- code/PostProcessing/SortByPTypeProcess.h | 2 +- .../SplitByBoneCountProcess.cpp | 2 +- code/PostProcessing/SplitByBoneCountProcess.h | 2 +- code/PostProcessing/SplitLargeMeshes.cpp | 2 +- code/PostProcessing/SplitLargeMeshes.h | 2 +- code/PostProcessing/TextureTransform.cpp | 2 +- code/PostProcessing/TextureTransform.h | 2 +- code/PostProcessing/TriangulateProcess.cpp | 2 +- code/PostProcessing/TriangulateProcess.h | 2 +- code/PostProcessing/ValidateDataStructure.cpp | 2 +- code/PostProcessing/ValidateDataStructure.h | 2 +- include/assimp/BaseImporter.h | 2 +- include/assimp/Bitmap.h | 2 +- include/assimp/BlobIOSystem.h | 2 +- include/assimp/ByteSwapper.h | 2 +- include/assimp/ColladaMetaData.h | 2 +- include/assimp/CreateAnimMesh.h | 2 +- include/assimp/DefaultIOStream.h | 2 +- include/assimp/DefaultIOSystem.h | 2 +- include/assimp/DefaultLogger.hpp | 2 +- include/assimp/Exceptional.h | 2 +- include/assimp/Exporter.hpp | 2 +- include/assimp/GenericProperty.h | 2 +- include/assimp/GltfMaterial.h | 2 +- include/assimp/Hash.h | 2 +- include/assimp/IOStream.hpp | 2 +- include/assimp/IOStreamBuffer.h | 2 +- include/assimp/IOSystem.hpp | 2 +- include/assimp/Importer.hpp | 2 +- include/assimp/LineSplitter.h | 2 +- include/assimp/LogAux.h | 2 +- include/assimp/LogStream.hpp | 2 +- include/assimp/Logger.hpp | 2 +- include/assimp/MathFunctions.h | 2 +- include/assimp/MemoryIOWrapper.h | 2 +- include/assimp/NullLogger.hpp | 2 +- include/assimp/ParsingUtils.h | 2 +- include/assimp/Profiler.h | 2 +- include/assimp/ProgressHandler.hpp | 2 +- include/assimp/RemoveComments.h | 2 +- include/assimp/SGSpatialSort.h | 2 +- include/assimp/SceneCombiner.h | 2 +- include/assimp/SkeletonMeshBuilder.h | 2 +- include/assimp/SmallVector.h | 2 +- include/assimp/SmoothingGroups.h | 2 +- include/assimp/SmoothingGroups.inl | 2 +- include/assimp/SpatialSort.h | 2 +- include/assimp/StandardShapes.h | 2 +- include/assimp/StreamReader.h | 2 +- include/assimp/StreamWriter.h | 2 +- include/assimp/StringComparison.h | 2 +- include/assimp/StringUtils.h | 2 +- include/assimp/Subdivision.h | 2 +- include/assimp/TinyFormatter.h | 2 +- include/assimp/Vertex.h | 2 +- include/assimp/XMLTools.h | 2 +- include/assimp/XmlParser.h | 2 +- include/assimp/ZipArchiveIOSystem.h | 2 +- include/assimp/aabb.h | 2 +- include/assimp/ai_assert.h | 2 +- include/assimp/anim.h | 2 +- include/assimp/camera.h | 2 +- include/assimp/cexport.h | 2 +- include/assimp/cfileio.h | 2 +- include/assimp/cimport.h | 2 +- include/assimp/color4.h | 2 +- include/assimp/color4.inl | 2 +- include/assimp/commonMetaData.h | 2 +- include/assimp/defs.h | 2 +- include/assimp/importerdesc.h | 2 +- include/assimp/light.h | 2 +- include/assimp/material.h | 2 +- include/assimp/material.inl | 2 +- include/assimp/matrix3x3.h | 2 +- include/assimp/matrix3x3.inl | 2 +- include/assimp/matrix4x4.h | 2 +- include/assimp/matrix4x4.inl | 2 +- include/assimp/mesh.h | 2 +- include/assimp/metadata.h | 2 +- include/assimp/pbrmaterial.h | 2 +- include/assimp/postprocess.h | 2 +- include/assimp/qnan.h | 2 +- include/assimp/quaternion.h | 2 +- include/assimp/quaternion.inl | 2 +- include/assimp/scene.h | 2 +- include/assimp/texture.h | 2 +- include/assimp/types.h | 2 +- include/assimp/vector2.h | 2 +- include/assimp/vector2.inl | 2 +- include/assimp/vector3.h | 2 +- include/assimp/vector3.inl | 2 +- include/assimp/version.h | 2 +- test/CMakeLists.txt | 2 +- test/unit/AbstractImportExportBase.cpp | 2 +- test/unit/AssimpAPITest.cpp | 2 +- test/unit/AssimpAPITest_aiMatrix3x3.cpp | 2 +- test/unit/AssimpAPITest_aiMatrix4x4.cpp | 2 +- test/unit/AssimpAPITest_aiQuaternion.cpp | 2 +- test/unit/AssimpAPITest_aiVector2D.cpp | 2 +- test/unit/AssimpAPITest_aiVector3D.cpp | 2 +- test/unit/Common/uiScene.cpp | 2 +- test/unit/Common/utAssertHandler.cpp | 2 +- test/unit/Common/utLineSplitter.cpp | 2 +- test/unit/Common/utMesh.cpp | 2 +- test/unit/Common/utSpatialSort.cpp | 2 +- test/unit/Common/utStandardShapes.cpp | 2 +- test/unit/Common/utXmlParser.cpp | 2 +- test/unit/ImportExport/MDL/MDLHL1TestFiles.h | 2 +- .../MDL/utMDLImporter_HL1_ImportSettings.cpp | 2 +- .../MDL/utMDLImporter_HL1_Materials.cpp | 2 +- .../MDL/utMDLImporter_HL1_Nodes.cpp | 2 +- .../ImportExport/RAW/utRAWImportExport.cpp | 2 +- .../Terragen/utTerragenImportExport.cpp | 2 +- .../ImportExport/utAssjsonImportExport.cpp | 2 +- test/unit/ImportExport/utCOBImportExport.cpp | 2 +- test/unit/ImportExport/utExporter.cpp | 2 +- test/unit/ImportExport/utMD2Importer.cpp | 2 +- test/unit/ImportExport/utMD5Importer.cpp | 2 +- test/unit/ImportExport/utMDLImporter.cpp | 2 +- test/unit/ImportExport/utNFFImportExport.cpp | 2 +- test/unit/ImportExport/utOFFImportExport.cpp | 2 +- test/unit/ImportExport/utOgreImportExport.cpp | 2 +- .../ImportExport/utQ3BSPFileImportExport.cpp | 2 +- test/unit/ImportExport/utXGLImportExport.cpp | 2 +- test/unit/MathTest.cpp | 2 +- test/unit/MathTest.h | 2 +- test/unit/RandomNumberGeneration.h | 2 +- test/unit/SceneDiffer.cpp | 2 +- test/unit/SceneDiffer.h | 2 +- test/unit/TestIOSystem.h | 2 +- test/unit/TestModelFactory.h | 2 +- test/unit/UTLogStream.h | 2 +- test/unit/ut3DImportExport.cpp | 2 +- test/unit/ut3DSImportExport.cpp | 2 +- test/unit/utACImportExport.cpp | 2 +- test/unit/utAMFImportExport.cpp | 2 +- test/unit/utASEImportExport.cpp | 2 +- test/unit/utAnim.cpp | 2 +- test/unit/utArmaturePopulate.cpp | 2 +- test/unit/utAssbinImportExport.cpp | 2 +- test/unit/utB3DImportExport.cpp | 2 +- test/unit/utBVHImportExport.cpp | 2 +- test/unit/utBatchLoader.cpp | 2 +- test/unit/utBlendImportAreaLight.cpp | 2 +- test/unit/utBlendImportMaterials.cpp | 2 +- test/unit/utBlenderImportExport.cpp | 2 +- test/unit/utBlenderIntermediate.cpp | 2 +- test/unit/utBlenderWork.cpp | 2 +- test/unit/utCSMImportExport.cpp | 2 +- test/unit/utColladaExport.cpp | 2 +- test/unit/utColladaImportExport.cpp | 2 +- test/unit/utD3MFImportExport.cpp | 2 +- test/unit/utDXFImporterExporter.cpp | 2 +- test/unit/utDefaultIOStream.cpp | 2 +- test/unit/utFBXImporterExporter.cpp | 2 +- test/unit/utFastAtof.cpp | 2 +- test/unit/utFindDegenerates.cpp | 2 +- test/unit/utFindInvalidData.cpp | 2 +- test/unit/utFixInfacingNormals.cpp | 2 +- test/unit/utGenBoundingBoxesProcess.cpp | 2 +- test/unit/utGenNormals.cpp | 2 +- test/unit/utHMPImportExport.cpp | 2 +- test/unit/utIFCImportExport.cpp | 2 +- test/unit/utIOStreamBuffer.cpp | 2 +- test/unit/utIOSystem.cpp | 2 +- test/unit/utImporter.cpp | 2 +- test/unit/utImproveCacheLocality.cpp | 2 +- test/unit/utIssues.cpp | 2 +- test/unit/utJoinVertices.cpp | 2 +- test/unit/utLWOImportExport.cpp | 2 +- test/unit/utLWSImportExport.cpp | 2 +- test/unit/utLimitBoneWeights.cpp | 2 +- test/unit/utMDCImportExport.cpp | 2 +- test/unit/utMaterialSystem.cpp | 2 +- test/unit/utMatrix3x3.cpp | 2 +- test/unit/utMatrix4x4.cpp | 2 +- test/unit/utMetadata.cpp | 2 +- test/unit/utObjImportExport.cpp | 2 +- test/unit/utObjTools.cpp | 2 +- test/unit/utOpenGEXImportExport.cpp | 2 +- test/unit/utPLYImportExport.cpp | 2 +- test/unit/utPMXImporter.cpp | 2 +- test/unit/utPretransformVertices.cpp | 2 +- test/unit/utProfiler.cpp | 2 +- test/unit/utQ3DImportExport.cpp | 2 +- test/unit/utRemoveComments.cpp | 2 +- test/unit/utRemoveComponent.cpp | 2 +- test/unit/utRemoveRedundantMaterials.cpp | 2 +- test/unit/utRemoveVCProcess.cpp | 2 +- test/unit/utSIBImporter.cpp | 2 +- test/unit/utSMDImportExport.cpp | 2 +- test/unit/utSTLImportExport.cpp | 2 +- test/unit/utScaleProcess.cpp | 2 +- test/unit/utSceneCombiner.cpp | 2 +- test/unit/utScenePreprocessor.cpp | 2 +- test/unit/utSharedPPData.cpp | 2 +- test/unit/utSimd.cpp | 2 +- test/unit/utSortByPType.cpp | 2 +- test/unit/utSplitLargeMeshes.cpp | 2 +- test/unit/utStringUtils.cpp | 2 +- test/unit/utTargetAnimation.cpp | 2 +- test/unit/utTextureTransform.cpp | 2 +- test/unit/utTriangulate.cpp | 2 +- test/unit/utTypes.cpp | 2 +- test/unit/utVector3.cpp | 2 +- test/unit/utVersion.cpp | 2 +- test/unit/utVertexTriangleAdjacency.cpp | 2 +- test/unit/utX3DImportExport.cpp | 2 +- test/unit/utXImporterExporter.cpp | 2 +- test/unit/utglTF2ImportExport.cpp | 2 +- test/unit/utglTFImportExport.cpp | 2 +- tools/assimp_cmd/CMakeLists.txt | 2 +- tools/assimp_cmd/CompareDump.cpp | 2 +- tools/assimp_cmd/Export.cpp | 2 +- tools/assimp_cmd/ImageExtractor.cpp | 2 +- tools/assimp_cmd/Info.cpp | 2 +- tools/assimp_cmd/Main.cpp | 2 +- tools/assimp_cmd/Main.h | 2 +- tools/assimp_cmd/WriteDump.cpp | 2 +- tools/assimp_view/AnimEvaluator.cpp | 2 +- tools/assimp_view/AnimEvaluator.h | 2 +- tools/assimp_view/AssetHelper.h | 2 +- tools/assimp_view/Background.cpp | 2 +- tools/assimp_view/CMakeLists.txt | 2 +- tools/assimp_view/Display.cpp | 2 +- tools/assimp_view/HelpDialog.cpp | 2 +- tools/assimp_view/Input.cpp | 2 +- tools/assimp_view/LogDisplay.cpp | 2 +- tools/assimp_view/LogWindow.cpp | 10 +- tools/assimp_view/Material.cpp | 2 +- tools/assimp_view/MaterialManager.h | 2 +- tools/assimp_view/MeshRenderer.cpp | 2 +- tools/assimp_view/MessageProc.cpp | 2 +- tools/assimp_view/Normals.cpp | 2 +- tools/assimp_view/SceneAnimator.cpp | 2 +- tools/assimp_view/SceneAnimator.h | 2 +- tools/assimp_view/Shaders.cpp | 2 +- tools/assimp_view/assimp_view.cpp | 2 +- tools/assimp_view/assimp_view.h | 2 +- 599 files changed, 722 insertions(+), 724 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 39233fe88..cd12d3a9d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,6 @@ # Open Asset Import Library (assimp) # ---------------------------------------------------------------------- -# Copyright (c) 2006-2021, assimp team +# Copyright (c) 2006-2022, assimp team # # All rights reserved. # diff --git a/code/AssetLib/3DS/3DSConverter.cpp b/code/AssetLib/3DS/3DSConverter.cpp index add1553bc..5a01429e4 100644 --- a/code/AssetLib/3DS/3DSConverter.cpp +++ b/code/AssetLib/3DS/3DSConverter.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/3DS/3DSExporter.cpp b/code/AssetLib/3DS/3DSExporter.cpp index ea92fa12c..71588f935 100644 --- a/code/AssetLib/3DS/3DSExporter.cpp +++ b/code/AssetLib/3DS/3DSExporter.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/3DS/3DSExporter.h b/code/AssetLib/3DS/3DSExporter.h index 8ac3da98c..82ec3512f 100644 --- a/code/AssetLib/3DS/3DSExporter.h +++ b/code/AssetLib/3DS/3DSExporter.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/3DS/3DSHelper.h b/code/AssetLib/3DS/3DSHelper.h index 3a5479de2..dc1098035 100644 --- a/code/AssetLib/3DS/3DSHelper.h +++ b/code/AssetLib/3DS/3DSHelper.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/3DS/3DSLoader.cpp b/code/AssetLib/3DS/3DSLoader.cpp index 05b5117ba..47ff361b3 100644 --- a/code/AssetLib/3DS/3DSLoader.cpp +++ b/code/AssetLib/3DS/3DSLoader.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/3DS/3DSLoader.h b/code/AssetLib/3DS/3DSLoader.h index bd167872f..f47fcfef9 100644 --- a/code/AssetLib/3DS/3DSLoader.h +++ b/code/AssetLib/3DS/3DSLoader.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/3MF/3MFTypes.h b/code/AssetLib/3MF/3MFTypes.h index c4e9e4243..987cdf613 100644 --- a/code/AssetLib/3MF/3MFTypes.h +++ b/code/AssetLib/3MF/3MFTypes.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/3MF/3MFXmlTags.h b/code/AssetLib/3MF/3MFXmlTags.h index a6e9758c1..63f18b455 100644 --- a/code/AssetLib/3MF/3MFXmlTags.h +++ b/code/AssetLib/3MF/3MFXmlTags.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/3MF/D3MFExporter.cpp b/code/AssetLib/3MF/D3MFExporter.cpp index 76a601cbe..42cd991e6 100644 --- a/code/AssetLib/3MF/D3MFExporter.cpp +++ b/code/AssetLib/3MF/D3MFExporter.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/3MF/D3MFExporter.h b/code/AssetLib/3MF/D3MFExporter.h index df25e305e..680d54f91 100644 --- a/code/AssetLib/3MF/D3MFExporter.h +++ b/code/AssetLib/3MF/D3MFExporter.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/3MF/D3MFImporter.cpp b/code/AssetLib/3MF/D3MFImporter.cpp index 58dde9738..fc02df7bd 100644 --- a/code/AssetLib/3MF/D3MFImporter.cpp +++ b/code/AssetLib/3MF/D3MFImporter.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/3MF/D3MFImporter.h b/code/AssetLib/3MF/D3MFImporter.h index 7219fa39d..a39ae790f 100644 --- a/code/AssetLib/3MF/D3MFImporter.h +++ b/code/AssetLib/3MF/D3MFImporter.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/3MF/D3MFOpcPackage.cpp b/code/AssetLib/3MF/D3MFOpcPackage.cpp index 8d51a7417..f88039ae8 100644 --- a/code/AssetLib/3MF/D3MFOpcPackage.cpp +++ b/code/AssetLib/3MF/D3MFOpcPackage.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/3MF/D3MFOpcPackage.h b/code/AssetLib/3MF/D3MFOpcPackage.h index 27bf44ff2..f6803a0ef 100644 --- a/code/AssetLib/3MF/D3MFOpcPackage.h +++ b/code/AssetLib/3MF/D3MFOpcPackage.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/3MF/XmlSerializer.cpp b/code/AssetLib/3MF/XmlSerializer.cpp index 985286fa7..9bd1c5bb0 100644 --- a/code/AssetLib/3MF/XmlSerializer.cpp +++ b/code/AssetLib/3MF/XmlSerializer.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/3MF/XmlSerializer.h b/code/AssetLib/3MF/XmlSerializer.h index 14da82e99..6cf6a70a9 100644 --- a/code/AssetLib/3MF/XmlSerializer.h +++ b/code/AssetLib/3MF/XmlSerializer.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/AC/ACLoader.cpp b/code/AssetLib/AC/ACLoader.cpp index 078c96e32..fe9f34f4e 100644 --- a/code/AssetLib/AC/ACLoader.cpp +++ b/code/AssetLib/AC/ACLoader.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/AC/ACLoader.h b/code/AssetLib/AC/ACLoader.h index 5b706a4a0..aabc114e3 100644 --- a/code/AssetLib/AC/ACLoader.h +++ b/code/AssetLib/AC/ACLoader.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/AMF/AMFImporter.cpp b/code/AssetLib/AMF/AMFImporter.cpp index 9a9ab94ca..b44391e1f 100644 --- a/code/AssetLib/AMF/AMFImporter.cpp +++ b/code/AssetLib/AMF/AMFImporter.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/AMF/AMFImporter.hpp b/code/AssetLib/AMF/AMFImporter.hpp index a71b6671e..601eae4e4 100644 --- a/code/AssetLib/AMF/AMFImporter.hpp +++ b/code/AssetLib/AMF/AMFImporter.hpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/AMF/AMFImporter_Geometry.cpp b/code/AssetLib/AMF/AMFImporter_Geometry.cpp index 1d2a1f5b4..341999f56 100644 --- a/code/AssetLib/AMF/AMFImporter_Geometry.cpp +++ b/code/AssetLib/AMF/AMFImporter_Geometry.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/AMF/AMFImporter_Material.cpp b/code/AssetLib/AMF/AMFImporter_Material.cpp index 6d93a43b6..676e74856 100644 --- a/code/AssetLib/AMF/AMFImporter_Material.cpp +++ b/code/AssetLib/AMF/AMFImporter_Material.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/AMF/AMFImporter_Node.hpp b/code/AssetLib/AMF/AMFImporter_Node.hpp index b466e339b..c827533a6 100644 --- a/code/AssetLib/AMF/AMFImporter_Node.hpp +++ b/code/AssetLib/AMF/AMFImporter_Node.hpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/AMF/AMFImporter_Postprocess.cpp b/code/AssetLib/AMF/AMFImporter_Postprocess.cpp index 3674f3d25..a65f9260e 100644 --- a/code/AssetLib/AMF/AMFImporter_Postprocess.cpp +++ b/code/AssetLib/AMF/AMFImporter_Postprocess.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/ASE/ASELoader.cpp b/code/AssetLib/ASE/ASELoader.cpp index fae441f57..65267e276 100644 --- a/code/AssetLib/ASE/ASELoader.cpp +++ b/code/AssetLib/ASE/ASELoader.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/ASE/ASELoader.h b/code/AssetLib/ASE/ASELoader.h index 9ec9d439f..cd9123556 100644 --- a/code/AssetLib/ASE/ASELoader.h +++ b/code/AssetLib/ASE/ASELoader.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/ASE/ASEParser.cpp b/code/AssetLib/ASE/ASEParser.cpp index a2884b8dd..4e381a8e0 100644 --- a/code/AssetLib/ASE/ASEParser.cpp +++ b/code/AssetLib/ASE/ASEParser.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/ASE/ASEParser.h b/code/AssetLib/ASE/ASEParser.h index f49cfc36f..5c24fffd1 100644 --- a/code/AssetLib/ASE/ASEParser.h +++ b/code/AssetLib/ASE/ASEParser.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Assbin/AssbinExporter.cpp b/code/AssetLib/Assbin/AssbinExporter.cpp index 7f58e2cf4..149b3c5f3 100644 --- a/code/AssetLib/Assbin/AssbinExporter.cpp +++ b/code/AssetLib/Assbin/AssbinExporter.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Assbin/AssbinExporter.h b/code/AssetLib/Assbin/AssbinExporter.h index b6f2acd3d..1801c1680 100644 --- a/code/AssetLib/Assbin/AssbinExporter.h +++ b/code/AssetLib/Assbin/AssbinExporter.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Assbin/AssbinFileWriter.cpp b/code/AssetLib/Assbin/AssbinFileWriter.cpp index 21bfd8512..72fbfdcb1 100644 --- a/code/AssetLib/Assbin/AssbinFileWriter.cpp +++ b/code/AssetLib/Assbin/AssbinFileWriter.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Assbin/AssbinFileWriter.h b/code/AssetLib/Assbin/AssbinFileWriter.h index 7b1d1e304..cfed3b400 100644 --- a/code/AssetLib/Assbin/AssbinFileWriter.h +++ b/code/AssetLib/Assbin/AssbinFileWriter.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Assbin/AssbinLoader.cpp b/code/AssetLib/Assbin/AssbinLoader.cpp index 5ca4b3e11..060ce4377 100644 --- a/code/AssetLib/Assbin/AssbinLoader.cpp +++ b/code/AssetLib/Assbin/AssbinLoader.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Assbin/AssbinLoader.h b/code/AssetLib/Assbin/AssbinLoader.h index 47f38db2a..f922b91fd 100644 --- a/code/AssetLib/Assbin/AssbinLoader.h +++ b/code/AssetLib/Assbin/AssbinLoader.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Assxml/AssxmlExporter.cpp b/code/AssetLib/Assxml/AssxmlExporter.cpp index d244813b1..731916a25 100644 --- a/code/AssetLib/Assxml/AssxmlExporter.cpp +++ b/code/AssetLib/Assxml/AssxmlExporter.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Assxml/AssxmlExporter.h b/code/AssetLib/Assxml/AssxmlExporter.h index 9a3d1f9d5..6fcdebfab 100644 --- a/code/AssetLib/Assxml/AssxmlExporter.h +++ b/code/AssetLib/Assxml/AssxmlExporter.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Assxml/AssxmlFileWriter.cpp b/code/AssetLib/Assxml/AssxmlFileWriter.cpp index 80c2db908..640890ea1 100644 --- a/code/AssetLib/Assxml/AssxmlFileWriter.cpp +++ b/code/AssetLib/Assxml/AssxmlFileWriter.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Assxml/AssxmlFileWriter.h b/code/AssetLib/Assxml/AssxmlFileWriter.h index 125869d1a..0620c9db7 100644 --- a/code/AssetLib/Assxml/AssxmlFileWriter.h +++ b/code/AssetLib/Assxml/AssxmlFileWriter.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/B3D/B3DImporter.cpp b/code/AssetLib/B3D/B3DImporter.cpp index 11f7bcd14..0bc3b7d0b 100644 --- a/code/AssetLib/B3D/B3DImporter.cpp +++ b/code/AssetLib/B3D/B3DImporter.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/B3D/B3DImporter.h b/code/AssetLib/B3D/B3DImporter.h index bb535afd1..e47d9078b 100644 --- a/code/AssetLib/B3D/B3DImporter.h +++ b/code/AssetLib/B3D/B3DImporter.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/BVH/BVHLoader.cpp b/code/AssetLib/BVH/BVHLoader.cpp index 6dc824e2f..e09e54184 100644 --- a/code/AssetLib/BVH/BVHLoader.cpp +++ b/code/AssetLib/BVH/BVHLoader.cpp @@ -4,7 +4,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/code/AssetLib/BVH/BVHLoader.h b/code/AssetLib/BVH/BVHLoader.h index 70511483d..56c32bd99 100644 --- a/code/AssetLib/BVH/BVHLoader.h +++ b/code/AssetLib/BVH/BVHLoader.h @@ -4,7 +4,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Blender/BlenderBMesh.cpp b/code/AssetLib/Blender/BlenderBMesh.cpp index ecacd1c7d..be536ebdb 100644 --- a/code/AssetLib/Blender/BlenderBMesh.cpp +++ b/code/AssetLib/Blender/BlenderBMesh.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. Redistribution and use of this software in source and binary forms, diff --git a/code/AssetLib/Blender/BlenderBMesh.h b/code/AssetLib/Blender/BlenderBMesh.h index df695cbbf..45ca2c806 100644 --- a/code/AssetLib/Blender/BlenderBMesh.h +++ b/code/AssetLib/Blender/BlenderBMesh.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. Redistribution and use of this software in source and binary forms, diff --git a/code/AssetLib/Blender/BlenderDNA.cpp b/code/AssetLib/Blender/BlenderDNA.cpp index 3da0dce31..2910904ba 100644 --- a/code/AssetLib/Blender/BlenderDNA.cpp +++ b/code/AssetLib/Blender/BlenderDNA.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Blender/BlenderDNA.h b/code/AssetLib/Blender/BlenderDNA.h index 871ee71a1..b2158f283 100644 --- a/code/AssetLib/Blender/BlenderDNA.h +++ b/code/AssetLib/Blender/BlenderDNA.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Blender/BlenderDNA.inl b/code/AssetLib/Blender/BlenderDNA.inl index a46532057..4f64987a5 100644 --- a/code/AssetLib/Blender/BlenderDNA.inl +++ b/code/AssetLib/Blender/BlenderDNA.inl @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Blender/BlenderIntermediate.h b/code/AssetLib/Blender/BlenderIntermediate.h index 68c42f5d6..0651f7117 100644 --- a/code/AssetLib/Blender/BlenderIntermediate.h +++ b/code/AssetLib/Blender/BlenderIntermediate.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Blender/BlenderLoader.cpp b/code/AssetLib/Blender/BlenderLoader.cpp index 04c911757..e99fbec0f 100644 --- a/code/AssetLib/Blender/BlenderLoader.cpp +++ b/code/AssetLib/Blender/BlenderLoader.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Blender/BlenderLoader.h b/code/AssetLib/Blender/BlenderLoader.h index 94f034cd1..0299ae393 100644 --- a/code/AssetLib/Blender/BlenderLoader.h +++ b/code/AssetLib/Blender/BlenderLoader.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Blender/BlenderModifier.cpp b/code/AssetLib/Blender/BlenderModifier.cpp index bc5c8c2d9..d2b393dc4 100644 --- a/code/AssetLib/Blender/BlenderModifier.cpp +++ b/code/AssetLib/Blender/BlenderModifier.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Blender/BlenderModifier.h b/code/AssetLib/Blender/BlenderModifier.h index d2fea43c1..5af560caf 100644 --- a/code/AssetLib/Blender/BlenderModifier.h +++ b/code/AssetLib/Blender/BlenderModifier.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Blender/BlenderScene.h b/code/AssetLib/Blender/BlenderScene.h index ebc6a27e6..c153d3c22 100644 --- a/code/AssetLib/Blender/BlenderScene.h +++ b/code/AssetLib/Blender/BlenderScene.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Blender/BlenderTessellator.cpp b/code/AssetLib/Blender/BlenderTessellator.cpp index acf26e1b2..d3d463ece 100644 --- a/code/AssetLib/Blender/BlenderTessellator.cpp +++ b/code/AssetLib/Blender/BlenderTessellator.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Blender/BlenderTessellator.h b/code/AssetLib/Blender/BlenderTessellator.h index 115bb9bcb..0d0ba320e 100644 --- a/code/AssetLib/Blender/BlenderTessellator.h +++ b/code/AssetLib/Blender/BlenderTessellator.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/COB/COBLoader.cpp b/code/AssetLib/COB/COBLoader.cpp index 647f49052..fae38b708 100644 --- a/code/AssetLib/COB/COBLoader.cpp +++ b/code/AssetLib/COB/COBLoader.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/COB/COBLoader.h b/code/AssetLib/COB/COBLoader.h index 3b6f67070..e6eb96dc1 100644 --- a/code/AssetLib/COB/COBLoader.h +++ b/code/AssetLib/COB/COBLoader.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/COB/COBScene.h b/code/AssetLib/COB/COBScene.h index d2ce11dd5..57620ca51 100644 --- a/code/AssetLib/COB/COBScene.h +++ b/code/AssetLib/COB/COBScene.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/CSM/CSMLoader.cpp b/code/AssetLib/CSM/CSMLoader.cpp index 1c2de33d3..2a309b365 100644 --- a/code/AssetLib/CSM/CSMLoader.cpp +++ b/code/AssetLib/CSM/CSMLoader.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/code/AssetLib/CSM/CSMLoader.h b/code/AssetLib/CSM/CSMLoader.h index e30d8fc5b..e9c4cd5ee 100644 --- a/code/AssetLib/CSM/CSMLoader.h +++ b/code/AssetLib/CSM/CSMLoader.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Collada/ColladaExporter.cpp b/code/AssetLib/Collada/ColladaExporter.cpp index 2b2064ef5..5c91daa1a 100644 --- a/code/AssetLib/Collada/ColladaExporter.cpp +++ b/code/AssetLib/Collada/ColladaExporter.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Collada/ColladaExporter.h b/code/AssetLib/Collada/ColladaExporter.h index b046e966e..56415fba7 100644 --- a/code/AssetLib/Collada/ColladaExporter.h +++ b/code/AssetLib/Collada/ColladaExporter.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Collada/ColladaHelper.cpp b/code/AssetLib/Collada/ColladaHelper.cpp index 0677a41f7..0fb172fbb 100644 --- a/code/AssetLib/Collada/ColladaHelper.cpp +++ b/code/AssetLib/Collada/ColladaHelper.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Collada/ColladaHelper.h b/code/AssetLib/Collada/ColladaHelper.h index c95a13d2f..31d7b5ae5 100644 --- a/code/AssetLib/Collada/ColladaHelper.h +++ b/code/AssetLib/Collada/ColladaHelper.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Collada/ColladaLoader.cpp b/code/AssetLib/Collada/ColladaLoader.cpp index 6f40c1a78..7f6862de4 100644 --- a/code/AssetLib/Collada/ColladaLoader.cpp +++ b/code/AssetLib/Collada/ColladaLoader.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Collada/ColladaLoader.h b/code/AssetLib/Collada/ColladaLoader.h index 9e2980e3c..246abed22 100644 --- a/code/AssetLib/Collada/ColladaLoader.h +++ b/code/AssetLib/Collada/ColladaLoader.h @@ -4,7 +4,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Collada/ColladaParser.cpp b/code/AssetLib/Collada/ColladaParser.cpp index 8bbdf02cc..7a4a7e62e 100644 --- a/code/AssetLib/Collada/ColladaParser.cpp +++ b/code/AssetLib/Collada/ColladaParser.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Collada/ColladaParser.h b/code/AssetLib/Collada/ColladaParser.h index 73e836b32..15982934f 100644 --- a/code/AssetLib/Collada/ColladaParser.h +++ b/code/AssetLib/Collada/ColladaParser.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- - Copyright (c) 2006-2021, assimp team + Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/DXF/DXFHelper.h b/code/AssetLib/DXF/DXFHelper.h index c7e75c3b1..e50c471d2 100644 --- a/code/AssetLib/DXF/DXFHelper.h +++ b/code/AssetLib/DXF/DXFHelper.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/DXF/DXFLoader.cpp b/code/AssetLib/DXF/DXFLoader.cpp index 2f1aa6961..c18ad8293 100644 --- a/code/AssetLib/DXF/DXFLoader.cpp +++ b/code/AssetLib/DXF/DXFLoader.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/DXF/DXFLoader.h b/code/AssetLib/DXF/DXFLoader.h index 2aace91b2..b32ae106f 100644 --- a/code/AssetLib/DXF/DXFLoader.h +++ b/code/AssetLib/DXF/DXFLoader.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/FBX/FBXAnimation.cpp b/code/AssetLib/FBX/FBXAnimation.cpp index 0fdc3517a..2fa3b7b05 100644 --- a/code/AssetLib/FBX/FBXAnimation.cpp +++ b/code/AssetLib/FBX/FBXAnimation.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/FBX/FBXBinaryTokenizer.cpp b/code/AssetLib/FBX/FBXBinaryTokenizer.cpp index 348812054..1a4d11856 100644 --- a/code/AssetLib/FBX/FBXBinaryTokenizer.cpp +++ b/code/AssetLib/FBX/FBXBinaryTokenizer.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/FBX/FBXCommon.h b/code/AssetLib/FBX/FBXCommon.h index 5ce6a7d15..54e2e9e50 100644 --- a/code/AssetLib/FBX/FBXCommon.h +++ b/code/AssetLib/FBX/FBXCommon.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/FBX/FBXCompileConfig.h b/code/AssetLib/FBX/FBXCompileConfig.h index 49860b844..75787d303 100644 --- a/code/AssetLib/FBX/FBXCompileConfig.h +++ b/code/AssetLib/FBX/FBXCompileConfig.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/FBX/FBXConverter.cpp b/code/AssetLib/FBX/FBXConverter.cpp index b1be6ed37..3cefed023 100644 --- a/code/AssetLib/FBX/FBXConverter.cpp +++ b/code/AssetLib/FBX/FBXConverter.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/FBX/FBXConverter.h b/code/AssetLib/FBX/FBXConverter.h index 20aaa4435..becfdb3e8 100644 --- a/code/AssetLib/FBX/FBXConverter.h +++ b/code/AssetLib/FBX/FBXConverter.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/FBX/FBXDeformer.cpp b/code/AssetLib/FBX/FBXDeformer.cpp index d26807184..ba245ed6d 100644 --- a/code/AssetLib/FBX/FBXDeformer.cpp +++ b/code/AssetLib/FBX/FBXDeformer.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/FBX/FBXDocument.cpp b/code/AssetLib/FBX/FBXDocument.cpp index 8e0439e18..f228b1749 100644 --- a/code/AssetLib/FBX/FBXDocument.cpp +++ b/code/AssetLib/FBX/FBXDocument.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/FBX/FBXDocument.h b/code/AssetLib/FBX/FBXDocument.h index eeb173cd0..bac7e7769 100644 --- a/code/AssetLib/FBX/FBXDocument.h +++ b/code/AssetLib/FBX/FBXDocument.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/FBX/FBXDocumentUtil.cpp b/code/AssetLib/FBX/FBXDocumentUtil.cpp index ab15298a8..68185e564 100644 --- a/code/AssetLib/FBX/FBXDocumentUtil.cpp +++ b/code/AssetLib/FBX/FBXDocumentUtil.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/FBX/FBXExportNode.cpp b/code/AssetLib/FBX/FBXExportNode.cpp index 817308ec8..21c61b257 100644 --- a/code/AssetLib/FBX/FBXExportNode.cpp +++ b/code/AssetLib/FBX/FBXExportNode.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/FBX/FBXExportNode.h b/code/AssetLib/FBX/FBXExportNode.h index 3aca98939..c6c4549d5 100644 --- a/code/AssetLib/FBX/FBXExportNode.h +++ b/code/AssetLib/FBX/FBXExportNode.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/FBX/FBXExportProperty.cpp b/code/AssetLib/FBX/FBXExportProperty.cpp index 1e88042c6..3216d7d85 100644 --- a/code/AssetLib/FBX/FBXExportProperty.cpp +++ b/code/AssetLib/FBX/FBXExportProperty.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/FBX/FBXExportProperty.h b/code/AssetLib/FBX/FBXExportProperty.h index 16fb0f144..26d0cf223 100644 --- a/code/AssetLib/FBX/FBXExportProperty.h +++ b/code/AssetLib/FBX/FBXExportProperty.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/FBX/FBXExporter.cpp b/code/AssetLib/FBX/FBXExporter.cpp index 66e14c75c..695672883 100644 --- a/code/AssetLib/FBX/FBXExporter.cpp +++ b/code/AssetLib/FBX/FBXExporter.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/FBX/FBXExporter.h b/code/AssetLib/FBX/FBXExporter.h index d249b7bee..659f9368a 100644 --- a/code/AssetLib/FBX/FBXExporter.h +++ b/code/AssetLib/FBX/FBXExporter.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/FBX/FBXImportSettings.h b/code/AssetLib/FBX/FBXImportSettings.h index bd1c8bddc..90e64bf04 100644 --- a/code/AssetLib/FBX/FBXImportSettings.h +++ b/code/AssetLib/FBX/FBXImportSettings.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/FBX/FBXImporter.cpp b/code/AssetLib/FBX/FBXImporter.cpp index 2416b9a2f..30b8b3215 100644 --- a/code/AssetLib/FBX/FBXImporter.cpp +++ b/code/AssetLib/FBX/FBXImporter.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/FBX/FBXImporter.h b/code/AssetLib/FBX/FBXImporter.h index 2d01f5434..a212efe11 100644 --- a/code/AssetLib/FBX/FBXImporter.h +++ b/code/AssetLib/FBX/FBXImporter.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/FBX/FBXMaterial.cpp b/code/AssetLib/FBX/FBXMaterial.cpp index 7eb047177..8849179f3 100644 --- a/code/AssetLib/FBX/FBXMaterial.cpp +++ b/code/AssetLib/FBX/FBXMaterial.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/FBX/FBXMeshGeometry.cpp b/code/AssetLib/FBX/FBXMeshGeometry.cpp index 6aeebcbe3..1f92fa1a7 100644 --- a/code/AssetLib/FBX/FBXMeshGeometry.cpp +++ b/code/AssetLib/FBX/FBXMeshGeometry.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/FBX/FBXMeshGeometry.h b/code/AssetLib/FBX/FBXMeshGeometry.h index 862693b4b..3cca38aa5 100644 --- a/code/AssetLib/FBX/FBXMeshGeometry.h +++ b/code/AssetLib/FBX/FBXMeshGeometry.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/FBX/FBXModel.cpp b/code/AssetLib/FBX/FBXModel.cpp index 7d08ff312..9fe4cd5f8 100644 --- a/code/AssetLib/FBX/FBXModel.cpp +++ b/code/AssetLib/FBX/FBXModel.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/FBX/FBXNodeAttribute.cpp b/code/AssetLib/FBX/FBXNodeAttribute.cpp index 6f6869d6a..a144f417a 100644 --- a/code/AssetLib/FBX/FBXNodeAttribute.cpp +++ b/code/AssetLib/FBX/FBXNodeAttribute.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/FBX/FBXParser.cpp b/code/AssetLib/FBX/FBXParser.cpp index 582940363..ef26f5322 100644 --- a/code/AssetLib/FBX/FBXParser.cpp +++ b/code/AssetLib/FBX/FBXParser.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/FBX/FBXParser.h b/code/AssetLib/FBX/FBXParser.h index db1e41f3d..314481e42 100644 --- a/code/AssetLib/FBX/FBXParser.h +++ b/code/AssetLib/FBX/FBXParser.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/FBX/FBXProperties.cpp b/code/AssetLib/FBX/FBXProperties.cpp index c3f4de260..7803c27ff 100644 --- a/code/AssetLib/FBX/FBXProperties.cpp +++ b/code/AssetLib/FBX/FBXProperties.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/FBX/FBXProperties.h b/code/AssetLib/FBX/FBXProperties.h index d1d6b87ab..18816117a 100644 --- a/code/AssetLib/FBX/FBXProperties.h +++ b/code/AssetLib/FBX/FBXProperties.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/FBX/FBXTokenizer.cpp b/code/AssetLib/FBX/FBXTokenizer.cpp index 24971d18c..8698abac6 100644 --- a/code/AssetLib/FBX/FBXTokenizer.cpp +++ b/code/AssetLib/FBX/FBXTokenizer.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/FBX/FBXTokenizer.h b/code/AssetLib/FBX/FBXTokenizer.h index 6d528970a..877950945 100644 --- a/code/AssetLib/FBX/FBXTokenizer.h +++ b/code/AssetLib/FBX/FBXTokenizer.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/FBX/FBXUtil.cpp b/code/AssetLib/FBX/FBXUtil.cpp index 3fe791b97..ac465d6e9 100644 --- a/code/AssetLib/FBX/FBXUtil.cpp +++ b/code/AssetLib/FBX/FBXUtil.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/FBX/FBXUtil.h b/code/AssetLib/FBX/FBXUtil.h index a4a1a9ec2..0e0bb75be 100644 --- a/code/AssetLib/FBX/FBXUtil.h +++ b/code/AssetLib/FBX/FBXUtil.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/HMP/HMPFileData.h b/code/AssetLib/HMP/HMPFileData.h index 48b01e782..b297136ba 100644 --- a/code/AssetLib/HMP/HMPFileData.h +++ b/code/AssetLib/HMP/HMPFileData.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/HMP/HMPLoader.cpp b/code/AssetLib/HMP/HMPLoader.cpp index 0bc152680..cd487914a 100644 --- a/code/AssetLib/HMP/HMPLoader.cpp +++ b/code/AssetLib/HMP/HMPLoader.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/HMP/HMPLoader.h b/code/AssetLib/HMP/HMPLoader.h index c78f7ea5a..95ce0a9eb 100644 --- a/code/AssetLib/HMP/HMPLoader.h +++ b/code/AssetLib/HMP/HMPLoader.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/HMP/HalfLifeFileData.h b/code/AssetLib/HMP/HalfLifeFileData.h index 125195646..f47862b7a 100644 --- a/code/AssetLib/HMP/HalfLifeFileData.h +++ b/code/AssetLib/HMP/HalfLifeFileData.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/IFC/IFCBoolean.cpp b/code/AssetLib/IFC/IFCBoolean.cpp index 08173472d..dad45ec13 100644 --- a/code/AssetLib/IFC/IFCBoolean.cpp +++ b/code/AssetLib/IFC/IFCBoolean.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. Redistribution and use of this software in source and binary forms, diff --git a/code/AssetLib/IFC/IFCCurve.cpp b/code/AssetLib/IFC/IFCCurve.cpp index 3ded43bc0..19732ef25 100644 --- a/code/AssetLib/IFC/IFCCurve.cpp +++ b/code/AssetLib/IFC/IFCCurve.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/IFC/IFCGeometry.cpp b/code/AssetLib/IFC/IFCGeometry.cpp index e70c760d8..64f32ca7b 100644 --- a/code/AssetLib/IFC/IFCGeometry.cpp +++ b/code/AssetLib/IFC/IFCGeometry.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. Redistribution and use of this software in source and binary forms, diff --git a/code/AssetLib/IFC/IFCLoader.cpp b/code/AssetLib/IFC/IFCLoader.cpp index 220a1be06..1d2c13ec5 100644 --- a/code/AssetLib/IFC/IFCLoader.cpp +++ b/code/AssetLib/IFC/IFCLoader.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/IFC/IFCLoader.h b/code/AssetLib/IFC/IFCLoader.h index a5c22387e..7b2c3aae6 100644 --- a/code/AssetLib/IFC/IFCLoader.h +++ b/code/AssetLib/IFC/IFCLoader.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/IFC/IFCMaterial.cpp b/code/AssetLib/IFC/IFCMaterial.cpp index c26a3aa0a..6cd0e5910 100644 --- a/code/AssetLib/IFC/IFCMaterial.cpp +++ b/code/AssetLib/IFC/IFCMaterial.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/IFC/IFCOpenings.cpp b/code/AssetLib/IFC/IFCOpenings.cpp index d6671b885..cffb8a014 100644 --- a/code/AssetLib/IFC/IFCOpenings.cpp +++ b/code/AssetLib/IFC/IFCOpenings.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. Redistribution and use of this software in source and binary forms, diff --git a/code/AssetLib/IFC/IFCProfile.cpp b/code/AssetLib/IFC/IFCProfile.cpp index 4235be181..aa31124ed 100644 --- a/code/AssetLib/IFC/IFCProfile.cpp +++ b/code/AssetLib/IFC/IFCProfile.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/IFC/IFCUtil.cpp b/code/AssetLib/IFC/IFCUtil.cpp index b3b7b0382..2ff0d6a58 100644 --- a/code/AssetLib/IFC/IFCUtil.cpp +++ b/code/AssetLib/IFC/IFCUtil.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/IFC/IFCUtil.h b/code/AssetLib/IFC/IFCUtil.h index b18f35052..e80e5623d 100644 --- a/code/AssetLib/IFC/IFCUtil.h +++ b/code/AssetLib/IFC/IFCUtil.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Irr/IRRLoader.cpp b/code/AssetLib/Irr/IRRLoader.cpp index b68671e0d..1826e8b5e 100644 --- a/code/AssetLib/Irr/IRRLoader.cpp +++ b/code/AssetLib/Irr/IRRLoader.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Irr/IRRLoader.h b/code/AssetLib/Irr/IRRLoader.h index 147b94414..d56c4ca2d 100644 --- a/code/AssetLib/Irr/IRRLoader.h +++ b/code/AssetLib/Irr/IRRLoader.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Irr/IRRMeshLoader.cpp b/code/AssetLib/Irr/IRRMeshLoader.cpp index c89eb3bc6..d02509dfb 100644 --- a/code/AssetLib/Irr/IRRMeshLoader.cpp +++ b/code/AssetLib/Irr/IRRMeshLoader.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/code/AssetLib/Irr/IRRMeshLoader.h b/code/AssetLib/Irr/IRRMeshLoader.h index 2a253bf20..79c1e486b 100644 --- a/code/AssetLib/Irr/IRRMeshLoader.h +++ b/code/AssetLib/Irr/IRRMeshLoader.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Irr/IRRShared.cpp b/code/AssetLib/Irr/IRRShared.cpp index b42f34b65..8763b63ae 100644 --- a/code/AssetLib/Irr/IRRShared.cpp +++ b/code/AssetLib/Irr/IRRShared.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/LWO/LWOAnimation.cpp b/code/AssetLib/LWO/LWOAnimation.cpp index d9208616d..49fa45746 100644 --- a/code/AssetLib/LWO/LWOAnimation.cpp +++ b/code/AssetLib/LWO/LWOAnimation.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/LWO/LWOAnimation.h b/code/AssetLib/LWO/LWOAnimation.h index 64aa5980a..1e419d461 100644 --- a/code/AssetLib/LWO/LWOAnimation.h +++ b/code/AssetLib/LWO/LWOAnimation.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/LWO/LWOBLoader.cpp b/code/AssetLib/LWO/LWOBLoader.cpp index 8ef40fc21..1fbd9b9df 100644 --- a/code/AssetLib/LWO/LWOBLoader.cpp +++ b/code/AssetLib/LWO/LWOBLoader.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/code/AssetLib/LWO/LWOFileData.h b/code/AssetLib/LWO/LWOFileData.h index 93ac1a236..f477f582f 100644 --- a/code/AssetLib/LWO/LWOFileData.h +++ b/code/AssetLib/LWO/LWOFileData.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/LWO/LWOLoader.cpp b/code/AssetLib/LWO/LWOLoader.cpp index 801da1d60..696a22a8e 100644 --- a/code/AssetLib/LWO/LWOLoader.cpp +++ b/code/AssetLib/LWO/LWOLoader.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/code/AssetLib/LWO/LWOLoader.h b/code/AssetLib/LWO/LWOLoader.h index 0999071d6..f3add5323 100644 --- a/code/AssetLib/LWO/LWOLoader.h +++ b/code/AssetLib/LWO/LWOLoader.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/LWO/LWOMaterial.cpp b/code/AssetLib/LWO/LWOMaterial.cpp index 178f24265..b6f0bcce9 100644 --- a/code/AssetLib/LWO/LWOMaterial.cpp +++ b/code/AssetLib/LWO/LWOMaterial.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/code/AssetLib/LWS/LWSLoader.cpp b/code/AssetLib/LWS/LWSLoader.cpp index e046b6f58..20932c863 100644 --- a/code/AssetLib/LWS/LWSLoader.cpp +++ b/code/AssetLib/LWS/LWSLoader.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/LWS/LWSLoader.h b/code/AssetLib/LWS/LWSLoader.h index 820bc8156..225186f5c 100644 --- a/code/AssetLib/LWS/LWSLoader.h +++ b/code/AssetLib/LWS/LWSLoader.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/M3D/M3DExporter.cpp b/code/AssetLib/M3D/M3DExporter.cpp index 22cfd5906..cf87b6221 100644 --- a/code/AssetLib/M3D/M3DExporter.cpp +++ b/code/AssetLib/M3D/M3DExporter.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team Copyright (c) 2019 bzt All rights reserved. diff --git a/code/AssetLib/M3D/M3DExporter.h b/code/AssetLib/M3D/M3DExporter.h index 1247114bb..d77743f56 100644 --- a/code/AssetLib/M3D/M3DExporter.h +++ b/code/AssetLib/M3D/M3DExporter.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team Copyright (c) 2019 bzt All rights reserved. diff --git a/code/AssetLib/M3D/M3DImporter.cpp b/code/AssetLib/M3D/M3DImporter.cpp index d87944456..7d2b984c1 100644 --- a/code/AssetLib/M3D/M3DImporter.cpp +++ b/code/AssetLib/M3D/M3DImporter.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team Copyright (c) 2019 bzt All rights reserved. diff --git a/code/AssetLib/M3D/M3DImporter.h b/code/AssetLib/M3D/M3DImporter.h index 34af117a3..5d3fcaa7b 100644 --- a/code/AssetLib/M3D/M3DImporter.h +++ b/code/AssetLib/M3D/M3DImporter.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team Copyright (c) 2019 bzt All rights reserved. diff --git a/code/AssetLib/M3D/M3DMaterials.h b/code/AssetLib/M3D/M3DMaterials.h index 13b76825b..a1b0fd742 100644 --- a/code/AssetLib/M3D/M3DMaterials.h +++ b/code/AssetLib/M3D/M3DMaterials.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team Copyright (c) 2019 bzt All rights reserved. diff --git a/code/AssetLib/M3D/M3DWrapper.cpp b/code/AssetLib/M3D/M3DWrapper.cpp index f26912892..30452c776 100644 --- a/code/AssetLib/M3D/M3DWrapper.cpp +++ b/code/AssetLib/M3D/M3DWrapper.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team Copyright (c) 2019 bzt All rights reserved. diff --git a/code/AssetLib/M3D/M3DWrapper.h b/code/AssetLib/M3D/M3DWrapper.h index bd2b3b6c6..7cc2d0eef 100644 --- a/code/AssetLib/M3D/M3DWrapper.h +++ b/code/AssetLib/M3D/M3DWrapper.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team Copyright (c) 2019 bzt All rights reserved. diff --git a/code/AssetLib/MD2/MD2FileData.h b/code/AssetLib/MD2/MD2FileData.h index 8eb602e50..3bce8feee 100644 --- a/code/AssetLib/MD2/MD2FileData.h +++ b/code/AssetLib/MD2/MD2FileData.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/MD2/MD2Loader.cpp b/code/AssetLib/MD2/MD2Loader.cpp index b7bf24ef7..7be31bce3 100644 --- a/code/AssetLib/MD2/MD2Loader.cpp +++ b/code/AssetLib/MD2/MD2Loader.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/code/AssetLib/MD2/MD2Loader.h b/code/AssetLib/MD2/MD2Loader.h index c473fe35b..a49ccb2fd 100644 --- a/code/AssetLib/MD2/MD2Loader.h +++ b/code/AssetLib/MD2/MD2Loader.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/MD2/MD2NormalTable.h b/code/AssetLib/MD2/MD2NormalTable.h index b2330d862..1837939e8 100644 --- a/code/AssetLib/MD2/MD2NormalTable.h +++ b/code/AssetLib/MD2/MD2NormalTable.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/MD3/MD3FileData.h b/code/AssetLib/MD3/MD3FileData.h index 62b5fb706..01475e679 100644 --- a/code/AssetLib/MD3/MD3FileData.h +++ b/code/AssetLib/MD3/MD3FileData.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/MD3/MD3Loader.cpp b/code/AssetLib/MD3/MD3Loader.cpp index abaabe47f..898b82626 100644 --- a/code/AssetLib/MD3/MD3Loader.cpp +++ b/code/AssetLib/MD3/MD3Loader.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/code/AssetLib/MD3/MD3Loader.h b/code/AssetLib/MD3/MD3Loader.h index b334dac1e..d911bb1da 100644 --- a/code/AssetLib/MD3/MD3Loader.h +++ b/code/AssetLib/MD3/MD3Loader.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/MD5/MD5Loader.cpp b/code/AssetLib/MD5/MD5Loader.cpp index a04b32e14..e289620cd 100644 --- a/code/AssetLib/MD5/MD5Loader.cpp +++ b/code/AssetLib/MD5/MD5Loader.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/MD5/MD5Loader.h b/code/AssetLib/MD5/MD5Loader.h index 9486ffd84..63fb1c36b 100644 --- a/code/AssetLib/MD5/MD5Loader.h +++ b/code/AssetLib/MD5/MD5Loader.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/MD5/MD5Parser.cpp b/code/AssetLib/MD5/MD5Parser.cpp index 802c9becd..7ed23cb82 100644 --- a/code/AssetLib/MD5/MD5Parser.cpp +++ b/code/AssetLib/MD5/MD5Parser.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/code/AssetLib/MD5/MD5Parser.h b/code/AssetLib/MD5/MD5Parser.h index d36114b6d..3108655f1 100644 --- a/code/AssetLib/MD5/MD5Parser.h +++ b/code/AssetLib/MD5/MD5Parser.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/MDC/MDCFileData.h b/code/AssetLib/MDC/MDCFileData.h index a8f3aea43..36c589e91 100644 --- a/code/AssetLib/MDC/MDCFileData.h +++ b/code/AssetLib/MDC/MDCFileData.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/MDC/MDCLoader.cpp b/code/AssetLib/MDC/MDCLoader.cpp index 8f089bbd8..659e0cfb7 100644 --- a/code/AssetLib/MDC/MDCLoader.cpp +++ b/code/AssetLib/MDC/MDCLoader.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/MDC/MDCLoader.h b/code/AssetLib/MDC/MDCLoader.h index 1d0243593..6e67cd12f 100644 --- a/code/AssetLib/MDC/MDCLoader.h +++ b/code/AssetLib/MDC/MDCLoader.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/MDL/HalfLife/HL1FileData.h b/code/AssetLib/MDL/HalfLife/HL1FileData.h index 30dca0d0a..28b1b2822 100644 --- a/code/AssetLib/MDL/HalfLife/HL1FileData.h +++ b/code/AssetLib/MDL/HalfLife/HL1FileData.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/MDL/HalfLife/HL1ImportDefinitions.h b/code/AssetLib/MDL/HalfLife/HL1ImportDefinitions.h index 47b4fbb31..d412aeede 100644 --- a/code/AssetLib/MDL/HalfLife/HL1ImportDefinitions.h +++ b/code/AssetLib/MDL/HalfLife/HL1ImportDefinitions.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/MDL/HalfLife/HL1ImportSettings.h b/code/AssetLib/MDL/HalfLife/HL1ImportSettings.h index d52305e44..340ba2da5 100644 --- a/code/AssetLib/MDL/HalfLife/HL1ImportSettings.h +++ b/code/AssetLib/MDL/HalfLife/HL1ImportSettings.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/MDL/HalfLife/HL1MDLLoader.cpp b/code/AssetLib/MDL/HalfLife/HL1MDLLoader.cpp index 1ff86fe27..93d37536c 100644 --- a/code/AssetLib/MDL/HalfLife/HL1MDLLoader.cpp +++ b/code/AssetLib/MDL/HalfLife/HL1MDLLoader.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/MDL/HalfLife/HL1MDLLoader.h b/code/AssetLib/MDL/HalfLife/HL1MDLLoader.h index 74bff7362..d87d6d3e8 100644 --- a/code/AssetLib/MDL/HalfLife/HL1MDLLoader.h +++ b/code/AssetLib/MDL/HalfLife/HL1MDLLoader.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/MDL/HalfLife/HL1MeshTrivert.h b/code/AssetLib/MDL/HalfLife/HL1MeshTrivert.h index 1eedf8edd..4ef8a13ce 100644 --- a/code/AssetLib/MDL/HalfLife/HL1MeshTrivert.h +++ b/code/AssetLib/MDL/HalfLife/HL1MeshTrivert.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/MDL/HalfLife/HalfLifeMDLBaseHeader.h b/code/AssetLib/MDL/HalfLife/HalfLifeMDLBaseHeader.h index 868b0d592..c7808c401 100644 --- a/code/AssetLib/MDL/HalfLife/HalfLifeMDLBaseHeader.h +++ b/code/AssetLib/MDL/HalfLife/HalfLifeMDLBaseHeader.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/MDL/HalfLife/LogFunctions.h b/code/AssetLib/MDL/HalfLife/LogFunctions.h index f73c68356..003774dc1 100644 --- a/code/AssetLib/MDL/HalfLife/LogFunctions.h +++ b/code/AssetLib/MDL/HalfLife/LogFunctions.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/MDL/HalfLife/UniqueNameGenerator.cpp b/code/AssetLib/MDL/HalfLife/UniqueNameGenerator.cpp index dde81454b..6fc8b118e 100644 --- a/code/AssetLib/MDL/HalfLife/UniqueNameGenerator.cpp +++ b/code/AssetLib/MDL/HalfLife/UniqueNameGenerator.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/MDL/HalfLife/UniqueNameGenerator.h b/code/AssetLib/MDL/HalfLife/UniqueNameGenerator.h index 02242a7bd..73b6f9e74 100644 --- a/code/AssetLib/MDL/HalfLife/UniqueNameGenerator.h +++ b/code/AssetLib/MDL/HalfLife/UniqueNameGenerator.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/MDL/MDLDefaultColorMap.h b/code/AssetLib/MDL/MDLDefaultColorMap.h index aad0af352..2eecac2dc 100644 --- a/code/AssetLib/MDL/MDLDefaultColorMap.h +++ b/code/AssetLib/MDL/MDLDefaultColorMap.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/MDL/MDLFileData.h b/code/AssetLib/MDL/MDLFileData.h index 473a06989..7ec2afe9a 100644 --- a/code/AssetLib/MDL/MDLFileData.h +++ b/code/AssetLib/MDL/MDLFileData.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/MDL/MDLLoader.cpp b/code/AssetLib/MDL/MDLLoader.cpp index c59375da0..a7eb218d3 100644 --- a/code/AssetLib/MDL/MDLLoader.cpp +++ b/code/AssetLib/MDL/MDLLoader.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/MDL/MDLLoader.h b/code/AssetLib/MDL/MDLLoader.h index e81fe0b4f..b7d87e88d 100644 --- a/code/AssetLib/MDL/MDLLoader.h +++ b/code/AssetLib/MDL/MDLLoader.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/MDL/MDLMaterialLoader.cpp b/code/AssetLib/MDL/MDLMaterialLoader.cpp index 4f441a054..eebb9d15e 100644 --- a/code/AssetLib/MDL/MDLMaterialLoader.cpp +++ b/code/AssetLib/MDL/MDLMaterialLoader.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/MMD/MMDCpp14.h b/code/AssetLib/MMD/MMDCpp14.h index 29e966b8a..10d376829 100644 --- a/code/AssetLib/MMD/MMDCpp14.h +++ b/code/AssetLib/MMD/MMDCpp14.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/MMD/MMDImporter.cpp b/code/AssetLib/MMD/MMDImporter.cpp index 84d320e41..b8c04491e 100644 --- a/code/AssetLib/MMD/MMDImporter.cpp +++ b/code/AssetLib/MMD/MMDImporter.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/MMD/MMDImporter.h b/code/AssetLib/MMD/MMDImporter.h index cfd903eee..36f384829 100644 --- a/code/AssetLib/MMD/MMDImporter.h +++ b/code/AssetLib/MMD/MMDImporter.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. Redistribution and use of this software in source and binary forms, diff --git a/code/AssetLib/MMD/MMDPmdParser.h b/code/AssetLib/MMD/MMDPmdParser.h index f9f555c6a..35e4f09d1 100644 --- a/code/AssetLib/MMD/MMDPmdParser.h +++ b/code/AssetLib/MMD/MMDPmdParser.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/MMD/MMDPmxParser.cpp b/code/AssetLib/MMD/MMDPmxParser.cpp index be3b10248..ca37ba199 100644 --- a/code/AssetLib/MMD/MMDPmxParser.cpp +++ b/code/AssetLib/MMD/MMDPmxParser.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/MMD/MMDPmxParser.h b/code/AssetLib/MMD/MMDPmxParser.h index 696e40889..08f57f6f0 100644 --- a/code/AssetLib/MMD/MMDPmxParser.h +++ b/code/AssetLib/MMD/MMDPmxParser.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/MMD/MMDVmdParser.h b/code/AssetLib/MMD/MMDVmdParser.h index 0ce24a48f..d5c7dedff 100644 --- a/code/AssetLib/MMD/MMDVmdParser.h +++ b/code/AssetLib/MMD/MMDVmdParser.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/MS3D/MS3DLoader.cpp b/code/AssetLib/MS3D/MS3DLoader.cpp index 4b0269b7b..0c35587f9 100644 --- a/code/AssetLib/MS3D/MS3DLoader.cpp +++ b/code/AssetLib/MS3D/MS3DLoader.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/code/AssetLib/MS3D/MS3DLoader.h b/code/AssetLib/MS3D/MS3DLoader.h index 4e42156f9..4bd417566 100644 --- a/code/AssetLib/MS3D/MS3DLoader.h +++ b/code/AssetLib/MS3D/MS3DLoader.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/NDO/NDOLoader.cpp b/code/AssetLib/NDO/NDOLoader.cpp index 0ccbe8a61..32e8cb5f8 100644 --- a/code/AssetLib/NDO/NDOLoader.cpp +++ b/code/AssetLib/NDO/NDOLoader.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/code/AssetLib/NDO/NDOLoader.h b/code/AssetLib/NDO/NDOLoader.h index fb619b8cb..61dd93981 100644 --- a/code/AssetLib/NDO/NDOLoader.h +++ b/code/AssetLib/NDO/NDOLoader.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. Redistribution and use of this software in source and binary forms, diff --git a/code/AssetLib/NFF/NFFLoader.cpp b/code/AssetLib/NFF/NFFLoader.cpp index 15f46b5e6..94ad65cb6 100644 --- a/code/AssetLib/NFF/NFFLoader.cpp +++ b/code/AssetLib/NFF/NFFLoader.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/code/AssetLib/NFF/NFFLoader.h b/code/AssetLib/NFF/NFFLoader.h index 514476c12..0fa615b19 100644 --- a/code/AssetLib/NFF/NFFLoader.h +++ b/code/AssetLib/NFF/NFFLoader.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/OFF/OFFLoader.cpp b/code/AssetLib/OFF/OFFLoader.cpp index 644579bce..41ee74da5 100644 --- a/code/AssetLib/OFF/OFFLoader.cpp +++ b/code/AssetLib/OFF/OFFLoader.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/OFF/OFFLoader.h b/code/AssetLib/OFF/OFFLoader.h index 9d1136b6c..04bb7f481 100644 --- a/code/AssetLib/OFF/OFFLoader.h +++ b/code/AssetLib/OFF/OFFLoader.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Ogre/OgreBinarySerializer.cpp b/code/AssetLib/Ogre/OgreBinarySerializer.cpp index fc975a5cc..738e1181e 100644 --- a/code/AssetLib/Ogre/OgreBinarySerializer.cpp +++ b/code/AssetLib/Ogre/OgreBinarySerializer.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Ogre/OgreBinarySerializer.h b/code/AssetLib/Ogre/OgreBinarySerializer.h index 0cf45bbcd..eb026ea70 100644 --- a/code/AssetLib/Ogre/OgreBinarySerializer.h +++ b/code/AssetLib/Ogre/OgreBinarySerializer.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Ogre/OgreImporter.cpp b/code/AssetLib/Ogre/OgreImporter.cpp index 5250dbe5e..ceb80e91c 100644 --- a/code/AssetLib/Ogre/OgreImporter.cpp +++ b/code/AssetLib/Ogre/OgreImporter.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Ogre/OgreImporter.h b/code/AssetLib/Ogre/OgreImporter.h index b1a07d4f0..dc8b09051 100644 --- a/code/AssetLib/Ogre/OgreImporter.h +++ b/code/AssetLib/Ogre/OgreImporter.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Ogre/OgreMaterial.cpp b/code/AssetLib/Ogre/OgreMaterial.cpp index 6da82f89c..7478a80a9 100644 --- a/code/AssetLib/Ogre/OgreMaterial.cpp +++ b/code/AssetLib/Ogre/OgreMaterial.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Ogre/OgreParsingUtils.h b/code/AssetLib/Ogre/OgreParsingUtils.h index 0925c0305..60dd5cf76 100644 --- a/code/AssetLib/Ogre/OgreParsingUtils.h +++ b/code/AssetLib/Ogre/OgreParsingUtils.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Ogre/OgreStructs.cpp b/code/AssetLib/Ogre/OgreStructs.cpp index a2d861172..d63dd934a 100644 --- a/code/AssetLib/Ogre/OgreStructs.cpp +++ b/code/AssetLib/Ogre/OgreStructs.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Ogre/OgreStructs.h b/code/AssetLib/Ogre/OgreStructs.h index 1d43b09e9..be9ffa02d 100644 --- a/code/AssetLib/Ogre/OgreStructs.h +++ b/code/AssetLib/Ogre/OgreStructs.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Ogre/OgreXmlSerializer.cpp b/code/AssetLib/Ogre/OgreXmlSerializer.cpp index 70671f251..545107ea3 100644 --- a/code/AssetLib/Ogre/OgreXmlSerializer.cpp +++ b/code/AssetLib/Ogre/OgreXmlSerializer.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Ogre/OgreXmlSerializer.h b/code/AssetLib/Ogre/OgreXmlSerializer.h index 1bd47e771..406681f55 100644 --- a/code/AssetLib/Ogre/OgreXmlSerializer.h +++ b/code/AssetLib/Ogre/OgreXmlSerializer.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/OpenGEX/OpenGEXExporter.cpp b/code/AssetLib/OpenGEX/OpenGEXExporter.cpp index 9f6994734..328c3c460 100644 --- a/code/AssetLib/OpenGEX/OpenGEXExporter.cpp +++ b/code/AssetLib/OpenGEX/OpenGEXExporter.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/OpenGEX/OpenGEXExporter.h b/code/AssetLib/OpenGEX/OpenGEXExporter.h index dc24fdc16..cc22c7d21 100644 --- a/code/AssetLib/OpenGEX/OpenGEXExporter.h +++ b/code/AssetLib/OpenGEX/OpenGEXExporter.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/OpenGEX/OpenGEXImporter.cpp b/code/AssetLib/OpenGEX/OpenGEXImporter.cpp index 94cf47e73..aea05e8fd 100644 --- a/code/AssetLib/OpenGEX/OpenGEXImporter.cpp +++ b/code/AssetLib/OpenGEX/OpenGEXImporter.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. @@ -66,135 +66,135 @@ static const aiImporterDesc desc = { }; namespace Grammar { -static const std::string MetricType = "Metric"; -static const std::string Metric_DistanceType = "distance"; -static const std::string Metric_AngleType = "angle"; -static const std::string Metric_TimeType = "time"; -static const std::string Metric_UpType = "up"; -static const std::string NameType = "Name"; -static const std::string ObjectRefType = "ObjectRef"; -static const std::string MaterialRefType = "MaterialRef"; -static const std::string MetricKeyType = "key"; -static const std::string GeometryNodeType = "GeometryNode"; -static const std::string CameraNodeType = "CameraNode"; -static const std::string LightNodeType = "LightNode"; -static const std::string GeometryObjectType = "GeometryObject"; -static const std::string CameraObjectType = "CameraObject"; -static const std::string LightObjectType = "LightObject"; -static const std::string TransformType = "Transform"; -static const std::string MeshType = "Mesh"; -static const std::string VertexArrayType = "VertexArray"; -static const std::string IndexArrayType = "IndexArray"; -static const std::string MaterialType = "Material"; -static const std::string ColorType = "Color"; -static const std::string ParamType = "Param"; -static const std::string TextureType = "Texture"; -static const std::string AttenType = "Atten"; + static const char* MetricType = "Metric"; + static const char *Metric_DistanceType = "distance"; + static const char *Metric_AngleType = "angle"; + static const char *Metric_TimeType = "time"; + static const char *Metric_UpType = "up"; + static const char *NameType = "Name"; + static const char *ObjectRefType = "ObjectRef"; + static const char *MaterialRefType = "MaterialRef"; + static const char *MetricKeyType = "key"; + static const char *GeometryNodeType = "GeometryNode"; + static const char *CameraNodeType = "CameraNode"; + static const char *LightNodeType = "LightNode"; + static const char *GeometryObjectType = "GeometryObject"; + static const char *CameraObjectType = "CameraObject"; + static const char *LightObjectType = "LightObject"; + static const char *TransformType = "Transform"; + static const char *MeshType = "Mesh"; + static const char *VertexArrayType = "VertexArray"; + static const char *IndexArrayType = "IndexArray"; + static const char *MaterialType = "Material"; + static const char *ColorType = "Color"; + static const char *ParamType = "Param"; + static const char *TextureType = "Texture"; + static const char *AttenType = "Atten"; -static const std::string DiffuseColorToken = "diffuse"; -static const std::string SpecularColorToken = "specular"; -static const std::string EmissionColorToken = "emission"; + static const char *DiffuseColorToken = "diffuse"; + static const char *SpecularColorToken = "specular"; + static const char *EmissionColorToken = "emission"; -static const std::string DiffuseTextureToken = "diffuse"; -static const std::string DiffuseSpecularTextureToken = "specular"; -static const std::string SpecularPowerTextureToken = "specular_power"; -static const std::string EmissionTextureToken = "emission"; -static const std::string OpacyTextureToken = "opacity"; -static const std::string TransparencyTextureToken = "transparency"; -static const std::string NormalTextureToken = "normal"; + static const char *DiffuseTextureToken = "diffuse"; + static const char *DiffuseSpecularTextureToken = "specular"; + static const char *SpecularPowerTextureToken = "specular_power"; + static const char *EmissionTextureToken = "emission"; + static const char *OpacyTextureToken = "opacity"; + static const char *TransparencyTextureToken = "transparency"; + static const char *NormalTextureToken = "normal"; -enum TokenType { - NoneType = -1, - MetricToken, - NameToken, - ObjectRefToken, - MaterialRefToken, - MetricKeyToken, - GeometryNodeToken, - CameraNodeToken, - LightNodeToken, - GeometryObjectToken, - CameraObjectToken, - LightObjectToken, - TransformToken, - MeshToken, - VertexArrayToken, - IndexArrayToken, - MaterialToken, - ColorToken, - ParamToken, - TextureToken, - AttenToken -}; + enum TokenType { + NoneType = -1, + MetricToken, + NameToken, + ObjectRefToken, + MaterialRefToken, + MetricKeyToken, + GeometryNodeToken, + CameraNodeToken, + LightNodeToken, + GeometryObjectToken, + CameraObjectToken, + LightObjectToken, + TransformToken, + MeshToken, + VertexArrayToken, + IndexArrayToken, + MaterialToken, + ColorToken, + ParamToken, + TextureToken, + AttenToken + }; -static const std::string ValidMetricToken[4] = { - Metric_DistanceType, - Metric_AngleType, - Metric_TimeType, - Metric_UpType -}; + static const std::string ValidMetricToken[4] = { + Metric_DistanceType, + Metric_AngleType, + Metric_TimeType, + Metric_UpType + }; -static int isValidMetricType(const char *token) { - if (nullptr == token) { - return false; - } - - int idx(-1); - for (size_t i = 0; i < 4; i++) { - if (ValidMetricToken[i] == token) { - idx = (int)i; - break; + static int isValidMetricType(const char *token) { + if (nullptr == token) { + return false; } + + int idx(-1); + for (size_t i = 0; i < 4; i++) { + if (ValidMetricToken[i] == token) { + idx = (int)i; + break; + } + } + + return idx; } - return idx; -} + static TokenType matchTokenType(const char *tokenType) { + if (MetricType == tokenType) { + return MetricToken; + } else if (NameType == tokenType) { + return NameToken; + } else if (ObjectRefType == tokenType) { + return ObjectRefToken; + } else if (MaterialRefType == tokenType) { + return MaterialRefToken; + } else if (MetricKeyType == tokenType) { + return MetricKeyToken; + } else if (GeometryNodeType == tokenType) { + return GeometryNodeToken; + } else if (CameraNodeType == tokenType) { + return CameraNodeToken; + } else if (LightNodeType == tokenType) { + return LightNodeToken; + } else if (GeometryObjectType == tokenType) { + return GeometryObjectToken; + } else if (CameraObjectType == tokenType) { + return CameraObjectToken; + } else if (LightObjectType == tokenType) { + return LightObjectToken; + } else if (TransformType == tokenType) { + return TransformToken; + } else if (MeshType == tokenType) { + return MeshToken; + } else if (VertexArrayType == tokenType) { + return VertexArrayToken; + } else if (IndexArrayType == tokenType) { + return IndexArrayToken; + } else if (MaterialType == tokenType) { + return MaterialToken; + } else if (ColorType == tokenType) { + return ColorToken; + } else if (ParamType == tokenType) { + return ParamToken; + } else if (TextureType == tokenType) { + return TextureToken; + } else if (AttenType == tokenType) { + return AttenToken; + } -static TokenType matchTokenType(const char *tokenType) { - if (MetricType == tokenType) { - return MetricToken; - } else if (NameType == tokenType) { - return NameToken; - } else if (ObjectRefType == tokenType) { - return ObjectRefToken; - } else if (MaterialRefType == tokenType) { - return MaterialRefToken; - } else if (MetricKeyType == tokenType) { - return MetricKeyToken; - } else if (GeometryNodeType == tokenType) { - return GeometryNodeToken; - } else if (CameraNodeType == tokenType) { - return CameraNodeToken; - } else if (LightNodeType == tokenType) { - return LightNodeToken; - } else if (GeometryObjectType == tokenType) { - return GeometryObjectToken; - } else if (CameraObjectType == tokenType) { - return CameraObjectToken; - } else if (LightObjectType == tokenType) { - return LightObjectToken; - } else if (TransformType == tokenType) { - return TransformToken; - } else if (MeshType == tokenType) { - return MeshToken; - } else if (VertexArrayType == tokenType) { - return VertexArrayToken; - } else if (IndexArrayType == tokenType) { - return IndexArrayToken; - } else if (MaterialType == tokenType) { - return MaterialToken; - } else if (ColorType == tokenType) { - return ColorToken; - } else if (ParamType == tokenType) { - return ParamToken; - } else if (TextureType == tokenType) { - return TextureToken; - } else if (AttenType == tokenType) { - return AttenToken; + return NoneType; } - - return NoneType; -} } // Namespace Grammar namespace Assimp { @@ -854,7 +854,7 @@ void OpenGEXImporter::handleVertexArrayNode(ODDLParser::DDLNode *node, aiScene * return; } - Property *prop(node->getProperties()); + Property *prop = node->getProperties(); if (nullptr != prop) { std::string propName, propKey; propId2StdString(prop, propName, propKey); diff --git a/code/AssetLib/OpenGEX/OpenGEXImporter.h b/code/AssetLib/OpenGEX/OpenGEXImporter.h index 92841b5d3..fca3eb1d5 100644 --- a/code/AssetLib/OpenGEX/OpenGEXImporter.h +++ b/code/AssetLib/OpenGEX/OpenGEXImporter.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/OpenGEX/OpenGEXStructs.h b/code/AssetLib/OpenGEX/OpenGEXStructs.h index a6d7514aa..5f845483d 100644 --- a/code/AssetLib/OpenGEX/OpenGEXStructs.h +++ b/code/AssetLib/OpenGEX/OpenGEXStructs.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Ply/PlyExporter.cpp b/code/AssetLib/Ply/PlyExporter.cpp index ccd9bde99..a98b83f67 100644 --- a/code/AssetLib/Ply/PlyExporter.cpp +++ b/code/AssetLib/Ply/PlyExporter.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Ply/PlyExporter.h b/code/AssetLib/Ply/PlyExporter.h index 1d2acd6b0..ff3a54cb6 100644 --- a/code/AssetLib/Ply/PlyExporter.h +++ b/code/AssetLib/Ply/PlyExporter.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Ply/PlyLoader.cpp b/code/AssetLib/Ply/PlyLoader.cpp index b58ef1ef2..4d422cea4 100644 --- a/code/AssetLib/Ply/PlyLoader.cpp +++ b/code/AssetLib/Ply/PlyLoader.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Ply/PlyLoader.h b/code/AssetLib/Ply/PlyLoader.h index 4f50400dd..e29da1db6 100644 --- a/code/AssetLib/Ply/PlyLoader.h +++ b/code/AssetLib/Ply/PlyLoader.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Ply/PlyParser.cpp b/code/AssetLib/Ply/PlyParser.cpp index 8af0edfdc..df93d5a57 100644 --- a/code/AssetLib/Ply/PlyParser.cpp +++ b/code/AssetLib/Ply/PlyParser.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Ply/PlyParser.h b/code/AssetLib/Ply/PlyParser.h index dd1ce900a..86349294e 100644 --- a/code/AssetLib/Ply/PlyParser.h +++ b/code/AssetLib/Ply/PlyParser.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Q3BSP/Q3BSPFileData.h b/code/AssetLib/Q3BSP/Q3BSPFileData.h index c288af2fc..8ccee0b0a 100644 --- a/code/AssetLib/Q3BSP/Q3BSPFileData.h +++ b/code/AssetLib/Q3BSP/Q3BSPFileData.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Q3BSP/Q3BSPFileImporter.cpp b/code/AssetLib/Q3BSP/Q3BSPFileImporter.cpp index 897bcb994..111da625b 100644 --- a/code/AssetLib/Q3BSP/Q3BSPFileImporter.cpp +++ b/code/AssetLib/Q3BSP/Q3BSPFileImporter.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Q3BSP/Q3BSPFileImporter.h b/code/AssetLib/Q3BSP/Q3BSPFileImporter.h index d1f420770..fdcfff876 100644 --- a/code/AssetLib/Q3BSP/Q3BSPFileImporter.h +++ b/code/AssetLib/Q3BSP/Q3BSPFileImporter.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Q3BSP/Q3BSPFileParser.cpp b/code/AssetLib/Q3BSP/Q3BSPFileParser.cpp index 45b2effb3..910da5b36 100644 --- a/code/AssetLib/Q3BSP/Q3BSPFileParser.cpp +++ b/code/AssetLib/Q3BSP/Q3BSPFileParser.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Q3BSP/Q3BSPFileParser.h b/code/AssetLib/Q3BSP/Q3BSPFileParser.h index 6a6f0e326..15cc751cc 100644 --- a/code/AssetLib/Q3BSP/Q3BSPFileParser.h +++ b/code/AssetLib/Q3BSP/Q3BSPFileParser.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Q3D/Q3DLoader.cpp b/code/AssetLib/Q3D/Q3DLoader.cpp index fe8541a5d..c637ab4cb 100644 --- a/code/AssetLib/Q3D/Q3DLoader.cpp +++ b/code/AssetLib/Q3D/Q3DLoader.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Q3D/Q3DLoader.h b/code/AssetLib/Q3D/Q3DLoader.h index c48427098..54af86dc2 100644 --- a/code/AssetLib/Q3D/Q3DLoader.h +++ b/code/AssetLib/Q3D/Q3DLoader.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Raw/RawLoader.cpp b/code/AssetLib/Raw/RawLoader.cpp index 8e57912f5..d472430f1 100644 --- a/code/AssetLib/Raw/RawLoader.cpp +++ b/code/AssetLib/Raw/RawLoader.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Raw/RawLoader.h b/code/AssetLib/Raw/RawLoader.h index 8941a2d19..6e4c4d110 100644 --- a/code/AssetLib/Raw/RawLoader.h +++ b/code/AssetLib/Raw/RawLoader.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/SIB/SIBImporter.cpp b/code/AssetLib/SIB/SIBImporter.cpp index 0321e7064..2efb7f399 100644 --- a/code/AssetLib/SIB/SIBImporter.cpp +++ b/code/AssetLib/SIB/SIBImporter.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/code/AssetLib/SIB/SIBImporter.h b/code/AssetLib/SIB/SIBImporter.h index 30c188a6c..2b197ddca 100644 --- a/code/AssetLib/SIB/SIBImporter.h +++ b/code/AssetLib/SIB/SIBImporter.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/SMD/SMDLoader.cpp b/code/AssetLib/SMD/SMDLoader.cpp index 8d9c745b1..f1e4db660 100644 --- a/code/AssetLib/SMD/SMDLoader.cpp +++ b/code/AssetLib/SMD/SMDLoader.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/SMD/SMDLoader.h b/code/AssetLib/SMD/SMDLoader.h index b905fcc87..db882a241 100644 --- a/code/AssetLib/SMD/SMDLoader.h +++ b/code/AssetLib/SMD/SMDLoader.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/STEPParser/STEPFileEncoding.cpp b/code/AssetLib/STEPParser/STEPFileEncoding.cpp index 6329e3b26..d4456e674 100644 --- a/code/AssetLib/STEPParser/STEPFileEncoding.cpp +++ b/code/AssetLib/STEPParser/STEPFileEncoding.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/STEPParser/STEPFileEncoding.h b/code/AssetLib/STEPParser/STEPFileEncoding.h index b57f61769..950c9b3e2 100644 --- a/code/AssetLib/STEPParser/STEPFileEncoding.h +++ b/code/AssetLib/STEPParser/STEPFileEncoding.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/STEPParser/STEPFileReader.cpp b/code/AssetLib/STEPParser/STEPFileReader.cpp index 09a596aa4..2bcfa1755 100644 --- a/code/AssetLib/STEPParser/STEPFileReader.cpp +++ b/code/AssetLib/STEPParser/STEPFileReader.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/STEPParser/STEPFileReader.h b/code/AssetLib/STEPParser/STEPFileReader.h index 0c70e78d3..8a57937c0 100644 --- a/code/AssetLib/STEPParser/STEPFileReader.h +++ b/code/AssetLib/STEPParser/STEPFileReader.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/STL/STLExporter.cpp b/code/AssetLib/STL/STLExporter.cpp index 59c6148ee..9bbc2063f 100644 --- a/code/AssetLib/STL/STLExporter.cpp +++ b/code/AssetLib/STL/STLExporter.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/STL/STLExporter.h b/code/AssetLib/STL/STLExporter.h index a6b8bf2bd..066dcfefd 100644 --- a/code/AssetLib/STL/STLExporter.h +++ b/code/AssetLib/STL/STLExporter.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/STL/STLLoader.cpp b/code/AssetLib/STL/STLLoader.cpp index 602e07106..67869c683 100644 --- a/code/AssetLib/STL/STLLoader.cpp +++ b/code/AssetLib/STL/STLLoader.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/STL/STLLoader.h b/code/AssetLib/STL/STLLoader.h index 4fac1f697..a340abe6b 100644 --- a/code/AssetLib/STL/STLLoader.h +++ b/code/AssetLib/STL/STLLoader.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Step/StepExporter.cpp b/code/AssetLib/Step/StepExporter.cpp index 1228c72ea..e13c9edab 100644 --- a/code/AssetLib/Step/StepExporter.cpp +++ b/code/AssetLib/Step/StepExporter.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Step/StepExporter.h b/code/AssetLib/Step/StepExporter.h index c7e4cab38..a02262659 100644 --- a/code/AssetLib/Step/StepExporter.h +++ b/code/AssetLib/Step/StepExporter.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Terragen/TerragenLoader.cpp b/code/AssetLib/Terragen/TerragenLoader.cpp index a4d8590d5..0556702ff 100644 --- a/code/AssetLib/Terragen/TerragenLoader.cpp +++ b/code/AssetLib/Terragen/TerragenLoader.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Terragen/TerragenLoader.h b/code/AssetLib/Terragen/TerragenLoader.h index 126cf64ad..cb9ff9166 100644 --- a/code/AssetLib/Terragen/TerragenLoader.h +++ b/code/AssetLib/Terragen/TerragenLoader.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Unreal/UnrealLoader.cpp b/code/AssetLib/Unreal/UnrealLoader.cpp index d9d3454e4..b0b326b54 100644 --- a/code/AssetLib/Unreal/UnrealLoader.cpp +++ b/code/AssetLib/Unreal/UnrealLoader.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/Unreal/UnrealLoader.h b/code/AssetLib/Unreal/UnrealLoader.h index d6c121460..a931a86dd 100644 --- a/code/AssetLib/Unreal/UnrealLoader.h +++ b/code/AssetLib/Unreal/UnrealLoader.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/X/XFileExporter.cpp b/code/AssetLib/X/XFileExporter.cpp index b95cb7abf..f0b1608c1 100644 --- a/code/AssetLib/X/XFileExporter.cpp +++ b/code/AssetLib/X/XFileExporter.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/X/XFileExporter.h b/code/AssetLib/X/XFileExporter.h index 620d282b6..1d9a5ae77 100644 --- a/code/AssetLib/X/XFileExporter.h +++ b/code/AssetLib/X/XFileExporter.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/X/XFileHelper.h b/code/AssetLib/X/XFileHelper.h index ad17cd951..3830eb483 100644 --- a/code/AssetLib/X/XFileHelper.h +++ b/code/AssetLib/X/XFileHelper.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/X/XFileImporter.cpp b/code/AssetLib/X/XFileImporter.cpp index 8a3047915..2c0e05ece 100644 --- a/code/AssetLib/X/XFileImporter.cpp +++ b/code/AssetLib/X/XFileImporter.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/X/XFileImporter.h b/code/AssetLib/X/XFileImporter.h index 1dc1b140e..648139002 100644 --- a/code/AssetLib/X/XFileImporter.h +++ b/code/AssetLib/X/XFileImporter.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/X/XFileParser.cpp b/code/AssetLib/X/XFileParser.cpp index 494ef5b2b..adcb7c8f4 100644 --- a/code/AssetLib/X/XFileParser.cpp +++ b/code/AssetLib/X/XFileParser.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/code/AssetLib/X/XFileParser.h b/code/AssetLib/X/XFileParser.h index 175fbb06c..36eac2ada 100644 --- a/code/AssetLib/X/XFileParser.h +++ b/code/AssetLib/X/XFileParser.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/X3D/X3DImporter.cpp b/code/AssetLib/X3D/X3DImporter.cpp index f32f485df..b34f361ae 100644 --- a/code/AssetLib/X3D/X3DImporter.cpp +++ b/code/AssetLib/X3D/X3DImporter.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/X3D/X3DImporter.hpp b/code/AssetLib/X3D/X3DImporter.hpp index adb73e6f8..d9aed70d8 100644 --- a/code/AssetLib/X3D/X3DImporter.hpp +++ b/code/AssetLib/X3D/X3DImporter.hpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/XGL/XGLLoader.cpp b/code/AssetLib/XGL/XGLLoader.cpp index a4d9835c5..4cec756e3 100644 --- a/code/AssetLib/XGL/XGLLoader.cpp +++ b/code/AssetLib/XGL/XGLLoader.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/XGL/XGLLoader.h b/code/AssetLib/XGL/XGLLoader.h index 93265f6f1..903f114cf 100644 --- a/code/AssetLib/XGL/XGLLoader.h +++ b/code/AssetLib/XGL/XGLLoader.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/glTF/glTFAsset.h b/code/AssetLib/glTF/glTFAsset.h index 5f5945271..4cd11aa4f 100644 --- a/code/AssetLib/glTF/glTFAsset.h +++ b/code/AssetLib/glTF/glTFAsset.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/glTF/glTFAsset.inl b/code/AssetLib/glTF/glTFAsset.inl index 10be7c78e..eb92330ba 100644 --- a/code/AssetLib/glTF/glTFAsset.inl +++ b/code/AssetLib/glTF/glTFAsset.inl @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/glTF/glTFAssetWriter.h b/code/AssetLib/glTF/glTFAssetWriter.h index 405ec103c..6dbc42420 100644 --- a/code/AssetLib/glTF/glTFAssetWriter.h +++ b/code/AssetLib/glTF/glTFAssetWriter.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/glTF/glTFAssetWriter.inl b/code/AssetLib/glTF/glTFAssetWriter.inl index a8efdd35a..5188af0dc 100644 --- a/code/AssetLib/glTF/glTFAssetWriter.inl +++ b/code/AssetLib/glTF/glTFAssetWriter.inl @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/glTF/glTFCommon.cpp b/code/AssetLib/glTF/glTFCommon.cpp index 6c63c01d9..9e2867bed 100644 --- a/code/AssetLib/glTF/glTFCommon.cpp +++ b/code/AssetLib/glTF/glTFCommon.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/glTF/glTFCommon.h b/code/AssetLib/glTF/glTFCommon.h index 14b82aa29..c2a33a061 100644 --- a/code/AssetLib/glTF/glTFCommon.h +++ b/code/AssetLib/glTF/glTFCommon.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/glTF/glTFExporter.cpp b/code/AssetLib/glTF/glTFExporter.cpp index acc195bd9..afcfb1223 100644 --- a/code/AssetLib/glTF/glTFExporter.cpp +++ b/code/AssetLib/glTF/glTFExporter.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/glTF/glTFExporter.h b/code/AssetLib/glTF/glTFExporter.h index bb9d5f05d..a52695402 100644 --- a/code/AssetLib/glTF/glTFExporter.h +++ b/code/AssetLib/glTF/glTFExporter.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/glTF/glTFImporter.cpp b/code/AssetLib/glTF/glTFImporter.cpp index 5e072dd2a..72103993d 100644 --- a/code/AssetLib/glTF/glTFImporter.cpp +++ b/code/AssetLib/glTF/glTFImporter.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/glTF/glTFImporter.h b/code/AssetLib/glTF/glTFImporter.h index 2df60a463..529da53cc 100644 --- a/code/AssetLib/glTF/glTFImporter.h +++ b/code/AssetLib/glTF/glTFImporter.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/glTF2/glTF2Asset.h b/code/AssetLib/glTF2/glTF2Asset.h index a9b5d442c..e4fb2dc84 100644 --- a/code/AssetLib/glTF2/glTF2Asset.h +++ b/code/AssetLib/glTF2/glTF2Asset.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/glTF2/glTF2Asset.inl b/code/AssetLib/glTF2/glTF2Asset.inl index f35a47efa..800b6640e 100644 --- a/code/AssetLib/glTF2/glTF2Asset.inl +++ b/code/AssetLib/glTF2/glTF2Asset.inl @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/glTF2/glTF2AssetWriter.h b/code/AssetLib/glTF2/glTF2AssetWriter.h index ce8b4d65e..089a15844 100644 --- a/code/AssetLib/glTF2/glTF2AssetWriter.h +++ b/code/AssetLib/glTF2/glTF2AssetWriter.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/glTF2/glTF2AssetWriter.inl b/code/AssetLib/glTF2/glTF2AssetWriter.inl index b91553fbe..4f4130599 100644 --- a/code/AssetLib/glTF2/glTF2AssetWriter.inl +++ b/code/AssetLib/glTF2/glTF2AssetWriter.inl @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/glTF2/glTF2Exporter.cpp b/code/AssetLib/glTF2/glTF2Exporter.cpp index a2b5e9848..e779a7be4 100644 --- a/code/AssetLib/glTF2/glTF2Exporter.cpp +++ b/code/AssetLib/glTF2/glTF2Exporter.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/glTF2/glTF2Exporter.h b/code/AssetLib/glTF2/glTF2Exporter.h index d328f8a80..99425228e 100644 --- a/code/AssetLib/glTF2/glTF2Exporter.h +++ b/code/AssetLib/glTF2/glTF2Exporter.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/glTF2/glTF2Importer.cpp b/code/AssetLib/glTF2/glTF2Importer.cpp index 9ed68d786..bf8690ad2 100644 --- a/code/AssetLib/glTF2/glTF2Importer.cpp +++ b/code/AssetLib/glTF2/glTF2Importer.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/AssetLib/glTF2/glTF2Importer.h b/code/AssetLib/glTF2/glTF2Importer.h index 23830c0eb..9a05c4dba 100644 --- a/code/AssetLib/glTF2/glTF2Importer.h +++ b/code/AssetLib/glTF2/glTF2Importer.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/CApi/AssimpCExport.cpp b/code/CApi/AssimpCExport.cpp index b06c93568..5e43958d0 100644 --- a/code/CApi/AssimpCExport.cpp +++ b/code/CApi/AssimpCExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/code/CApi/CInterfaceIOWrapper.cpp b/code/CApi/CInterfaceIOWrapper.cpp index 245f3bc7a..579545ecc 100644 --- a/code/CApi/CInterfaceIOWrapper.cpp +++ b/code/CApi/CInterfaceIOWrapper.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/code/CApi/CInterfaceIOWrapper.h b/code/CApi/CInterfaceIOWrapper.h index de3dc196a..768be3746 100644 --- a/code/CApi/CInterfaceIOWrapper.h +++ b/code/CApi/CInterfaceIOWrapper.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index 08efd28df..555b6795e 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -1,7 +1,7 @@ # Open Asset Import Library (assimp) # ---------------------------------------------------------------------- # -# Copyright (c) 2006-2021, assimp team +# Copyright (c) 2006-2022, assimp team # # All rights reserved. # diff --git a/code/Common/AssertHandler.cpp b/code/Common/AssertHandler.cpp index 29fb2b313..d0bd6ccad 100644 --- a/code/Common/AssertHandler.cpp +++ b/code/Common/AssertHandler.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/code/Common/Assimp.cpp b/code/Common/Assimp.cpp index 3a0ec7d60..71e312cee 100644 --- a/code/Common/Assimp.cpp +++ b/code/Common/Assimp.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/code/Common/BaseImporter.cpp b/code/Common/BaseImporter.cpp index 82b8f12fc..5e186bb19 100644 --- a/code/Common/BaseImporter.cpp +++ b/code/Common/BaseImporter.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/Common/BaseProcess.cpp b/code/Common/BaseProcess.cpp index 09ef85cc4..48895b9f3 100644 --- a/code/Common/BaseProcess.cpp +++ b/code/Common/BaseProcess.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/Common/BaseProcess.h b/code/Common/BaseProcess.h index 7f2b2604c..64403567a 100644 --- a/code/Common/BaseProcess.h +++ b/code/Common/BaseProcess.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/Common/Bitmap.cpp b/code/Common/Bitmap.cpp index 51f31625e..65dfd1754 100644 --- a/code/Common/Bitmap.cpp +++ b/code/Common/Bitmap.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/Common/CreateAnimMesh.cpp b/code/Common/CreateAnimMesh.cpp index b8870ff25..58f3d909d 100644 --- a/code/Common/CreateAnimMesh.cpp +++ b/code/Common/CreateAnimMesh.cpp @@ -4,7 +4,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- Copyright (C) 2016 The Qt Company Ltd. -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/Common/DefaultIOStream.cpp b/code/Common/DefaultIOStream.cpp index e18dcd3f5..e30f26acd 100644 --- a/code/Common/DefaultIOStream.cpp +++ b/code/Common/DefaultIOStream.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/Common/DefaultIOSystem.cpp b/code/Common/DefaultIOSystem.cpp index de93909de..b28910c70 100644 --- a/code/Common/DefaultIOSystem.cpp +++ b/code/Common/DefaultIOSystem.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/Common/DefaultLogger.cpp b/code/Common/DefaultLogger.cpp index da43a7a7e..f88632f0e 100644 --- a/code/Common/DefaultLogger.cpp +++ b/code/Common/DefaultLogger.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/code/Common/DefaultProgressHandler.h b/code/Common/DefaultProgressHandler.h index ebf4a0e74..ac1bb68db 100644 --- a/code/Common/DefaultProgressHandler.h +++ b/code/Common/DefaultProgressHandler.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/Common/Exceptional.cpp b/code/Common/Exceptional.cpp index 89090c9d3..b25281a97 100644 --- a/code/Common/Exceptional.cpp +++ b/code/Common/Exceptional.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/Common/Exporter.cpp b/code/Common/Exporter.cpp index 512bbf447..9a4e2cf3d 100644 --- a/code/Common/Exporter.cpp +++ b/code/Common/Exporter.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/Common/FileLogStream.h b/code/Common/FileLogStream.h index ed508bbf7..334541485 100644 --- a/code/Common/FileLogStream.h +++ b/code/Common/FileLogStream.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/Common/Importer.cpp b/code/Common/Importer.cpp index 2f9c23bec..1d67c9def 100644 --- a/code/Common/Importer.cpp +++ b/code/Common/Importer.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/Common/Importer.h b/code/Common/Importer.h index f79b38214..ab7e3a6b3 100644 --- a/code/Common/Importer.h +++ b/code/Common/Importer.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/Common/ImporterRegistry.cpp b/code/Common/ImporterRegistry.cpp index 644acf29c..fd4a7cd6e 100644 --- a/code/Common/ImporterRegistry.cpp +++ b/code/Common/ImporterRegistry.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/Common/PolyTools.h b/code/Common/PolyTools.h index 15276184e..11f627392 100644 --- a/code/Common/PolyTools.h +++ b/code/Common/PolyTools.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/Common/PostStepRegistry.cpp b/code/Common/PostStepRegistry.cpp index a2d015cc4..de4f39083 100644 --- a/code/Common/PostStepRegistry.cpp +++ b/code/Common/PostStepRegistry.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/code/Common/RemoveComments.cpp b/code/Common/RemoveComments.cpp index e9e2a6ade..4fae21c95 100644 --- a/code/Common/RemoveComments.cpp +++ b/code/Common/RemoveComments.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/Common/SGSpatialSort.cpp b/code/Common/SGSpatialSort.cpp index 78b869260..0d16d6fe8 100644 --- a/code/Common/SGSpatialSort.cpp +++ b/code/Common/SGSpatialSort.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/code/Common/SceneCombiner.cpp b/code/Common/SceneCombiner.cpp index 7dbbf8860..2c2539e54 100644 --- a/code/Common/SceneCombiner.cpp +++ b/code/Common/SceneCombiner.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/Common/ScenePreprocessor.cpp b/code/Common/ScenePreprocessor.cpp index 2ea17c643..2ef291eeb 100644 --- a/code/Common/ScenePreprocessor.cpp +++ b/code/Common/ScenePreprocessor.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/Common/ScenePreprocessor.h b/code/Common/ScenePreprocessor.h index eba7e84f8..49e06ed1c 100644 --- a/code/Common/ScenePreprocessor.h +++ b/code/Common/ScenePreprocessor.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/Common/ScenePrivate.h b/code/Common/ScenePrivate.h index 7a6031b3c..3910db78c 100644 --- a/code/Common/ScenePrivate.h +++ b/code/Common/ScenePrivate.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/Common/SkeletonMeshBuilder.cpp b/code/Common/SkeletonMeshBuilder.cpp index 7c98187a4..5ea30d9c7 100644 --- a/code/Common/SkeletonMeshBuilder.cpp +++ b/code/Common/SkeletonMeshBuilder.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/Common/SpatialSort.cpp b/code/Common/SpatialSort.cpp index 9b96887ac..6103002cc 100644 --- a/code/Common/SpatialSort.cpp +++ b/code/Common/SpatialSort.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/Common/StandardShapes.cpp b/code/Common/StandardShapes.cpp index 64ceeffc8..e94b5b9af 100644 --- a/code/Common/StandardShapes.cpp +++ b/code/Common/StandardShapes.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/Common/StdOStreamLogStream.h b/code/Common/StdOStreamLogStream.h index 7012ab825..cc0e06263 100644 --- a/code/Common/StdOStreamLogStream.h +++ b/code/Common/StdOStreamLogStream.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/code/Common/Subdivision.cpp b/code/Common/Subdivision.cpp index 9e7577a04..705ea3fb3 100644 --- a/code/Common/Subdivision.cpp +++ b/code/Common/Subdivision.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/Common/TargetAnimation.cpp b/code/Common/TargetAnimation.cpp index 6cd9c9a4d..5f6d9bad0 100644 --- a/code/Common/TargetAnimation.cpp +++ b/code/Common/TargetAnimation.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/Common/TargetAnimation.h b/code/Common/TargetAnimation.h index f386029fb..863406b94 100644 --- a/code/Common/TargetAnimation.h +++ b/code/Common/TargetAnimation.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/Common/Version.cpp b/code/Common/Version.cpp index 205dde52b..20533ab80 100644 --- a/code/Common/Version.cpp +++ b/code/Common/Version.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/Common/VertexTriangleAdjacency.cpp b/code/Common/VertexTriangleAdjacency.cpp index d644f4ab9..555e3e386 100644 --- a/code/Common/VertexTriangleAdjacency.cpp +++ b/code/Common/VertexTriangleAdjacency.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/code/Common/VertexTriangleAdjacency.h b/code/Common/VertexTriangleAdjacency.h index 48c1a54fb..41d809450 100644 --- a/code/Common/VertexTriangleAdjacency.h +++ b/code/Common/VertexTriangleAdjacency.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/Common/Win32DebugLogStream.h b/code/Common/Win32DebugLogStream.h index 51f1ab178..34d849e83 100644 --- a/code/Common/Win32DebugLogStream.h +++ b/code/Common/Win32DebugLogStream.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/code/Common/ZipArchiveIOSystem.cpp b/code/Common/ZipArchiveIOSystem.cpp index 9870fa9d0..c322b140f 100644 --- a/code/Common/ZipArchiveIOSystem.cpp +++ b/code/Common/ZipArchiveIOSystem.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/Common/material.cpp b/code/Common/material.cpp index 6c90e66f0..8f791a313 100644 --- a/code/Common/material.cpp +++ b/code/Common/material.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/Common/scene.cpp b/code/Common/scene.cpp index b1f858c48..b0e882154 100644 --- a/code/Common/scene.cpp +++ b/code/Common/scene.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/Common/simd.cpp b/code/Common/simd.cpp index 071ee3e01..9eb547f9a 100644 --- a/code/Common/simd.cpp +++ b/code/Common/simd.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/code/Common/simd.h b/code/Common/simd.h index ee0f62658..0a062a248 100644 --- a/code/Common/simd.h +++ b/code/Common/simd.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/code/Material/MaterialSystem.cpp b/code/Material/MaterialSystem.cpp index 23d198953..b2f738959 100644 --- a/code/Material/MaterialSystem.cpp +++ b/code/Material/MaterialSystem.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/Material/MaterialSystem.h b/code/Material/MaterialSystem.h index 593161790..41891ad97 100644 --- a/code/Material/MaterialSystem.h +++ b/code/Material/MaterialSystem.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/Pbrt/PbrtExporter.cpp b/code/Pbrt/PbrtExporter.cpp index c04ab6c19..25061f517 100644 --- a/code/Pbrt/PbrtExporter.cpp +++ b/code/Pbrt/PbrtExporter.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/Pbrt/PbrtExporter.h b/code/Pbrt/PbrtExporter.h index e8ff03ccb..4f4e1625d 100644 --- a/code/Pbrt/PbrtExporter.h +++ b/code/Pbrt/PbrtExporter.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/PostProcessing/ArmaturePopulate.cpp b/code/PostProcessing/ArmaturePopulate.cpp index fdf7508d0..3fc1e12bc 100644 --- a/code/PostProcessing/ArmaturePopulate.cpp +++ b/code/PostProcessing/ArmaturePopulate.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/PostProcessing/ArmaturePopulate.h b/code/PostProcessing/ArmaturePopulate.h index ded8b4886..530932f48 100644 --- a/code/PostProcessing/ArmaturePopulate.h +++ b/code/PostProcessing/ArmaturePopulate.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/PostProcessing/CalcTangentsProcess.cpp b/code/PostProcessing/CalcTangentsProcess.cpp index 3e6bb0270..0ebad91df 100644 --- a/code/PostProcessing/CalcTangentsProcess.cpp +++ b/code/PostProcessing/CalcTangentsProcess.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/code/PostProcessing/CalcTangentsProcess.h b/code/PostProcessing/CalcTangentsProcess.h index ce08d3ef7..018789bae 100644 --- a/code/PostProcessing/CalcTangentsProcess.h +++ b/code/PostProcessing/CalcTangentsProcess.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/PostProcessing/ComputeUVMappingProcess.cpp b/code/PostProcessing/ComputeUVMappingProcess.cpp index 8ce3e41c4..c7456cc9d 100644 --- a/code/PostProcessing/ComputeUVMappingProcess.cpp +++ b/code/PostProcessing/ComputeUVMappingProcess.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/PostProcessing/ComputeUVMappingProcess.h b/code/PostProcessing/ComputeUVMappingProcess.h index fe44b4d41..74744be7f 100644 --- a/code/PostProcessing/ComputeUVMappingProcess.h +++ b/code/PostProcessing/ComputeUVMappingProcess.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/PostProcessing/ConvertToLHProcess.cpp b/code/PostProcessing/ConvertToLHProcess.cpp index 4b949e10e..4ded0fc15 100644 --- a/code/PostProcessing/ConvertToLHProcess.cpp +++ b/code/PostProcessing/ConvertToLHProcess.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/code/PostProcessing/ConvertToLHProcess.h b/code/PostProcessing/ConvertToLHProcess.h index 7e92b66af..474056c3a 100644 --- a/code/PostProcessing/ConvertToLHProcess.h +++ b/code/PostProcessing/ConvertToLHProcess.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/PostProcessing/DeboneProcess.cpp b/code/PostProcessing/DeboneProcess.cpp index 3783bb65c..e8cfb16b0 100644 --- a/code/PostProcessing/DeboneProcess.cpp +++ b/code/PostProcessing/DeboneProcess.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/PostProcessing/DeboneProcess.h b/code/PostProcessing/DeboneProcess.h index 5765bf5bf..cb072b7eb 100644 --- a/code/PostProcessing/DeboneProcess.h +++ b/code/PostProcessing/DeboneProcess.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/PostProcessing/DropFaceNormalsProcess.cpp b/code/PostProcessing/DropFaceNormalsProcess.cpp index 21abf9693..0cf17f909 100644 --- a/code/PostProcessing/DropFaceNormalsProcess.cpp +++ b/code/PostProcessing/DropFaceNormalsProcess.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/code/PostProcessing/DropFaceNormalsProcess.h b/code/PostProcessing/DropFaceNormalsProcess.h index 5f7917b5a..50abdc727 100644 --- a/code/PostProcessing/DropFaceNormalsProcess.h +++ b/code/PostProcessing/DropFaceNormalsProcess.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/PostProcessing/EmbedTexturesProcess.cpp b/code/PostProcessing/EmbedTexturesProcess.cpp index 0c1207cff..2f80c908e 100644 --- a/code/PostProcessing/EmbedTexturesProcess.cpp +++ b/code/PostProcessing/EmbedTexturesProcess.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/PostProcessing/EmbedTexturesProcess.h b/code/PostProcessing/EmbedTexturesProcess.h index b33968850..c3e63612c 100644 --- a/code/PostProcessing/EmbedTexturesProcess.h +++ b/code/PostProcessing/EmbedTexturesProcess.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/PostProcessing/FindDegenerates.cpp b/code/PostProcessing/FindDegenerates.cpp index 3809abf50..de46d5630 100644 --- a/code/PostProcessing/FindDegenerates.cpp +++ b/code/PostProcessing/FindDegenerates.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/PostProcessing/FindDegenerates.h b/code/PostProcessing/FindDegenerates.h index 9ab62b97b..6fe1e929b 100644 --- a/code/PostProcessing/FindDegenerates.h +++ b/code/PostProcessing/FindDegenerates.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/PostProcessing/FindInstancesProcess.cpp b/code/PostProcessing/FindInstancesProcess.cpp index d46afc201..7f8c93f77 100644 --- a/code/PostProcessing/FindInstancesProcess.cpp +++ b/code/PostProcessing/FindInstancesProcess.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/code/PostProcessing/FindInstancesProcess.h b/code/PostProcessing/FindInstancesProcess.h index 7336f1492..b501d88d5 100644 --- a/code/PostProcessing/FindInstancesProcess.h +++ b/code/PostProcessing/FindInstancesProcess.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/PostProcessing/FindInvalidDataProcess.cpp b/code/PostProcessing/FindInvalidDataProcess.cpp index ea7d99094..b42cbe9a0 100644 --- a/code/PostProcessing/FindInvalidDataProcess.cpp +++ b/code/PostProcessing/FindInvalidDataProcess.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/PostProcessing/FindInvalidDataProcess.h b/code/PostProcessing/FindInvalidDataProcess.h index 4d8c61d83..5ea895c59 100644 --- a/code/PostProcessing/FindInvalidDataProcess.h +++ b/code/PostProcessing/FindInvalidDataProcess.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/PostProcessing/FixNormalsStep.cpp b/code/PostProcessing/FixNormalsStep.cpp index 09b1f1908..be0104214 100644 --- a/code/PostProcessing/FixNormalsStep.cpp +++ b/code/PostProcessing/FixNormalsStep.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/code/PostProcessing/FixNormalsStep.h b/code/PostProcessing/FixNormalsStep.h index 86e998f0b..b7d3ba386 100644 --- a/code/PostProcessing/FixNormalsStep.h +++ b/code/PostProcessing/FixNormalsStep.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/PostProcessing/GenBoundingBoxesProcess.cpp b/code/PostProcessing/GenBoundingBoxesProcess.cpp index 7f41d847c..1c20b6f94 100644 --- a/code/PostProcessing/GenBoundingBoxesProcess.cpp +++ b/code/PostProcessing/GenBoundingBoxesProcess.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/PostProcessing/GenBoundingBoxesProcess.h b/code/PostProcessing/GenBoundingBoxesProcess.h index a1daaea45..0b7591b6d 100644 --- a/code/PostProcessing/GenBoundingBoxesProcess.h +++ b/code/PostProcessing/GenBoundingBoxesProcess.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/PostProcessing/GenFaceNormalsProcess.cpp b/code/PostProcessing/GenFaceNormalsProcess.cpp index 3e8612d29..517dd3b63 100644 --- a/code/PostProcessing/GenFaceNormalsProcess.cpp +++ b/code/PostProcessing/GenFaceNormalsProcess.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/code/PostProcessing/GenFaceNormalsProcess.h b/code/PostProcessing/GenFaceNormalsProcess.h index eefff6c73..586c4902e 100644 --- a/code/PostProcessing/GenFaceNormalsProcess.h +++ b/code/PostProcessing/GenFaceNormalsProcess.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/PostProcessing/GenVertexNormalsProcess.cpp b/code/PostProcessing/GenVertexNormalsProcess.cpp index e82bc3e6f..1a8afc597 100644 --- a/code/PostProcessing/GenVertexNormalsProcess.cpp +++ b/code/PostProcessing/GenVertexNormalsProcess.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/code/PostProcessing/GenVertexNormalsProcess.h b/code/PostProcessing/GenVertexNormalsProcess.h index 8fc301ab7..0dcae793a 100644 --- a/code/PostProcessing/GenVertexNormalsProcess.h +++ b/code/PostProcessing/GenVertexNormalsProcess.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/PostProcessing/ImproveCacheLocality.cpp b/code/PostProcessing/ImproveCacheLocality.cpp index 3243c40b4..56bdfc447 100644 --- a/code/PostProcessing/ImproveCacheLocality.cpp +++ b/code/PostProcessing/ImproveCacheLocality.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/code/PostProcessing/ImproveCacheLocality.h b/code/PostProcessing/ImproveCacheLocality.h index 8ccd42ad3..b2074a17c 100644 --- a/code/PostProcessing/ImproveCacheLocality.h +++ b/code/PostProcessing/ImproveCacheLocality.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/PostProcessing/JoinVerticesProcess.cpp b/code/PostProcessing/JoinVerticesProcess.cpp index 60c64f3bf..184e8d745 100644 --- a/code/PostProcessing/JoinVerticesProcess.cpp +++ b/code/PostProcessing/JoinVerticesProcess.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/code/PostProcessing/JoinVerticesProcess.h b/code/PostProcessing/JoinVerticesProcess.h index 66f40f93d..f95236e31 100644 --- a/code/PostProcessing/JoinVerticesProcess.h +++ b/code/PostProcessing/JoinVerticesProcess.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/PostProcessing/LimitBoneWeightsProcess.cpp b/code/PostProcessing/LimitBoneWeightsProcess.cpp index fb8b49b91..63f6bf9f3 100644 --- a/code/PostProcessing/LimitBoneWeightsProcess.cpp +++ b/code/PostProcessing/LimitBoneWeightsProcess.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/PostProcessing/LimitBoneWeightsProcess.h b/code/PostProcessing/LimitBoneWeightsProcess.h index 29cd9f924..22d286b68 100644 --- a/code/PostProcessing/LimitBoneWeightsProcess.h +++ b/code/PostProcessing/LimitBoneWeightsProcess.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/PostProcessing/MakeVerboseFormat.cpp b/code/PostProcessing/MakeVerboseFormat.cpp index 71c1cc439..75e2a0f06 100644 --- a/code/PostProcessing/MakeVerboseFormat.cpp +++ b/code/PostProcessing/MakeVerboseFormat.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/code/PostProcessing/MakeVerboseFormat.h b/code/PostProcessing/MakeVerboseFormat.h index 4304a3afa..6b81da622 100644 --- a/code/PostProcessing/MakeVerboseFormat.h +++ b/code/PostProcessing/MakeVerboseFormat.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/PostProcessing/OptimizeGraph.cpp b/code/PostProcessing/OptimizeGraph.cpp index d7bcf3fec..ea44eb3c1 100644 --- a/code/PostProcessing/OptimizeGraph.cpp +++ b/code/PostProcessing/OptimizeGraph.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/PostProcessing/OptimizeGraph.h b/code/PostProcessing/OptimizeGraph.h index 4df565de9..f5caa139c 100644 --- a/code/PostProcessing/OptimizeGraph.h +++ b/code/PostProcessing/OptimizeGraph.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/PostProcessing/OptimizeMeshes.cpp b/code/PostProcessing/OptimizeMeshes.cpp index 939284ee4..e624bb1cf 100644 --- a/code/PostProcessing/OptimizeMeshes.cpp +++ b/code/PostProcessing/OptimizeMeshes.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/code/PostProcessing/OptimizeMeshes.h b/code/PostProcessing/OptimizeMeshes.h index 4dd51554b..b80f98d5d 100644 --- a/code/PostProcessing/OptimizeMeshes.h +++ b/code/PostProcessing/OptimizeMeshes.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/PostProcessing/PretransformVertices.cpp b/code/PostProcessing/PretransformVertices.cpp index fa95319ff..ec7b8783e 100644 --- a/code/PostProcessing/PretransformVertices.cpp +++ b/code/PostProcessing/PretransformVertices.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/code/PostProcessing/PretransformVertices.h b/code/PostProcessing/PretransformVertices.h index 4aa742b09..14e5139ec 100644 --- a/code/PostProcessing/PretransformVertices.h +++ b/code/PostProcessing/PretransformVertices.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/PostProcessing/ProcessHelper.cpp b/code/PostProcessing/ProcessHelper.cpp index e46289330..6f0a79825 100644 --- a/code/PostProcessing/ProcessHelper.cpp +++ b/code/PostProcessing/ProcessHelper.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/PostProcessing/ProcessHelper.h b/code/PostProcessing/ProcessHelper.h index 497c5237f..78df94ca1 100644 --- a/code/PostProcessing/ProcessHelper.h +++ b/code/PostProcessing/ProcessHelper.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/PostProcessing/RemoveRedundantMaterials.cpp b/code/PostProcessing/RemoveRedundantMaterials.cpp index f6355fcc6..ac2fa9790 100644 --- a/code/PostProcessing/RemoveRedundantMaterials.cpp +++ b/code/PostProcessing/RemoveRedundantMaterials.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/code/PostProcessing/RemoveRedundantMaterials.h b/code/PostProcessing/RemoveRedundantMaterials.h index 4210a7fe2..e8c1478fd 100644 --- a/code/PostProcessing/RemoveRedundantMaterials.h +++ b/code/PostProcessing/RemoveRedundantMaterials.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/PostProcessing/RemoveVCProcess.cpp b/code/PostProcessing/RemoveVCProcess.cpp index 9ee1da15c..1107736e9 100644 --- a/code/PostProcessing/RemoveVCProcess.cpp +++ b/code/PostProcessing/RemoveVCProcess.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/code/PostProcessing/RemoveVCProcess.h b/code/PostProcessing/RemoveVCProcess.h index 57d9f5839..cf1086882 100644 --- a/code/PostProcessing/RemoveVCProcess.h +++ b/code/PostProcessing/RemoveVCProcess.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/PostProcessing/ScaleProcess.cpp b/code/PostProcessing/ScaleProcess.cpp index 8fb3dc903..0090f8dd7 100644 --- a/code/PostProcessing/ScaleProcess.cpp +++ b/code/PostProcessing/ScaleProcess.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/PostProcessing/ScaleProcess.h b/code/PostProcessing/ScaleProcess.h index 4dc7e3559..b6eb75de7 100644 --- a/code/PostProcessing/ScaleProcess.h +++ b/code/PostProcessing/ScaleProcess.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/PostProcessing/SortByPTypeProcess.cpp b/code/PostProcessing/SortByPTypeProcess.cpp index 3787be51e..c9268093e 100644 --- a/code/PostProcessing/SortByPTypeProcess.cpp +++ b/code/PostProcessing/SortByPTypeProcess.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/code/PostProcessing/SortByPTypeProcess.h b/code/PostProcessing/SortByPTypeProcess.h index 0380235d2..e30342a86 100644 --- a/code/PostProcessing/SortByPTypeProcess.h +++ b/code/PostProcessing/SortByPTypeProcess.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/PostProcessing/SplitByBoneCountProcess.cpp b/code/PostProcessing/SplitByBoneCountProcess.cpp index ed5b9411e..ace62ae90 100644 --- a/code/PostProcessing/SplitByBoneCountProcess.cpp +++ b/code/PostProcessing/SplitByBoneCountProcess.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/PostProcessing/SplitByBoneCountProcess.h b/code/PostProcessing/SplitByBoneCountProcess.h index 0972440fd..938b00c7f 100644 --- a/code/PostProcessing/SplitByBoneCountProcess.h +++ b/code/PostProcessing/SplitByBoneCountProcess.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/PostProcessing/SplitLargeMeshes.cpp b/code/PostProcessing/SplitLargeMeshes.cpp index b601a1331..508a82669 100644 --- a/code/PostProcessing/SplitLargeMeshes.cpp +++ b/code/PostProcessing/SplitLargeMeshes.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/PostProcessing/SplitLargeMeshes.h b/code/PostProcessing/SplitLargeMeshes.h index 61facf7ef..e5a8d4c1b 100644 --- a/code/PostProcessing/SplitLargeMeshes.h +++ b/code/PostProcessing/SplitLargeMeshes.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/PostProcessing/TextureTransform.cpp b/code/PostProcessing/TextureTransform.cpp index 1cb7f293e..653506ec6 100644 --- a/code/PostProcessing/TextureTransform.cpp +++ b/code/PostProcessing/TextureTransform.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/PostProcessing/TextureTransform.h b/code/PostProcessing/TextureTransform.h index 8d2c70081..c1cccf8ef 100644 --- a/code/PostProcessing/TextureTransform.h +++ b/code/PostProcessing/TextureTransform.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/PostProcessing/TriangulateProcess.cpp b/code/PostProcessing/TriangulateProcess.cpp index b7928ee59..a18bf1c24 100644 --- a/code/PostProcessing/TriangulateProcess.cpp +++ b/code/PostProcessing/TriangulateProcess.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/PostProcessing/TriangulateProcess.h b/code/PostProcessing/TriangulateProcess.h index c82366662..ed5f4a587 100644 --- a/code/PostProcessing/TriangulateProcess.h +++ b/code/PostProcessing/TriangulateProcess.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/code/PostProcessing/ValidateDataStructure.cpp b/code/PostProcessing/ValidateDataStructure.cpp index 6a872ef11..e99f6a6e3 100644 --- a/code/PostProcessing/ValidateDataStructure.cpp +++ b/code/PostProcessing/ValidateDataStructure.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/code/PostProcessing/ValidateDataStructure.h b/code/PostProcessing/ValidateDataStructure.h index 50ff6e317..077a47b70 100644 --- a/code/PostProcessing/ValidateDataStructure.h +++ b/code/PostProcessing/ValidateDataStructure.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/BaseImporter.h b/include/assimp/BaseImporter.h index 656e0f165..9351c69da 100644 --- a/include/assimp/BaseImporter.h +++ b/include/assimp/BaseImporter.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/Bitmap.h b/include/assimp/Bitmap.h index 228f6e9ba..6a614f7cf 100644 --- a/include/assimp/Bitmap.h +++ b/include/assimp/Bitmap.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/BlobIOSystem.h b/include/assimp/BlobIOSystem.h index da220b690..7e8d46a53 100644 --- a/include/assimp/BlobIOSystem.h +++ b/include/assimp/BlobIOSystem.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/ByteSwapper.h b/include/assimp/ByteSwapper.h index 94df04b7f..cf3a703b0 100644 --- a/include/assimp/ByteSwapper.h +++ b/include/assimp/ByteSwapper.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/ColladaMetaData.h b/include/assimp/ColladaMetaData.h index de5963b39..52eb3c508 100644 --- a/include/assimp/ColladaMetaData.h +++ b/include/assimp/ColladaMetaData.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/CreateAnimMesh.h b/include/assimp/CreateAnimMesh.h index 868a1f399..e5211f504 100644 --- a/include/assimp/CreateAnimMesh.h +++ b/include/assimp/CreateAnimMesh.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/DefaultIOStream.h b/include/assimp/DefaultIOStream.h index 9e0a48623..aa298a667 100644 --- a/include/assimp/DefaultIOStream.h +++ b/include/assimp/DefaultIOStream.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/DefaultIOSystem.h b/include/assimp/DefaultIOSystem.h index 2e5d0aac0..8545e75cf 100644 --- a/include/assimp/DefaultIOSystem.h +++ b/include/assimp/DefaultIOSystem.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/DefaultLogger.hpp b/include/assimp/DefaultLogger.hpp index a83aedbd7..723097ff2 100644 --- a/include/assimp/DefaultLogger.hpp +++ b/include/assimp/DefaultLogger.hpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/Exceptional.h b/include/assimp/Exceptional.h index 3078de9f4..e753a8ba1 100644 --- a/include/assimp/Exceptional.h +++ b/include/assimp/Exceptional.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. Redistribution and use of this software in source and binary forms, diff --git a/include/assimp/Exporter.hpp b/include/assimp/Exporter.hpp index 6ab35a8f0..09a459442 100644 --- a/include/assimp/Exporter.hpp +++ b/include/assimp/Exporter.hpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/GenericProperty.h b/include/assimp/GenericProperty.h index cac6ba964..073d53312 100644 --- a/include/assimp/GenericProperty.h +++ b/include/assimp/GenericProperty.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/GltfMaterial.h b/include/assimp/GltfMaterial.h index 85476ba0e..86ca8897c 100644 --- a/include/assimp/GltfMaterial.h +++ b/include/assimp/GltfMaterial.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/Hash.h b/include/assimp/Hash.h index 87f06450d..1f2baedac 100644 --- a/include/assimp/Hash.h +++ b/include/assimp/Hash.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/IOStream.hpp b/include/assimp/IOStream.hpp index bbf3537ba..5e19f5176 100644 --- a/include/assimp/IOStream.hpp +++ b/include/assimp/IOStream.hpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/IOStreamBuffer.h b/include/assimp/IOStreamBuffer.h index bbb5ef256..09ca1c962 100644 --- a/include/assimp/IOStreamBuffer.h +++ b/include/assimp/IOStreamBuffer.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/IOSystem.hpp b/include/assimp/IOSystem.hpp index dda0718e6..863dd9c1d 100644 --- a/include/assimp/IOSystem.hpp +++ b/include/assimp/IOSystem.hpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/Importer.hpp b/include/assimp/Importer.hpp index 6ce327c4f..05a15139a 100644 --- a/include/assimp/Importer.hpp +++ b/include/assimp/Importer.hpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/include/assimp/LineSplitter.h b/include/assimp/LineSplitter.h index 0a9d24437..a8aa665db 100644 --- a/include/assimp/LineSplitter.h +++ b/include/assimp/LineSplitter.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/LogAux.h b/include/assimp/LogAux.h index 01a7d6375..c7b86a185 100644 --- a/include/assimp/LogAux.h +++ b/include/assimp/LogAux.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/LogStream.hpp b/include/assimp/LogStream.hpp index 64a7955fd..0ac74c609 100644 --- a/include/assimp/LogStream.hpp +++ b/include/assimp/LogStream.hpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/Logger.hpp b/include/assimp/Logger.hpp index 549b0fbc2..54fd5d03d 100644 --- a/include/assimp/Logger.hpp +++ b/include/assimp/Logger.hpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/MathFunctions.h b/include/assimp/MathFunctions.h index 2088c394c..f2a7ccdf6 100644 --- a/include/assimp/MathFunctions.h +++ b/include/assimp/MathFunctions.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/MemoryIOWrapper.h b/include/assimp/MemoryIOWrapper.h index 0e509d997..b4c37763d 100644 --- a/include/assimp/MemoryIOWrapper.h +++ b/include/assimp/MemoryIOWrapper.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/NullLogger.hpp b/include/assimp/NullLogger.hpp index 8277b014a..1b594ea28 100644 --- a/include/assimp/NullLogger.hpp +++ b/include/assimp/NullLogger.hpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/ParsingUtils.h b/include/assimp/ParsingUtils.h index b5074869e..b08f23227 100644 --- a/include/assimp/ParsingUtils.h +++ b/include/assimp/ParsingUtils.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/Profiler.h b/include/assimp/Profiler.h index 2f2c72bf2..fe0ffbb10 100644 --- a/include/assimp/Profiler.h +++ b/include/assimp/Profiler.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/ProgressHandler.hpp b/include/assimp/ProgressHandler.hpp index 40661fba8..1a272bb87 100644 --- a/include/assimp/ProgressHandler.hpp +++ b/include/assimp/ProgressHandler.hpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/RemoveComments.h b/include/assimp/RemoveComments.h index 32f2c6722..c2defff63 100644 --- a/include/assimp/RemoveComments.h +++ b/include/assimp/RemoveComments.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/SGSpatialSort.h b/include/assimp/SGSpatialSort.h index 23a3cb53c..96feefabb 100644 --- a/include/assimp/SGSpatialSort.h +++ b/include/assimp/SGSpatialSort.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/SceneCombiner.h b/include/assimp/SceneCombiner.h index 874a885a5..6da38cd15 100644 --- a/include/assimp/SceneCombiner.h +++ b/include/assimp/SceneCombiner.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/SkeletonMeshBuilder.h b/include/assimp/SkeletonMeshBuilder.h index 37d12f03d..2929aaa61 100644 --- a/include/assimp/SkeletonMeshBuilder.h +++ b/include/assimp/SkeletonMeshBuilder.h @@ -4,7 +4,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/SmallVector.h b/include/assimp/SmallVector.h index fb78f5a97..60ad26411 100644 --- a/include/assimp/SmallVector.h +++ b/include/assimp/SmallVector.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/SmoothingGroups.h b/include/assimp/SmoothingGroups.h index 754417881..4625a2916 100644 --- a/include/assimp/SmoothingGroups.h +++ b/include/assimp/SmoothingGroups.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/SmoothingGroups.inl b/include/assimp/SmoothingGroups.inl index 08c2dfa53..d5fff5bf7 100644 --- a/include/assimp/SmoothingGroups.inl +++ b/include/assimp/SmoothingGroups.inl @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/SpatialSort.h b/include/assimp/SpatialSort.h index c0c4a0292..87b009da7 100644 --- a/include/assimp/SpatialSort.h +++ b/include/assimp/SpatialSort.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/StandardShapes.h b/include/assimp/StandardShapes.h index 7084427b5..77880cf9e 100644 --- a/include/assimp/StandardShapes.h +++ b/include/assimp/StandardShapes.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/StreamReader.h b/include/assimp/StreamReader.h index c6c17762d..44b24a33b 100644 --- a/include/assimp/StreamReader.h +++ b/include/assimp/StreamReader.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/StreamWriter.h b/include/assimp/StreamWriter.h index f787a3fa0..1bdfcc650 100644 --- a/include/assimp/StreamWriter.h +++ b/include/assimp/StreamWriter.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/include/assimp/StringComparison.h b/include/assimp/StringComparison.h index b0161664f..0518d426d 100644 --- a/include/assimp/StringComparison.h +++ b/include/assimp/StringComparison.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/StringUtils.h b/include/assimp/StringUtils.h index 025a826d2..59c6e9ead 100644 --- a/include/assimp/StringUtils.h +++ b/include/assimp/StringUtils.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/Subdivision.h b/include/assimp/Subdivision.h index 095550a19..9dfb38901 100644 --- a/include/assimp/Subdivision.h +++ b/include/assimp/Subdivision.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/TinyFormatter.h b/include/assimp/TinyFormatter.h index 112f19013..6356bbae6 100644 --- a/include/assimp/TinyFormatter.h +++ b/include/assimp/TinyFormatter.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/Vertex.h b/include/assimp/Vertex.h index f2e5572d3..fd7eb037e 100644 --- a/include/assimp/Vertex.h +++ b/include/assimp/Vertex.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/XMLTools.h b/include/assimp/XMLTools.h index e0082a365..b2766f19b 100644 --- a/include/assimp/XMLTools.h +++ b/include/assimp/XMLTools.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/XmlParser.h b/include/assimp/XmlParser.h index dfaab5169..28f2be8e8 100644 --- a/include/assimp/XmlParser.h +++ b/include/assimp/XmlParser.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/ZipArchiveIOSystem.h b/include/assimp/ZipArchiveIOSystem.h index 842a982de..dac60b501 100644 --- a/include/assimp/ZipArchiveIOSystem.h +++ b/include/assimp/ZipArchiveIOSystem.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/include/assimp/aabb.h b/include/assimp/aabb.h index a6ccdd452..51443bc20 100644 --- a/include/assimp/aabb.h +++ b/include/assimp/aabb.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/ai_assert.h b/include/assimp/ai_assert.h index b4f1ef8b2..b41c08f52 100644 --- a/include/assimp/ai_assert.h +++ b/include/assimp/ai_assert.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/anim.h b/include/assimp/anim.h index 8a73297a5..ef56c1dc2 100644 --- a/include/assimp/anim.h +++ b/include/assimp/anim.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/camera.h b/include/assimp/camera.h index 56c4dbe3f..09255fa05 100644 --- a/include/assimp/camera.h +++ b/include/assimp/camera.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/cexport.h b/include/assimp/cexport.h index 47b59a62f..a45ece39b 100644 --- a/include/assimp/cexport.h +++ b/include/assimp/cexport.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/cfileio.h b/include/assimp/cfileio.h index 48a728a2a..fc1b95ad1 100644 --- a/include/assimp/cfileio.h +++ b/include/assimp/cfileio.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/cimport.h b/include/assimp/cimport.h index d660eebb1..935ed18bd 100644 --- a/include/assimp/cimport.h +++ b/include/assimp/cimport.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/color4.h b/include/assimp/color4.h index 573745ed6..e1e354939 100644 --- a/include/assimp/color4.h +++ b/include/assimp/color4.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/color4.inl b/include/assimp/color4.inl index e5bfdf356..aed3de6f1 100644 --- a/include/assimp/color4.inl +++ b/include/assimp/color4.inl @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/commonMetaData.h b/include/assimp/commonMetaData.h index 28de15909..ccded585b 100644 --- a/include/assimp/commonMetaData.h +++ b/include/assimp/commonMetaData.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/defs.h b/include/assimp/defs.h index e5f401999..232125aa9 100644 --- a/include/assimp/defs.h +++ b/include/assimp/defs.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/importerdesc.h b/include/assimp/importerdesc.h index 037f2e7a4..d08bd1781 100644 --- a/include/assimp/importerdesc.h +++ b/include/assimp/importerdesc.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/light.h b/include/assimp/light.h index 46acad5fd..3331997a9 100644 --- a/include/assimp/light.h +++ b/include/assimp/light.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/material.h b/include/assimp/material.h index 4f98b4697..416dbc4a8 100644 --- a/include/assimp/material.h +++ b/include/assimp/material.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/material.inl b/include/assimp/material.inl index 7a3cce741..a10ba4de3 100644 --- a/include/assimp/material.inl +++ b/include/assimp/material.inl @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/matrix3x3.h b/include/assimp/matrix3x3.h index c941d9f94..5ae31bbeb 100644 --- a/include/assimp/matrix3x3.h +++ b/include/assimp/matrix3x3.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/matrix3x3.inl b/include/assimp/matrix3x3.inl index eee6d0614..99d9197e3 100644 --- a/include/assimp/matrix3x3.inl +++ b/include/assimp/matrix3x3.inl @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/matrix4x4.h b/include/assimp/matrix4x4.h index 6caf7686c..07abf4711 100644 --- a/include/assimp/matrix4x4.h +++ b/include/assimp/matrix4x4.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/include/assimp/matrix4x4.inl b/include/assimp/matrix4x4.inl index c1dd87b65..54d176d18 100644 --- a/include/assimp/matrix4x4.inl +++ b/include/assimp/matrix4x4.inl @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/mesh.h b/include/assimp/mesh.h index 9d4ddf97b..5704e7ca0 100644 --- a/include/assimp/mesh.h +++ b/include/assimp/mesh.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/metadata.h b/include/assimp/metadata.h index 57fedfbfc..d2ec837e9 100644 --- a/include/assimp/metadata.h +++ b/include/assimp/metadata.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/pbrmaterial.h b/include/assimp/pbrmaterial.h index b642a96e3..06932ced2 100644 --- a/include/assimp/pbrmaterial.h +++ b/include/assimp/pbrmaterial.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/postprocess.h b/include/assimp/postprocess.h index 094fbf596..cdcbf0577 100644 --- a/include/assimp/postprocess.h +++ b/include/assimp/postprocess.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/qnan.h b/include/assimp/qnan.h index 0999f5e78..c64cabaad 100644 --- a/include/assimp/qnan.h +++ b/include/assimp/qnan.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/include/assimp/quaternion.h b/include/assimp/quaternion.h index 6941fbbc3..aa92ea577 100644 --- a/include/assimp/quaternion.h +++ b/include/assimp/quaternion.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/quaternion.inl b/include/assimp/quaternion.inl index 3f8abc682..960e91ab2 100644 --- a/include/assimp/quaternion.inl +++ b/include/assimp/quaternion.inl @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/include/assimp/scene.h b/include/assimp/scene.h index 61c2d4c6f..f4c6d7960 100644 --- a/include/assimp/scene.h +++ b/include/assimp/scene.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/texture.h b/include/assimp/texture.h index ec156114b..576fa7711 100644 --- a/include/assimp/texture.h +++ b/include/assimp/texture.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/types.h b/include/assimp/types.h index 47af917ab..a41363b8a 100644 --- a/include/assimp/types.h +++ b/include/assimp/types.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/vector2.h b/include/assimp/vector2.h index 586d63244..333c094d4 100644 --- a/include/assimp/vector2.h +++ b/include/assimp/vector2.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/vector2.inl b/include/assimp/vector2.inl index b51dd0ec2..245eb3190 100644 --- a/include/assimp/vector2.inl +++ b/include/assimp/vector2.inl @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/include/assimp/vector3.h b/include/assimp/vector3.h index e3ad0b680..c191e1ee7 100644 --- a/include/assimp/vector3.h +++ b/include/assimp/vector3.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/vector3.inl b/include/assimp/vector3.inl index 80d2c55a1..28ca2be07 100644 --- a/include/assimp/vector3.inl +++ b/include/assimp/vector3.inl @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/include/assimp/version.h b/include/assimp/version.h index 09a35dbb6..b83110a04 100644 --- a/include/assimp/version.h +++ b/include/assimp/version.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 5e573ed7c..7b15d749d 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,7 +1,7 @@ # Open Asset Import Library (assimp) # ---------------------------------------------------------------------- # -# Copyright (c) 2006-2021, assimp team +# Copyright (c) 2006-2022, assimp team # # All rights reserved. # diff --git a/test/unit/AbstractImportExportBase.cpp b/test/unit/AbstractImportExportBase.cpp index f669588aa..31402f483 100644 --- a/test/unit/AbstractImportExportBase.cpp +++ b/test/unit/AbstractImportExportBase.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/test/unit/AssimpAPITest.cpp b/test/unit/AssimpAPITest.cpp index 249bf1cd4..b8739b039 100644 --- a/test/unit/AssimpAPITest.cpp +++ b/test/unit/AssimpAPITest.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/AssimpAPITest_aiMatrix3x3.cpp b/test/unit/AssimpAPITest_aiMatrix3x3.cpp index 68919db97..90976ba6e 100644 --- a/test/unit/AssimpAPITest_aiMatrix3x3.cpp +++ b/test/unit/AssimpAPITest_aiMatrix3x3.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/test/unit/AssimpAPITest_aiMatrix4x4.cpp b/test/unit/AssimpAPITest_aiMatrix4x4.cpp index d2f57b19d..9372bd9c4 100644 --- a/test/unit/AssimpAPITest_aiMatrix4x4.cpp +++ b/test/unit/AssimpAPITest_aiMatrix4x4.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/test/unit/AssimpAPITest_aiQuaternion.cpp b/test/unit/AssimpAPITest_aiQuaternion.cpp index 79f89337e..8f57bc586 100644 --- a/test/unit/AssimpAPITest_aiQuaternion.cpp +++ b/test/unit/AssimpAPITest_aiQuaternion.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/test/unit/AssimpAPITest_aiVector2D.cpp b/test/unit/AssimpAPITest_aiVector2D.cpp index d52561fa8..44bb34aec 100644 --- a/test/unit/AssimpAPITest_aiVector2D.cpp +++ b/test/unit/AssimpAPITest_aiVector2D.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/test/unit/AssimpAPITest_aiVector3D.cpp b/test/unit/AssimpAPITest_aiVector3D.cpp index a30f80b60..c7521163d 100644 --- a/test/unit/AssimpAPITest_aiVector3D.cpp +++ b/test/unit/AssimpAPITest_aiVector3D.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/test/unit/Common/uiScene.cpp b/test/unit/Common/uiScene.cpp index af0b6ca01..87001cef4 100644 --- a/test/unit/Common/uiScene.cpp +++ b/test/unit/Common/uiScene.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/Common/utAssertHandler.cpp b/test/unit/Common/utAssertHandler.cpp index 5e2925945..a2585fe65 100644 --- a/test/unit/Common/utAssertHandler.cpp +++ b/test/unit/Common/utAssertHandler.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/Common/utLineSplitter.cpp b/test/unit/Common/utLineSplitter.cpp index 770f7f826..0a97f72d9 100644 --- a/test/unit/Common/utLineSplitter.cpp +++ b/test/unit/Common/utLineSplitter.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/test/unit/Common/utMesh.cpp b/test/unit/Common/utMesh.cpp index da0c1084d..edb3de3de 100644 --- a/test/unit/Common/utMesh.cpp +++ b/test/unit/Common/utMesh.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/Common/utSpatialSort.cpp b/test/unit/Common/utSpatialSort.cpp index f0b694c7d..0684e831f 100644 --- a/test/unit/Common/utSpatialSort.cpp +++ b/test/unit/Common/utSpatialSort.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/Common/utStandardShapes.cpp b/test/unit/Common/utStandardShapes.cpp index e1bb6eef9..d7e6d21d7 100644 --- a/test/unit/Common/utStandardShapes.cpp +++ b/test/unit/Common/utStandardShapes.cpp @@ -1,7 +1,7 @@ /* Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +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 diff --git a/test/unit/Common/utXmlParser.cpp b/test/unit/Common/utXmlParser.cpp index 7e992f9df..2db78e30d 100644 --- a/test/unit/Common/utXmlParser.cpp +++ b/test/unit/Common/utXmlParser.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/ImportExport/MDL/MDLHL1TestFiles.h b/test/unit/ImportExport/MDL/MDLHL1TestFiles.h index d5210bf8b..3c0630f63 100644 --- a/test/unit/ImportExport/MDL/MDLHL1TestFiles.h +++ b/test/unit/ImportExport/MDL/MDLHL1TestFiles.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/ImportExport/MDL/utMDLImporter_HL1_ImportSettings.cpp b/test/unit/ImportExport/MDL/utMDLImporter_HL1_ImportSettings.cpp index e21fd5032..02969e186 100644 --- a/test/unit/ImportExport/MDL/utMDLImporter_HL1_ImportSettings.cpp +++ b/test/unit/ImportExport/MDL/utMDLImporter_HL1_ImportSettings.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/ImportExport/MDL/utMDLImporter_HL1_Materials.cpp b/test/unit/ImportExport/MDL/utMDLImporter_HL1_Materials.cpp index 4050c48ff..c47667e76 100644 --- a/test/unit/ImportExport/MDL/utMDLImporter_HL1_Materials.cpp +++ b/test/unit/ImportExport/MDL/utMDLImporter_HL1_Materials.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/ImportExport/MDL/utMDLImporter_HL1_Nodes.cpp b/test/unit/ImportExport/MDL/utMDLImporter_HL1_Nodes.cpp index 1b1ed75d5..4420727e9 100644 --- a/test/unit/ImportExport/MDL/utMDLImporter_HL1_Nodes.cpp +++ b/test/unit/ImportExport/MDL/utMDLImporter_HL1_Nodes.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/ImportExport/RAW/utRAWImportExport.cpp b/test/unit/ImportExport/RAW/utRAWImportExport.cpp index a04953e2c..bdd7f8533 100644 --- a/test/unit/ImportExport/RAW/utRAWImportExport.cpp +++ b/test/unit/ImportExport/RAW/utRAWImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/ImportExport/Terragen/utTerragenImportExport.cpp b/test/unit/ImportExport/Terragen/utTerragenImportExport.cpp index 37c9c4ba6..6432dbf5f 100644 --- a/test/unit/ImportExport/Terragen/utTerragenImportExport.cpp +++ b/test/unit/ImportExport/Terragen/utTerragenImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/ImportExport/utAssjsonImportExport.cpp b/test/unit/ImportExport/utAssjsonImportExport.cpp index 13724f755..3470874b5 100644 --- a/test/unit/ImportExport/utAssjsonImportExport.cpp +++ b/test/unit/ImportExport/utAssjsonImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/ImportExport/utCOBImportExport.cpp b/test/unit/ImportExport/utCOBImportExport.cpp index 20663478b..187f16ede 100644 --- a/test/unit/ImportExport/utCOBImportExport.cpp +++ b/test/unit/ImportExport/utCOBImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/ImportExport/utExporter.cpp b/test/unit/ImportExport/utExporter.cpp index e153d3e4d..9c5ca1ce6 100644 --- a/test/unit/ImportExport/utExporter.cpp +++ b/test/unit/ImportExport/utExporter.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/ImportExport/utMD2Importer.cpp b/test/unit/ImportExport/utMD2Importer.cpp index 60390c6ff..0fcf76bfc 100644 --- a/test/unit/ImportExport/utMD2Importer.cpp +++ b/test/unit/ImportExport/utMD2Importer.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/ImportExport/utMD5Importer.cpp b/test/unit/ImportExport/utMD5Importer.cpp index 2f582f108..082121937 100644 --- a/test/unit/ImportExport/utMD5Importer.cpp +++ b/test/unit/ImportExport/utMD5Importer.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/ImportExport/utMDLImporter.cpp b/test/unit/ImportExport/utMDLImporter.cpp index 98ec9b8dc..c8960601d 100644 --- a/test/unit/ImportExport/utMDLImporter.cpp +++ b/test/unit/ImportExport/utMDLImporter.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/ImportExport/utNFFImportExport.cpp b/test/unit/ImportExport/utNFFImportExport.cpp index 8a2920a82..621324a85 100644 --- a/test/unit/ImportExport/utNFFImportExport.cpp +++ b/test/unit/ImportExport/utNFFImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/ImportExport/utOFFImportExport.cpp b/test/unit/ImportExport/utOFFImportExport.cpp index cc4097915..78ae4acc4 100644 --- a/test/unit/ImportExport/utOFFImportExport.cpp +++ b/test/unit/ImportExport/utOFFImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/ImportExport/utOgreImportExport.cpp b/test/unit/ImportExport/utOgreImportExport.cpp index b45ba6d5c..7312d6b58 100644 --- a/test/unit/ImportExport/utOgreImportExport.cpp +++ b/test/unit/ImportExport/utOgreImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/ImportExport/utQ3BSPFileImportExport.cpp b/test/unit/ImportExport/utQ3BSPFileImportExport.cpp index b2b0e93ab..f5694d2ee 100644 --- a/test/unit/ImportExport/utQ3BSPFileImportExport.cpp +++ b/test/unit/ImportExport/utQ3BSPFileImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/ImportExport/utXGLImportExport.cpp b/test/unit/ImportExport/utXGLImportExport.cpp index f8b1daf6c..8199806cc 100644 --- a/test/unit/ImportExport/utXGLImportExport.cpp +++ b/test/unit/ImportExport/utXGLImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/MathTest.cpp b/test/unit/MathTest.cpp index ecc23545c..ff870ff43 100644 --- a/test/unit/MathTest.cpp +++ b/test/unit/MathTest.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/test/unit/MathTest.h b/test/unit/MathTest.h index eda49f75e..08411e82f 100644 --- a/test/unit/MathTest.h +++ b/test/unit/MathTest.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/test/unit/RandomNumberGeneration.h b/test/unit/RandomNumberGeneration.h index 892e78c06..95ba5b43b 100644 --- a/test/unit/RandomNumberGeneration.h +++ b/test/unit/RandomNumberGeneration.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/SceneDiffer.cpp b/test/unit/SceneDiffer.cpp index 368589bf3..0918530b7 100644 --- a/test/unit/SceneDiffer.cpp +++ b/test/unit/SceneDiffer.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/test/unit/SceneDiffer.h b/test/unit/SceneDiffer.h index e0dc6005a..2ac429b76 100644 --- a/test/unit/SceneDiffer.h +++ b/test/unit/SceneDiffer.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/test/unit/TestIOSystem.h b/test/unit/TestIOSystem.h index 4a42b23f0..b43e65b8f 100644 --- a/test/unit/TestIOSystem.h +++ b/test/unit/TestIOSystem.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/TestModelFactory.h b/test/unit/TestModelFactory.h index b4c1d5f4b..d0f43d760 100644 --- a/test/unit/TestModelFactory.h +++ b/test/unit/TestModelFactory.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/test/unit/UTLogStream.h b/test/unit/UTLogStream.h index 964f3dc43..70cb3f801 100644 --- a/test/unit/UTLogStream.h +++ b/test/unit/UTLogStream.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/ut3DImportExport.cpp b/test/unit/ut3DImportExport.cpp index 93d311ba8..5ff1d7940 100644 --- a/test/unit/ut3DImportExport.cpp +++ b/test/unit/ut3DImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/ut3DSImportExport.cpp b/test/unit/ut3DSImportExport.cpp index 5b78face3..01406362d 100644 --- a/test/unit/ut3DSImportExport.cpp +++ b/test/unit/ut3DSImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utACImportExport.cpp b/test/unit/utACImportExport.cpp index ec87edb27..9615a3a3e 100644 --- a/test/unit/utACImportExport.cpp +++ b/test/unit/utACImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utAMFImportExport.cpp b/test/unit/utAMFImportExport.cpp index 743b927e4..78309a105 100644 --- a/test/unit/utAMFImportExport.cpp +++ b/test/unit/utAMFImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utASEImportExport.cpp b/test/unit/utASEImportExport.cpp index 52416eb91..8014cbbc7 100644 --- a/test/unit/utASEImportExport.cpp +++ b/test/unit/utASEImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utAnim.cpp b/test/unit/utAnim.cpp index 67e8d3440..956810d74 100644 --- a/test/unit/utAnim.cpp +++ b/test/unit/utAnim.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utArmaturePopulate.cpp b/test/unit/utArmaturePopulate.cpp index baabae076..0acea7b50 100644 --- a/test/unit/utArmaturePopulate.cpp +++ b/test/unit/utArmaturePopulate.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utAssbinImportExport.cpp b/test/unit/utAssbinImportExport.cpp index f15897fed..437a0a5fe 100644 --- a/test/unit/utAssbinImportExport.cpp +++ b/test/unit/utAssbinImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utB3DImportExport.cpp b/test/unit/utB3DImportExport.cpp index 8a64a1f21..9672aa01b 100644 --- a/test/unit/utB3DImportExport.cpp +++ b/test/unit/utB3DImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utBVHImportExport.cpp b/test/unit/utBVHImportExport.cpp index 5d1ce5f5b..d69ac7987 100644 --- a/test/unit/utBVHImportExport.cpp +++ b/test/unit/utBVHImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utBatchLoader.cpp b/test/unit/utBatchLoader.cpp index c2722f26c..df6aa7995 100644 --- a/test/unit/utBatchLoader.cpp +++ b/test/unit/utBatchLoader.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/test/unit/utBlendImportAreaLight.cpp b/test/unit/utBlendImportAreaLight.cpp index 71c096bd9..53788743e 100644 --- a/test/unit/utBlendImportAreaLight.cpp +++ b/test/unit/utBlendImportAreaLight.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utBlendImportMaterials.cpp b/test/unit/utBlendImportMaterials.cpp index 4ab6f7b92..582d47ef8 100644 --- a/test/unit/utBlendImportMaterials.cpp +++ b/test/unit/utBlendImportMaterials.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utBlenderImportExport.cpp b/test/unit/utBlenderImportExport.cpp index 9ef1fc693..297098672 100644 --- a/test/unit/utBlenderImportExport.cpp +++ b/test/unit/utBlenderImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/test/unit/utBlenderIntermediate.cpp b/test/unit/utBlenderIntermediate.cpp index 118bceb2d..c2cc51e8d 100644 --- a/test/unit/utBlenderIntermediate.cpp +++ b/test/unit/utBlenderIntermediate.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/test/unit/utBlenderWork.cpp b/test/unit/utBlenderWork.cpp index 28f245638..554198b08 100644 --- a/test/unit/utBlenderWork.cpp +++ b/test/unit/utBlenderWork.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utCSMImportExport.cpp b/test/unit/utCSMImportExport.cpp index 83a3e7e16..13bfd52bc 100644 --- a/test/unit/utCSMImportExport.cpp +++ b/test/unit/utCSMImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utColladaExport.cpp b/test/unit/utColladaExport.cpp index d0c22ffb8..4488f9f90 100644 --- a/test/unit/utColladaExport.cpp +++ b/test/unit/utColladaExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utColladaImportExport.cpp b/test/unit/utColladaImportExport.cpp index 44f988852..b58fa03fa 100644 --- a/test/unit/utColladaImportExport.cpp +++ b/test/unit/utColladaImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utD3MFImportExport.cpp b/test/unit/utD3MFImportExport.cpp index eb990a74a..ed290e876 100644 --- a/test/unit/utD3MFImportExport.cpp +++ b/test/unit/utD3MFImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utDXFImporterExporter.cpp b/test/unit/utDXFImporterExporter.cpp index 3a0475d74..9193946b5 100644 --- a/test/unit/utDXFImporterExporter.cpp +++ b/test/unit/utDXFImporterExporter.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utDefaultIOStream.cpp b/test/unit/utDefaultIOStream.cpp index d3e2c8a7e..803c6f6f6 100644 --- a/test/unit/utDefaultIOStream.cpp +++ b/test/unit/utDefaultIOStream.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/test/unit/utFBXImporterExporter.cpp b/test/unit/utFBXImporterExporter.cpp index 4cfc9b152..679f6ded3 100644 --- a/test/unit/utFBXImporterExporter.cpp +++ b/test/unit/utFBXImporterExporter.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utFastAtof.cpp b/test/unit/utFastAtof.cpp index 189053dc1..cc25482d2 100644 --- a/test/unit/utFastAtof.cpp +++ b/test/unit/utFastAtof.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/test/unit/utFindDegenerates.cpp b/test/unit/utFindDegenerates.cpp index 6f2abebfb..5eadc032c 100644 --- a/test/unit/utFindDegenerates.cpp +++ b/test/unit/utFindDegenerates.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utFindInvalidData.cpp b/test/unit/utFindInvalidData.cpp index b0c8a91d5..1fa8a3fc7 100644 --- a/test/unit/utFindInvalidData.cpp +++ b/test/unit/utFindInvalidData.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utFixInfacingNormals.cpp b/test/unit/utFixInfacingNormals.cpp index 4a52ad142..8f75dd2f0 100644 --- a/test/unit/utFixInfacingNormals.cpp +++ b/test/unit/utFixInfacingNormals.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/test/unit/utGenBoundingBoxesProcess.cpp b/test/unit/utGenBoundingBoxesProcess.cpp index db878ba4c..c512e7f80 100644 --- a/test/unit/utGenBoundingBoxesProcess.cpp +++ b/test/unit/utGenBoundingBoxesProcess.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utGenNormals.cpp b/test/unit/utGenNormals.cpp index 759cb0071..83aadb52e 100644 --- a/test/unit/utGenNormals.cpp +++ b/test/unit/utGenNormals.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utHMPImportExport.cpp b/test/unit/utHMPImportExport.cpp index 0aaabeda0..83e7ba09d 100644 --- a/test/unit/utHMPImportExport.cpp +++ b/test/unit/utHMPImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utIFCImportExport.cpp b/test/unit/utIFCImportExport.cpp index 61871ad64..49c7446c7 100644 --- a/test/unit/utIFCImportExport.cpp +++ b/test/unit/utIFCImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utIOStreamBuffer.cpp b/test/unit/utIOStreamBuffer.cpp index a0e4660df..7565014c1 100644 --- a/test/unit/utIOStreamBuffer.cpp +++ b/test/unit/utIOStreamBuffer.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/test/unit/utIOSystem.cpp b/test/unit/utIOSystem.cpp index 1e866515e..d69e645fe 100644 --- a/test/unit/utIOSystem.cpp +++ b/test/unit/utIOSystem.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/test/unit/utImporter.cpp b/test/unit/utImporter.cpp index 9d3b971a3..768a276ee 100644 --- a/test/unit/utImporter.cpp +++ b/test/unit/utImporter.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utImproveCacheLocality.cpp b/test/unit/utImproveCacheLocality.cpp index fe92bc7e2..0e97eb0c7 100644 --- a/test/unit/utImproveCacheLocality.cpp +++ b/test/unit/utImproveCacheLocality.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utIssues.cpp b/test/unit/utIssues.cpp index 5eeed6ad8..546c36ad0 100644 --- a/test/unit/utIssues.cpp +++ b/test/unit/utIssues.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/test/unit/utJoinVertices.cpp b/test/unit/utJoinVertices.cpp index a4431908a..b0700900c 100644 --- a/test/unit/utJoinVertices.cpp +++ b/test/unit/utJoinVertices.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utLWOImportExport.cpp b/test/unit/utLWOImportExport.cpp index 72c7d683b..266105030 100644 --- a/test/unit/utLWOImportExport.cpp +++ b/test/unit/utLWOImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utLWSImportExport.cpp b/test/unit/utLWSImportExport.cpp index 0fbbc8106..730911ec2 100644 --- a/test/unit/utLWSImportExport.cpp +++ b/test/unit/utLWSImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utLimitBoneWeights.cpp b/test/unit/utLimitBoneWeights.cpp index 36a8a7d3c..0c24b56c4 100644 --- a/test/unit/utLimitBoneWeights.cpp +++ b/test/unit/utLimitBoneWeights.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utMDCImportExport.cpp b/test/unit/utMDCImportExport.cpp index a42a1f88e..29b9ed56c 100644 --- a/test/unit/utMDCImportExport.cpp +++ b/test/unit/utMDCImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utMaterialSystem.cpp b/test/unit/utMaterialSystem.cpp index 6f1be1608..7b4560443 100644 --- a/test/unit/utMaterialSystem.cpp +++ b/test/unit/utMaterialSystem.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utMatrix3x3.cpp b/test/unit/utMatrix3x3.cpp index dbc9a04c8..ae722a811 100644 --- a/test/unit/utMatrix3x3.cpp +++ b/test/unit/utMatrix3x3.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utMatrix4x4.cpp b/test/unit/utMatrix4x4.cpp index a06833006..0b85a8fcc 100644 --- a/test/unit/utMatrix4x4.cpp +++ b/test/unit/utMatrix4x4.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utMetadata.cpp b/test/unit/utMetadata.cpp index 88a30d38c..6bd536d6c 100644 --- a/test/unit/utMetadata.cpp +++ b/test/unit/utMetadata.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/test/unit/utObjImportExport.cpp b/test/unit/utObjImportExport.cpp index 72c29d8bc..58eace075 100644 --- a/test/unit/utObjImportExport.cpp +++ b/test/unit/utObjImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utObjTools.cpp b/test/unit/utObjTools.cpp index f83639013..744e22630 100644 --- a/test/unit/utObjTools.cpp +++ b/test/unit/utObjTools.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utOpenGEXImportExport.cpp b/test/unit/utOpenGEXImportExport.cpp index 024eb2d87..a7b682063 100644 --- a/test/unit/utOpenGEXImportExport.cpp +++ b/test/unit/utOpenGEXImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utPLYImportExport.cpp b/test/unit/utPLYImportExport.cpp index 385ff49f6..2edbdd71f 100644 --- a/test/unit/utPLYImportExport.cpp +++ b/test/unit/utPLYImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utPMXImporter.cpp b/test/unit/utPMXImporter.cpp index bb6a77ad8..a0d663d29 100644 --- a/test/unit/utPMXImporter.cpp +++ b/test/unit/utPMXImporter.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utPretransformVertices.cpp b/test/unit/utPretransformVertices.cpp index fd1c27147..b22fdf71f 100644 --- a/test/unit/utPretransformVertices.cpp +++ b/test/unit/utPretransformVertices.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utProfiler.cpp b/test/unit/utProfiler.cpp index cf99412fd..6738d568e 100644 --- a/test/unit/utProfiler.cpp +++ b/test/unit/utProfiler.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/test/unit/utQ3DImportExport.cpp b/test/unit/utQ3DImportExport.cpp index e4c10629d..e5396a680 100644 --- a/test/unit/utQ3DImportExport.cpp +++ b/test/unit/utQ3DImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utRemoveComments.cpp b/test/unit/utRemoveComments.cpp index 2aed8f408..44fb56ef8 100644 --- a/test/unit/utRemoveComments.cpp +++ b/test/unit/utRemoveComments.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utRemoveComponent.cpp b/test/unit/utRemoveComponent.cpp index c0b7ba0b9..42fb85f73 100644 --- a/test/unit/utRemoveComponent.cpp +++ b/test/unit/utRemoveComponent.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utRemoveRedundantMaterials.cpp b/test/unit/utRemoveRedundantMaterials.cpp index 7d0adaaae..cec4501bd 100644 --- a/test/unit/utRemoveRedundantMaterials.cpp +++ b/test/unit/utRemoveRedundantMaterials.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utRemoveVCProcess.cpp b/test/unit/utRemoveVCProcess.cpp index 16cb337b6..b555b0c86 100644 --- a/test/unit/utRemoveVCProcess.cpp +++ b/test/unit/utRemoveVCProcess.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utSIBImporter.cpp b/test/unit/utSIBImporter.cpp index cfb604d21..b36e0883f 100644 --- a/test/unit/utSIBImporter.cpp +++ b/test/unit/utSIBImporter.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utSMDImportExport.cpp b/test/unit/utSMDImportExport.cpp index 3418853e7..08683d554 100644 --- a/test/unit/utSMDImportExport.cpp +++ b/test/unit/utSMDImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utSTLImportExport.cpp b/test/unit/utSTLImportExport.cpp index 42e95db34..4bf374a1b 100644 --- a/test/unit/utSTLImportExport.cpp +++ b/test/unit/utSTLImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utScaleProcess.cpp b/test/unit/utScaleProcess.cpp index bad616599..baa13ab52 100644 --- a/test/unit/utScaleProcess.cpp +++ b/test/unit/utScaleProcess.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utSceneCombiner.cpp b/test/unit/utSceneCombiner.cpp index d7c25c547..d837e4dce 100644 --- a/test/unit/utSceneCombiner.cpp +++ b/test/unit/utSceneCombiner.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utScenePreprocessor.cpp b/test/unit/utScenePreprocessor.cpp index fb903c46a..45d8a36ee 100644 --- a/test/unit/utScenePreprocessor.cpp +++ b/test/unit/utScenePreprocessor.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utSharedPPData.cpp b/test/unit/utSharedPPData.cpp index 01a0929e7..e4be169dd 100644 --- a/test/unit/utSharedPPData.cpp +++ b/test/unit/utSharedPPData.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/test/unit/utSimd.cpp b/test/unit/utSimd.cpp index b3ed6327c..720d657b6 100644 --- a/test/unit/utSimd.cpp +++ b/test/unit/utSimd.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utSortByPType.cpp b/test/unit/utSortByPType.cpp index 26e09ea64..4dc034205 100644 --- a/test/unit/utSortByPType.cpp +++ b/test/unit/utSortByPType.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utSplitLargeMeshes.cpp b/test/unit/utSplitLargeMeshes.cpp index 52b0d9c43..c8a697de6 100644 --- a/test/unit/utSplitLargeMeshes.cpp +++ b/test/unit/utSplitLargeMeshes.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utStringUtils.cpp b/test/unit/utStringUtils.cpp index 08be82e9a..9c5ab31f5 100644 --- a/test/unit/utStringUtils.cpp +++ b/test/unit/utStringUtils.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utTargetAnimation.cpp b/test/unit/utTargetAnimation.cpp index 4b7c158d2..9cbb45309 100644 --- a/test/unit/utTargetAnimation.cpp +++ b/test/unit/utTargetAnimation.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utTextureTransform.cpp b/test/unit/utTextureTransform.cpp index 4b7c158d2..9cbb45309 100644 --- a/test/unit/utTextureTransform.cpp +++ b/test/unit/utTextureTransform.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utTriangulate.cpp b/test/unit/utTriangulate.cpp index 4f3e5cdc3..874e55c6a 100644 --- a/test/unit/utTriangulate.cpp +++ b/test/unit/utTriangulate.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utTypes.cpp b/test/unit/utTypes.cpp index 1ac9a1d5e..33d2b4f76 100644 --- a/test/unit/utTypes.cpp +++ b/test/unit/utTypes.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/test/unit/utVector3.cpp b/test/unit/utVector3.cpp index 4702ea65f..2602c287c 100644 --- a/test/unit/utVector3.cpp +++ b/test/unit/utVector3.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utVersion.cpp b/test/unit/utVersion.cpp index 790611556..0fc338f02 100644 --- a/test/unit/utVersion.cpp +++ b/test/unit/utVersion.cpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utVertexTriangleAdjacency.cpp b/test/unit/utVertexTriangleAdjacency.cpp index 6a8fea094..bda6304e0 100644 --- a/test/unit/utVertexTriangleAdjacency.cpp +++ b/test/unit/utVertexTriangleAdjacency.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utX3DImportExport.cpp b/test/unit/utX3DImportExport.cpp index a6ad618ab..f2df81ac2 100644 --- a/test/unit/utX3DImportExport.cpp +++ b/test/unit/utX3DImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utXImporterExporter.cpp b/test/unit/utXImporterExporter.cpp index 26221ce8b..4d247cc6f 100644 --- a/test/unit/utXImporterExporter.cpp +++ b/test/unit/utXImporterExporter.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utglTF2ImportExport.cpp b/test/unit/utglTF2ImportExport.cpp index 51c57b2da..84f940c66 100644 --- a/test/unit/utglTF2ImportExport.cpp +++ b/test/unit/utglTF2ImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/test/unit/utglTFImportExport.cpp b/test/unit/utglTFImportExport.cpp index 38bde9879..cb20c1519 100644 --- a/test/unit/utglTFImportExport.cpp +++ b/test/unit/utglTFImportExport.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/tools/assimp_cmd/CMakeLists.txt b/tools/assimp_cmd/CMakeLists.txt index 5aeac0f7b..6f4b61387 100644 --- a/tools/assimp_cmd/CMakeLists.txt +++ b/tools/assimp_cmd/CMakeLists.txt @@ -1,7 +1,7 @@ # Open Asset Import Library (assimp) # ---------------------------------------------------------------------- # -# Copyright (c) 2006-2021, assimp team +# Copyright (c) 2006-2022, assimp team # All rights reserved. diff --git a/tools/assimp_cmd/CompareDump.cpp b/tools/assimp_cmd/CompareDump.cpp index 0179cb677..49f680c24 100644 --- a/tools/assimp_cmd/CompareDump.cpp +++ b/tools/assimp_cmd/CompareDump.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/tools/assimp_cmd/Export.cpp b/tools/assimp_cmd/Export.cpp index 6c3c41de9..fd9fc7652 100644 --- a/tools/assimp_cmd/Export.cpp +++ b/tools/assimp_cmd/Export.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/tools/assimp_cmd/ImageExtractor.cpp b/tools/assimp_cmd/ImageExtractor.cpp index 23aa9c249..49edf9790 100644 --- a/tools/assimp_cmd/ImageExtractor.cpp +++ b/tools/assimp_cmd/ImageExtractor.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/tools/assimp_cmd/Info.cpp b/tools/assimp_cmd/Info.cpp index 6e52fc981..c43a7834e 100644 --- a/tools/assimp_cmd/Info.cpp +++ b/tools/assimp_cmd/Info.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team diff --git a/tools/assimp_cmd/Main.cpp b/tools/assimp_cmd/Main.cpp index 87467579f..31b92b0f0 100644 --- a/tools/assimp_cmd/Main.cpp +++ b/tools/assimp_cmd/Main.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/tools/assimp_cmd/Main.h b/tools/assimp_cmd/Main.h index 5ac306abd..1d3dd8fb2 100644 --- a/tools/assimp_cmd/Main.h +++ b/tools/assimp_cmd/Main.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/tools/assimp_cmd/WriteDump.cpp b/tools/assimp_cmd/WriteDump.cpp index f35630568..4ada408fd 100644 --- a/tools/assimp_cmd/WriteDump.cpp +++ b/tools/assimp_cmd/WriteDump.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/tools/assimp_view/AnimEvaluator.cpp b/tools/assimp_view/AnimEvaluator.cpp index 5a2ddc182..ad8e7f5b2 100644 --- a/tools/assimp_view/AnimEvaluator.cpp +++ b/tools/assimp_view/AnimEvaluator.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/tools/assimp_view/AnimEvaluator.h b/tools/assimp_view/AnimEvaluator.h index 394ebef4a..76b22ea8a 100644 --- a/tools/assimp_view/AnimEvaluator.h +++ b/tools/assimp_view/AnimEvaluator.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/tools/assimp_view/AssetHelper.h b/tools/assimp_view/AssetHelper.h index 95c7cb109..1ae469f85 100644 --- a/tools/assimp_view/AssetHelper.h +++ b/tools/assimp_view/AssetHelper.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/tools/assimp_view/Background.cpp b/tools/assimp_view/Background.cpp index 6e8091f49..e49630204 100644 --- a/tools/assimp_view/Background.cpp +++ b/tools/assimp_view/Background.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/tools/assimp_view/CMakeLists.txt b/tools/assimp_view/CMakeLists.txt index 0199392fe..13c4c139a 100644 --- a/tools/assimp_view/CMakeLists.txt +++ b/tools/assimp_view/CMakeLists.txt @@ -1,7 +1,7 @@ # Open Asset Import Library (assimp) # ---------------------------------------------------------------------- # -# Copyright (c) 2006-2021, assimp team +# Copyright (c) 2006-2022, assimp team # All rights reserved. diff --git a/tools/assimp_view/Display.cpp b/tools/assimp_view/Display.cpp index c0770e7f2..95ed41615 100644 --- a/tools/assimp_view/Display.cpp +++ b/tools/assimp_view/Display.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/tools/assimp_view/HelpDialog.cpp b/tools/assimp_view/HelpDialog.cpp index af8df0755..fde4e1caf 100644 --- a/tools/assimp_view/HelpDialog.cpp +++ b/tools/assimp_view/HelpDialog.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/tools/assimp_view/Input.cpp b/tools/assimp_view/Input.cpp index 25238d6b2..b8572d792 100644 --- a/tools/assimp_view/Input.cpp +++ b/tools/assimp_view/Input.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/tools/assimp_view/LogDisplay.cpp b/tools/assimp_view/LogDisplay.cpp index 2d2646b06..1bd650c08 100644 --- a/tools/assimp_view/LogDisplay.cpp +++ b/tools/assimp_view/LogDisplay.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/tools/assimp_view/LogWindow.cpp b/tools/assimp_view/LogWindow.cpp index 8a47b259f..8e80bf564 100644 --- a/tools/assimp_view/LogWindow.cpp +++ b/tools/assimp_view/LogWindow.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. @@ -128,16 +128,14 @@ void CMyLogStream::write(const char *message) { //------------------------------------------------------------------------------- void CLogWindow::Clear() { this->szText = AI_VIEW_RTF_LOG_HEADER; - ; this->szPlainText = ""; - this->Update(); } //------------------------------------------------------------------------------- void CLogWindow::Update() { if (this->bIsVisible) { - SETTEXTEX sInfo; + SETTEXTEX sInfo = {}; sInfo.flags = ST_DEFAULT; sInfo.codepage = CP_ACP; @@ -148,7 +146,7 @@ void CLogWindow::Update() { //------------------------------------------------------------------------------- void CLogWindow::Save() { - char szFileName[MAX_PATH]; + char szFileName[MAX_PATH] = {}; DWORD dwTemp = MAX_PATH; if (ERROR_SUCCESS != RegQueryValueEx(g_hRegistry, "LogDestination", nullptr, nullptr, (BYTE *)szFileName, &dwTemp)) { @@ -228,7 +226,7 @@ void CLogWindow::WriteLine(const char *message) { this->szText.append("\\par}}"); if (this->bIsVisible && this->bUpdate) { - SETTEXTEX sInfo; + SETTEXTEX sInfo = {}; sInfo.flags = ST_DEFAULT; sInfo.codepage = CP_ACP; diff --git a/tools/assimp_view/Material.cpp b/tools/assimp_view/Material.cpp index 002e4f522..e3c023bd9 100644 --- a/tools/assimp_view/Material.cpp +++ b/tools/assimp_view/Material.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/tools/assimp_view/MaterialManager.h b/tools/assimp_view/MaterialManager.h index 9aeb5e992..625cae27e 100644 --- a/tools/assimp_view/MaterialManager.h +++ b/tools/assimp_view/MaterialManager.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/tools/assimp_view/MeshRenderer.cpp b/tools/assimp_view/MeshRenderer.cpp index bc1a5236f..655e99d0b 100644 --- a/tools/assimp_view/MeshRenderer.cpp +++ b/tools/assimp_view/MeshRenderer.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/tools/assimp_view/MessageProc.cpp b/tools/assimp_view/MessageProc.cpp index 18424d78e..e51c8292c 100644 --- a/tools/assimp_view/MessageProc.cpp +++ b/tools/assimp_view/MessageProc.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/tools/assimp_view/Normals.cpp b/tools/assimp_view/Normals.cpp index 817a22926..b76408939 100644 --- a/tools/assimp_view/Normals.cpp +++ b/tools/assimp_view/Normals.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/tools/assimp_view/SceneAnimator.cpp b/tools/assimp_view/SceneAnimator.cpp index 2318001c0..c8b20229e 100644 --- a/tools/assimp_view/SceneAnimator.cpp +++ b/tools/assimp_view/SceneAnimator.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/tools/assimp_view/SceneAnimator.h b/tools/assimp_view/SceneAnimator.h index 43c8d8eb7..454357f30 100644 --- a/tools/assimp_view/SceneAnimator.h +++ b/tools/assimp_view/SceneAnimator.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/tools/assimp_view/Shaders.cpp b/tools/assimp_view/Shaders.cpp index b8ee8dbf8..9fd05ca8d 100644 --- a/tools/assimp_view/Shaders.cpp +++ b/tools/assimp_view/Shaders.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/tools/assimp_view/assimp_view.cpp b/tools/assimp_view/assimp_view.cpp index 37e5f5429..c5c48fd93 100644 --- a/tools/assimp_view/assimp_view.cpp +++ b/tools/assimp_view/assimp_view.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. diff --git a/tools/assimp_view/assimp_view.h b/tools/assimp_view/assimp_view.h index 7349c3513..cbcee3cac 100644 --- a/tools/assimp_view/assimp_view.h +++ b/tools/assimp_view/assimp_view.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. From f63b10bf452ec1515afb5e24a8267c7b0d161294 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Mon, 10 Jan 2022 21:22:44 +0100 Subject: [PATCH 54/83] OpenGEX: Fix usage of texture specular token --- code/AssetLib/OpenGEX/OpenGEXImporter.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/AssetLib/OpenGEX/OpenGEXImporter.cpp b/code/AssetLib/OpenGEX/OpenGEXImporter.cpp index aea05e8fd..92cfe65b2 100644 --- a/code/AssetLib/OpenGEX/OpenGEXImporter.cpp +++ b/code/AssetLib/OpenGEX/OpenGEXImporter.cpp @@ -1085,6 +1085,8 @@ void OpenGEXImporter::handleTextureNode(ODDLParser::DDLNode *node, aiScene * /*p tex.Set(val->getString()); if (prop->m_value->getString() == Grammar::DiffuseTextureToken) { m_currentMaterial->AddProperty(&tex, AI_MATKEY_TEXTURE_DIFFUSE(0)); + } else if (prop->m_value->getString() == Grammar::DiffuseSpecularTextureToken) { + m_currentMaterial->AddProperty(&tex, AI_MATKEY_TEXTURE_SPECULAR(0)); } else if (prop->m_value->getString() == Grammar::SpecularPowerTextureToken) { m_currentMaterial->AddProperty(&tex, AI_MATKEY_TEXTURE_SPECULAR(0)); } else if (prop->m_value->getString() == Grammar::EmissionTextureToken) { From e671d087e188fee8f019b48bd4fc27bc1eea8183 Mon Sep 17 00:00:00 2001 From: Jeremy Sigrist Date: Wed, 5 Jan 2022 11:51:29 -0800 Subject: [PATCH 55/83] Collada: Read all instance_material child nodes --- code/AssetLib/Collada/ColladaParser.cpp | 32 +++++++++++++++---------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/code/AssetLib/Collada/ColladaParser.cpp b/code/AssetLib/Collada/ColladaParser.cpp index 8bbdf02cc..bd929cf63 100644 --- a/code/AssetLib/Collada/ColladaParser.cpp +++ b/code/AssetLib/Collada/ColladaParser.cpp @@ -2242,20 +2242,26 @@ void ColladaParser::ReadNodeGeometry(XmlNode &node, Node *pNode) { if (currentName == "bind_material") { XmlNode techNode = currentNode.child("technique_common"); if (techNode) { - XmlNode instanceMatNode = techNode.child("instance_material"); - // read ID of the geometry subgroup and the target material - std::string group; - XmlParser::getStdStrAttribute(instanceMatNode, "symbol", group); - XmlParser::getStdStrAttribute(instanceMatNode, "target", url); - const char *urlMat = url.c_str(); - Collada::SemanticMappingTable s; - if (urlMat[0] == '#') - urlMat++; + for (XmlNode instanceMatNode = techNode.child("instance_material"); instanceMatNode; instanceMatNode = instanceMatNode.next_sibling()) + { + const std::string &instance_name = instanceMatNode.name(); + if (instance_name == "instance_material") + { + // read ID of the geometry subgroup and the target material + std::string group; + XmlParser::getStdStrAttribute(instanceMatNode, "symbol", group); + XmlParser::getStdStrAttribute(instanceMatNode, "target", url); + const char *urlMat = url.c_str(); + Collada::SemanticMappingTable s; + if (urlMat[0] == '#') + urlMat++; - s.mMatName = urlMat; - // store the association - instance.mMaterials[group] = s; - ReadMaterialVertexInputBinding(instanceMatNode, s); + s.mMatName = urlMat; + // store the association + instance.mMaterials[group] = s; + ReadMaterialVertexInputBinding(instanceMatNode, s); + } + } } } } From 7eec3f0d8fcd2f9331aea23daefb3dae4597b983 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Sun, 16 Jan 2022 13:19:25 +0100 Subject: [PATCH 56/83] Update copyrights. --- test/unit/Common/utBase64.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unit/Common/utBase64.cpp b/test/unit/Common/utBase64.cpp index 6ac960364..8b0a60e47 100644 --- a/test/unit/Common/utBase64.cpp +++ b/test/unit/Common/utBase64.cpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. From f8253c3e3c1573123e4a550171a65ba71b913690 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Sun, 16 Jan 2022 13:21:01 +0100 Subject: [PATCH 57/83] Update Base64.hpp --- include/assimp/Base64.hpp | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/include/assimp/Base64.hpp b/include/assimp/Base64.hpp index 9db71c314..894eb449b 100644 --- a/include/assimp/Base64.hpp +++ b/include/assimp/Base64.hpp @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2021, assimp team +Copyright (c) 2006-2022, assimp team All rights reserved. @@ -48,19 +48,17 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include namespace Assimp { - namespace Base64 { -void Encode(const uint8_t *in, size_t inLength, std::string &out); -void Encode(const std::vector& in, std::string &out); -std::string Encode(const std::vector& in); +void Encode(const uint8_t *in, size_t inLength, std::string &out); +void Encode(const std::vector& in, std::string &out); +std::string Encode(const std::vector& in); -size_t Decode(const char *in, size_t inLength, uint8_t *&out); -size_t Decode(const std::string& in, std::vector& out); -std::vector Decode(const std::string& in); +size_t Decode(const char *in, size_t inLength, uint8_t *&out); +size_t Decode(const std::string& in, std::vector& out); +std::vector Decode(const std::string& in); -} - -} +} // namespace Base64 +} // namespace Assimp #endif // AI_BASE64_HPP_INC From acd70b35a04cee6e433d7208847a2dd5a8436953 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Sun, 16 Jan 2022 20:57:56 +0100 Subject: [PATCH 58/83] Fix merge issues --- code/AssetLib/Blender/BlenderLoader.cpp | 4 +++- code/AssetLib/Ogre/OgreImporter.cpp | 3 --- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/code/AssetLib/Blender/BlenderLoader.cpp b/code/AssetLib/Blender/BlenderLoader.cpp index 8fad056b6..42d25ebac 100644 --- a/code/AssetLib/Blender/BlenderLoader.cpp +++ b/code/AssetLib/Blender/BlenderLoader.cpp @@ -120,7 +120,9 @@ static const char * const TokensForSearch[] = { "blender" }; // Returns whether the class can handle the format of the given file. bool BlenderImporter::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool /*checkSig*/) const { // note: this won't catch compressed files - return SearchFileHeaderForToken(pIOHandler, pFile, TokensForSearch, AI_COUNT_OF(TokensForSearch)); + static const char *tokens[] = { "" }; return SearchFileHeaderForToken(pIOHandler, pFile, tokens, AI_COUNT_OF(tokens)); - } else { - /// @todo Read and validate first header chunk? - return false; } /// @todo Read and validate first header chunk? From 65f235310501eee1404ec59c06664ebe1132af7c Mon Sep 17 00:00:00 2001 From: Ben Sewell Date: Mon, 17 Jan 2022 14:59:17 +0000 Subject: [PATCH 59/83] IFC Reading: Fix opening reading. --- code/AssetLib/IFC/IFCBoolean.cpp | 2 +- code/AssetLib/IFC/IFCGeometry.cpp | 77 ++++-- code/AssetLib/IFC/IFCOpenings.cpp | 375 +++++++++++++++++++++++++----- code/AssetLib/IFC/IFCUtil.h | 1 - code/Common/DefaultLogger.cpp | 9 +- 5 files changed, 389 insertions(+), 75 deletions(-) diff --git a/code/AssetLib/IFC/IFCBoolean.cpp b/code/AssetLib/IFC/IFCBoolean.cpp index dad45ec13..ee255e612 100644 --- a/code/AssetLib/IFC/IFCBoolean.cpp +++ b/code/AssetLib/IFC/IFCBoolean.cpp @@ -699,7 +699,7 @@ void ProcessBooleanExtrudedAreaSolidDifference(const Schema_2x3::IfcExtrudedArea continue; } - GenerateOpenings(openings, std::vector(1, IfcVector3(1, 0, 0)), temp, false, true); + GenerateOpenings(openings, temp, false, true); result.Append(temp); vit += pcount; diff --git a/code/AssetLib/IFC/IFCGeometry.cpp b/code/AssetLib/IFC/IFCGeometry.cpp index 64f32ca7b..4c088955f 100644 --- a/code/AssetLib/IFC/IFCGeometry.cpp +++ b/code/AssetLib/IFC/IFCGeometry.cpp @@ -190,7 +190,7 @@ void ProcessPolygonBoundaries(TempMesh& result, const TempMesh& inmesh, size_t m std::copy(outer_vit, outer_vit+outer_polygon_size, std::back_inserter(temp.mVerts)); - GenerateOpenings(fake_openings, normals, temp, false, false); + GenerateOpenings(fake_openings, temp, false, false); result.Append(temp); } @@ -529,6 +529,31 @@ IfcMatrix3 DerivePlaneCoordinateSpace(const TempMesh& curmesh, bool& ok, IfcVect return m; } +const auto closeDistance = 1e-6; + +bool areClose(Schema_2x3::IfcCartesianPoint pt1,Schema_2x3::IfcCartesianPoint pt2) { + if(pt1.Coordinates.size() != pt2.Coordinates.size()) + { + IFCImporter::LogWarn("unable to compare differently-dimensioned points"); + return false; + } + auto coord1 = pt1.Coordinates.begin(); + auto coord2 = pt2.Coordinates.begin(); + // we're just testing each dimension separately rather than doing euclidean distance, as we're + // looking for very close coordinates + for(; coord1 != pt1.Coordinates.end(); coord1++,coord2++) + { + if(std::fabs(*coord1 - *coord2) > closeDistance) + return false; + } + return true; +} + +bool areClose(IfcVector3 pt1,IfcVector3 pt2) { + return (std::fabs(pt1.x - pt2.x) < closeDistance && + std::fabs(pt1.y - pt2.y) < closeDistance && + std::fabs(pt1.z - pt2.z) < closeDistance); +} // Extrudes the given polygon along the direction, converts it into an opening or applies all openings as necessary. void ProcessExtrudedArea(const Schema_2x3::IfcExtrudedAreaSolid& solid, const TempMesh& curve, const IfcVector3& extrusionDir, TempMesh& result, ConversionData &conv, bool collect_openings) @@ -592,7 +617,21 @@ void ProcessExtrudedArea(const Schema_2x3::IfcExtrudedAreaSolid& solid, const Te nors.push_back(IfcVector3()); continue; } - nors.push_back(((bounds.mVerts[2] - bounds.mVerts[0]) ^ (bounds.mVerts[1] - bounds.mVerts[0])).Normalize()); + auto nor = ((bounds.mVerts[2] - bounds.mVerts[0]) ^ (bounds.mVerts[1] - bounds.mVerts[0])).Normalize(); + auto vI0 = bounds.mVertcnt[0]; + for(size_t faceI = 0; faceI < bounds.mVertcnt.size(); faceI++) + { + if(bounds.mVertcnt[faceI] >= 3) { + // do a check that this is at least parallel to the base plane + auto nor2 = ((bounds.mVerts[vI0 + 2] - bounds.mVerts[vI0]) ^ (bounds.mVerts[vI0 + 1] - bounds.mVerts[vI0])).Normalize(); + if(!areClose(nor,nor2)) { + std::stringstream msg; + msg << "Face " << faceI << " is not parallel with face 0 - opening on entity " << solid.GetID(); + IFCImporter::LogWarn(msg.str().c_str()); + } + } + } + nors.push_back(nor); } } @@ -613,7 +652,7 @@ void ProcessExtrudedArea(const Schema_2x3::IfcExtrudedAreaSolid& solid, const Te out.push_back(in[i] + dir); if( openings ) { - if( (in[i] - in[next]).Length() > diag * 0.1 && GenerateOpenings(*conv.apply_openings, nors, temp, true, true, dir) ) { + if( (in[i] - in[next]).Length() > diag * 0.1 && GenerateOpenings(*conv.apply_openings, temp, true, true, dir) ) { ++sides_with_openings; } @@ -622,31 +661,33 @@ void ProcessExtrudedArea(const Schema_2x3::IfcExtrudedAreaSolid& solid, const Te } } - if( openings ) { + if(openings) { for(TempOpening& opening : *conv.apply_openings) { - if( !opening.wallPoints.empty() ) { - IFCImporter::LogError("failed to generate all window caps"); + if(!opening.wallPoints.empty()) { + std::stringstream msg; + msg << "failed to generate all window caps on ID " << (int)solid.GetID(); + IFCImporter::LogError(msg.str().c_str()); } opening.wallPoints.clear(); } } size_t sides_with_v_openings = 0; - if( has_area ) { + if(has_area) { - for( size_t n = 0; n < 2; ++n ) { - if( n > 0 ) { - for( size_t i = 0; i < in.size(); ++i ) + for(size_t n = 0; n < 2; ++n) { + if(n > 0) { + for(size_t i = 0; i < in.size(); ++i) out.push_back(in[i] + dir); } else { - for( size_t i = in.size(); i--; ) + for(size_t i = in.size(); i--; ) out.push_back(in[i]); } curmesh.mVertcnt.push_back(static_cast(in.size())); - if( openings && in.size() > 2 ) { - if( GenerateOpenings(*conv.apply_openings, nors, temp, true, true, dir) ) { + if(openings && in.size() > 2) { + if(GenerateOpenings(*conv.apply_openings,temp,true,true,dir)) { ++sides_with_v_openings; } @@ -656,8 +697,10 @@ void ProcessExtrudedArea(const Schema_2x3::IfcExtrudedAreaSolid& solid, const Te } } - if( openings && (sides_with_openings == 1 || sides_with_v_openings == 2 ) ) { - IFCImporter::LogWarn("failed to resolve all openings, presumably their topology is not supported by Assimp"); + if (openings && (sides_with_openings == 1 || sides_with_v_openings == 2)) { + std::stringstream msg; + msg << "failed to resolve all openings, presumably their topology is not supported by Assimp - ID " << solid.GetID() << " sides_with_openings " << sides_with_openings << " sides_with_v_openings " << sides_with_v_openings; + IFCImporter::LogWarn(msg.str().c_str()); } IFCImporter::LogVerboseDebug("generate mesh procedurally by extrusion (IfcExtrudedAreaSolid)"); @@ -781,7 +824,9 @@ bool ProcessGeometricItem(const Schema_2x3::IfcRepresentationItem& geo, unsigned return false; } else { - IFCImporter::LogWarn("skipping unknown IfcGeometricRepresentationItem entity, type is ", geo.GetClassName()); + std::stringstream toLog; + toLog << "skipping unknown IfcGeometricRepresentationItem entity, type is " << geo.GetClassName() << " id is " << geo.GetID(); + IFCImporter::LogWarn(toLog.str().c_str()); return false; } diff --git a/code/AssetLib/IFC/IFCOpenings.cpp b/code/AssetLib/IFC/IFCOpenings.cpp index cffb8a014..16d0bcdc3 100644 --- a/code/AssetLib/IFC/IFCOpenings.cpp +++ b/code/AssetLib/IFC/IFCOpenings.cpp @@ -58,6 +58,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #endif #include +#include +#include namespace Assimp { namespace IFC { @@ -73,7 +75,7 @@ namespace Assimp { // fallback method to generate wall openings - bool TryAddOpenings_Poly2Tri(const std::vector& openings,const std::vector& nors, + bool TryAddOpenings_Poly2Tri(const std::vector& openings, TempMesh& curmesh); @@ -1140,7 +1142,6 @@ IfcMatrix4 ProjectOntoPlane(std::vector& out_contour, const TempMesh // ------------------------------------------------------------------------------------------------ bool GenerateOpenings(std::vector& openings, - const std::vector& nors, TempMesh& curmesh, bool check_intersection, bool generate_connection_geometry, @@ -1340,7 +1341,7 @@ bool GenerateOpenings(std::vector& openings, MergeWindowContours(temp_contour, other, poly); if (poly.size() > 1) { - return TryAddOpenings_Poly2Tri(openings, nors, curmesh); + return TryAddOpenings_Poly2Tri(openings, curmesh); } else if (poly.size() == 0) { IFCImporter::LogWarn("ignoring duplicate opening"); @@ -1427,8 +1428,296 @@ bool GenerateOpenings(std::vector& openings, return true; } +std::vector GetContourInPlane2D(std::shared_ptr mesh,IfcMatrix3 planeSpace, + IfcVector3 planeNor,IfcFloat planeOffset, + IfcVector3 extrusionDir,IfcVector3& wall_extrusion,bool& first,bool& ok) { + std::vector contour; + + const auto outernor = ((mesh->mVerts[2] - mesh->mVerts[0]) ^ (mesh->mVerts[1] - mesh->mVerts[0])).Normalize(); + const IfcFloat dot = planeNor * outernor; + if(std::fabs(dot) < 1.f - 1e-6f) { + std::stringstream msg; + msg << "Skipping: Unaligned opening (" << planeNor.x << ", " << planeNor.y << ", " << planeNor.z << ")"; + msg << " . ( " << outernor.x << ", " << outernor.y << ", " << outernor.z << ") = " << dot; + IFCImporter::LogDebug(msg.str().c_str()); + ok = false; + return contour; + } + + const std::vector& va = mesh->mVerts; + if(va.size() <= 2) { + std::stringstream msg; + msg << "Skipping: Only " << va.size() << " verticies in opening mesh."; + IFCImporter::LogDebug(msg.str().c_str()); + ok = false; + return contour; + } + + for(const IfcVector3& xx : mesh->mVerts) { + IfcVector3 vv = planeSpace * xx,vv_extr = planeSpace * (xx + extrusionDir); + + const bool is_extruded_side = std::fabs(vv.z - planeOffset) > std::fabs(vv_extr.z - planeOffset); + if(first) { + first = false; + if(dot > 0.f) { + wall_extrusion = extrusionDir; + if(is_extruded_side) { + wall_extrusion = -wall_extrusion; + } + } + } + + // XXX should not be necessary - but it is. Why? For precision reasons? + vv = is_extruded_side ? vv_extr : vv; + contour.push_back(IfcVector2(vv.x,vv.y)); + } + ok = true; + + return contour; +} + +const float close { 1e-6f }; + +static bool isClose(IfcVector2 first,IfcVector2 second) { + auto diff = (second - first); + return (std::fabsf(diff.x) < close && std::fabsf(diff.y) < close); +} + +static void logSegment(std::pair segment) { + std::stringstream msg2; + msg2 << " Segment: \n"; + msg2 << " " << segment.first.x << " " << segment.first.y << " \n"; + msg2 << " " << segment.second.x << " " << segment.second.y << " \n"; + IFCImporter::LogInfo(msg2.str().c_str()); +} + +std::vector> GetContoursInPlane3D(std::shared_ptr mesh,IfcMatrix3 planeSpace, + IfcFloat planeOffset) { + + { + std::stringstream msg; + msg << "GetContoursInPlane3D: planeSpace is \n"; + msg << planeSpace.a1 << " " << planeSpace.a2 << " " << planeSpace.a3 << " " << "\n"; + msg << planeSpace.b1 << " " << planeSpace.b2 << " " << planeSpace.b3 << " " << "\n"; + msg << planeSpace.c1 << " " << planeSpace.c2 << " " << planeSpace.c3 << " " << "\n"; + msg << "\n planeOffset is " << planeOffset; + IFCImporter::LogInfo(msg.str().c_str()); + } + + // we'll put our line segments in here, and then merge them together into contours later + std::deque> lineSegments; + + // find the lines giving the intersection of the faces with the plane - we'll work in planeSpace throughout. + size_t vI0{ 0 }; // vertex index for first vertex in plane + for(auto nVertices : mesh->mVertcnt) { // iterate over faces + { + std::stringstream msg; + msg << "GetContoursInPlane3D: face (transformed) is \n"; + for(auto vI = vI0; vI < vI0 + nVertices; vI++) { + auto v = planeSpace * mesh->mVerts[vI]; + msg << " " << v.x << " " << v.y << " " << v.z << " " << "\n"; + } + IFCImporter::LogInfo(msg.str().c_str()); + } + + if(nVertices <= 2) // not a plane, a point or line + { + std::stringstream msg; + msg << "GetContoursInPlane3D: found point or line when expecting plane (only " << nVertices << " vertices)"; + IFCImporter::LogWarn(msg.str().c_str()); + vI0 += nVertices; + continue; + } + + // assuming the vertices are all in a plane (let's hope so!) we can get the intersection + // vector between the planes + auto v0 = planeSpace * mesh->mVerts[vI0]; + auto v1 = planeSpace * mesh->mVerts[vI0 + 1]; + auto v2 = planeSpace * mesh->mVerts[vI0 + 2]; + + auto faceNor = ((v1 - v0) ^ (v2 - v0)).Normalize(); + auto intersectionDir = faceNor ^ IfcVector3(0.f,0.f,1.f); // as we're in plane space, plane normal is (0,0,1) + + // now calculate intersections between face and plane + IfcVector2 firstPoint; + bool gotFirstPoint(false); + + if(std::fabsf(v0.z - planeOffset) < close) { + // first point is on the plane + firstPoint.x = v0.x; + firstPoint.y = v0.y; + gotFirstPoint = true; + } + + auto vn = v0; + for(auto vI = vI0 + 1; vI < vI0 + nVertices; vI++) { + auto vp = vn; + vn = planeSpace * mesh->mVerts[vI]; + IfcVector3 intersection; + + if(std::fabsf(vn.z - planeOffset) < close) { + // on the plane + intersection = vn; + } + else if((vn.z > planeOffset) != (vp.z > planeOffset)) + { + // passes through the plane + auto vdir = vn - vp; + auto scale = (planeOffset - vp.z) / vdir.z; + intersection = vp + scale * vdir; + } + else { + // nowhere near - move on + continue; + } + + if(!gotFirstPoint) { + if(std::fabsf(vp.z - planeOffset) < close) { + // just had a second line along the plane + firstPoint.x = vp.x; + firstPoint.y = vp.y; + IfcVector2 secondPoint(intersection.x,intersection.y); + auto s = std::pair(firstPoint,secondPoint); + logSegment(s); + lineSegments.push_back(s); + // next firstpoint should be this one + } + else { + // store the first intersection point + firstPoint.x = intersection.x; + firstPoint.y = intersection.y; + gotFirstPoint = true; + } + } + else { + // now got the second point, so store the pair + IfcVector2 secondPoint(intersection.x,intersection.y); + auto s = std::pair(firstPoint,secondPoint); + logSegment(s); + lineSegments.push_back(s); + + // - note that we don't move onto the next face as a non-convex face can create two or more intersections with a plane + gotFirstPoint = false; + } + } + if(gotFirstPoint) { + IFCImporter::LogWarn("GetContoursInPlane3D: odd number of intersections with plane"); + } + vI0 += nVertices; + } + + { + std::stringstream msg; + msg << "GetContoursInPlane3D: found " << lineSegments.size() << " line segments:\n"; + IFCImporter::LogInfo(msg.str().c_str()); + + for(auto& s : lineSegments) { + logSegment(s); + } + + } + + // now merge contours until we have the best-looking polygons we can + std::vector contours; + while(!lineSegments.empty()) { + // start with a polygon and make the best closed contour we can + const auto& firstSeg = lineSegments.front(); + std::deque contour{ firstSeg.first, firstSeg.second }; + lineSegments.pop_front(); + bool foundNextPoint{ true }; + bool closedContour{ false }; + while(foundNextPoint) { + foundNextPoint = false; + for(auto nextSeg = lineSegments.begin(); nextSeg != lineSegments.end(); nextSeg++) { + // see if we can match up both ends - in which case we've closed the contour + if(isClose(contour.front(),nextSeg->first) && isClose(contour.back(),nextSeg->second) || + isClose(contour.back(),nextSeg->first) && isClose(contour.front(),nextSeg->second) + ) { + lineSegments.erase(nextSeg); + closedContour = true; + break; + } + + // otherwise, see if we can match up either end + foundNextPoint = true; + if(isClose(contour.front(),nextSeg->first)) { + contour.push_front(nextSeg->second); + } + else if(isClose(contour.front(),nextSeg->second)) { + contour.push_front(nextSeg->first); + } + else if(isClose(contour.back(),nextSeg->first)) { + contour.push_back(nextSeg->second); + } + else if(isClose(contour.back(),nextSeg->second)) { + contour.push_back(nextSeg->first); + } + else { + foundNextPoint = false; + } + if(foundNextPoint) { + lineSegments.erase(nextSeg); + break; + } + } + } + + if(!closedContour) { + IFCImporter::LogWarn("GetContoursInPlane3D: did not close contour"); + } + + // now add the contour if we can + if(contour.size() <= 2) { + IFCImporter::LogWarn("GetContoursInPlane3D: discarding line/point contour"); + continue; + } + Contour c{}; + for(auto p : contour) + { + c.push_back(p); + } + contours.push_back(c); + } + + { + std::stringstream msg; + msg << "GetContoursInPlane3D: found " << contours.size() << " contours:\n"; + + for(auto c : contours) { + msg << " Contour: \n"; + for(auto p : c) { + msg << " " << p.x << " " << p.y << " \n"; + } + } + + IFCImporter::LogInfo(msg.str().c_str()); + } + + + return contours; +} + +std::vector> GetContoursInPlane(std::shared_ptr mesh,IfcMatrix3 planeSpace, + IfcVector3 planeNor,IfcFloat planeOffset, + IfcVector3 extrusionDir,IfcVector3& wall_extrusion,bool& first) { + + if(mesh->mVertcnt.size() == 1) + { + bool ok; + auto contour = GetContourInPlane2D(mesh,planeSpace,planeNor,planeOffset,extrusionDir,wall_extrusion,first,ok); + if(ok) + return std::vector> {contour}; + else + return std::vector> {}; + } + else + { + return GetContoursInPlane3D(mesh,planeSpace,planeOffset); + } +} + // ------------------------------------------------------------------------------------------------ -bool TryAddOpenings_Poly2Tri(const std::vector& openings,const std::vector& nors, +bool TryAddOpenings_Poly2Tri(const std::vector& openings, TempMesh& curmesh) { IFCImporter::LogWarn("forced to use poly2tri fallback method to generate wall openings"); @@ -1498,61 +1787,41 @@ bool TryAddOpenings_Poly2Tri(const std::vector& openings,const std: try { ClipperLib::Clipper clipper_holes; - size_t c = 0; - for(const TempOpening& t :openings) { - const IfcVector3& outernor = nors[c++]; - const IfcFloat dot = nor * outernor; - if (std::fabs(dot)<1.f-1e-6f) { - continue; - } + for(const TempOpening& t : openings) { + auto contours = GetContoursInPlane(t.profileMesh,m,nor,coord,t.extrusionDir,wall_extrusion,first); - const std::vector& va = t.profileMesh->mVerts; - if(va.size() <= 2) { - continue; - } + for(auto& contour : contours) { + // scale to clipping space + ClipperLib::Polygon hole; + for(IfcVector2& pip : contour) { + pip.x = (pip.x - vmin.x) / vmax.x; + pip.y = (pip.y - vmin.y) / vmax.y; - std::vector contour; - - for(const IfcVector3& xx : t.profileMesh->mVerts) { - IfcVector3 vv = m * xx, vv_extr = m * (xx + t.extrusionDir); - - const bool is_extruded_side = std::fabs(vv.z - coord) > std::fabs(vv_extr.z - coord); - if (first) { - first = false; - if (dot > 0.f) { - wall_extrusion = t.extrusionDir; - if (is_extruded_side) { - wall_extrusion = - wall_extrusion; - } - } + hole.push_back(ClipperLib::IntPoint(to_int64(pip.x),to_int64(pip.y))); } - // XXX should not be necessary - but it is. Why? For precision reasons? - vv = is_extruded_side ? vv_extr : vv; - contour.push_back(IfcVector2(vv.x,vv.y)); + if(!ClipperLib::Orientation(hole)) { + std::reverse(hole.begin(),hole.end()); + // assert(ClipperLib::Orientation(hole)); + } + + /*ClipperLib::Polygons pol_temp(1), pol_temp2(1); + pol_temp[0] = hole; + + ClipperLib::OffsetPolygons(pol_temp,pol_temp2,5.0); + hole = pol_temp2[0];*/ + + clipper_holes.AddPolygon(hole,ClipperLib::ptSubject); + { + std::stringstream msg; + msg << "- added polygon "; + for(auto elem : hole) { + msg << " (" << elem.X << ", " << elem.Y << ")"; + } + IFCImporter::LogDebug(msg.str().c_str()); + } } - - ClipperLib::Polygon hole; - for(IfcVector2& pip : contour) { - pip.x = (pip.x - vmin.x) / vmax.x; - pip.y = (pip.y - vmin.y) / vmax.y; - - hole.push_back(ClipperLib::IntPoint( to_int64(pip.x), to_int64(pip.y) )); - } - - if (!ClipperLib::Orientation(hole)) { - std::reverse(hole.begin(), hole.end()); - // assert(ClipperLib::Orientation(hole)); - } - - /*ClipperLib::Polygons pol_temp(1), pol_temp2(1); - pol_temp[0] = hole; - - ClipperLib::OffsetPolygons(pol_temp,pol_temp2,5.0); - hole = pol_temp2[0];*/ - - clipper_holes.AddPolygon(hole,ClipperLib::ptSubject); } clipper_holes.Execute(ClipperLib::ctUnion,holes_union, diff --git a/code/AssetLib/IFC/IFCUtil.h b/code/AssetLib/IFC/IFCUtil.h index e80e5623d..b5f72a56d 100644 --- a/code/AssetLib/IFC/IFCUtil.h +++ b/code/AssetLib/IFC/IFCUtil.h @@ -307,7 +307,6 @@ void ProcessBooleanExtrudedAreaSolidDifference(const Schema_2x3::IfcExtrudedArea // IFCOpenings.cpp bool GenerateOpenings(std::vector& openings, - const std::vector& nors, TempMesh& curmesh, bool check_intersection, bool generate_connection_geometry, diff --git a/code/Common/DefaultLogger.cpp b/code/Common/DefaultLogger.cpp index f88632f0e..5cb32d38f 100644 --- a/code/Common/DefaultLogger.cpp +++ b/code/Common/DefaultLogger.cpp @@ -388,15 +388,16 @@ void DefaultLogger::WriteToStreams(const char *message, ErrorSeverity ErrorSev) ai_assert(nullptr != message); // Check whether this is a repeated message - if (!::strncmp(message, lastMsg, lastLen - 1)) { + auto thisLen = ::strlen(message); + if (thisLen == lastLen - 1 && !::strncmp(message, lastMsg, lastLen - 1)) { if (!noRepeatMsg) { noRepeatMsg = true; message = "Skipping one or more lines with the same contents\n"; - } else - return; + } + return; } else { // append a new-line character to the message to be printed - lastLen = ::strlen(message); + lastLen = thisLen; ::memcpy(lastMsg, message, lastLen + 1); ::strcat(lastMsg + lastLen, "\n"); From 415b0e19d955b78e9b584d7e4a1cca6c7ff054b9 Mon Sep 17 00:00:00 2001 From: Ben Sewell Date: Mon, 17 Jan 2022 16:39:50 +0000 Subject: [PATCH 60/83] Changes for gcc compatibility --- code/AssetLib/IFC/IFCOpenings.cpp | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/code/AssetLib/IFC/IFCOpenings.cpp b/code/AssetLib/IFC/IFCOpenings.cpp index 16d0bcdc3..c261a24b0 100644 --- a/code/AssetLib/IFC/IFCOpenings.cpp +++ b/code/AssetLib/IFC/IFCOpenings.cpp @@ -1480,7 +1480,7 @@ const float close { 1e-6f }; static bool isClose(IfcVector2 first,IfcVector2 second) { auto diff = (second - first); - return (std::fabsf(diff.x) < close && std::fabsf(diff.y) < close); + return (std::fabs(diff.x) < close && std::fabs(diff.y) < close); } static void logSegment(std::pair segment) { @@ -1529,20 +1529,13 @@ std::vector> GetContoursInPlane3D(std::shared_ptrmVerts[vI0]; - auto v1 = planeSpace * mesh->mVerts[vI0 + 1]; - auto v2 = planeSpace * mesh->mVerts[vI0 + 2]; - - auto faceNor = ((v1 - v0) ^ (v2 - v0)).Normalize(); - auto intersectionDir = faceNor ^ IfcVector3(0.f,0.f,1.f); // as we're in plane space, plane normal is (0,0,1) // now calculate intersections between face and plane IfcVector2 firstPoint; bool gotFirstPoint(false); - if(std::fabsf(v0.z - planeOffset) < close) { + if(std::fabs(v0.z - planeOffset) < close) { // first point is on the plane firstPoint.x = v0.x; firstPoint.y = v0.y; @@ -1555,7 +1548,7 @@ std::vector> GetContoursInPlane3D(std::shared_ptrmVerts[vI]; IfcVector3 intersection; - if(std::fabsf(vn.z - planeOffset) < close) { + if(std::fabs(vn.z - planeOffset) < close) { // on the plane intersection = vn; } @@ -1572,7 +1565,7 @@ std::vector> GetContoursInPlane3D(std::shared_ptr> GetContoursInPlane3D(std::shared_ptrfirst) && isClose(contour.back(),nextSeg->second) || - isClose(contour.back(),nextSeg->first) && isClose(contour.front(),nextSeg->second) + if((isClose(contour.front(),nextSeg->first) && isClose(contour.back(),nextSeg->second)) || + (isClose(contour.back(),nextSeg->first) && isClose(contour.front(),nextSeg->second)) ) { lineSegments.erase(nextSeg); closedContour = true; From 5af79cac1da8c78ad03c3d099a3aea84d0902492 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Tue, 18 Jan 2022 21:23:43 +0100 Subject: [PATCH 61/83] Fix unittests + small refactorings --- code/AssetLib/glTF2/glTF2Importer.cpp | 67 ++++++++++++++++----------- code/AssetLib/glTF2/glTF2Importer.h | 2 +- 2 files changed, 40 insertions(+), 29 deletions(-) diff --git a/code/AssetLib/glTF2/glTF2Importer.cpp b/code/AssetLib/glTF2/glTF2Importer.cpp index 963752519..4e78d0e17 100644 --- a/code/AssetLib/glTF2/glTF2Importer.cpp +++ b/code/AssetLib/glTF2/glTF2Importer.cpp @@ -98,7 +98,7 @@ static const aiImporterDesc desc = { glTF2Importer::glTF2Importer() : BaseImporter(), meshOffsets(), - embeddedTexIdxs(), + mEmbeddedTexIdxs(), mScene(nullptr) { // empty } @@ -111,18 +111,21 @@ const aiImporterDesc *glTF2Importer::GetInfo() const { return &desc; } -bool glTF2Importer::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool /* checkSig */) const { - try { - glTF2::Asset asset(pIOHandler); - asset.Load(pFile, GetExtension(pFile) == "glb"); - std::string version = asset.asset.version; - return !version.empty() && version[0] == '2'; - } catch(...) { +bool glTF2Importer::CanRead(const std::string &filename, IOSystem *pIOHandler, bool checkSig ) const { + const std::string extension = GetExtension(filename); + if (!checkSig && (extension != "gltf") && (extension != "glb")) { return false; } + + if (pIOHandler) { + glTF2::Asset asset(pIOHandler); + return asset.CanRead(filename, extension == "glb"); + } + + return false; } -static aiTextureMapMode ConvertWrappingMode(SamplerWrap gltfWrapMode) { +static inline aiTextureMapMode ConvertWrappingMode(SamplerWrap gltfWrapMode) { switch (gltfWrapMode) { case SamplerWrap::Mirrored_Repeat: return aiTextureMapMode_Mirror; @@ -137,21 +140,21 @@ static aiTextureMapMode ConvertWrappingMode(SamplerWrap gltfWrapMode) { } } -inline void SetMaterialColorProperty(Asset & /*r*/, vec4 &prop, aiMaterial *mat, +static inline void SetMaterialColorProperty(Asset & /*r*/, vec4 &prop, aiMaterial *mat, const char *pKey, unsigned int type, unsigned int idx) { aiColor4D col; CopyValue(prop, col); mat->AddProperty(&col, 1, pKey, type, idx); } -inline void SetMaterialColorProperty(Asset & /*r*/, vec3 &prop, aiMaterial *mat, +static inline void SetMaterialColorProperty(Asset & /*r*/, vec3 &prop, aiMaterial *mat, const char *pKey, unsigned int type, unsigned int idx) { aiColor4D col; glTFCommon::CopyValue(prop, col); mat->AddProperty(&col, 1, pKey, type, idx); } -inline void SetMaterialTextureProperty(std::vector &embeddedTexIdxs, Asset & /*r*/, +static void SetMaterialTextureProperty(std::vector &embeddedTexIdxs, Asset & /*r*/, glTF2::TextureInfo prop, aiMaterial *mat, aiTextureType texType, unsigned int texSlot = 0) { if (prop.texture && prop.texture->source) { @@ -368,10 +371,10 @@ void glTF2Importer::ImportMaterials(Asset &r) { mScene->mNumMaterials = numImportedMaterials + 1; mScene->mMaterials = new aiMaterial *[mScene->mNumMaterials]; std::fill(mScene->mMaterials, mScene->mMaterials + mScene->mNumMaterials, nullptr); - mScene->mMaterials[numImportedMaterials] = ImportMaterial(embeddedTexIdxs, r, defaultMaterial); + mScene->mMaterials[numImportedMaterials] = ImportMaterial(mEmbeddedTexIdxs, r, defaultMaterial); for (unsigned int i = 0; i < numImportedMaterials; ++i) { - mScene->mMaterials[i] = ImportMaterial(embeddedTexIdxs, r, r.materials[i]); + mScene->mMaterials[i] = ImportMaterial(mEmbeddedTexIdxs, r, r.materials[i]); } } @@ -799,8 +802,7 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { if (actualNumFaces < nFaces) { ASSIMP_LOG_WARN("Some faces had out-of-range indices. Those faces were dropped."); } - if (actualNumFaces == 0) - { + if (actualNumFaces == 0) { throw DeadlyImportError("Mesh \"", aim->mName.C_Str(), "\" has no faces"); } aim->mNumFaces = actualNumFaces; @@ -840,7 +842,6 @@ void glTF2Importer::ImportCameras(glTF2::Asset &r) { aicam->mLookAt = aiVector3D(0.f, 0.f, -1.f); if (cam.type == Camera::Perspective) { - aicam->mAspect = cam.cameraProperties.perspective.aspectRatio; aicam->mHorizontalFOV = cam.cameraProperties.perspective.yfov * ((aicam->mAspect == 0.f) ? 1.f : aicam->mAspect); aicam->mClipPlaneFar = cam.cameraProperties.perspective.zfar; @@ -859,8 +860,9 @@ void glTF2Importer::ImportCameras(glTF2::Asset &r) { } void glTF2Importer::ImportLights(glTF2::Asset &r) { - if (!r.lights.Size()) + if (!r.lights.Size()) { return; + } const unsigned int numLights = r.lights.Size(); ASSIMP_LOG_DEBUG("Importing ", numLights, " lights"); @@ -1122,8 +1124,8 @@ aiNode *ImportNode(aiScene *pScene, glTF2::Asset &r, std::vector & bone->mNumWeights = static_cast(weights.size()); if (bone->mNumWeights > 0) { - bone->mWeights = new aiVertexWeight[bone->mNumWeights]; - memcpy(bone->mWeights, weights.data(), bone->mNumWeights * sizeof(aiVertexWeight)); + bone->mWeights = new aiVertexWeight[bone->mNumWeights]; + memcpy(bone->mWeights, weights.data(), bone->mNumWeights * sizeof(aiVertexWeight)); } else { // Assimp expects all bones to have at least 1 weight. bone->mWeights = new aiVertexWeight[1]; @@ -1164,8 +1166,7 @@ aiNode *ImportNode(aiScene *pScene, glTF2::Asset &r, std::vector & if (!ainode->mMetaData) { ainode->mMetaData = aiMetadata::Alloc(1); ainode->mMetaData->Set(0, "PBR_LightRange", node.light->range.value); - } - else { + } else { ainode->mMetaData->Add("PBR_LightRange", node.light->range.value); } } @@ -1506,16 +1507,26 @@ void glTF2Importer::ImportAnimations(glTF2::Asset &r) { } } -void glTF2Importer::ImportEmbeddedTextures(glTF2::Asset &r) { - embeddedTexIdxs.resize(r.images.Size(), -1); - - int numEmbeddedTexs = 0; +static unsigned int countEmbeddedTextures(glTF2::Asset &r) { + unsigned int numEmbeddedTexs = 0; for (size_t i = 0; i < r.images.Size(); ++i) { if (r.images[i].HasData()) { numEmbeddedTexs += 1; } } + return numEmbeddedTexs; +} + +void glTF2Importer::ImportEmbeddedTextures(glTF2::Asset &r) { + mEmbeddedTexIdxs.resize(r.images.Size(), -1); + const unsigned int numEmbeddedTexs = countEmbeddedTextures(r); + /* for (size_t i = 0; i < r.images.Size(); ++i) { + if (r.images[i].HasData()) { + numEmbeddedTexs += 1; + } + }*/ + if (numEmbeddedTexs == 0) { return; } @@ -1533,7 +1544,7 @@ void glTF2Importer::ImportEmbeddedTextures(glTF2::Asset &r) { } int idx = mScene->mNumTextures++; - embeddedTexIdxs[i] = idx; + mEmbeddedTexIdxs[i] = idx; aiTexture *tex = mScene->mTextures[idx] = new aiTexture(); @@ -1594,7 +1605,7 @@ void glTF2Importer::InternReadFile(const std::string &pFile, aiScene *pScene, IO // clean all member arrays meshOffsets.clear(); - embeddedTexIdxs.clear(); + mEmbeddedTexIdxs.clear(); this->mScene = pScene; diff --git a/code/AssetLib/glTF2/glTF2Importer.h b/code/AssetLib/glTF2/glTF2Importer.h index 9a05c4dba..831bcd7d2 100644 --- a/code/AssetLib/glTF2/glTF2Importer.h +++ b/code/AssetLib/glTF2/glTF2Importer.h @@ -79,7 +79,7 @@ private: private: std::vector meshOffsets; - std::vector embeddedTexIdxs; + std::vector mEmbeddedTexIdxs; aiScene *mScene; /// An instance of rapidjson::IRemoteSchemaDocumentProvider From 9d0006fecbb164e9cc596a0ea3b95f9b1b8355f1 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Tue, 18 Jan 2022 21:32:06 +0100 Subject: [PATCH 62/83] Revert change --- code/AssetLib/B3D/B3DImporter.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/code/AssetLib/B3D/B3DImporter.cpp b/code/AssetLib/B3D/B3DImporter.cpp index 78d26bdcc..6a0c09ee9 100644 --- a/code/AssetLib/B3D/B3DImporter.cpp +++ b/code/AssetLib/B3D/B3DImporter.cpp @@ -89,11 +89,22 @@ void DeleteAllBarePointers(std::vector &x) { } B3DImporter::~B3DImporter() { + // empty } // ------------------------------------------------------------------------------------------------ bool B3DImporter::CanRead(const std::string & /*pFile*/, IOSystem * /*pIOHandler*/, bool /*checkSig*/) const { - return false; + size_t pos = pFile.find_last_of('.'); + if (pos == string::npos) { + return false; + } + + string ext = pFile.substr(pos + 1); + if (ext.size() != 3) { + return false; + } + + return (ext[0] == 'b' || ext[0] == 'B') && (ext[1] == '3') && (ext[2] == 'd' || ext[2] == 'D'); } // ------------------------------------------------------------------------------------------------ From cff213d4ddf2c77bad571e323f333a40085b6a99 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Tue, 18 Jan 2022 21:33:05 +0100 Subject: [PATCH 63/83] Revert change --- code/AssetLib/C4D/C4DImporter.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/code/AssetLib/C4D/C4DImporter.cpp b/code/AssetLib/C4D/C4DImporter.cpp index 5107717c3..b14df4300 100644 --- a/code/AssetLib/C4D/C4DImporter.cpp +++ b/code/AssetLib/C4D/C4DImporter.cpp @@ -118,8 +118,12 @@ C4DImporter::~C4DImporter() { // ------------------------------------------------------------------------------------------------ bool C4DImporter::CanRead( const std::string& /*pFile*/, IOSystem* /*pIOHandler*/, bool /*checkSig*/) const { - // TODO - return false; +const std::string& extension = GetExtension(pFile); + if (extension == "c4d") { + return true; + } else if ((!extension.length() || checkSig) && pIOHandler) { + // TODO + } } // ------------------------------------------------------------------------------------------------ From 037732c429f30dd4bfc17b17d1bdc72298b81f35 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Tue, 18 Jan 2022 21:34:18 +0100 Subject: [PATCH 64/83] Revert change --- code/AssetLib/Q3BSP/Q3BSPFileImporter.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/AssetLib/Q3BSP/Q3BSPFileImporter.cpp b/code/AssetLib/Q3BSP/Q3BSPFileImporter.cpp index f98d1264a..6c1498892 100644 --- a/code/AssetLib/Q3BSP/Q3BSPFileImporter.cpp +++ b/code/AssetLib/Q3BSP/Q3BSPFileImporter.cpp @@ -158,6 +158,9 @@ Q3BSPFileImporter::~Q3BSPFileImporter() { // ------------------------------------------------------------------------------------------------ // Returns true if the loader can read this. bool Q3BSPFileImporter::CanRead(const std::string &/*rFile*/, IOSystem * /*pIOHandler*/, bool /*checkSig*/) const { + if (!checkSig) { + return SimpleExtensionCheck(rFile, "pk3", "bsp"); + } return false; } From 1e80630d5d124f60c59c9605844d3bd60c7fda53 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Tue, 18 Jan 2022 21:35:09 +0100 Subject: [PATCH 65/83] Revert change. --- code/AssetLib/Raw/RawLoader.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/AssetLib/Raw/RawLoader.cpp b/code/AssetLib/Raw/RawLoader.cpp index 26b6896b1..b2f56f9e4 100644 --- a/code/AssetLib/Raw/RawLoader.cpp +++ b/code/AssetLib/Raw/RawLoader.cpp @@ -85,7 +85,7 @@ RAWImporter::~RAWImporter() { // ------------------------------------------------------------------------------------------------ // Returns whether the class can handle the format of the given file. bool RAWImporter::CanRead(const std::string & /*pFile*/, IOSystem * /*pIOHandler*/, bool /*checkSig*/) const { - return false; + return SimpleExtensionCheck(pFile, "raw"); } // ------------------------------------------------------------------------------------------------ From cf474117427bd2f5b37c433b0569ebfdd9a6343e Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Tue, 18 Jan 2022 21:36:02 +0100 Subject: [PATCH 66/83] Revert change --- code/AssetLib/SIB/SIBImporter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/AssetLib/SIB/SIBImporter.cpp b/code/AssetLib/SIB/SIBImporter.cpp index 904e2896a..569e3082a 100644 --- a/code/AssetLib/SIB/SIBImporter.cpp +++ b/code/AssetLib/SIB/SIBImporter.cpp @@ -218,7 +218,7 @@ SIBImporter::~SIBImporter() { // ------------------------------------------------------------------------------------------------ // Returns whether the class can handle the format of the given file. bool SIBImporter::CanRead(const std::string & /*pFile*/, IOSystem * /*pIOHandler*/, bool /*checkSig*/) const { - return false; + return SimpleExtensionCheck(pFile, "sib"); } // ------------------------------------------------------------------------------------------------ From 7350baea9306ead00df9f65aa72f1e74af6caf65 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Tue, 18 Jan 2022 21:36:55 +0100 Subject: [PATCH 67/83] Revert change --- code/AssetLib/SMD/SMDLoader.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/AssetLib/SMD/SMDLoader.cpp b/code/AssetLib/SMD/SMDLoader.cpp index af5b49524..fc674caa0 100644 --- a/code/AssetLib/SMD/SMDLoader.cpp +++ b/code/AssetLib/SMD/SMDLoader.cpp @@ -102,8 +102,7 @@ SMDImporter::~SMDImporter() { // ------------------------------------------------------------------------------------------------ // Returns whether the class can handle the format of the given file. bool SMDImporter::CanRead( const std::string& /*pFile*/, IOSystem* /*pIOHandler*/, bool) const { - // fixme: auto format detection - return false; + return SimpleExtensionCheck(pFile,"smd","vta"); } // ------------------------------------------------------------------------------------------------ From 959af1ac4ddc06deeac44a93eeaaf4d20aa8ff3c Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Tue, 18 Jan 2022 21:37:49 +0100 Subject: [PATCH 68/83] Revert change --- code/AssetLib/Unreal/UnrealLoader.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/code/AssetLib/Unreal/UnrealLoader.cpp b/code/AssetLib/Unreal/UnrealLoader.cpp index a1e96a058..54ffb8c89 100644 --- a/code/AssetLib/Unreal/UnrealLoader.cpp +++ b/code/AssetLib/Unreal/UnrealLoader.cpp @@ -168,16 +168,20 @@ static const aiImporterDesc desc = { // ------------------------------------------------------------------------------------------------ // Constructor to be privately used by Importer UnrealImporter::UnrealImporter() : - mConfigFrameID(0), mConfigHandleFlags(true) {} + mConfigFrameID(0), mConfigHandleFlags(true) { + // empty +} // ------------------------------------------------------------------------------------------------ // Destructor, private as well -UnrealImporter::~UnrealImporter() {} +UnrealImporter::~UnrealImporter() { + // empty +} // ------------------------------------------------------------------------------------------------ // Returns whether the class can handle the format of the given file. bool UnrealImporter::CanRead(const std::string & /*pFile*/, IOSystem * /*pIOHandler*/, bool /*checkSig*/) const { - return false; + return SimpleExtensionCheck(pFile, "3d", "uc"); } // ------------------------------------------------------------------------------------------------ From ea5996307a912668a0b272f0d0af018aef46f1ce Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Tue, 18 Jan 2022 22:20:37 +0100 Subject: [PATCH 69/83] Update B3DImporter.cpp --- code/AssetLib/B3D/B3DImporter.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/AssetLib/B3D/B3DImporter.cpp b/code/AssetLib/B3D/B3DImporter.cpp index 6a0c09ee9..c4ef75be3 100644 --- a/code/AssetLib/B3D/B3DImporter.cpp +++ b/code/AssetLib/B3D/B3DImporter.cpp @@ -81,7 +81,7 @@ static const aiImporterDesc desc = { //#define DEBUG_B3D -template +template void DeleteAllBarePointers(std::vector &x) { for (auto p : x) { delete p; @@ -93,7 +93,7 @@ B3DImporter::~B3DImporter() { } // ------------------------------------------------------------------------------------------------ -bool B3DImporter::CanRead(const std::string & /*pFile*/, IOSystem * /*pIOHandler*/, bool /*checkSig*/) const { +bool B3DImporter::CanRead(const std::string &pFile, IOSystem * /*pIOHandler*/, bool /*checkSig*/) const { size_t pos = pFile.find_last_of('.'); if (pos == string::npos) { return false; From c3b91dd766267119e06ee032124a0a4977897838 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Tue, 18 Jan 2022 22:21:58 +0100 Subject: [PATCH 70/83] C4D. Fix merge conflicts --- code/AssetLib/C4D/C4DImporter.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/code/AssetLib/C4D/C4DImporter.cpp b/code/AssetLib/C4D/C4DImporter.cpp index b14df4300..06d7a3412 100644 --- a/code/AssetLib/C4D/C4DImporter.cpp +++ b/code/AssetLib/C4D/C4DImporter.cpp @@ -117,13 +117,15 @@ C4DImporter::~C4DImporter() { } // ------------------------------------------------------------------------------------------------ -bool C4DImporter::CanRead( const std::string& /*pFile*/, IOSystem* /*pIOHandler*/, bool /*checkSig*/) const { -const std::string& extension = GetExtension(pFile); +bool C4DImporter::CanRead( const std::string& pFile, IOSystem* /*pIOHandler*/, bool /*checkSig*/) const { + const std::string& extension = GetExtension(pFile); if (extension == "c4d") { return true; } else if ((!extension.length() || checkSig) && pIOHandler) { // TODO } + + return false; } // ------------------------------------------------------------------------------------------------ From 331cb5ac7231d18cbc2a21a10e3725edbecbda32 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Tue, 18 Jan 2022 22:23:01 +0100 Subject: [PATCH 71/83] Update M3DImporter.cpp --- code/AssetLib/M3D/M3DImporter.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/code/AssetLib/M3D/M3DImporter.cpp b/code/AssetLib/M3D/M3DImporter.cpp index 02a11c840..895b2bf70 100644 --- a/code/AssetLib/M3D/M3DImporter.cpp +++ b/code/AssetLib/M3D/M3DImporter.cpp @@ -112,10 +112,8 @@ M3DImporter::M3DImporter() : // ------------------------------------------------------------------------------------------------ // Returns true, if file is a binary or ASCII Model 3D file. bool M3DImporter::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool /*checkSig*/) const { - /* - * don't use CheckMagicToken because that checks with swapped bytes too, leading to false - * positives. This magic is not uint32_t, but char[4], so memcmp is the best way - */ + // don't use CheckMagicToken because that checks with swapped bytes too, leading to false + // positives. This magic is not uint32_t, but char[4], so memcmp is the best way std::unique_ptr pStream(pIOHandler->Open(pFile, "rb")); unsigned char data[4]; if (4 != pStream->Read(data, 1, 4)) { From ffc13f18ba320d1e2f1e0b249f1d8f468b35cbc5 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Tue, 18 Jan 2022 22:24:11 +0100 Subject: [PATCH 72/83] NFF: reenable canRead --- code/AssetLib/NFF/NFFLoader.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/code/AssetLib/NFF/NFFLoader.cpp b/code/AssetLib/NFF/NFFLoader.cpp index a7e8bd616..48271d137 100644 --- a/code/AssetLib/NFF/NFFLoader.cpp +++ b/code/AssetLib/NFF/NFFLoader.cpp @@ -5,8 +5,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2022, assimp team - - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -83,8 +81,8 @@ NFFImporter::~NFFImporter() {} // ------------------------------------------------------------------------------------------------ // Returns whether the class can handle the format of the given file. -bool NFFImporter::CanRead(const std::string & /*pFile*/, IOSystem * /*pIOHandler*/, bool /*checkSig*/) const { - return false; +bool NFFImporter::CanRead(const std::string & pFile, IOSystem * /*pIOHandler*/, bool /*checkSig*/) const { + return SimpleExtensionCheck(pFile, "nff", "enff"); } // ------------------------------------------------------------------------------------------------ From b4dee9220d1a55028b715e13514448cf00ae9dd4 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Tue, 18 Jan 2022 22:25:22 +0100 Subject: [PATCH 73/83] Update Q3BSPFileImporter.cpp --- code/AssetLib/Q3BSP/Q3BSPFileImporter.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/AssetLib/Q3BSP/Q3BSPFileImporter.cpp b/code/AssetLib/Q3BSP/Q3BSPFileImporter.cpp index 6c1498892..5a2f12366 100644 --- a/code/AssetLib/Q3BSP/Q3BSPFileImporter.cpp +++ b/code/AssetLib/Q3BSP/Q3BSPFileImporter.cpp @@ -157,9 +157,9 @@ Q3BSPFileImporter::~Q3BSPFileImporter() { // ------------------------------------------------------------------------------------------------ // Returns true if the loader can read this. -bool Q3BSPFileImporter::CanRead(const std::string &/*rFile*/, IOSystem * /*pIOHandler*/, bool /*checkSig*/) const { +bool Q3BSPFileImporter::CanRead(const std::string &filename, IOSystem * /*pIOHandler*/, bool /*checkSig*/) const { if (!checkSig) { - return SimpleExtensionCheck(rFile, "pk3", "bsp"); + return SimpleExtensionCheck(filename, "pk3", "bsp"); } return false; } From 088658b35947d1cd3fd15b54473dd47bf9468645 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Tue, 18 Jan 2022 22:25:43 +0100 Subject: [PATCH 74/83] Update Q3BSPFileImporter.cpp --- code/AssetLib/Q3BSP/Q3BSPFileImporter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/AssetLib/Q3BSP/Q3BSPFileImporter.cpp b/code/AssetLib/Q3BSP/Q3BSPFileImporter.cpp index 5a2f12366..db9a4a02f 100644 --- a/code/AssetLib/Q3BSP/Q3BSPFileImporter.cpp +++ b/code/AssetLib/Q3BSP/Q3BSPFileImporter.cpp @@ -157,7 +157,7 @@ Q3BSPFileImporter::~Q3BSPFileImporter() { // ------------------------------------------------------------------------------------------------ // Returns true if the loader can read this. -bool Q3BSPFileImporter::CanRead(const std::string &filename, IOSystem * /*pIOHandler*/, bool /*checkSig*/) const { +bool Q3BSPFileImporter::CanRead(const std::string &filename, IOSystem * /*pIOHandler*/, bool checkSig) const { if (!checkSig) { return SimpleExtensionCheck(filename, "pk3", "bsp"); } From ec63fe74ee85ef44f2b145813f324c9afc5a264c Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Tue, 18 Jan 2022 22:26:16 +0100 Subject: [PATCH 75/83] Update RawLoader.cpp --- code/AssetLib/Raw/RawLoader.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/AssetLib/Raw/RawLoader.cpp b/code/AssetLib/Raw/RawLoader.cpp index b2f56f9e4..bfd2e6d6e 100644 --- a/code/AssetLib/Raw/RawLoader.cpp +++ b/code/AssetLib/Raw/RawLoader.cpp @@ -84,8 +84,8 @@ RAWImporter::~RAWImporter() { // ------------------------------------------------------------------------------------------------ // Returns whether the class can handle the format of the given file. -bool RAWImporter::CanRead(const std::string & /*pFile*/, IOSystem * /*pIOHandler*/, bool /*checkSig*/) const { - return SimpleExtensionCheck(pFile, "raw"); +bool RAWImporter::CanRead(const std::string &filename, IOSystem * /*pIOHandler*/, bool /*checkSig*/) const { + return SimpleExtensionCheck(filename, "raw"); } // ------------------------------------------------------------------------------------------------ From 7b24437f0635668186f677512e7ff4c0934dfc8a Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Tue, 18 Jan 2022 22:27:19 +0100 Subject: [PATCH 76/83] Update SIBImporter.cpp --- code/AssetLib/SIB/SIBImporter.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/code/AssetLib/SIB/SIBImporter.cpp b/code/AssetLib/SIB/SIBImporter.cpp index 569e3082a..7b66afa44 100644 --- a/code/AssetLib/SIB/SIBImporter.cpp +++ b/code/AssetLib/SIB/SIBImporter.cpp @@ -5,8 +5,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2022, assimp team - - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -61,7 +59,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifdef ASSIMP_USE_HUNTER #include #else -//# include "../contrib/ConvertUTF/ConvertUTF.h" #include "../contrib/utf8cpp/source/utf8.h" #endif #include @@ -217,8 +214,8 @@ SIBImporter::~SIBImporter() { // ------------------------------------------------------------------------------------------------ // Returns whether the class can handle the format of the given file. -bool SIBImporter::CanRead(const std::string & /*pFile*/, IOSystem * /*pIOHandler*/, bool /*checkSig*/) const { - return SimpleExtensionCheck(pFile, "sib"); +bool SIBImporter::CanRead(const std::string &filename, IOSystem * /*pIOHandler*/, bool /*checkSig*/) const { + return SimpleExtensionCheck(filename, "sib"); } // ------------------------------------------------------------------------------------------------ From 12b01dd5753386984d41566ac1f3cf528f717a94 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Tue, 18 Jan 2022 22:28:54 +0100 Subject: [PATCH 77/83] Update SMDLoader.cpp --- code/AssetLib/SMD/SMDLoader.cpp | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/code/AssetLib/SMD/SMDLoader.cpp b/code/AssetLib/SMD/SMDLoader.cpp index fc674caa0..46fd968c8 100644 --- a/code/AssetLib/SMD/SMDLoader.cpp +++ b/code/AssetLib/SMD/SMDLoader.cpp @@ -81,15 +81,15 @@ static const aiImporterDesc desc = { // ------------------------------------------------------------------------------------------------ // Constructor to be privately used by Importer -SMDImporter::SMDImporter() -: configFrameID() -, mBuffer() -, pScene( nullptr ) -, iFileSize( 0 ) -, iSmallestFrame( INT_MAX ) -, dLengthOfAnim( 0.0 ) -, bHasUVs(false ) -, iLineNumber((unsigned int)-1) { +SMDImporter::SMDImporter() : + configFrameID(), + mBuffer(), + pScene( nullptr ), + iFileSize( 0 ), + iSmallestFrame( INT_MAX ), + dLengthOfAnim( 0.0 ), + bHasUVs(false ), + iLineNumber((unsigned int)-1) { // empty } @@ -101,8 +101,8 @@ SMDImporter::~SMDImporter() { // ------------------------------------------------------------------------------------------------ // Returns whether the class can handle the format of the given file. -bool SMDImporter::CanRead( const std::string& /*pFile*/, IOSystem* /*pIOHandler*/, bool) const { - return SimpleExtensionCheck(pFile,"smd","vta"); +bool SMDImporter::CanRead( const std::string& filename, IOSystem* /*pIOHandler*/, bool) const { + return SimpleExtensionCheck(filename, "smd", "vta"); } // ------------------------------------------------------------------------------------------------ From 4cb76e6a18f9d05c8769e44bb6b1ca8283b4fd9d Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Tue, 18 Jan 2022 22:29:55 +0100 Subject: [PATCH 78/83] Update UnrealLoader.cpp --- code/AssetLib/Unreal/UnrealLoader.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/AssetLib/Unreal/UnrealLoader.cpp b/code/AssetLib/Unreal/UnrealLoader.cpp index 54ffb8c89..661952b3d 100644 --- a/code/AssetLib/Unreal/UnrealLoader.cpp +++ b/code/AssetLib/Unreal/UnrealLoader.cpp @@ -74,7 +74,7 @@ namespace Unreal { 3 = Masked two-sided 4 = Modulation blended two-sided 8 = Placeholder triangle for weapon positioning (invisible) - */ +*/ enum MeshFlags { MF_NORMAL_OS = 0, MF_NORMAL_TS = 1, @@ -180,8 +180,8 @@ UnrealImporter::~UnrealImporter() { // ------------------------------------------------------------------------------------------------ // Returns whether the class can handle the format of the given file. -bool UnrealImporter::CanRead(const std::string & /*pFile*/, IOSystem * /*pIOHandler*/, bool /*checkSig*/) const { - return SimpleExtensionCheck(pFile, "3d", "uc"); +bool UnrealImporter::CanRead(const std::string & filename, IOSystem * /*pIOHandler*/, bool /*checkSig*/) const { + return SimpleExtensionCheck(filename, "3d", "uc"); } // ------------------------------------------------------------------------------------------------ From 17d5633a5b2688681fb9b83fbf47e228264b6924 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Wed, 19 Jan 2022 21:42:14 +0100 Subject: [PATCH 79/83] Add missing SImpleExtensionCheck --- code/AssetLib/glTF2/glTF2Importer.cpp | 6 ------ code/Common/BaseImporter.cpp | 27 +++++++++++++++++++++++++++ include/assimp/BaseImporter.h | 14 ++++++++++++++ 3 files changed, 41 insertions(+), 6 deletions(-) diff --git a/code/AssetLib/glTF2/glTF2Importer.cpp b/code/AssetLib/glTF2/glTF2Importer.cpp index 4e78d0e17..1f4cafdda 100644 --- a/code/AssetLib/glTF2/glTF2Importer.cpp +++ b/code/AssetLib/glTF2/glTF2Importer.cpp @@ -1521,12 +1521,6 @@ static unsigned int countEmbeddedTextures(glTF2::Asset &r) { void glTF2Importer::ImportEmbeddedTextures(glTF2::Asset &r) { mEmbeddedTexIdxs.resize(r.images.Size(), -1); const unsigned int numEmbeddedTexs = countEmbeddedTextures(r); - /* for (size_t i = 0; i < r.images.Size(); ++i) { - if (r.images[i].HasData()) { - numEmbeddedTexs += 1; - } - }*/ - if (numEmbeddedTexs == 0) { return; } diff --git a/code/Common/BaseImporter.cpp b/code/Common/BaseImporter.cpp index e400f5c29..383300ef1 100644 --- a/code/Common/BaseImporter.cpp +++ b/code/Common/BaseImporter.cpp @@ -225,6 +225,32 @@ void BaseImporter::GetExtensionList(std::set &extensions) { return false; } +// ------------------------------------------------------------------------------------------------ +// Simple check for file extension +/*static*/ bool BaseImporter::SimpleExtensionCheck(const std::string &pFile, + const char *ext0, + const char *ext1, + const char *ext2) { + std::string::size_type pos = pFile.find_last_of('.'); + + // no file extension - can't read + if (pos == std::string::npos) + return false; + + const char *ext_real = &pFile[pos + 1]; + if (!ASSIMP_stricmp(ext_real, ext0)) + return true; + + // check for other, optional, file extensions + if (ext1 && !ASSIMP_stricmp(ext_real, ext1)) + return true; + + if (ext2 && !ASSIMP_stricmp(ext_real, ext2)) + return true; + + return false; +} + // ------------------------------------------------------------------------------------------------ // Get file extension from path std::string BaseImporter::GetExtension(const std::string &file) { @@ -242,6 +268,7 @@ std::string BaseImporter::GetExtension(const std::string &file) { return ret; } + // ------------------------------------------------------------------------------------------------ // Check for magic bytes at the beginning of the file. /* static */ bool BaseImporter::CheckMagicToken(IOSystem *pIOHandler, const std::string &pFile, diff --git a/include/assimp/BaseImporter.h b/include/assimp/BaseImporter.h index e7aafef23..5a3c764d4 100644 --- a/include/assimp/BaseImporter.h +++ b/include/assimp/BaseImporter.h @@ -260,6 +260,20 @@ public: // static utilities bool tokensSol = false, bool noAlphaBeforeTokens = false); + // ------------------------------------------------------------------- + /** @brief Check whether a file has a specific file extension + * @param pFile Input file + * @param ext0 Extension to check for. Lowercase characters only, no dot! + * @param ext1 Optional second extension + * @param ext2 Optional third extension + * @note Case-insensitive + */ + static bool SimpleExtensionCheck( + const std::string &pFile, + const char *ext0, + const char *ext1 = nullptr, + const char *ext2 = nullptr); + // ------------------------------------------------------------------- /** @brief Extract file extension from a string * @param pFile Input file From 15b08f643aaa72267a590ce5b98a64b2b15e2089 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Wed, 19 Jan 2022 21:55:24 +0100 Subject: [PATCH 80/83] Fix warning: unused variable --- code/AssetLib/Blender/BlenderLoader.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/code/AssetLib/Blender/BlenderLoader.cpp b/code/AssetLib/Blender/BlenderLoader.cpp index 42d25ebac..f1450168b 100644 --- a/code/AssetLib/Blender/BlenderLoader.cpp +++ b/code/AssetLib/Blender/BlenderLoader.cpp @@ -120,8 +120,6 @@ static const char * const TokensForSearch[] = { "blender" }; // Returns whether the class can handle the format of the given file. bool BlenderImporter::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool /*checkSig*/) const { // note: this won't catch compressed files - static const char *tokens[] = { " Date: Wed, 19 Jan 2022 22:00:53 +0100 Subject: [PATCH 81/83] Fix compile error: missing var --- code/AssetLib/Blender/BlenderLoader.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/AssetLib/Blender/BlenderLoader.cpp b/code/AssetLib/Blender/BlenderLoader.cpp index f1450168b..bfc44aea2 100644 --- a/code/AssetLib/Blender/BlenderLoader.cpp +++ b/code/AssetLib/Blender/BlenderLoader.cpp @@ -114,12 +114,14 @@ BlenderImporter::~BlenderImporter() { } static const char * const Tokens[] = { "BLENDER" }; -static const char * const TokensForSearch[] = { "blender" }; +//static const char * const TokensForSearch[] = { "blender" }; // ------------------------------------------------------------------------------------------------ // Returns whether the class can handle the format of the given file. bool BlenderImporter::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool /*checkSig*/) const { // note: this won't catch compressed files + static const char *tokens[] = { " Date: Wed, 19 Jan 2022 22:03:11 +0100 Subject: [PATCH 82/83] Fix compile error: missing var --- code/AssetLib/Blender/BlenderLoader.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/code/AssetLib/Blender/BlenderLoader.cpp b/code/AssetLib/Blender/BlenderLoader.cpp index bfc44aea2..3d9e8017b 100644 --- a/code/AssetLib/Blender/BlenderLoader.cpp +++ b/code/AssetLib/Blender/BlenderLoader.cpp @@ -114,7 +114,6 @@ BlenderImporter::~BlenderImporter() { } static const char * const Tokens[] = { "BLENDER" }; -//static const char * const TokensForSearch[] = { "blender" }; // ------------------------------------------------------------------------------------------------ // Returns whether the class can handle the format of the given file. From c1968823adfb8c997f98671becca51fc54614da7 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Thu, 20 Jan 2022 10:25:52 +0100 Subject: [PATCH 83/83] ASE: Fix material parsing - Fuzzer error found when material access get's an out-of-bound access. - Break parsing when material index gets out of range. - closes https://github.com/assimp/assimp/issues/4232 --- code/AssetLib/ASE/ASEParser.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/AssetLib/ASE/ASEParser.cpp b/code/AssetLib/ASE/ASEParser.cpp index 4e381a8e0..f684b56d3 100644 --- a/code/AssetLib/ASE/ASEParser.cpp +++ b/code/AssetLib/ASE/ASEParser.cpp @@ -486,8 +486,9 @@ void Parser::ParseLV1MaterialListBlock() { ParseLV4MeshLong(iIndex); if (iIndex >= iMaterialCount) { - LogWarning("Out of range: material index is too large"); + LogError("Out of range: material index is too large"); iIndex = iMaterialCount - 1; + return; } // get a reference to the material