diff --git a/Source/Engine/Tools/ModelTool/ModelTool.Assimp.cpp b/Source/Engine/Tools/ModelTool/ModelTool.Assimp.cpp index 1b04092be..ff8dc31fe 100644 --- a/Source/Engine/Tools/ModelTool/ModelTool.Assimp.cpp +++ b/Source/Engine/Tools/ModelTool/ModelTool.Assimp.cpp @@ -23,21 +23,20 @@ #include #include #include -using namespace Assimp; -class AssimpLogStream : public LogStream +class AssimpLogStream : public Assimp::LogStream { public: AssimpLogStream() { - DefaultLogger::create(""); - DefaultLogger::get()->attachStream(this); + Assimp::DefaultLogger::create(""); + Assimp::DefaultLogger::get()->attachStream(this); } ~AssimpLogStream() { - DefaultLogger::get()->detatchStream(this); - DefaultLogger::kill(); + Assimp::DefaultLogger::get()->detachStream(this); + Assimp::DefaultLogger::kill(); } void write(const char* message) override @@ -148,7 +147,7 @@ struct AssimpBone struct AssimpImporterData { - Importer AssimpImporter; + Assimp::Importer AssimpImporter; AssimpLogStream AssimpLogStream; const String Path; const aiScene* Scene = nullptr; diff --git a/Source/ThirdParty/assimp/.editorconfig b/Source/ThirdParty/assimp/.editorconfig new file mode 100644 index 000000000..9ea66423a --- /dev/null +++ b/Source/ThirdParty/assimp/.editorconfig @@ -0,0 +1,8 @@ +# See for details + +[*.{h,hpp,inl}] +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true +indent_size = 4 +indent_style = space diff --git a/Source/ThirdParty/assimp/AssertHandler.h b/Source/ThirdParty/assimp/AssertHandler.h new file mode 100644 index 000000000..1247ff490 --- /dev/null +++ b/Source/ThirdParty/assimp/AssertHandler.h @@ -0,0 +1,79 @@ +/* +Open Asset Import Library (assimp) +---------------------------------------------------------------------- + +Copyright (c) 2006-2020, assimp team + +All rights reserved. + +Redistribution and use of this software in source and binary forms, +with or without modification, are permitted provided that the +following conditions are met: + +* Redistributions of source code must retain the above + copyright notice, this list of conditions and the + following disclaimer. + +* Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the + following disclaimer in the documentation and/or other + materials provided with the distribution. + +* Neither the name of the assimp team, nor the names of its + contributors may be used to endorse or promote products + derived from this software without specific prior + written permission of the assimp team. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +---------------------------------------------------------------------- +*/ + +/** @file Provides facilities to replace the default assert handler. */ + +#ifndef INCLUDED_AI_ASSERTHANDLER_H +#define INCLUDED_AI_ASSERTHANDLER_H + +#include +#include + +namespace Assimp { + +// --------------------------------------------------------------------------- +/** + * @brief Signature of functions which handle assert violations. + */ +using AiAssertHandler = void (*)(const char* failedExpression, const char* file, int line); + +// --------------------------------------------------------------------------- +/** + * @brief Set the assert handler. + */ +ASSIMP_API void setAiAssertHandler(AiAssertHandler handler); + +// --------------------------------------------------------------------------- +/** The assert handler which is set by default. + * + * @brief This issues a message to stderr and calls abort. + */ +AI_WONT_RETURN ASSIMP_API void defaultAiAssertHandler(const char* failedExpression, const char* file, int line) AI_WONT_RETURN_SUFFIX; + +// --------------------------------------------------------------------------- +/** + * @brief Dispatches an assert violation to the assert handler. + */ +ASSIMP_API void aiAssertViolation(const char* failedExpression, const char* file, int line); + +} // end of namespace Assimp + +#endif // INCLUDED_AI_ASSERTHANDLER_H diff --git a/Source/ThirdParty/assimp/Base64.hpp b/Source/ThirdParty/assimp/Base64.hpp new file mode 100644 index 000000000..6a3551307 --- /dev/null +++ b/Source/ThirdParty/assimp/Base64.hpp @@ -0,0 +1,92 @@ +/* +--------------------------------------------------------------------------- +Open Asset Import Library (assimp) +--------------------------------------------------------------------------- + +Copyright (c) 2006-2024, assimp team + +All rights reserved. + +Redistribution and use of this software in source and binary forms, +with or without modification, are permitted provided that the following +conditions are met: + +* Redistributions of source code must retain the above + copyright notice, this list of conditions and the + following disclaimer. + +* Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the + following disclaimer in the documentation and/or other + materials provided with the distribution. + +* Neither the name of the assimp team, nor the names of its + contributors may be used to endorse or promote products + derived from this software without specific prior + written permission of the assimp team. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(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 +#include + +namespace Assimp { +namespace Base64 { + +/// @brief Will encode the given character buffer from UTF64 to ASCII +/// @param in The UTF-64 buffer. +/// @param inLength The size of the buffer +/// @param out The encoded ASCII string. +ASSIMP_API void Encode(const uint8_t *in, size_t inLength, std::string &out); + +/// @brief Will encode the given character buffer from UTF64 to ASCII. +/// @param in A vector, which contains the buffer for encoding. +/// @param out The encoded ASCII string. +ASSIMP_API void Encode(const std::vector &in, std::string &out); + +/// @brief Will encode the given character buffer from UTF64 to ASCII. +/// @param in A vector, which contains the buffer for encoding. +/// @return The encoded ASCII string. +ASSIMP_API std::string Encode(const std::vector &in); + +/// @brief Will decode the given character buffer from ASCII to UTF64. +/// @param in The ASCII buffer to decode. +/// @param inLength The size of the buffer. +/// @param out The decoded buffer. +/// @return The new buffer size. +ASSIMP_API size_t Decode(const char *in, size_t inLength, uint8_t *&out); + +/// @brief Will decode the given character buffer from ASCII to UTF64. +/// @param in The ASCII buffer to decode as a std::string. +/// @param out The decoded buffer. +/// @return The new buffer size. +ASSIMP_API size_t Decode(const std::string &in, std::vector &out); + +/// @brief Will decode the given character buffer from ASCII to UTF64. +/// @param in The ASCII string. +/// @return The decoded buffer in a vector. +ASSIMP_API std::vector Decode(const std::string &in); + +} // namespace Base64 +} // namespace Assimp + +#endif // AI_BASE64_HPP_INC diff --git a/Source/ThirdParty/assimp/BaseImporter.h b/Source/ThirdParty/assimp/BaseImporter.h index 48dfc8ed8..447784e75 100644 --- a/Source/ThirdParty/assimp/BaseImporter.h +++ b/Source/ThirdParty/assimp/BaseImporter.h @@ -2,8 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2019, assimp team - +Copyright (c) 2006-2024, assimp team All rights reserved. @@ -40,22 +39,31 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ---------------------------------------------------------------------- */ -/** @file Definition of the base class for all importer worker classes. */ +/// @file Definition of the base class for all importer worker classes. + +#pragma once #ifndef INCLUDED_AI_BASEIMPORTER_H #define INCLUDED_AI_BASEIMPORTER_H +#ifdef __GNUC__ +#pragma GCC system_header +#endif + #include "Exceptional.h" -#include -#include #include #include +#include +#include +#include +#include struct aiScene; struct aiImporterDesc; -namespace Assimp { +namespace Assimp { +// Forward declarations class Importer; class IOSystem; class BaseProcess; @@ -64,8 +72,10 @@ class IOStream; // utility to do char4 to uint32 in a portable manner #define AI_MAKE_MAGIC(string) ((uint32_t)((string[0] << 24) + \ - (string[1] << 16) + (string[2] << 8) + string[3])) + (string[1] << 16) + (string[2] << 8) + string[3])) +using UByteBuffer = std::vector; +using ByteBuffer = std::vector; // --------------------------------------------------------------------------- /** FOR IMPORTER PLUGINS ONLY: The BaseImporter defines a common interface @@ -81,48 +91,41 @@ class ASSIMP_API BaseImporter { friend class Importer; public: - /** Constructor to be privately used by #Importer */ BaseImporter() AI_NO_EXCEPT; /** Destructor, private as well */ - virtual ~BaseImporter(); + virtual ~BaseImporter() = default; // ------------------------------------------------------------------- /** 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, - IOSystem* pIOHandler, - bool checkSig - ) const = 0; + const std::string &pFile, + IOSystem *pIOHandler, + bool checkSig) const = 0; // ------------------------------------------------------------------- /** Imports the given file and returns the imported data. * If the import succeeds, ownership of the data is transferred to - * the caller. If the import fails, NULL is returned. The function + * the caller. If the import fails, nullptr is returned. The function * takes care that any partially constructed data is destroyed * beforehand. * * @param pImp #Importer object hosting this loader. * @param pFile Path of the file to be imported. * @param pIOHandler IO-Handler used to open this and possible other files. - * @return The imported data or NULL if failed. If it failed a + * @return The imported data or nullptr if failed. If it failed a * human-readable error description can be retrieved by calling * GetErrorText() * @@ -131,21 +134,32 @@ public: * in InternReadFile(), this function will catch it and transform it into * a suitable response to the caller. */ - aiScene* ReadFile( - const Importer* pImp, - const std::string& pFile, - IOSystem* pIOHandler - ); + aiScene *ReadFile( + Importer *pImp, + const std::string &pFile, + IOSystem *pIOHandler); // ------------------------------------------------------------------- /** Returns the error description of the last error that occurred. + * If the error is due to a std::exception, this will return the message. + * Exceptions can also be accessed with GetException(). * @return A description of the last error that occurred. An empty * string if there was no error. */ - const std::string& GetErrorText() const { + const std::string &GetErrorText() const { return m_ErrorText; } + // ------------------------------------------------------------------- + /** Returns the exception of the last exception that occurred. + * Note: Exceptions are not the only source of error details, so GetErrorText + * should be consulted too. + * @return The last exception that occurred. + */ + const std::exception_ptr& GetException() const { + return m_Exception; + } + // ------------------------------------------------------------------- /** Called prior to ReadFile(). * The function is a request to the importer to update its configuration @@ -153,22 +167,30 @@ public: * @param pImp Importer instance */ virtual void SetupProperties( - const Importer* pImp - ); + const Importer *pImp); // ------------------------------------------------------------------- /** Called by #Importer::GetImporterInfo to get a description of * some loader features. Importers must provide this information. */ - virtual const aiImporterDesc* GetInfo() const = 0; + virtual const aiImporterDesc *GetInfo() const = 0; + + /** + * Will be called only by scale process when scaling is requested. + */ + void SetFileScale(double scale) { + fileScale = scale; + } // ------------------------------------------------------------------- /** Called by #Importer::GetExtensionList for each loaded importer. * Take the extension list contained in the structure returned by * #GetInfo and insert all file extensions into the given set. * @param extension set to collect file extensions in*/ - void GetExtensionList(std::set& extensions); + void GetExtensionList(std::set &extensions); protected: + double importerScale = 1.0; + double fileScale = 1.0; // ------------------------------------------------------------------- /** Imports the given file into the given scene structure. The @@ -190,7 +212,7 @@ protected: *
  • aiAnimation::mDuration may be -1. Assimp determines the length * of the animation automatically in this case as the length of * the longest animation channel.
  • - *
  • aiMesh::mBitangents may be NULL if tangents and normals are + *
  • aiMesh::mBitangents may be nullptr if tangents and normals are * given. In this case bitangents are computed as the cross product * between normal and tangent.
  • *
  • There needn't be a material. If none is there a default material @@ -211,17 +233,15 @@ protected: * * @param pFile Path of the file to be imported. * @param pScene The scene object to hold the imported data. - * NULL is not a valid parameter. + * nullptr is not a valid parameter. * @param pIOHandler The IO handler to use for any file access. - * NULL is not a valid parameter. */ + * nullptr is not a valid parameter. */ virtual void InternReadFile( - const std::string& pFile, - aiScene* pScene, - IOSystem* pIOHandler - ) = 0; + const std::string &pFile, + aiScene *pScene, + IOSystem *pIOHandler) = 0; public: // static utilities - // ------------------------------------------------------------------- /** A utility for CanRead(). * @@ -237,13 +257,13 @@ public: // static utilities * @param searchBytes Number of bytes to be searched for the tokens. */ static bool SearchFileHeaderForToken( - IOSystem* pIOSystem, - const std::string& file, - const char** tokens, - unsigned int numTokens, - unsigned int searchBytes = 200, - bool tokensSol = false, - bool noAlphaBeforeTokens = false); + IOSystem *pIOSystem, + const std::string &file, + const char **tokens, + std::size_t numTokens, + unsigned int searchBytes = 200, + bool tokensSol = false, + bool noGraphBeforeTokens = false); // ------------------------------------------------------------------- /** @brief Check whether a file has a specific file extension @@ -253,19 +273,29 @@ public: // static utilities * @param ext2 Optional third extension * @note Case-insensitive */ - static bool SimpleExtensionCheck ( - const std::string& pFile, - const char* ext0, - const char* ext1 = NULL, - const char* ext2 = NULL); + static bool SimpleExtensionCheck( + const std::string &pFile, + const char *ext0, + const char *ext1 = nullptr, + const char *ext2 = nullptr); + + // ------------------------------------------------------------------- + /** @brief Check whether a file has one of the passed file extensions + * @param pFile Input file + * @param extensions Extensions to check for. Lowercase characters only, no dot! + * @note Case-insensitive + */ + static bool HasExtension( + const std::string &pFile, + const std::set &extensions); // ------------------------------------------------------------------- /** @brief Extract file extension from a string * @param pFile Input file * @return Extension without trailing dot, all lowercase */ - static std::string GetExtension ( - const std::string& pFile); + static std::string GetExtension( + const std::string &pFile); // ------------------------------------------------------------------- /** @brief Check whether a file starts with one or more magic tokens @@ -282,12 +312,12 @@ public: // static utilities * tokens of size 2,4. */ static bool CheckMagicToken( - IOSystem* pIOHandler, - const std::string& pFile, - const void* magic, - unsigned int num, - unsigned int offset = 0, - unsigned int size = 4); + IOSystem *pIOHandler, + const std::string &pFile, + const void *magic, + std::size_t num, + unsigned int offset = 0, + unsigned int size = 4); // ------------------------------------------------------------------- /** An utility for all text file loaders. It converts a file to our @@ -296,7 +326,7 @@ public: // static utilities * @param data File buffer to be converted to UTF8 data. The buffer * is resized as appropriate. */ static void ConvertToUTF8( - std::vector& data); + std::vector &data); // ------------------------------------------------------------------- /** An utility for all text file loaders. It converts a file from our @@ -305,13 +335,13 @@ public: // static utilities * @param data File buffer to be converted from UTF8 to ISO-8859-1. The buffer * is resized as appropriate. */ static void ConvertUTF8toISO8859_1( - std::string& data); + std::string &data); // ------------------------------------------------------------------- /// @brief Enum to define, if empty files are ok or not. - enum TextFileMode { + enum TextFileMode { ALLOW_EMPTY, - FORBID_EMPTY + FORBID_EMPTY }; // ------------------------------------------------------------------- @@ -324,22 +354,20 @@ public: // static utilities * a binary 0. * @param mode Whether it is OK to load empty text files. */ static void TextFileToBuffer( - IOStream* stream, - std::vector& data, - TextFileMode mode = FORBID_EMPTY); + IOStream *stream, + std::vector &data, + TextFileMode mode = FORBID_EMPTY); // ------------------------------------------------------------------- /** Utility function to move a std::vector into a aiScene array * @param vec The vector to be moved * @param out The output pointer to the allocated array. * @param numOut The output count of elements copied. */ - template - AI_FORCE_INLINE - static void CopyVector( - std::vector& vec, - T*& out, - unsigned int& outLength) - { + template + AI_FORCE_INLINE static void CopyVector( + std::vector &vec, + T *&out, + unsigned int &outLength) { outLength = unsigned(vec.size()); if (outLength) { out = new T[outLength]; @@ -347,15 +375,37 @@ public: // static utilities } } + // ------------------------------------------------------------------- + /** Utility function to move a std::vector of unique_ptrs into a aiScene array + * @param vec The vector of unique_ptrs to be moved + * @param out The output pointer to the allocated array. + * @param numOut The output count of elements copied. */ + template + AI_FORCE_INLINE static void CopyVector( + std::vector > &vec, + T **&out, + unsigned int &outLength) { + outLength = unsigned(vec.size()); + if (outLength) { + out = new T*[outLength]; + T** outPtr = out; + std::for_each(vec.begin(), vec.end(), [&outPtr](std::unique_ptr& uPtr){*outPtr = uPtr.release(); ++outPtr; }); + } + } + +private: + /* Pushes state into importer for the importer scale */ + void UpdateImporterScale(Importer *pImp); + protected: /// Error description in case there was one. std::string m_ErrorText; + /// The exception, in case there was one. + std::exception_ptr m_Exception; /// Currently set progress handler. - ProgressHandler* m_progress; + ProgressHandler *m_progress; }; - - } // end of namespace Assimp #endif // AI_BASEIMPORTER_H_INC diff --git a/Source/ThirdParty/assimp/Bitmap.h b/Source/ThirdParty/assimp/Bitmap.h index e6b5fb132..5145a6cd5 100644 --- a/Source/ThirdParty/assimp/Bitmap.h +++ b/Source/ThirdParty/assimp/Bitmap.h @@ -3,9 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2019, assimp team - - +Copyright (c) 2006-2024, assimp team All rights reserved. @@ -46,12 +44,16 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Used for file formats which embed their textures into the model file. */ - +#pragma once #ifndef AI_BITMAP_H_INC #define AI_BITMAP_H_INC +#ifdef __GNUC__ +# pragma GCC system_header +#endif + #include "defs.h" -#include +#include #include struct aiTexture; @@ -60,6 +62,10 @@ namespace Assimp { class IOStream; +// --------------------------------------------------------------------------- +/** + * This class is used to store and write bitmap information. + */ class ASSIMP_API Bitmap { protected: @@ -71,13 +77,12 @@ protected: uint32_t offset; // We define the struct size because sizeof(Header) might return a wrong result because of structure padding. - // Moreover, we must use this ugly and error prone syntax because Visual Studio neither support constexpr or sizeof(name_of_field). - static const std::size_t header_size = - sizeof(uint16_t) + // type - sizeof(uint32_t) + // size - sizeof(uint16_t) + // reserved1 - sizeof(uint16_t) + // reserved2 - sizeof(uint32_t); // offset + static constexpr std::size_t header_size = + sizeof(uint16_t) + + sizeof(uint32_t) + + sizeof(uint16_t) + + sizeof(uint16_t) + + sizeof(uint32_t); }; struct DIB { @@ -94,25 +99,28 @@ protected: uint32_t nb_important_colors; // We define the struct size because sizeof(DIB) might return a wrong result because of structure padding. - // Moreover, we must use this ugly and error prone syntax because Visual Studio neither support constexpr or sizeof(name_of_field). - static const std::size_t dib_size = - sizeof(uint32_t) + // size - sizeof(int32_t) + // width - sizeof(int32_t) + // height - sizeof(uint16_t) + // planes - sizeof(uint16_t) + // bits_per_pixel - sizeof(uint32_t) + // compression - sizeof(uint32_t) + // image_size - sizeof(int32_t) + // x_resolution - sizeof(int32_t) + // y_resolution - sizeof(uint32_t) + // nb_colors - sizeof(uint32_t); // nb_important_colors + static constexpr std::size_t dib_size = + sizeof(uint32_t) + + sizeof(int32_t) + + sizeof(int32_t) + + sizeof(uint16_t) + + sizeof(uint16_t) + + sizeof(uint32_t) + + sizeof(uint32_t) + + sizeof(int32_t) + + sizeof(int32_t) + + sizeof(uint32_t) + + sizeof(uint32_t); }; - static const std::size_t mBytesPerPixel = 4; + static constexpr std::size_t mBytesPerPixel = 4; public: - static void Save(aiTexture* texture, IOStream* file); + /// @brief Will save an aiTexture instance as a bitmap. + /// @param texture The pointer to the texture instance + /// @param file The filename to save into. + /// @return true if successfully saved, false if not. + static bool Save(aiTexture* texture, IOStream* file); protected: static void WriteHeader(Header& header, IOStream* file); diff --git a/Source/ThirdParty/assimp/BlobIOSystem.h b/Source/ThirdParty/assimp/BlobIOSystem.h index d005e5c11..eb23f9e92 100644 --- a/Source/ThirdParty/assimp/BlobIOSystem.h +++ b/Source/ThirdParty/assimp/BlobIOSystem.h @@ -3,9 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2019, assimp team - - +Copyright (c) 2006-2024, assimp team All rights reserved. @@ -44,152 +42,138 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /** @file Provides cheat implementations for IOSystem and IOStream to * redirect exporter output to a blob chain.*/ +#pragma once #ifndef AI_BLOBIOSYSTEM_H_INCLUDED #define AI_BLOBIOSYSTEM_H_INCLUDED -#include +#ifdef __GNUC__ +#pragma GCC system_header +#endif + #include -#include #include -#include +#include +#include +#include #include #include -namespace Assimp { - class BlobIOSystem; +namespace Assimp { +class BlobIOSystem; // -------------------------------------------------------------------------------------------- /** Redirect IOStream to a blob */ // -------------------------------------------------------------------------------------------- -class BlobIOStream : public IOStream -{ +class BlobIOStream : public IOStream { public: - - BlobIOStream(BlobIOSystem* creator, const std::string& file, size_t initial = 4096) - : buffer() - , cur_size() - , file_size() - , cursor() - , initial(initial) - , file(file) - , creator(creator) - { + /// @brief The class constructor with all needed parameters + /// @param creator Pointer to the creator instance + /// @param file The filename + /// @param initial The initial size + BlobIOStream(BlobIOSystem *creator, const std::string &file, size_t initial = 4096) : + buffer(), + cur_size(), + file_size(), + cursor(), + initial(initial), + file(file), + creator(creator) { + // empty } - - virtual ~BlobIOStream(); + /// @brief The class destructor. + ~BlobIOStream() override; public: - // ------------------------------------------------------------------- - aiExportDataBlob* GetBlob() - { - aiExportDataBlob* blob = new aiExportDataBlob(); + aiExportDataBlob *GetBlob() { + aiExportDataBlob *blob = new aiExportDataBlob(); blob->size = file_size; blob->data = buffer; - buffer = NULL; + buffer = nullptr; return blob; } - -public: - - // ------------------------------------------------------------------- - virtual size_t Read( void *, - size_t, - size_t ) - { + size_t Read(void *, size_t, size_t) override { return 0; } // ------------------------------------------------------------------- - virtual size_t Write(const void* pvBuffer, - size_t pSize, - size_t pCount) - { + size_t Write(const void *pvBuffer, size_t pSize, size_t pCount) override { pSize *= pCount; if (cursor + pSize > cur_size) { Grow(cursor + pSize); } - memcpy(buffer+cursor, pvBuffer, pSize); + memcpy(buffer + cursor, pvBuffer, pSize); cursor += pSize; - file_size = std::max(file_size,cursor); + file_size = std::max(file_size, cursor); return pCount; } // ------------------------------------------------------------------- - virtual aiReturn Seek(size_t pOffset, - aiOrigin pOrigin) - { - switch(pOrigin) - { - case aiOrigin_CUR: - cursor += pOffset; - break; + aiReturn Seek(size_t pOffset, aiOrigin pOrigin) override { + switch (pOrigin) { + case aiOrigin_CUR: + cursor += pOffset; + break; - case aiOrigin_END: - cursor = file_size - pOffset; - break; + case aiOrigin_END: + cursor = file_size - pOffset; + break; - case aiOrigin_SET: - cursor = pOffset; - break; + case aiOrigin_SET: + cursor = pOffset; + break; - default: - return AI_FAILURE; + default: + return AI_FAILURE; } if (cursor > file_size) { Grow(cursor); } - file_size = std::max(cursor,file_size); + file_size = std::max(cursor, file_size); + return AI_SUCCESS; } // ------------------------------------------------------------------- - virtual size_t Tell() const - { + size_t Tell() const override { return cursor; } // ------------------------------------------------------------------- - virtual size_t FileSize() const - { + size_t FileSize() const override { return file_size; } // ------------------------------------------------------------------- - virtual void Flush() - { + void Flush() override { // ignore } - - private: - // ------------------------------------------------------------------- - void Grow(size_t need = 0) - { + void Grow(size_t need = 0) { // 1.5 and phi are very heap-friendly growth factors (the first // allows for frequent re-use of heap blocks, the second // forms a fibonacci sequence with similar characteristics - // since this heavily depends on the heap implementation // and other factors as well, i'll just go with 1.5 since // it is quicker to compute). - size_t new_size = std::max(initial, std::max( need, cur_size+(cur_size>>1) )); + size_t new_size = std::max(initial, std::max(need, cur_size + (cur_size >> 1))); - const uint8_t* const old = buffer; + const uint8_t *const old = buffer; buffer = new uint8_t[new_size]; if (old) { - memcpy(buffer,old,cur_size); + memcpy(buffer, old, cur_size); delete[] old; } @@ -197,68 +181,73 @@ private: } private: - - uint8_t* buffer; - size_t cur_size,file_size, cursor, initial; + uint8_t *buffer; + size_t cur_size, file_size, cursor, initial; const std::string file; - BlobIOSystem* const creator; + BlobIOSystem *const creator; }; - #define AI_BLOBIO_MAGIC "$blobfile" // -------------------------------------------------------------------------------------------- /** Redirect IOSystem to a blob */ // -------------------------------------------------------------------------------------------- -class BlobIOSystem : public IOSystem -{ +class BlobIOSystem : public IOSystem { friend class BlobIOStream; - typedef std::pair BlobEntry; + typedef std::pair BlobEntry; + public: - - BlobIOSystem() - { + /// @brief The default class constructor. + BlobIOSystem() : + baseName{AI_BLOBIO_MAGIC} { } - virtual ~BlobIOSystem() - { - for(BlobEntry& blobby : blobs) { + /// @brief The class constructor with the base name. + /// @param baseName The base name. + BlobIOSystem(const std::string &baseName) : + baseName(baseName) { + // empty + } + + ~BlobIOSystem() override { + for (BlobEntry &blobby : blobs) { delete blobby.second; } } public: - // ------------------------------------------------------------------- - const char* GetMagicFileName() const - { - return AI_BLOBIO_MAGIC; + const char *GetMagicFileName() const { + return baseName.c_str(); } - // ------------------------------------------------------------------- - aiExportDataBlob* GetBlobChain() - { + aiExportDataBlob *GetBlobChain() { + const auto magicName = std::string(this->GetMagicFileName()); + const bool hasBaseName = baseName != AI_BLOBIO_MAGIC; + // one must be the master - aiExportDataBlob* master = NULL, *cur; - for(const BlobEntry& blobby : blobs) { - if (blobby.first == AI_BLOBIO_MAGIC) { + aiExportDataBlob *master = nullptr, *cur; + + for (const BlobEntry &blobby : blobs) { + if (blobby.first == magicName) { master = blobby.second; + master->name.Set(hasBaseName ? blobby.first : ""); break; } } + if (!master) { ASSIMP_LOG_ERROR("BlobIOSystem: no data written or master file was not closed properly."); - return NULL; + return nullptr; } - master->name.Set(""); - cur = master; - for(const BlobEntry& blobby : blobs) { + + for (const BlobEntry &blobby : blobs) { if (blobby.second == master) { continue; } @@ -266,9 +255,13 @@ public: cur->next = blobby.second; cur = cur->next; - // extract the file extension from the file written - const std::string::size_type s = blobby.first.find_first_of('.'); - cur->name.Set(s == std::string::npos ? blobby.first : blobby.first.substr(s+1)); + if (hasBaseName) { + cur->name.Set(blobby.first); + } else { + // extract the file extension from the file written + const std::string::size_type s = blobby.first.find_first_of('.'); + cur->name.Set(s == std::string::npos ? blobby.first : blobby.first.substr(s + 1)); + } } // give up blob ownership @@ -277,62 +270,54 @@ public: } public: - // ------------------------------------------------------------------- - virtual bool Exists( const char* pFile) const { + bool Exists(const char *pFile) const override { return created.find(std::string(pFile)) != created.end(); } - // ------------------------------------------------------------------- - virtual char getOsSeparator() const { + char getOsSeparator() const override { return '/'; } - // ------------------------------------------------------------------- - virtual IOStream* Open(const char* pFile, - const char* pMode) - { + IOStream *Open(const char *pFile, const char *pMode) override { if (pMode[0] != 'w') { - return NULL; + return nullptr; } created.insert(std::string(pFile)); - return new BlobIOStream(this,std::string(pFile)); + return new BlobIOStream(this, std::string(pFile)); } // ------------------------------------------------------------------- - virtual void Close( IOStream* pFile) - { + void Close(IOStream *pFile) override { delete pFile; } private: - // ------------------------------------------------------------------- - void OnDestruct(const std::string& filename, BlobIOStream* child) - { + void OnDestruct(const std::string &filename, BlobIOStream *child) { // we don't know in which the files are closed, so we // can't reliably say that the first must be the master // file ... - blobs.push_back( BlobEntry(filename,child->GetBlob()) ); + blobs.emplace_back(filename, child->GetBlob()); } private: + std::string baseName; std::set created; - std::vector< BlobEntry > blobs; + std::vector blobs; }; - // -------------------------------------------------------------------------------------------- -BlobIOStream :: ~BlobIOStream() -{ - creator->OnDestruct(file,this); +BlobIOStream::~BlobIOStream() { + if (nullptr != creator) { + creator->OnDestruct(file, this); + } delete[] buffer; } - -} // end Assimp +} // namespace Assimp #endif diff --git a/Source/ThirdParty/assimp/ByteSwapper.h b/Source/ThirdParty/assimp/ByteSwapper.h index 20a2463fb..73c115b8a 100644 --- a/Source/ThirdParty/assimp/ByteSwapper.h +++ b/Source/ThirdParty/assimp/ByteSwapper.h @@ -2,8 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2019, assimp team - +Copyright (c) 2006-2024, assimp team All rights reserved. @@ -40,17 +39,22 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ---------------------------------------------------------------------- */ -/** @file Helper class tp perform various byte oder swappings +/** @file Helper class tp perform various byte order swappings (e.g. little to big endian) */ +#pragma once #ifndef AI_BYTESWAPPER_H_INC #define AI_BYTESWAPPER_H_INC +#ifdef __GNUC__ +# pragma GCC system_header +#endif + #include #include -#include +#include #if _MSC_VER >= 1400 -#include +#include #endif namespace Assimp { @@ -61,10 +65,10 @@ namespace Assimp { * and vice versa. Direct use of this class is DEPRECATED. Use #StreamReader instead. */ // -------------------------------------------------------------------------------------- class ByteSwap { - ByteSwap() AI_NO_EXCEPT {} + ByteSwap() AI_NO_EXCEPT = default; + ~ByteSwap() = default; public: - // ---------------------------------------------------------------------- /** Swap two bytes of data * @param[inout] _szOut A void* to save the reintcasts for the caller. */ @@ -84,8 +88,7 @@ public: // ---------------------------------------------------------------------- /** Swap four bytes of data * @param[inout] _szOut A void* to save the reintcasts for the caller. */ - static inline void Swap4(void* _szOut) - { + static inline void Swap4(void* _szOut) { ai_assert(_szOut); #if _MSC_VER >= 1400 @@ -206,7 +209,7 @@ template struct ByteSwap::_swapper { // -------------------------------------------------------------------------------------- #if (defined AI_BUILD_BIG_ENDIAN) # define AI_LE(t) (t) -# define AI_BE(t) ByteSwap::Swapped(t) +# define AI_BE(t) Assimp::ByteSwap::Swapped(t) # define AI_LSWAP2(p) # define AI_LSWAP4(p) # define AI_LSWAP8(p) @@ -214,16 +217,16 @@ template struct ByteSwap::_swapper { # define AI_LSWAP4P(p) # define AI_LSWAP8P(p) # define LE_NCONST const -# define AI_SWAP2(p) ByteSwap::Swap2(&(p)) -# define AI_SWAP4(p) ByteSwap::Swap4(&(p)) -# define AI_SWAP8(p) ByteSwap::Swap8(&(p)) -# define AI_SWAP2P(p) ByteSwap::Swap2((p)) -# define AI_SWAP4P(p) ByteSwap::Swap4((p)) -# define AI_SWAP8P(p) ByteSwap::Swap8((p)) +# define AI_SWAP2(p) Assimp::ByteSwap::Swap2(&(p)) +# define AI_SWAP4(p) Assimp::ByteSwap::Swap4(&(p)) +# define AI_SWAP8(p) Assimp::ByteSwap::Swap8(&(p)) +# define AI_SWAP2P(p) Assimp::ByteSwap::Swap2((p)) +# define AI_SWAP4P(p) Assimp::ByteSwap::Swap4((p)) +# define AI_SWAP8P(p) Assimp::ByteSwap::Swap8((p)) # define BE_NCONST #else # define AI_BE(t) (t) -# define AI_LE(t) ByteSwap::Swapped(t) +# define AI_LE(t) Assimp::ByteSwap::Swapped(t) # define AI_SWAP2(p) # define AI_SWAP4(p) # define AI_SWAP8(p) @@ -231,12 +234,12 @@ template struct ByteSwap::_swapper { # define AI_SWAP4P(p) # define AI_SWAP8P(p) # define BE_NCONST const -# define AI_LSWAP2(p) ByteSwap::Swap2(&(p)) -# define AI_LSWAP4(p) ByteSwap::Swap4(&(p)) -# define AI_LSWAP8(p) ByteSwap::Swap8(&(p)) -# define AI_LSWAP2P(p) ByteSwap::Swap2((p)) -# define AI_LSWAP4P(p) ByteSwap::Swap4((p)) -# define AI_LSWAP8P(p) ByteSwap::Swap8((p)) +# define AI_LSWAP2(p) Assimp::ByteSwap::Swap2(&(p)) +# define AI_LSWAP4(p) Assimp::ByteSwap::Swap4(&(p)) +# define AI_LSWAP8(p) Assimp::ByteSwap::Swap8(&(p)) +# define AI_LSWAP2P(p) Assimp::ByteSwap::Swap2((p)) +# define AI_LSWAP4P(p) Assimp::ByteSwap::Swap4((p)) +# define AI_LSWAP8P(p) Assimp::ByteSwap::Swap8((p)) # define LE_NCONST #endif @@ -258,7 +261,7 @@ struct ByteSwapper { }; // -------------------------------------------------------------------------------------------- -template +template struct Getter { void operator() (T* inout, bool le) { #ifdef AI_BUILD_BIG_ENDIAN @@ -273,12 +276,12 @@ struct Getter { } }; -template -struct Getter { +template +struct Getter { void operator() (T* inout, bool /*le*/) { // static branch - ByteSwapper1)> () (inout); + ByteSwapper1)> () (inout); } }; } // end Intern diff --git a/Source/ThirdParty/assimp/Defines.h b/Source/ThirdParty/assimp/ColladaMetaData.h similarity index 83% rename from Source/ThirdParty/assimp/Defines.h rename to Source/ThirdParty/assimp/ColladaMetaData.h index 15e1d83c2..9973d16a5 100644 --- a/Source/ThirdParty/assimp/Defines.h +++ b/Source/ThirdParty/assimp/ColladaMetaData.h @@ -2,7 +2,8 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2012, assimp team +Copyright (c) 2006-2024, assimp team + All rights reserved. Redistribution and use of this software in source and binary forms, @@ -38,12 +39,18 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ---------------------------------------------------------------------- */ -// We need those constants, workaround for any platforms where nobody defined them yet -#if (!defined SIZE_MAX) -# define SIZE_MAX (~((size_t)0)) +/** @file ColladaMetaData.h + * Declares common metadata constants used by Collada files + */ +#pragma once +#ifndef AI_COLLADAMETADATA_H_INC +#define AI_COLLADAMETADATA_H_INC + +#ifdef __GNUC__ +#pragma GCC system_header #endif -#if (!defined UINT_MAX) -# define UINT_MAX (~((unsigned int)0)) -#endif +#define AI_METADATA_COLLADA_ID "Collada_id" +#define AI_METADATA_COLLADA_SID "Collada_sid" +#endif diff --git a/Source/ThirdParty/assimp/Compiler/poppack1.h b/Source/ThirdParty/assimp/Compiler/poppack1.h index e033bc147..ff501bc0c 100644 --- a/Source/ThirdParty/assimp/Compiler/poppack1.h +++ b/Source/ThirdParty/assimp/Compiler/poppack1.h @@ -1,7 +1,7 @@ // =============================================================================== -// May be included multiple times - resets structure packing to the defaults -// for all supported compilers. Reverts the changes made by #include +// May be included multiple times - resets structure packing to the defaults +// for all supported compilers. Reverts the changes made by #include // // Currently this works on the following compilers: // MSVC 7,8,9 @@ -14,7 +14,7 @@ #endif // reset packing to the original value -#if defined(_MSC_VER) || defined(__BORLANDC__) || defined (__BCPLUSPLUS__) +#if (defined(_MSC_VER) && !defined(__clang__)) || defined(__BORLANDC__) || defined (__BCPLUSPLUS__) # pragma pack( pop ) #endif #undef PACK_STRUCT diff --git a/Source/ThirdParty/assimp/Compiler/pushpack1.h b/Source/ThirdParty/assimp/Compiler/pushpack1.h index 4c9fbb857..b32ed172c 100644 --- a/Source/ThirdParty/assimp/Compiler/pushpack1.h +++ b/Source/ThirdParty/assimp/Compiler/pushpack1.h @@ -1,7 +1,7 @@ // =============================================================================== -// May be included multiple times - sets structure packing to 1 +// May be included multiple times - sets structure packing to 1 // for all supported compilers. #include reverts the changes. // // Currently this works on the following compilers: @@ -22,7 +22,7 @@ # error poppack1.h must be included after pushpack1.h #endif -#if defined(_MSC_VER) || defined(__BORLANDC__) || defined (__BCPLUSPLUS__) +#if (defined(_MSC_VER) && !defined(__clang__)) || defined(__BORLANDC__) || defined (__BCPLUSPLUS__) # pragma pack(push,1) # define PACK_STRUCT #elif defined( __GNUC__ ) || defined(__clang__) @@ -37,7 +37,7 @@ #if defined(_MSC_VER) // C4103: Packing was changed after the inclusion of the header, probably missing #pragma pop -# pragma warning (disable : 4103) +# pragma warning (disable : 4103) #endif #define AI_PUSHPACK_IS_DEFINED diff --git a/Source/ThirdParty/assimp/CreateAnimMesh.h b/Source/ThirdParty/assimp/CreateAnimMesh.h index a60173588..6e14ac747 100644 --- a/Source/ThirdParty/assimp/CreateAnimMesh.h +++ b/Source/ThirdParty/assimp/CreateAnimMesh.h @@ -2,8 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2019, assimp team - +Copyright (c) 2006-2024, assimp team All rights reserved. @@ -43,16 +42,36 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /** @file CreateAnimMesh.h * Create AnimMesh from Mesh */ +#pragma once #ifndef INCLUDED_AI_CREATE_ANIM_MESH_H #define INCLUDED_AI_CREATE_ANIM_MESH_H +#ifdef __GNUC__ +# pragma GCC system_header +#endif + #include -namespace Assimp { +namespace Assimp { -/** Create aiAnimMesh from aiMesh. */ -ASSIMP_API aiAnimMesh *aiCreateAnimMesh(const aiMesh *mesh); +/** + * Create aiAnimMesh from aiMesh. + * @param mesh The input mesh to create an animated mesh from. + * @param needPositions If true, positions will be copied from. + * @param needNormals If true, normals will be copied from. + * @param needTangents If true, tangents and bitangents will be copied from. + * @param needColors If true, colors will be copied from. + * @param needTexCoords If true, texCoords will be copied from. + * @return The new created animated mesh. + */ +ASSIMP_API aiAnimMesh *aiCreateAnimMesh(const aiMesh *mesh, + bool needPositions = true, + bool needNormals = true, + bool needTangents = true, + bool needColors = true, + bool needTexCoords = true); } // end of namespace Assimp + #endif // INCLUDED_AI_CREATE_ANIM_MESH_H diff --git a/Source/ThirdParty/assimp/DefaultIOStream.h b/Source/ThirdParty/assimp/DefaultIOStream.h index 994d728ff..c39d9a8e1 100644 --- a/Source/ThirdParty/assimp/DefaultIOStream.h +++ b/Source/ThirdParty/assimp/DefaultIOStream.h @@ -2,8 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2019, assimp team - +Copyright (c) 2006-2024, assimp team All rights reserved. @@ -40,16 +39,23 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ---------------------------------------------------------------------- */ -/** @file Default file I/O using fXXX()-family of functions */ +/** + * @file + * @brief Default file I/O using fXXX()-family of functions + */ +#pragma once #ifndef AI_DEFAULTIOSTREAM_H_INC #define AI_DEFAULTIOSTREAM_H_INC -#include +#ifdef __GNUC__ +# pragma GCC system_header +#endif + +#include #include #include -#include -namespace Assimp { +namespace Assimp { // ---------------------------------------------------------------------------------- //! @class DefaultIOStream @@ -57,8 +63,7 @@ namespace Assimp { //! @note An instance of this class can exist without a valid file handle //! attached to it. All calls fail, but the instance can nevertheless be //! used with no restrictions. -class ASSIMP_API DefaultIOStream : public IOStream -{ +class ASSIMP_API DefaultIOStream : public IOStream { friend class DefaultIOSystem; #if __ANDROID__ # if __ANDROID_API__ > 9 @@ -69,72 +74,66 @@ class ASSIMP_API DefaultIOStream : public IOStream #endif // __ANDROID__ protected: + /// @brief DefaultIOStream() AI_NO_EXCEPT; + + /// @brief The class constructor with the file name and the stream. + /// @param pFile The file-streaam + /// @param strFilename The file name DefaultIOStream(FILE* pFile, const std::string &strFilename); public: /** Destructor public to allow simple deletion to close the file. */ - ~DefaultIOStream (); + ~DefaultIOStream () override; // ------------------------------------------------------------------- /// Read from stream - size_t Read(void* pvBuffer, - size_t pSize, - size_t pCount); - + size_t Read(void* pvBuffer, size_t pSize, size_t pCount) override; // ------------------------------------------------------------------- /// Write to stream - size_t Write(const void* pvBuffer, - size_t pSize, - size_t pCount); + size_t Write(const void* pvBuffer, size_t pSize, size_t pCount) override; // ------------------------------------------------------------------- /// Seek specific position - aiReturn Seek(size_t pOffset, - aiOrigin pOrigin); + aiReturn Seek(size_t pOffset, aiOrigin pOrigin) override; // ------------------------------------------------------------------- /// Get current seek position - size_t Tell() const; + size_t Tell() const override; // ------------------------------------------------------------------- /// Get size of file - size_t FileSize() const; + size_t FileSize() const override; // ------------------------------------------------------------------- /// Flush file contents - void Flush(); + void Flush() override; private: - // File data-structure, using clib FILE* mFile; - // Filename std::string mFilename; - // Cached file size mutable size_t mCachedSize; }; // ---------------------------------------------------------------------------------- -inline -DefaultIOStream::DefaultIOStream() AI_NO_EXCEPT -: mFile(nullptr) -, mFilename("") -, mCachedSize(SIZE_MAX) { +AI_FORCE_INLINE DefaultIOStream::DefaultIOStream() AI_NO_EXCEPT : + mFile(nullptr), + mFilename(), + mCachedSize(SIZE_MAX) { // empty } // ---------------------------------------------------------------------------------- -inline -DefaultIOStream::DefaultIOStream (FILE* pFile, const std::string &strFilename) -: mFile(pFile) -, mFilename(strFilename) -, mCachedSize(SIZE_MAX) { +AI_FORCE_INLINE DefaultIOStream::DefaultIOStream (FILE* pFile, const std::string &strFilename) : + mFile(pFile), + mFilename(strFilename), + mCachedSize(SIZE_MAX) { // empty } + // ---------------------------------------------------------------------------------- } // ns assimp #endif //!!AI_DEFAULTIOSTREAM_H_INC - diff --git a/Source/ThirdParty/assimp/DefaultIOSystem.h b/Source/ThirdParty/assimp/DefaultIOSystem.h index 2dd5c801b..0aeef9eb8 100644 --- a/Source/ThirdParty/assimp/DefaultIOSystem.h +++ b/Source/ThirdParty/assimp/DefaultIOSystem.h @@ -2,8 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2019, assimp team - +Copyright (c) 2006-2024, assimp team All rights reserved. @@ -40,10 +39,17 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ---------------------------------------------------------------------- */ -/** @file Default implementation of IOSystem using the standard C file functions */ +/** + * @file Default implementation of IOSystem using the standard C file functions + */ +#pragma once #ifndef AI_DEFAULTIOSYSTEM_H_INC #define AI_DEFAULTIOSYSTEM_H_INC +#ifdef __GNUC__ +# pragma GCC system_header +#endif + #include namespace Assimp { @@ -54,23 +60,23 @@ class ASSIMP_API DefaultIOSystem : public IOSystem { public: // ------------------------------------------------------------------- /** Tests for the existence of a file at the given path. */ - bool Exists( const char* pFile) const; + bool Exists( const char* pFile) const override; // ------------------------------------------------------------------- /** Returns the directory separator. */ - char getOsSeparator() const; + char getOsSeparator() const override; // ------------------------------------------------------------------- /** Open a new file with a given path. */ - IOStream* Open( const char* pFile, const char* pMode = "rb"); + IOStream* Open( const char* pFile, const char* pMode = "rb") override; // ------------------------------------------------------------------- /** Closes the given file and releases all resources associated with it. */ - void Close( IOStream* pFile); + void Close( IOStream* pFile) override; // ------------------------------------------------------------------- /** Compare two paths */ - bool ComparePaths (const char* one, const char* second) const; + bool ComparePaths (const char* one, const char* second) const override; /** @brief get the file name of a full filepath * example: /tmp/archive.tar.gz -> archive.tar.gz diff --git a/Source/ThirdParty/assimp/DefaultLogger.hpp b/Source/ThirdParty/assimp/DefaultLogger.hpp index 1946e250a..b43eebb70 100644 --- a/Source/ThirdParty/assimp/DefaultLogger.hpp +++ b/Source/ThirdParty/assimp/DefaultLogger.hpp @@ -2,8 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2019, assimp team - +Copyright (c) 2006-2024, assimp team All rights reserved. @@ -39,23 +38,30 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ---------------------------------------------------------------------- */ -/** @file DefaultLogger.hpp -*/ +/** + * @file DefaultLogger.hpp + */ + +#pragma once #ifndef INCLUDED_AI_DEFAULTLOGGER #define INCLUDED_AI_DEFAULTLOGGER -#include "Logger.hpp" +#ifdef __GNUC__ +# pragma GCC system_header +#endif + #include "LogStream.hpp" +#include "Logger.hpp" #include "NullLogger.hpp" #include -namespace Assimp { +namespace Assimp { // ------------------------------------------------------------------------------------ class IOStream; struct LogStreamInfo; -/** default name of logfile */ +/** default name of log-file */ #define ASSIMP_DEFAULT_LOG_NAME "AssimpLog.txt" // ------------------------------------------------------------------------------------ @@ -71,27 +77,24 @@ struct LogStreamInfo; * If you wish to customize the logging at an even deeper level supply your own * implementation of #Logger to #set(). * @note The whole logging stuff causes a small extra overhead for all imports. */ -class ASSIMP_API DefaultLogger : - public Logger { - +class ASSIMP_API DefaultLogger : public Logger { public: - // ---------------------------------------------------------------------- /** @brief Creates a logging instance. * @param name Name for log file. Only valid in combination * with the aiDefaultLogStream_FILE flag. - * @param severity Log severity, VERBOSE turns on debug messages + * @param severity Log severity, DEBUG turns on debug messages and VERBOSE turns on all messages. * @param defStreams Default log streams to be attached. Any bitwise * combination of the aiDefaultLogStream enumerated values. * If #aiDefaultLogStream_FILE is specified but an empty string is * passed for 'name', no log file is created at all. * @param io IOSystem to be used to open external files (such as the - * log file). Pass NULL to rely on the default implementation. + * log file). Pass nullptr to rely on the default implementation. * This replaces the default #NullLogger with a #DefaultLogger instance. */ - static Logger *create(const char* name = ASSIMP_DEFAULT_LOG_NAME, - LogSeverity severity = NORMAL, - unsigned int defStreams = aiDefaultLogStream_DEBUGGER | aiDefaultLogStream_FILE, - IOSystem* io = NULL); + static Logger *create(const char *name = ASSIMP_DEFAULT_LOG_NAME, + LogSeverity severity = NORMAL, + unsigned int defStreams = aiDefaultLogStream_DEBUGGER | aiDefaultLogStream_FILE, + IOSystem *io = nullptr); // ---------------------------------------------------------------------- /** @brief Setup a custom #Logger implementation. @@ -101,7 +104,7 @@ public: * it's much easier to use #create() and to attach your own custom * output streams to it. * @param logger Pass NULL to setup a default NullLogger*/ - static void set (Logger *logger); + static void set(Logger *logger); // ---------------------------------------------------------------------- /** @brief Getter for singleton instance @@ -123,13 +126,11 @@ public: // ---------------------------------------------------------------------- /** @copydoc Logger::attachStream */ - bool attachStream(LogStream *pStream, - unsigned int severity); + bool attachStream(LogStream *pStream, unsigned int severity) override; // ---------------------------------------------------------------------- - /** @copydoc Logger::detatchStream */ - bool detatchStream(LogStream *pStream, - unsigned int severity); + /** @copydoc Logger::detachStream */ + bool detachStream(LogStream *pStream, unsigned int severity) override; private: // ---------------------------------------------------------------------- @@ -139,23 +140,26 @@ private: // ---------------------------------------------------------------------- /** @briefDestructor */ - ~DefaultLogger(); + ~DefaultLogger() override; + + /** @brief Logs debug infos, only been written when severity level DEBUG or higher is set */ + void OnDebug(const char *message) override; /** @brief Logs debug infos, only been written when severity level VERBOSE is set */ - void OnDebug(const char* message); + void OnVerboseDebug(const char *message) override; /** @brief Logs an info message */ - void OnInfo(const char* message); + void OnInfo(const char *message) override; /** @brief Logs a warning message */ - void OnWarn(const char* message); + void OnWarn(const char *message) override; /** @brief Logs an error message */ - void OnError(const char* message); + void OnError(const char *message) override; // ---------------------------------------------------------------------- /** @brief Writes a message to all streams */ - void WriteToStreams(const char* message, ErrorSeverity ErrorSev ); + void WriteToStreams(const char *message, ErrorSeverity ErrorSev); // ---------------------------------------------------------------------- /** @brief Returns the thread id. @@ -166,9 +170,9 @@ private: private: // Aliases for stream container - typedef std::vector StreamArray; - typedef std::vector::iterator StreamIt; - typedef std::vector::const_iterator ConstStreamIt; + using StreamArray = std::vector; + using StreamIt = std::vector::iterator; + using ConstStreamIt = std::vector::const_iterator; //! only logging instance static Logger *m_pLogger; @@ -178,9 +182,10 @@ private: StreamArray m_StreamArray; bool noRepeatMsg; - char lastMsg[MAX_LOG_MESSAGE_LENGTH*2]; + char lastMsg[MAX_LOG_MESSAGE_LENGTH * 2]; size_t lastLen; }; + // ------------------------------------------------------------------------------------ } // Namespace Assimp diff --git a/Source/ThirdParty/assimp/Exceptional.h b/Source/ThirdParty/assimp/Exceptional.h index 5109b8f07..b4b51863f 100644 --- a/Source/ThirdParty/assimp/Exceptional.h +++ b/Source/ThirdParty/assimp/Exceptional.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2008, assimp team +Copyright (c) 2006-2024, assimp team All rights reserved. Redistribution and use of this software in source and binary forms, @@ -38,67 +38,109 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ---------------------------------------------------------------------- */ -#ifndef INCLUDED_EXCEPTIONAL_H -#define INCLUDED_EXCEPTIONAL_H +#pragma once +#ifndef AI_INCLUDED_EXCEPTIONAL_H +#define AI_INCLUDED_EXCEPTIONAL_H + +#ifdef __GNUC__ +#pragma GCC system_header +#endif -#include #include +#include +#include + using std::runtime_error; #ifdef _MSC_VER -# pragma warning(disable : 4275) +#pragma warning(disable : 4275) #endif +// --------------------------------------------------------------------------- +/** + * The base-class for all other exceptions + */ +class ASSIMP_API DeadlyErrorBase : public runtime_error { +protected: + /// @brief The class constructor with the formatter. + /// @param f The formatter. + DeadlyErrorBase(Assimp::Formatter::format f); + + /// @brief The class constructor with the parameter ellipse. + /// @tparam ...T The type for the ellipse + /// @tparam U The other type + /// @param f The formatter + /// @param u One parameter + /// @param ...args The rest + template + DeadlyErrorBase(Assimp::Formatter::format f, U&& u, T&&... args) : + DeadlyErrorBase(std::move(f << std::forward(u)), std::forward(args)...) {} +}; + // --------------------------------------------------------------------------- /** FOR IMPORTER PLUGINS ONLY: Simple exception class to be thrown if an * unrecoverable error occurs while importing. Loading APIs return - * NULL instead of a valid aiScene then. */ -class DeadlyImportError - : public runtime_error -{ + * nullptr instead of a valid aiScene then. */ +class ASSIMP_API DeadlyImportError : public DeadlyErrorBase { public: - /** Constructor with arguments */ - explicit DeadlyImportError( const std::string& errorText) - : runtime_error(errorText) - { + /// @brief The class constructor with the message. + /// @param message The message + DeadlyImportError(const char *message) : + DeadlyErrorBase(Assimp::Formatter::format(), std::forward(message)) { + // empty } -private: + /// @brief The class constructor with the parameter ellipse. + /// @tparam ...T The type for the ellipse + /// @param ...args The args + template + explicit DeadlyImportError(T&&... args) : + DeadlyErrorBase(Assimp::Formatter::format(), std::forward(args)...) { + // empty + } }; -typedef DeadlyImportError DeadlyExportError; +// --------------------------------------------------------------------------- +/** FOR EXPORTER PLUGINS ONLY: Simple exception class to be thrown if an + * unrecoverable error occurs while exporting. Exporting APIs return + * nullptr instead of a valid aiScene then. */ +class ASSIMP_API DeadlyExportError : public DeadlyErrorBase { +public: + /** Constructor with arguments */ + template + explicit DeadlyExportError(T&&... args) : + DeadlyErrorBase(Assimp::Formatter::format(), std::forward(args)...) {} +}; #ifdef _MSC_VER -# pragma warning(default : 4275) +#pragma warning(default : 4275) #endif // --------------------------------------------------------------------------- template -struct ExceptionSwallower { - T operator ()() const { +struct ExceptionSwallower { + T operator()() const { return T(); } }; // --------------------------------------------------------------------------- template -struct ExceptionSwallower { - T* operator ()() const { - return NULL; +struct ExceptionSwallower { + T *operator()() const { + return nullptr; } }; // --------------------------------------------------------------------------- template <> struct ExceptionSwallower { - aiReturn operator ()() const { + aiReturn operator()() const { try { throw; - } - catch (std::bad_alloc&) { + } catch (std::bad_alloc &) { return aiReturn_OUTOFMEMORY; - } - catch (...) { + } catch (...) { return aiReturn_FAILURE; } } @@ -107,19 +149,34 @@ struct ExceptionSwallower { // --------------------------------------------------------------------------- template <> struct ExceptionSwallower { - void operator ()() const { + void operator()() const { return; } }; -#define ASSIMP_BEGIN_EXCEPTION_REGION()\ -{\ - try { +#define ASSIMP_BEGIN_EXCEPTION_REGION() \ + { \ + try { -#define ASSIMP_END_EXCEPTION_REGION(type)\ - } catch(...) {\ - return ExceptionSwallower()();\ - }\ +#define ASSIMP_END_EXCEPTION_REGION_WITH_ERROR_STRING(type, ASSIMP_END_EXCEPTION_REGION_errorString, ASSIMP_END_EXCEPTION_REGION_exception) \ + } \ + catch (const DeadlyImportError &e) { \ + ASSIMP_END_EXCEPTION_REGION_errorString = e.what(); \ + ASSIMP_END_EXCEPTION_REGION_exception = std::current_exception(); \ + return ExceptionSwallower()(); \ + } \ + catch (...) { \ + ASSIMP_END_EXCEPTION_REGION_errorString = "Unknown exception"; \ + ASSIMP_END_EXCEPTION_REGION_exception = std::current_exception(); \ + return ExceptionSwallower()(); \ + } \ } -#endif // INCLUDED_EXCEPTIONAL_H +#define ASSIMP_END_EXCEPTION_REGION(type) \ + } \ + catch (...) { \ + return ExceptionSwallower()(); \ + } \ + } + +#endif // AI_INCLUDED_EXCEPTIONAL_H diff --git a/Source/ThirdParty/assimp/Exporter.hpp b/Source/ThirdParty/assimp/Exporter.hpp index ea0303e80..bdec20b97 100644 --- a/Source/ThirdParty/assimp/Exporter.hpp +++ b/Source/ThirdParty/assimp/Exporter.hpp @@ -3,9 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2019, assimp team - - +Copyright (c) 2006-2024, assimp team All rights reserved. @@ -48,13 +46,18 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef AI_EXPORT_HPP_INC #define AI_EXPORT_HPP_INC +#ifdef __GNUC__ +#pragma GCC system_header +#endif + #ifndef ASSIMP_BUILD_NO_EXPORT #include "cexport.h" #include +#include namespace Assimp { - + class ExporterPimpl; class IOSystem; class ProgressHandler; @@ -82,7 +85,7 @@ class ASSIMP_API ExportProperties; class ASSIMP_API Exporter { public: /** Function pointer type of a Export worker function */ - typedef void (*fpExportFunc)(const char*, IOSystem*, const aiScene*, const ExportProperties*); + typedef void (*fpExportFunc)(const char *, IOSystem *, const aiScene *, const ExportProperties *); /** Internal description of an Assimp export format option */ struct ExportFormatEntry { @@ -96,8 +99,7 @@ public: unsigned int mEnforcePP; // Constructor to fill all entries - ExportFormatEntry( const char* pId, const char* pDesc, const char* pExtension, fpExportFunc pFunction, unsigned int pEnforcePP = 0u) - { + ExportFormatEntry(const char *pId, const char *pDesc, const char *pExtension, fpExportFunc pFunction, unsigned int pEnforcePP = 0u) { mDescription.id = pId; mDescription.description = pDesc; mDescription.fileExtension = pExtension; @@ -106,12 +108,11 @@ public: } ExportFormatEntry() : - mExportFunction() - , mEnforcePP() - { - mDescription.id = NULL; - mDescription.description = NULL; - mDescription.fileExtension = NULL; + mExportFunction(), + mEnforcePP() { + mDescription.id = nullptr; + mDescription.description = nullptr; + mDescription.fileExtension = nullptr; } }; @@ -140,7 +141,7 @@ public: * * @param pIOHandler The IO handler to be used in all file accesses * of the Importer. */ - void SetIOHandler( IOSystem* pIOHandler); + void SetIOHandler(IOSystem *pIOHandler); // ------------------------------------------------------------------- /** Retrieves the IO handler that is currently set. @@ -149,7 +150,7 @@ public: * handler is active as long the application doesn't supply its own * custom IO handler via #SetIOHandler(). * @return A valid IOSystem interface, never NULL. */ - IOSystem* GetIOHandler() const; + IOSystem *GetIOHandler() const; // ------------------------------------------------------------------- /** Checks whether a default IO handler is active @@ -169,7 +170,7 @@ public: * disable progress reporting. * @note Progress handlers can be used to abort the loading * at almost any time.*/ - void SetProgressHandler(ProgressHandler* pHandler); + void SetProgressHandler(ProgressHandler *pHandler); // ------------------------------------------------------------------- /** Exports the given scene to a chosen file format. Returns the exported @@ -183,22 +184,22 @@ public: * #GetExportFormatCount / #GetExportFormatDescription to learn which * export formats are available. * @param pPreprocessing See the documentation for #Export - * @return the exported data or NULL in case of error. + * @return the exported data or nullptr in case of error. * @note If the Exporter instance did already hold a blob from * a previous call to #ExportToBlob, it will be disposed. * Any IO handlers set via #SetIOHandler are ignored here. * @note Use aiCopyScene() to get a modifiable copy of a previously * imported scene. */ - const aiExportDataBlob* ExportToBlob(const aiScene* pScene, const char* pFormatId, - unsigned int pPreprocessing = 0u, const ExportProperties* pProperties = nullptr); - const aiExportDataBlob* ExportToBlob( const aiScene* pScene, const std::string& pFormatId, - unsigned int pPreprocessing = 0u, const ExportProperties* pProperties = nullptr); + const aiExportDataBlob *ExportToBlob(const aiScene *pScene, const char *pFormatId, + unsigned int pPreprocessing = 0u, const ExportProperties *pProperties = nullptr); + const aiExportDataBlob *ExportToBlob(const aiScene *pScene, const std::string &pFormatId, + unsigned int pPreprocessing = 0u, const ExportProperties *pProperties = nullptr); // ------------------------------------------------------------------- /** Convenience function to export directly to a file. Use * #SetIOSystem to supply a custom IOSystem to gain fine-grained control * about the output data flow of the export process. - * @param pBlob A data blob obtained from a previous call to #aiExportScene. Must not be NULL. + * @param pBlob A data blob obtained from a previous call to #aiExportScene. Must not be nullptr. * @param pPath Full target file name. Target must be accessible. * @param pPreprocessing Accepts any choice of the #aiPostProcessSteps enumerated * flags, but in reality only a subset of them makes sense here. Specifying @@ -227,10 +228,10 @@ public: * @return AI_SUCCESS if everything was fine. * @note Use aiCopyScene() to get a modifiable copy of a previously * imported scene.*/ - aiReturn Export( const aiScene* pScene, const char* pFormatId, const char* pPath, - unsigned int pPreprocessing = 0u, const ExportProperties* pProperties = nullptr); - aiReturn Export( const aiScene* pScene, const std::string& pFormatId, const std::string& pPath, - unsigned int pPreprocessing = 0u, const ExportProperties* pProperties = nullptr); + aiReturn Export(const aiScene *pScene, const char *pFormatId, const char *pPath, + unsigned int pPreprocessing = 0u, const ExportProperties *pProperties = nullptr); + aiReturn Export(const aiScene *pScene, const std::string &pFormatId, const std::string &pPath, + unsigned int pPreprocessing = 0u, const ExportProperties *pProperties = nullptr); // ------------------------------------------------------------------- /** Returns an error description of an error that occurred in #Export @@ -238,21 +239,21 @@ public: * * Returns an empty string if no error occurred. * @return A description of the last error, an empty string if no - * error occurred. The string is never NULL. + * error occurred. The string is never nullptr. * * @note The returned function remains valid until one of the * following methods is called: #Export, #ExportToBlob, #FreeBlob */ - const char* GetErrorString() const; + const char *GetErrorString() const; // ------------------------------------------------------------------- /** Return the blob obtained from the last call to #ExportToBlob */ - const aiExportDataBlob* GetBlob() const; + const aiExportDataBlob *GetBlob() const; // ------------------------------------------------------------------- /** Orphan the blob from the last call to #ExportToBlob. This means * the caller takes ownership and is thus responsible for calling * the C API function #aiReleaseExportBlob to release it. */ - const aiExportDataBlob* GetOrphanedBlob() const; + const aiExportDataBlob *GetOrphanedBlob() const; // ------------------------------------------------------------------- /** Frees the current blob. @@ -262,7 +263,7 @@ public: * automatically by the destructor. The only reason to call * it manually would be to reclaim as much storage as possible * without giving up the #Exporter instance yet. */ - void FreeBlob( ); + void FreeBlob(); // ------------------------------------------------------------------- /** Returns the number of export file formats available in the current @@ -288,7 +289,7 @@ public: * for. Valid range is 0 to #Exporter::GetExportFormatCount * @return A description of that specific export format. * NULL if pIndex is out of range. */ - const aiExportFormatDesc* GetExportFormatDescription( size_t pIndex ) const; + const aiExportFormatDesc *GetExportFormatDescription(size_t pIndex) const; // ------------------------------------------------------------------- /** Register a custom exporter. Custom export formats are limited to @@ -301,7 +302,7 @@ public: * registered. A common cause that would prevent an exporter * from being registered is that its format id is already * occupied by another format. */ - aiReturn RegisterExporter(const ExportFormatEntry& desc); + aiReturn RegisterExporter(const ExportFormatEntry &desc); // ------------------------------------------------------------------- /** Remove an export format previously registered with #RegisterExporter @@ -312,11 +313,11 @@ public: * 'id' field of #aiExportFormatDesc. * @note Calling this method on a format description not yet registered * has no effect.*/ - void UnregisterExporter(const char* id); + void UnregisterExporter(const char *id); protected: // Just because we don't want you to know how we're hacking around. - ExporterPimpl* pimpl; + ExporterPimpl *pimpl; }; class ASSIMP_API ExportProperties { @@ -330,6 +331,7 @@ public: typedef std::map FloatPropertyMap; typedef std::map StringPropertyMap; typedef std::map MatrixPropertyMap; + typedef std::map> CallbackPropertyMap; public: /** Standard constructor @@ -343,7 +345,7 @@ public: * This copies the configuration properties of another ExportProperties. * @see ExportProperties(const ExportProperties& other) */ - ExportProperties(const ExportProperties& other); + ExportProperties(const ExportProperties &other); // ------------------------------------------------------------------- /** Set an integer configuration property. @@ -358,7 +360,7 @@ public: * floating-point property has no effect - the loader will call * GetPropertyFloat() to read the property, but it won't be there. */ - bool SetPropertyInteger(const char* szName, int iValue); + bool SetPropertyInteger(const char *szName, int iValue); // ------------------------------------------------------------------- /** Set a boolean configuration property. Boolean properties @@ -367,27 +369,29 @@ public: * #GetPropertyBool and vice versa. * @see SetPropertyInteger() */ - bool SetPropertyBool(const char* szName, bool value) { - return SetPropertyInteger(szName,value); + bool SetPropertyBool(const char *szName, bool value) { + return SetPropertyInteger(szName, value); } // ------------------------------------------------------------------- /** Set a floating-point configuration property. * @see SetPropertyInteger() */ - bool SetPropertyFloat(const char* szName, ai_real fValue); + bool SetPropertyFloat(const char *szName, ai_real fValue); // ------------------------------------------------------------------- /** Set a string configuration property. * @see SetPropertyInteger() */ - bool SetPropertyString(const char* szName, const std::string& sValue); + bool SetPropertyString(const char *szName, const std::string &sValue); // ------------------------------------------------------------------- /** Set a matrix configuration property. * @see SetPropertyInteger() */ - bool SetPropertyMatrix(const char* szName, const aiMatrix4x4& sValue); + bool SetPropertyMatrix(const char *szName, const aiMatrix4x4 &sValue); + + bool SetPropertyCallback(const char *szName, const std::function &f); // ------------------------------------------------------------------- /** Get a configuration property. @@ -402,8 +406,8 @@ public: * floating-point property has no effect - the loader will call * GetPropertyFloat() to read the property, but it won't be there. */ - int GetPropertyInteger(const char* szName, - int iErrorReturn = 0xffffffff) const; + int GetPropertyInteger(const char *szName, + int iErrorReturn = 0xffffffff) const; // ------------------------------------------------------------------- /** Get a boolean configuration property. Boolean properties @@ -412,16 +416,16 @@ public: * #GetPropertyBool and vice versa. * @see GetPropertyInteger() */ - bool GetPropertyBool(const char* szName, bool bErrorReturn = false) const { - return GetPropertyInteger(szName,bErrorReturn)!=0; + bool GetPropertyBool(const char *szName, bool bErrorReturn = false) const { + return GetPropertyInteger(szName, bErrorReturn) != 0; } // ------------------------------------------------------------------- /** Get a floating-point configuration property * @see GetPropertyInteger() */ - ai_real GetPropertyFloat(const char* szName, - ai_real fErrorReturn = 10e10f) const; + ai_real GetPropertyFloat(const char *szName, + ai_real fErrorReturn = 10e10f) const; // ------------------------------------------------------------------- /** Get a string configuration property @@ -429,8 +433,8 @@ public: * The return value remains valid until the property is modified. * @see GetPropertyInteger() */ - const std::string GetPropertyString(const char* szName, - const std::string& sErrorReturn = "") const; + const std::string GetPropertyString(const char *szName, + const std::string &sErrorReturn = "") const; // ------------------------------------------------------------------- /** Get a matrix configuration property @@ -438,36 +442,38 @@ public: * The return value remains valid until the property is modified. * @see GetPropertyInteger() */ - const aiMatrix4x4 GetPropertyMatrix(const char* szName, - const aiMatrix4x4& sErrorReturn = aiMatrix4x4()) const; + const aiMatrix4x4 GetPropertyMatrix(const char *szName, + const aiMatrix4x4 &sErrorReturn = aiMatrix4x4()) const; + + std::function GetPropertyCallback(const char* szName) const; // ------------------------------------------------------------------- /** Determine a integer configuration property has been set. * @see HasPropertyInteger() */ - bool HasPropertyInteger(const char* szName) const; + bool HasPropertyInteger(const char *szName) const; /** Determine a boolean configuration property has been set. * @see HasPropertyBool() */ - bool HasPropertyBool(const char* szName) const; + bool HasPropertyBool(const char *szName) const; /** Determine a boolean configuration property has been set. * @see HasPropertyFloat() */ - bool HasPropertyFloat(const char* szName) const; + bool HasPropertyFloat(const char *szName) const; /** Determine a String configuration property has been set. * @see HasPropertyString() */ - bool HasPropertyString(const char* szName) const; + bool HasPropertyString(const char *szName) const; /** Determine a Matrix configuration property has been set. * @see HasPropertyMatrix() */ - bool HasPropertyMatrix(const char* szName) const; + bool HasPropertyMatrix(const char *szName) const; -protected: + bool HasPropertyCallback(const char *szName) const; /** List of integer properties */ IntPropertyMap mIntProperties; @@ -480,23 +486,21 @@ protected: /** List of Matrix properties */ MatrixPropertyMap mMatrixProperties; + + CallbackPropertyMap mCallbackProperties; }; // ---------------------------------------------------------------------------------- -inline -const aiExportDataBlob* Exporter::ExportToBlob( const aiScene* pScene, const std::string& pFormatId, - unsigned int pPreprocessing, const ExportProperties* pProperties) -{ - return ExportToBlob(pScene,pFormatId.c_str(),pPreprocessing, pProperties); +inline const aiExportDataBlob *Exporter::ExportToBlob(const aiScene *pScene, const std::string &pFormatId, + unsigned int pPreprocessing, const ExportProperties *pProperties) { + return ExportToBlob(pScene, pFormatId.c_str(), pPreprocessing, pProperties); } // ---------------------------------------------------------------------------------- -inline -aiReturn Exporter :: Export( const aiScene* pScene, const std::string& pFormatId, - const std::string& pPath, unsigned int pPreprocessing, - const ExportProperties* pProperties) -{ - return Export(pScene,pFormatId.c_str(),pPath.c_str(),pPreprocessing, pProperties); +inline aiReturn Exporter ::Export(const aiScene *pScene, const std::string &pFormatId, + const std::string &pPath, unsigned int pPreprocessing, + const ExportProperties *pProperties) { + return Export(pScene, pFormatId.c_str(), pPath.c_str(), pPreprocessing, pProperties); } } // namespace Assimp diff --git a/Source/ThirdParty/assimp/GenericProperty.h b/Source/ThirdParty/assimp/GenericProperty.h index 183ecd519..a35ebf23d 100644 --- a/Source/ThirdParty/assimp/GenericProperty.h +++ b/Source/ThirdParty/assimp/GenericProperty.h @@ -2,8 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2019, assimp team - +Copyright (c) 2006-2024, assimp team All rights reserved. @@ -40,26 +39,30 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ---------------------------------------------------------------------- */ +#pragma once #ifndef AI_GENERIC_PROPERTY_H_INCLUDED #define AI_GENERIC_PROPERTY_H_INCLUDED -#include +#ifdef __GNUC__ +# pragma GCC system_header +#endif + +#include #include -#include "Hash.h" +#include #include // ------------------------------------------------------------------------------------------------ template -inline -bool SetGenericProperty(std::map< unsigned int, T >& list, - const char* szName, const T& value) { +inline bool SetGenericProperty(std::map &list, + const char *szName, const T &value) { ai_assert(nullptr != szName); const uint32_t hash = SuperFastHash(szName); typename std::map::iterator it = list.find(hash); - if (it == list.end()) { - list.insert(std::pair( hash, value )); + if (it == list.end()) { + list.insert(std::pair(hash, value)); return false; } (*it).second = value; @@ -69,9 +72,8 @@ bool SetGenericProperty(std::map< unsigned int, T >& list, // ------------------------------------------------------------------------------------------------ template -inline -const T& GetGenericProperty(const std::map< unsigned int, T >& list, - const char* szName, const T& errorReturn) { +inline const T &GetGenericProperty(const std::map &list, + const char *szName, const T &errorReturn) { ai_assert(nullptr != szName); const uint32_t hash = SuperFastHash(szName); @@ -85,24 +87,23 @@ const T& GetGenericProperty(const std::map< unsigned int, T >& list, // ------------------------------------------------------------------------------------------------ // Special version for pointer types - they will be deleted when replaced with another value -// passing NULL removes the whole property +// passing nullptr removes the whole property template -inline -void SetGenericPropertyPtr(std::map< unsigned int, T* >& list, - const char* szName, T* value, bool* bWasExisting = nullptr ) { +inline void SetGenericPropertyPtr(std::map &list, + const char *szName, T *value, bool *bWasExisting = nullptr) { ai_assert(nullptr != szName); const uint32_t hash = SuperFastHash(szName); - typename std::map::iterator it = list.find(hash); - if (it == list.end()) { + typename std::map::iterator it = list.find(hash); + if (it == list.end()) { if (bWasExisting) { *bWasExisting = false; } - list.insert(std::pair( hash, value )); + list.insert(std::pair(hash, value)); return; } - if ((*it).second != value) { + if ((*it).second != value) { delete (*it).second; (*it).second = value; } @@ -116,9 +117,8 @@ void SetGenericPropertyPtr(std::map< unsigned int, T* >& list, // ------------------------------------------------------------------------------------------------ template -inline -bool HasGenericProperty(const std::map< unsigned int, T >& list, - const char* szName) { +inline bool HasGenericProperty(const std::map &list, + const char *szName) { ai_assert(nullptr != szName); const uint32_t hash = SuperFastHash(szName); diff --git a/Source/ThirdParty/assimp/GltfMaterial.h b/Source/ThirdParty/assimp/GltfMaterial.h new file mode 100644 index 000000000..5e63b9132 --- /dev/null +++ b/Source/ThirdParty/assimp/GltfMaterial.h @@ -0,0 +1,74 @@ +/* +--------------------------------------------------------------------------- +Open Asset Import Library (assimp) +--------------------------------------------------------------------------- + +Copyright (c) 2006-2024, assimp team + +All rights reserved. + +Redistribution and use of this software in source and binary forms, +with or without modification, are permitted provided that the following +conditions are met: + +* Redistributions of source code must retain the above + copyright notice, this list of conditions and the + following disclaimer. + +* Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the + following disclaimer in the documentation and/or other + materials provided with the distribution. + +* Neither the name of the assimp team, nor the names of its + contributors may be used to endorse or promote products + derived from this software without specific prior + written permission of the assimp team. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(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 GltfMaterial.h + * @brief glTF-specific material macros + * These will be made generic at some future date + */ + +#ifndef AI_GLTFMATERIAL_H_INC +#define AI_GLTFMATERIAL_H_INC + +#ifdef __GNUC__ +# pragma GCC system_header +#endif + +#include + +#define AI_MATKEY_GLTF_PBRMETALLICROUGHNESS_METALLICROUGHNESS_TEXTURE aiTextureType_UNKNOWN, 0 +#define AI_MATKEY_GLTF_ALPHAMODE "$mat.gltf.alphaMode", 0, 0 +#define AI_MATKEY_GLTF_ALPHACUTOFF "$mat.gltf.alphaCutoff", 0, 0 + +#define _AI_MATKEY_GLTF_MAPPINGNAME_BASE "$tex.mappingname" +#define _AI_MATKEY_GLTF_MAPPINGID_BASE "$tex.mappingid" +#define _AI_MATKEY_GLTF_MAPPINGFILTER_MAG_BASE "$tex.mappingfiltermag" +#define _AI_MATKEY_GLTF_MAPPINGFILTER_MIN_BASE "$tex.mappingfiltermin" +#define _AI_MATKEY_GLTF_SCALE_BASE "$tex.scale" +#define _AI_MATKEY_GLTF_STRENGTH_BASE "$tex.strength" + +#define AI_MATKEY_GLTF_MAPPINGNAME(type, N) _AI_MATKEY_GLTF_MAPPINGNAME_BASE, type, N +#define AI_MATKEY_GLTF_MAPPINGID(type, N) _AI_MATKEY_GLTF_MAPPINGID_BASE, type, N +#define AI_MATKEY_GLTF_MAPPINGFILTER_MAG(type, N) _AI_MATKEY_GLTF_MAPPINGFILTER_MAG_BASE, type, N +#define AI_MATKEY_GLTF_MAPPINGFILTER_MIN(type, N) _AI_MATKEY_GLTF_MAPPINGFILTER_MIN_BASE, type, N +#define AI_MATKEY_GLTF_TEXTURE_SCALE(type, N) _AI_MATKEY_GLTF_SCALE_BASE, type, N +#define AI_MATKEY_GLTF_TEXTURE_STRENGTH(type, N) _AI_MATKEY_GLTF_STRENGTH_BASE, type, N + +#endif diff --git a/Source/ThirdParty/assimp/Hash.h b/Source/ThirdParty/assimp/Hash.h index 30657be19..9dec87408 100644 --- a/Source/ThirdParty/assimp/Hash.h +++ b/Source/ThirdParty/assimp/Hash.h @@ -2,8 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2019, assimp team - +Copyright (c) 2006-2024, assimp team All rights reserved. @@ -39,12 +38,18 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ---------------------------------------------------------------------- */ - +#pragma once #ifndef AI_HASH_H_INCLUDED #define AI_HASH_H_INCLUDED +#ifdef __GNUC__ +# pragma GCC system_header +#endif + #include +#include #include +#include // ------------------------------------------------------------------------------------------------ // Hashing function taken from @@ -60,21 +65,21 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #undef get16bits #if (defined(__GNUC__) && defined(__i386__)) || defined(__WATCOMC__) \ || defined(_MSC_VER) || defined (__BORLANDC__) || defined (__TURBOC__) -#define get16bits(d) (*((const uint16_t *) (d))) +# define get16bits(d) (*((const uint16_t *) (d))) #endif #if !defined (get16bits) -#define get16bits(d) ((((uint32_t)(((const uint8_t *)(d))[1])) << 8)\ +# define get16bits(d) ((((uint32_t)(((const uint8_t *)(d))[1])) << 8)\ +(uint32_t)(((const uint8_t *)(d))[0]) ) #endif // ------------------------------------------------------------------------------------------------ inline uint32_t SuperFastHash (const char * data, uint32_t len = 0, uint32_t hash = 0) { -uint32_t tmp; -int rem; + uint32_t tmp; + int rem; - if (!data) return 0; - if (!len)len = (uint32_t)::strlen(data); + if (data == NULL) return 0; + if (len == 0)len = (uint32_t)::strlen(data); rem = len & 3; len >>= 2; @@ -92,7 +97,7 @@ int rem; switch (rem) { case 3: hash += get16bits (data); hash ^= hash << 16; - hash ^= data[sizeof (uint16_t)] << 18; + hash ^= abs(data[sizeof(uint16_t)]) << 18; hash += hash >> 11; break; case 2: hash += get16bits (data); diff --git a/Source/ThirdParty/assimp/IOStream.hpp b/Source/ThirdParty/assimp/IOStream.hpp index 0623d0f70..1866a3d72 100644 --- a/Source/ThirdParty/assimp/IOStream.hpp +++ b/Source/ThirdParty/assimp/IOStream.hpp @@ -3,9 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2019, assimp team - - +Copyright (c) 2006-2024, assimp team All rights reserved. @@ -48,14 +46,18 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef AI_IOSTREAM_H_INC #define AI_IOSTREAM_H_INC -#include "types.h" +#ifdef __GNUC__ +# pragma GCC system_header +#endif + +#include #ifndef __cplusplus # error This header requires C++ to be used. aiFileIO.h is the \ corresponding C interface. #endif -namespace Assimp { +namespace Assimp { // ---------------------------------------------------------------------------------- /** @brief CPP-API: Class to handle file I/O for C++ @@ -71,14 +73,14 @@ class ASSIMP_API IOStream { protected: /** Constructor protected, use IOSystem::Open() to create an instance. */ - IOStream() AI_NO_EXCEPT; + IOStream() AI_NO_EXCEPT = default; public: // ------------------------------------------------------------------- /** @brief Destructor. Deleting the object closes the underlying file, * alternatively you may use IOSystem::Close() to release the file. */ - virtual ~IOStream(); + virtual ~IOStream() = default; // ------------------------------------------------------------------- /** @brief Read from the file @@ -124,19 +126,6 @@ public: virtual void Flush() = 0; }; //! class IOStream -// ---------------------------------------------------------------------------------- -inline -IOStream::IOStream() AI_NO_EXCEPT { - // empty -} - -// ---------------------------------------------------------------------------------- -inline -IOStream::~IOStream() { - // empty -} -// ---------------------------------------------------------------------------------- - } //!namespace Assimp #endif //!!AI_IOSTREAM_H_INC diff --git a/Source/ThirdParty/assimp/IOStreamBuffer.h b/Source/ThirdParty/assimp/IOStreamBuffer.h index 58abd97a0..5a6924a09 100644 --- a/Source/ThirdParty/assimp/IOStreamBuffer.h +++ b/Source/ThirdParty/assimp/IOStreamBuffer.h @@ -1,11 +1,8 @@ -#pragma once - /* Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2019, assimp team - +Copyright (c) 2006-2024, assimp team All rights reserved. @@ -42,11 +39,18 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ---------------------------------------------------------------------- */ +#pragma once +#ifndef AI_IOSTREAMBUFFER_H_INC +#define AI_IOSTREAMBUFFER_H_INC + +#ifdef __GNUC__ +#pragma GCC system_header +#endif + +#include #include #include -#include "ParsingUtils.h" - #include namespace Assimp { @@ -55,19 +59,19 @@ namespace Assimp { /** * Implementation of a cached stream buffer. */ -template +template class IOStreamBuffer { public: /// @brief The class constructor. - IOStreamBuffer( size_t cache = 4096 * 4096 ); + IOStreamBuffer(size_t cache = 4096 * 4096); /// @brief The class destructor. - ~IOStreamBuffer(); + ~IOStreamBuffer() = default; /// @brief Will open the cached access for a given stream. /// @param stream The stream to cache. /// @return true if successful. - bool open( IOStream *stream ); + bool open(IOStream *stream); /// @brief Will close the cached access. /// @return true if successful. @@ -76,7 +80,7 @@ public: /// @brief Returns the file-size. /// @return The file-size. size_t size() const; - + /// @brief Returns the cache size. /// @return The cache size. size_t cacheSize() const; @@ -100,7 +104,7 @@ public: /// @brief Will read the next line. /// @param buffer The buffer for the next line. /// @return true if successful. - bool getNextDataLine( std::vector &buffer, T continuationToken ); + bool getNextDataLine(std::vector &buffer, T continuationToken); /// @brief Will read the next line ascii or binary end line char. /// @param buffer The buffer for the next line. @@ -110,7 +114,7 @@ public: /// @brief Will read the next block. /// @param buffer The buffer for the next block. /// @return true if successful. - bool getNextBlock( std::vector &buffer ); + bool getNextBlock(std::vector &buffer); private: IOStream *m_stream; @@ -123,95 +127,87 @@ private: size_t m_filePos; }; -template -inline -IOStreamBuffer::IOStreamBuffer( size_t cache ) -: m_stream( nullptr ) -, m_filesize( 0 ) -, m_cacheSize( cache ) -, m_numBlocks( 0 ) -, m_blockIdx( 0 ) -, m_cachePos( 0 ) -, m_filePos( 0 ) { - m_cache.resize( cache ); - std::fill( m_cache.begin(), m_cache.end(), '\n' ); +template +AI_FORCE_INLINE IOStreamBuffer::IOStreamBuffer(size_t cache) : + m_stream(nullptr), + m_filesize(0), + m_cacheSize(cache), + m_numBlocks(0), + m_blockIdx(0), + m_cachePos(0), + m_filePos(0) { + m_cache.resize(cache); + std::fill(m_cache.begin(), m_cache.end(), '\n'); } -template -inline -IOStreamBuffer::~IOStreamBuffer() { - // empty -} - -template -inline -bool IOStreamBuffer::open( IOStream *stream ) { +template +AI_FORCE_INLINE bool IOStreamBuffer::open(IOStream *stream) { // file still opened! - if ( nullptr != m_stream ) { + if (nullptr != m_stream) { return false; } // Invalid stream pointer - if ( nullptr == stream ) { + if (nullptr == stream) { return false; } m_stream = stream; m_filesize = m_stream->FileSize(); - if ( m_filesize == 0 ) { + if (m_filesize == 0) { return false; } - if ( m_filesize < m_cacheSize ) { + if (m_filesize < m_cacheSize) { m_cacheSize = m_filesize; } m_numBlocks = m_filesize / m_cacheSize; - if ( ( m_filesize % m_cacheSize ) > 0 ) { + if ((m_filesize % m_cacheSize) > 0) { m_numBlocks++; } return true; } -template -inline -bool IOStreamBuffer::close() { - if ( nullptr == m_stream ) { +template +AI_FORCE_INLINE bool IOStreamBuffer::close() { + if (nullptr == m_stream) { return false; } // init counters and state vars - m_stream = nullptr; - m_filesize = 0; + m_stream = nullptr; + m_filesize = 0; m_numBlocks = 0; - m_blockIdx = 0; - m_cachePos = 0; - m_filePos = 0; + m_blockIdx = 0; + m_cachePos = 0; + m_filePos = 0; return true; } -template -inline -size_t IOStreamBuffer::size() const { +template +AI_FORCE_INLINE + size_t + IOStreamBuffer::size() const { return m_filesize; } -template -inline -size_t IOStreamBuffer::cacheSize() const { +template +AI_FORCE_INLINE + size_t + IOStreamBuffer::cacheSize() const { return m_cacheSize; } -template -inline -bool IOStreamBuffer::readNextBlock() { - m_stream->Seek( m_filePos, aiOrigin_SET ); - size_t readLen = m_stream->Read( &m_cache[ 0 ], sizeof( T ), m_cacheSize ); - if ( readLen == 0 ) { +template +AI_FORCE_INLINE bool IOStreamBuffer::readNextBlock() { + m_stream->Seek(m_filePos, aiOrigin_SET); + size_t readLen = m_stream->Read(&m_cache[0], sizeof(T), m_cacheSize); + if (readLen == 0) { return false; } - if ( readLen < m_cacheSize ) { + if (readLen < m_cacheSize) { m_cacheSize = readLen; } m_filePos += m_cacheSize; @@ -221,88 +217,78 @@ bool IOStreamBuffer::readNextBlock() { return true; } -template -inline -size_t IOStreamBuffer::getNumBlocks() const { +template +AI_FORCE_INLINE size_t IOStreamBuffer::getNumBlocks() const { return m_numBlocks; } -template -inline -size_t IOStreamBuffer::getCurrentBlockIndex() const { +template +AI_FORCE_INLINE size_t IOStreamBuffer::getCurrentBlockIndex() const { return m_blockIdx; } -template -inline -size_t IOStreamBuffer::getFilePos() const { +template +AI_FORCE_INLINE size_t IOStreamBuffer::getFilePos() const { return m_filePos; } -template -inline -bool IOStreamBuffer::getNextDataLine( std::vector &buffer, T continuationToken ) { - buffer.resize( m_cacheSize ); - if ( m_cachePos >= m_cacheSize || 0 == m_filePos ) { - if ( !readNextBlock() ) { +template +AI_FORCE_INLINE bool IOStreamBuffer::getNextDataLine(std::vector &buffer, T continuationToken) { + buffer.resize(m_cacheSize); + if (m_cachePos >= m_cacheSize || 0 == m_filePos) { + if (!readNextBlock()) { return false; } } - bool continuationFound( false ); size_t i = 0; - for( ;; ) { - if ( continuationToken == m_cache[ m_cachePos ] ) { - continuationFound = true; + for (;;) { + if (continuationToken == m_cache[m_cachePos] && IsLineEnd(m_cache[m_cachePos + 1])) { ++m_cachePos; - } - if ( IsLineEnd( m_cache[ m_cachePos ] ) ) { - if ( !continuationFound ) { - // the end of the data line - break; - } else { - // skip line end - while ( m_cache[m_cachePos] != '\n') { - ++m_cachePos; - } + while (m_cache[m_cachePos] != '\n') { ++m_cachePos; - continuationFound = false; } + ++m_cachePos; + } else if (IsLineEnd(m_cache[m_cachePos])) { + break; } - buffer[ i ] = m_cache[ m_cachePos ]; + buffer[i] = m_cache[m_cachePos]; ++m_cachePos; ++i; + + if(i == buffer.size()) { + buffer.resize(buffer.size() * 2); + } + if (m_cachePos >= size()) { break; } - if ( m_cachePos >= m_cacheSize ) { - if ( !readNextBlock() ) { + if (m_cachePos >= m_cacheSize) { + if (!readNextBlock()) { return false; } } } - - buffer[ i ] = '\n'; + + buffer[i] = '\n'; ++m_cachePos; return true; } -static inline -bool isEndOfCache( size_t pos, size_t cacheSize ) { - return ( pos == cacheSize ); +static AI_FORCE_INLINE bool isEndOfCache(size_t pos, size_t cacheSize) { + return (pos == cacheSize); } -template -inline -bool IOStreamBuffer::getNextLine(std::vector &buffer) { +template +AI_FORCE_INLINE bool IOStreamBuffer::getNextLine(std::vector &buffer) { buffer.resize(m_cacheSize); - if ( isEndOfCache( m_cachePos, m_cacheSize ) || 0 == m_filePos) { - if (!readNextBlock()) { - return false; - } - } + if (m_cachePos >= m_cacheSize || 0 == m_filePos) { + if (!readNextBlock()) { + return false; + } + } if (IsLineEnd(m_cache[m_cachePos])) { // skip line end @@ -310,18 +296,23 @@ bool IOStreamBuffer::getNextLine(std::vector &buffer) { ++m_cachePos; } ++m_cachePos; - if ( isEndOfCache( m_cachePos, m_cacheSize ) ) { - if ( !readNextBlock() ) { + if (isEndOfCache(m_cachePos, m_cacheSize)) { + if (!readNextBlock()) { return false; } } } - size_t i( 0 ); - while (!IsLineEnd(m_cache[ m_cachePos ])) { - buffer[i] = m_cache[ m_cachePos ]; + size_t i(0); + while (!IsLineEnd(m_cache[m_cachePos])) { + buffer[i] = m_cache[m_cachePos]; ++m_cachePos; ++i; + + if(i == buffer.size()) { + buffer.resize(buffer.size() * 2); + } + if (m_cachePos >= m_cacheSize) { if (!readNextBlock()) { return false; @@ -329,20 +320,21 @@ bool IOStreamBuffer::getNextLine(std::vector &buffer) { } } buffer[i] = '\n'; - ++m_cachePos; + while (m_cachePos < m_cacheSize && (m_cache[m_cachePos] == '\r' || m_cache[m_cachePos] == '\n')) { + ++m_cachePos; + } return true; } -template -inline -bool IOStreamBuffer::getNextBlock( std::vector &buffer) { +template +AI_FORCE_INLINE bool IOStreamBuffer::getNextBlock(std::vector &buffer) { // Return the last block-value if getNextLine was used before - if ( 0 != m_cachePos ) { - buffer = std::vector( m_cache.begin() + m_cachePos, m_cache.end() ); + if (0 != m_cachePos) { + buffer = std::vector(m_cache.begin() + m_cachePos, m_cache.end()); m_cachePos = 0; } else { - if ( !readNextBlock() ) { + if (!readNextBlock()) { return false; } @@ -352,4 +344,6 @@ bool IOStreamBuffer::getNextBlock( std::vector &buffer) { return true; } -} // !ns Assimp +} // namespace Assimp + +#endif // AI_IOSTREAMBUFFER_H_INC diff --git a/Source/ThirdParty/assimp/IOSystem.hpp b/Source/ThirdParty/assimp/IOSystem.hpp index 78139c283..b345151d5 100644 --- a/Source/ThirdParty/assimp/IOSystem.hpp +++ b/Source/ThirdParty/assimp/IOSystem.hpp @@ -3,9 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2019, assimp team - - +Copyright (c) 2006-2024, assimp team All rights reserved. @@ -50,6 +48,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef AI_IOSYSTEM_H_INC #define AI_IOSYSTEM_H_INC +#ifdef __GNUC__ +# pragma GCC system_header +#endif + #ifndef __cplusplus # error This header requires C++ to be used. aiFileIO.h is the \ corresponding C interface. @@ -58,9 +60,9 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "types.h" #ifdef _WIN32 -# include -# include -# include +# include +# include +# include #else # include # include @@ -71,7 +73,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. namespace Assimp { - class IOStream; +class IOStream; // --------------------------------------------------------------------------- /** @brief CPP-API: Interface to the file system. @@ -80,7 +82,7 @@ namespace Assimp { * to the importer library. If you implement this interface, you also want to * supply a custom implementation for IOStream. * - * @see Importer::SetIOHandler() + * @see Importer::SetIOHandler() */ class ASSIMP_API IOSystem #ifndef SWIG @@ -95,7 +97,7 @@ public: * Create an instance of your derived class and assign it to an * #Assimp::Importer instance by calling Importer::SetIOHandler(). */ - IOSystem() AI_NO_EXCEPT; + IOSystem() AI_NO_EXCEPT = default; // ------------------------------------------------------------------- /** @brief Virtual destructor. @@ -103,7 +105,7 @@ public: * It is safe to be called from within DLL Assimp, we're constructed * on Assimp's heap. */ - virtual ~IOSystem(); + virtual ~IOSystem() = default; // ------------------------------------------------------------------- /** @brief For backward compatibility @@ -222,25 +224,18 @@ public: */ virtual bool ChangeDirectory( const std::string &path ); - virtual bool DeleteFile( const std::string &file ); + // ------------------------------------------------------------------- + /** + * @brief Will delete the given file. + * @param file [in] The filename + * @return true, if the file wase deleted, false if not. + */ + virtual bool DeleteFile(const std::string &file); private: std::vector m_pathStack; }; -// ---------------------------------------------------------------------------- -AI_FORCE_INLINE -IOSystem::IOSystem() AI_NO_EXCEPT -: m_pathStack() { - // empty -} - -// ---------------------------------------------------------------------------- -AI_FORCE_INLINE -IOSystem::~IOSystem() { - // empty -} - // ---------------------------------------------------------------------------- // For compatibility, the interface of some functions taking a std::string was // changed to const char* to avoid crashes between binary incompatible STL @@ -248,8 +243,7 @@ IOSystem::~IOSystem() { // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- -AI_FORCE_INLINE -IOStream* IOSystem::Open(const std::string& pFile, const std::string& pMode) { +AI_FORCE_INLINE IOStream* IOSystem::Open(const std::string& pFile, const std::string& pMode) { // NOTE: // For compatibility, interface was changed to const char* to // avoid crashes between binary incompatible STL versions @@ -257,8 +251,7 @@ IOStream* IOSystem::Open(const std::string& pFile, const std::string& pMode) { } // ---------------------------------------------------------------------------- -AI_FORCE_INLINE -bool IOSystem::Exists( const std::string& pFile) const { +AI_FORCE_INLINE bool IOSystem::Exists( const std::string& pFile) const { // NOTE: // For compatibility, interface was changed to const char* to // avoid crashes between binary incompatible STL versions @@ -266,8 +259,7 @@ bool IOSystem::Exists( const std::string& pFile) const { } // ---------------------------------------------------------------------------- -AI_FORCE_INLINE -bool IOSystem::ComparePaths (const std::string& one, const std::string& second) const { +AI_FORCE_INLINE bool IOSystem::ComparePaths(const std::string& one, const std::string& second) const { // NOTE: // For compatibility, interface was changed to const char* to // avoid crashes between binary incompatible STL versions @@ -275,8 +267,7 @@ bool IOSystem::ComparePaths (const std::string& one, const std::string& second) } // ---------------------------------------------------------------------------- -AI_FORCE_INLINE -bool IOSystem::PushDirectory( const std::string &path ) { +AI_FORCE_INLINE bool IOSystem::PushDirectory( const std::string &path ) { if ( path.empty() ) { return false; } @@ -287,24 +278,12 @@ bool IOSystem::PushDirectory( const std::string &path ) { } // ---------------------------------------------------------------------------- -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 { +AI_FORCE_INLINE size_t IOSystem::StackSize() const { return m_pathStack.size(); } // ---------------------------------------------------------------------------- -AI_FORCE_INLINE -bool IOSystem::PopDirectory() { +AI_FORCE_INLINE bool IOSystem::PopDirectory() { if ( m_pathStack.empty() ) { return false; } @@ -315,8 +294,7 @@ bool IOSystem::PopDirectory() { } // ---------------------------------------------------------------------------- -AI_FORCE_INLINE -bool IOSystem::CreateDirectory( const std::string &path ) { +AI_FORCE_INLINE bool IOSystem::CreateDirectory( const std::string &path ) { if ( path.empty() ) { return false; } @@ -329,8 +307,7 @@ bool IOSystem::CreateDirectory( const std::string &path ) { } // ---------------------------------------------------------------------------- -AI_FORCE_INLINE -bool IOSystem::ChangeDirectory( const std::string &path ) { +AI_FORCE_INLINE bool IOSystem::ChangeDirectory( const std::string &path ) { if ( path.empty() ) { return false; } @@ -344,8 +321,7 @@ bool IOSystem::ChangeDirectory( const std::string &path ) { // ---------------------------------------------------------------------------- -AI_FORCE_INLINE -bool IOSystem::DeleteFile( const std::string &file ) { +AI_FORCE_INLINE bool IOSystem::DeleteFile( const std::string &file ) { if ( file.empty() ) { return false; } diff --git a/Source/ThirdParty/assimp/Importer.hpp b/Source/ThirdParty/assimp/Importer.hpp index 4941df412..a3a0d9eae 100644 --- a/Source/ThirdParty/assimp/Importer.hpp +++ b/Source/ThirdParty/assimp/Importer.hpp @@ -3,9 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2019, assimp team - - +Copyright (c) 2006-2024, assimp team All rights reserved. @@ -48,36 +46,42 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef AI_ASSIMP_HPP_INC #define AI_ASSIMP_HPP_INC +#ifdef __GNUC__ +#pragma GCC system_header +#endif + #ifndef __cplusplus -# error This header requires C++ to be used. Use assimp.h for plain C. +#error This header requires C++ to be used. Use assimp.h for plain C. #endif // __cplusplus // Public ASSIMP data structures #include -namespace Assimp { - // ======================================================================= - // Public interface to Assimp - class Importer; - class IOStream; - class IOSystem; - class ProgressHandler; +#include - // ======================================================================= - // Plugin development - // - // Include the following headers for the declarations: - // BaseImporter.h - // BaseProcess.h - class BaseImporter; - class BaseProcess; - class SharedPostProcessInfo; - class BatchLoader; +namespace Assimp { +// ======================================================================= +// Public interface to Assimp +class Importer; +class IOStream; +class IOSystem; +class ProgressHandler; - // ======================================================================= - // Holy stuff, only for members of the high council of the Jedi. - class ImporterPimpl; -} //! namespace Assimp +// ======================================================================= +// Plugin development +// +// Include the following headers for the declarations: +// BaseImporter.h +// BaseProcess.h +class BaseImporter; +class BaseProcess; +class SharedPostProcessInfo; +class BatchLoader; + +// ======================================================================= +// Holy stuff, only for members of the high council of the Jedi. +class ImporterPimpl; +} // namespace Assimp #define AI_PROPERTY_WAS_NOT_EXISTING 0xffffffff @@ -87,7 +91,7 @@ struct aiScene; struct aiImporterDesc; /** @namespace Assimp Assimp's CPP-API and all internal APIs */ -namespace Assimp { +namespace Assimp { // ---------------------------------------------------------------------------------- /** CPP-API: The Importer class forms an C++ interface to the functionality of the @@ -97,7 +101,7 @@ namespace Assimp { * If the import succeeds, the function returns a pointer to the imported data. * The data remains property of the object, it is intended to be accessed * read-only. The imported data will be destroyed along with the Importer -* object. If the import fails, ReadFile() returns a NULL pointer. In this +* object. If the import fails, ReadFile() returns a nullptr pointer. In this * case you can retrieve a human-readable error description be calling * GetErrorString(). You can call ReadFile() multiple times with a single Importer * instance. Actually, constructing Importer objects involves quite many @@ -107,13 +111,13 @@ namespace Assimp { * If you need the Importer to do custom file handling to access the files, * implement IOSystem and IOStream and supply an instance of your custom * IOSystem implementation by calling SetIOHandler() before calling ReadFile(). -* If you do not assign a custion IO handler, a default handler using the +* If you do not assign a custom IO handler, a default handler using the * standard C++ IO logic will be used. * * @note One Importer instance is not thread-safe. If you use multiple * threads for loading, each thread should maintain its own Importer instance. */ -class ASSIMP_API Importer { +class ASSIMP_API Importer { public: /** * @brief The upper limit for hints. @@ -121,7 +125,6 @@ public: static const unsigned int MaxLenHint = 200; public: - // ------------------------------------------------------------------- /** Constructor. Creates an empty importer object. * @@ -137,7 +140,7 @@ public: * If this Importer owns a scene it won't be copied. * Call ReadFile() to start the import process. */ - Importer(const Importer& other)=delete; + Importer(const Importer &other) = delete; // ------------------------------------------------------------------- /** Assignment operator has been deleted @@ -150,7 +153,6 @@ public: */ ~Importer(); - // ------------------------------------------------------------------- /** Registers a new loader. * @@ -160,7 +162,7 @@ public: * @return AI_SUCCESS if the loader has been added. The registration * fails if there is already a loader for a specific file extension. */ - aiReturn RegisterLoader(BaseImporter* pImp); + aiReturn RegisterLoader(BaseImporter *pImp); // ------------------------------------------------------------------- /** Unregisters a loader. @@ -171,7 +173,7 @@ public: * if the #Importer instance is used by more than one thread) or * if it has not yet been registered. */ - aiReturn UnregisterLoader(BaseImporter* pImp); + aiReturn UnregisterLoader(BaseImporter *pImp); // ------------------------------------------------------------------- /** Registers a new post-process step. @@ -184,7 +186,7 @@ public: * deleted with the Importer instance. * @return AI_SUCCESS if the step has been added correctly. */ - aiReturn RegisterPPStep(BaseProcess* pImp); + aiReturn RegisterPPStep(BaseProcess *pImp); // ------------------------------------------------------------------- /** Unregisters a post-process step. @@ -195,7 +197,7 @@ public: * if the #Importer instance is used by more than one thread) or * if it has not yet been registered. */ - aiReturn UnregisterPPStep(BaseProcess* pImp); + aiReturn UnregisterPPStep(BaseProcess *pImp); // ------------------------------------------------------------------- /** Set an integer configuration property. @@ -210,7 +212,7 @@ public: * floating-point property has no effect - the loader will call * GetPropertyFloat() to read the property, but it won't be there. */ - bool SetPropertyInteger(const char* szName, int iValue); + bool SetPropertyInteger(const char *szName, int iValue); // ------------------------------------------------------------------- /** Set a boolean configuration property. Boolean properties @@ -219,27 +221,33 @@ public: * #GetPropertyBool and vice versa. * @see SetPropertyInteger() */ - bool SetPropertyBool(const char* szName, bool value) { - return SetPropertyInteger(szName,value); + bool SetPropertyBool(const char *szName, bool value) { + return SetPropertyInteger(szName, value); } // ------------------------------------------------------------------- /** Set a floating-point configuration property. * @see SetPropertyInteger() */ - bool SetPropertyFloat(const char* szName, ai_real fValue); + bool SetPropertyFloat(const char *szName, ai_real fValue); // ------------------------------------------------------------------- /** Set a string configuration property. * @see SetPropertyInteger() */ - bool SetPropertyString(const char* szName, const std::string& sValue); + bool SetPropertyString(const char *szName, const std::string &sValue); // ------------------------------------------------------------------- /** Set a matrix configuration property. * @see SetPropertyInteger() */ - bool SetPropertyMatrix(const char* szName, const aiMatrix4x4& sValue); + bool SetPropertyMatrix(const char *szName, const aiMatrix4x4 &sValue); + + // ------------------------------------------------------------------- + /** Set a pointer configuration property. + * @see SetPropertyInteger() + */ + bool SetPropertyPointer(const char *szName, void *sValue); // ------------------------------------------------------------------- /** Get a configuration property. @@ -254,8 +262,8 @@ public: * floating-point property has no effect - the loader will call * GetPropertyFloat() to read the property, but it won't be there. */ - int GetPropertyInteger(const char* szName, - int iErrorReturn = 0xffffffff) const; + int GetPropertyInteger(const char *szName, + int iErrorReturn = 0xffffffff) const; // ------------------------------------------------------------------- /** Get a boolean configuration property. Boolean properties @@ -264,16 +272,16 @@ public: * #GetPropertyBool and vice versa. * @see GetPropertyInteger() */ - bool GetPropertyBool(const char* szName, bool bErrorReturn = false) const { - return GetPropertyInteger(szName,bErrorReturn)!=0; + bool GetPropertyBool(const char *szName, bool bErrorReturn = false) const { + return GetPropertyInteger(szName, bErrorReturn) != 0; } // ------------------------------------------------------------------- /** Get a floating-point configuration property * @see GetPropertyInteger() */ - ai_real GetPropertyFloat(const char* szName, - ai_real fErrorReturn = 10e10) const; + ai_real GetPropertyFloat(const char *szName, + ai_real fErrorReturn = 10e10) const; // ------------------------------------------------------------------- /** Get a string configuration property @@ -281,8 +289,8 @@ public: * The return value remains valid until the property is modified. * @see GetPropertyInteger() */ - const std::string GetPropertyString(const char* szName, - const std::string& sErrorReturn = "") const; + std::string GetPropertyString(const char *szName, + const std::string &sErrorReturn = std::string()) const; // ------------------------------------------------------------------- /** Get a matrix configuration property @@ -290,8 +298,17 @@ public: * The return value remains valid until the property is modified. * @see GetPropertyInteger() */ - const aiMatrix4x4 GetPropertyMatrix(const char* szName, - const aiMatrix4x4& sErrorReturn = aiMatrix4x4()) const; + aiMatrix4x4 GetPropertyMatrix(const char *szName, + const aiMatrix4x4 &sErrorReturn = aiMatrix4x4()) const; + + // ------------------------------------------------------------------- + /** Get a pointer configuration property + * + * The return value remains valid until the property is modified. + * @see GetPropertyInteger() + */ + void* GetPropertyPointer(const char *szName, + void *sErrorReturn = nullptr) const; // ------------------------------------------------------------------- /** Supplies a custom IO handler to the importer to use to open and @@ -302,13 +319,13 @@ public: * * The Importer takes ownership of the object and will destroy it * afterwards. The previously assigned handler will be deleted. - * Pass NULL to take again ownership of your IOSystem and reset Assimp + * Pass nullptr to take again ownership of your IOSystem and reset Assimp * to use its default implementation. * * @param pIOHandler The IO handler to be used in all file accesses * of the Importer. */ - void SetIOHandler( IOSystem* pIOHandler); + void SetIOHandler(IOSystem *pIOHandler); // ------------------------------------------------------------------- /** Retrieves the IO handler that is currently set. @@ -316,9 +333,9 @@ public: * interface is the default IO handler provided by ASSIMP. The default * handler is active as long the application doesn't supply its own * custom IO handler via #SetIOHandler(). - * @return A valid IOSystem interface, never NULL. + * @return A valid IOSystem interface, never nullptr. */ - IOSystem* GetIOHandler() const; + IOSystem *GetIOHandler() const; // ------------------------------------------------------------------- /** Checks whether a default IO handler is active @@ -335,11 +352,11 @@ public: * isn't as periodically as you'd like it to have ...). * This can be used to implement progress bars and loading * timeouts. - * @param pHandler Progress callback interface. Pass NULL to + * @param pHandler Progress callback interface. Pass nullptr to * disable progress reporting. * @note Progress handlers can be used to abort the loading * at almost any time.*/ - void SetProgressHandler ( ProgressHandler* pHandler ); + void SetProgressHandler(ProgressHandler *pHandler); // ------------------------------------------------------------------- /** Retrieves the progress handler that is currently set. @@ -347,9 +364,9 @@ public: * interface is the default handler provided by ASSIMP. The default * handler is active as long the application doesn't supply its own * custom handler via #SetProgressHandler(). - * @return A valid ProgressHandler interface, never NULL. + * @return A valid ProgressHandler interface, never nullptr. */ - ProgressHandler* GetProgressHandler() const; + ProgressHandler *GetProgressHandler() const; // ------------------------------------------------------------------- /** Checks whether a default progress handler is active @@ -379,7 +396,7 @@ public: * If the call succeeds, the contents of the file are returned as a * pointer to an aiScene object. The returned data is intended to be * read-only, the importer object keeps ownership of the data and will - * destroy it upon destruction. If the import fails, NULL is returned. + * destroy it upon destruction. If the import fails, nullptr is returned. * A human-readable error description can be retrieved by calling * GetErrorString(). The previous scene will be deleted during this call. * @param pFile Path and filename to the file to be imported. @@ -388,16 +405,16 @@ public: * #aiPostProcessSteps flags. If you wish to inspect the imported * scene first in order to fine-tune your post-processing setup, * consider to use #ApplyPostProcessing(). - * @return A pointer to the imported data, NULL if the import failed. + * @return A pointer to the imported data, nullptr if the import failed. * The pointer to the scene remains in possession of the Importer * instance. Use GetOrphanedScene() to take ownership of it. * * @note Assimp is able to determine the file format of a file * automatically. */ - const aiScene* ReadFile( - const char* pFile, - unsigned int pFlags); + const aiScene *ReadFile( + const char *pFile, + unsigned int pFlags); // ------------------------------------------------------------------- /** Reads the given file from a memory buffer and returns its @@ -406,7 +423,7 @@ public: * If the call succeeds, the contents of the file are returned as a * pointer to an aiScene object. The returned data is intended to be * read-only, the importer object keeps ownership of the data and will - * destroy it upon destruction. If the import fails, NULL is returned. + * destroy it upon destruction. If the import fails, nullptr is returned. * A human-readable error description can be retrieved by calling * GetErrorString(). The previous scene will be deleted during this call. * Calling this method doesn't affect the active IOSystem. @@ -424,7 +441,7 @@ public: * the request, the library continues and tries to determine the * file format on its own, a task that may or may not be successful. * Check the return value, and you'll know ... - * @return A pointer to the imported data, NULL if the import failed. + * @return A pointer to the imported data, nullptr if the import failed. * The pointer to the scene remains in possession of the Importer * instance. Use GetOrphanedScene() to take ownership of it. * @@ -436,11 +453,11 @@ public: * a custom IOSystem to make Assimp find these files and use * the regular ReadFile() API. */ - const aiScene* ReadFileFromMemory( - const void* pBuffer, - size_t pLength, - unsigned int pFlags, - const char* pHint = ""); + const aiScene *ReadFileFromMemory( + const void *pBuffer, + size_t pLength, + unsigned int pFlags, + const char *pHint = ""); // ------------------------------------------------------------------- /** Apply post-processing to an already-imported scene. @@ -452,17 +469,17 @@ public: * #aiPostProcessSteps flags. * @return A pointer to the post-processed data. This is still the * same as the pointer returned by #ReadFile(). However, if - * post-processing fails, the scene could now be NULL. + * post-processing fails, the scene could now be nullptr. * That's quite a rare case, post processing steps are not really * designed to 'fail'. To be exact, the #aiProcess_ValidateDS * flag is currently the only post processing step which can actually - * cause the scene to be reset to NULL. + * cause the scene to be reset to nullptr. * * @note The method does nothing if no scene is currently bound * to the #Importer instance. */ - const aiScene* ApplyPostProcessing(unsigned int pFlags); + const aiScene *ApplyPostProcessing(unsigned int pFlags); - const aiScene* ApplyCustomizedPostProcessing( BaseProcess *rootProcess, bool requestValidation ); + const aiScene *ApplyCustomizedPostProcessing(BaseProcess *rootProcess, bool requestValidation); // ------------------------------------------------------------------- /** @brief Reads the given file and returns its contents if successful. @@ -470,9 +487,9 @@ public: * This function is provided for backward compatibility. * See the const char* version for detailed docs. * @see ReadFile(const char*, pFlags) */ - const aiScene* ReadFile( - const std::string& pFile, - unsigned int pFlags); + const aiScene *ReadFile( + const std::string &pFile, + unsigned int pFlags); // ------------------------------------------------------------------- /** Frees the current scene. @@ -480,33 +497,42 @@ public: * The function does nothing if no scene has previously been * read via ReadFile(). FreeScene() is called automatically by the * destructor and ReadFile() itself. */ - void FreeScene( ); + void FreeScene(); // ------------------------------------------------------------------- /** Returns an error description of an error that occurred in ReadFile(). * * Returns an empty string if no error occurred. * @return A description of the last error, an empty string if no - * error occurred. The string is never NULL. + * error occurred. The string is never nullptr. * * @note The returned function remains valid until one of the * following methods is called: #ReadFile(), #FreeScene(). */ - const char* GetErrorString() const; + const char *GetErrorString() const; + + // ------------------------------------------------------------------- + /** Returns an exception if one occurred during import. + * + * @return The last exception which occurred. + * + * @note The returned value remains valid until one of the + * following methods is called: #ReadFile(), #FreeScene(). */ + const std::exception_ptr& GetException() const; // ------------------------------------------------------------------- /** Returns the scene loaded by the last successful call to ReadFile() * - * @return Current scene or NULL if there is currently no scene loaded */ - const aiScene* GetScene() const; + * @return Current scene or nullptr if there is currently no scene loaded */ + const aiScene *GetScene() const; // ------------------------------------------------------------------- /** Returns the scene loaded by the last successful call to ReadFile() * and releases the scene from the ownership of the Importer * instance. The application is now responsible for deleting the * scene. Any further calls to GetScene() or GetOrphanedScene() - * will return NULL - until a new scene has been loaded via ReadFile(). + * will return nullptr - until a new scene has been loaded via ReadFile(). * - * @return Current scene or NULL if there is currently no scene loaded + * @return Current scene or nullptr if there is currently no scene loaded * @note Use this method with maximal caution, and only if you have to. * By design, aiScene's are exclusively maintained, allocated and * deallocated by Assimp and no one else. The reasoning behind this @@ -518,7 +544,7 @@ public: * On Windows, it's typically fine provided everything is linked * against the multithreaded-dll version of the runtime library. * It will work as well for static linkage with Assimp.*/ - aiScene* GetOrphanedScene(); + aiScene *GetOrphanedScene(); // ------------------------------------------------------------------- /** Returns whether a given file extension is supported by ASSIMP. @@ -527,7 +553,7 @@ public: * Must include a trailing dot '.'. Example: ".3ds", ".md3". * Cases-insensitive. * @return true if the extension is supported, false otherwise */ - bool IsExtensionSupported(const char* szExtension) const; + bool IsExtensionSupported(const char *szExtension) const; // ------------------------------------------------------------------- /** @brief Returns whether a given file extension is supported by ASSIMP. @@ -535,7 +561,7 @@ public: * This function is provided for backward compatibility. * See the const char* version for detailed and up-to-date docs. * @see IsExtensionSupported(const char*) */ - inline bool IsExtensionSupported(const std::string& szExtension) const; + inline bool IsExtensionSupported(const std::string &szExtension) const; // ------------------------------------------------------------------- /** Get a full list of all file extensions supported by ASSIMP. @@ -547,7 +573,7 @@ public: * @param szOut String to receive the extension list. * Format of the list: "*.3ds;*.obj;*.dae". This is useful for * use with the WinAPI call GetOpenFileName(Ex). */ - void GetExtensionList(aiString& szOut) const; + void GetExtensionList(aiString &szOut) const; // ------------------------------------------------------------------- /** @brief Get a full list of all file extensions supported by ASSIMP. @@ -555,7 +581,7 @@ public: * This function is provided for backward compatibility. * See the aiString version for detailed and up-to-date docs. * @see GetExtensionList(aiString&)*/ - inline void GetExtensionList(std::string& szOut) const; + inline void GetExtensionList(std::string &szOut) const; // ------------------------------------------------------------------- /** Get the number of importers currently registered with Assimp. */ @@ -566,18 +592,18 @@ public: * * For the declaration of #aiImporterDesc, include . * @param index Index to query, must be within [0,GetImporterCount()) - * @return Importer meta data structure, NULL if the index does not + * @return Importer meta data structure, nullptr if the index does not * exist or if the importer doesn't offer meta information ( * importers may do this at the cost of being hated by their peers).*/ - const aiImporterDesc* GetImporterInfo(size_t index) const; + const aiImporterDesc *GetImporterInfo(size_t index) const; // ------------------------------------------------------------------- /** Find the importer corresponding to a specific index. * * @param index Index to query, must be within [0,GetImporterCount()) - * @return Importer instance. NULL if the index does not + * @return Importer instance. nullptr if the index does not * exist. */ - BaseImporter* GetImporter(size_t index) const; + BaseImporter *GetImporter(size_t index) const; // ------------------------------------------------------------------- /** Find the importer corresponding to a specific file extension. @@ -588,8 +614,8 @@ public: * are recognized (BAH being the file extension): "BAH" (comparison * is case-insensitive), ".bah", "*.bah" (wild card and dot * characters at the beginning of the extension are skipped). - * @return NULL if no importer is found*/ - BaseImporter* GetImporter (const char* szExtension) const; + * @return nullptr if no importer is found*/ + BaseImporter *GetImporter(const char *szExtension) const; // ------------------------------------------------------------------- /** Find the importer index corresponding to a specific file extension. @@ -599,7 +625,7 @@ public: * is case-insensitive), ".bah", "*.bah" (wild card and dot * characters at the beginning of the extension are skipped). * @return (size_t)-1 if no importer is found */ - size_t GetImporterIndex (const char* szExtension) const; + size_t GetImporterIndex(const char *szExtension) const; // ------------------------------------------------------------------- /** Returns the storage allocated by ASSIMP to hold the scene data @@ -610,7 +636,7 @@ public: * @note The returned memory statistics refer to the actual * size of the use data of the aiScene. Heap-related overhead * is (naturally) not included.*/ - void GetMemoryRequirements(aiMemoryInfo& in) const; + void GetMemoryRequirements(aiMemoryInfo &in) const; // ------------------------------------------------------------------- /** Enables "extra verbose" mode. @@ -623,16 +649,14 @@ public: // ------------------------------------------------------------------- /** Private, do not use. */ - ImporterPimpl* Pimpl() { return pimpl; } - const ImporterPimpl* Pimpl() const { return pimpl; } + ImporterPimpl *Pimpl() { return pimpl; } + const ImporterPimpl *Pimpl() const { return pimpl; } protected: - // Just because we don't want you to know how we're hacking around. - ImporterPimpl* pimpl; + ImporterPimpl *pimpl; }; //! class Importer - // ---------------------------------------------------------------------------- // For compatibility, the interface of some functions taking a std::string was // changed to const char* to avoid crashes between binary incompatible STL @@ -640,20 +664,20 @@ protected: // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- -AI_FORCE_INLINE const aiScene* Importer::ReadFile( const std::string& pFile,unsigned int pFlags){ - return ReadFile(pFile.c_str(),pFlags); +AI_FORCE_INLINE const aiScene *Importer::ReadFile(const std::string &pFile, unsigned int pFlags) { + return ReadFile(pFile.c_str(), pFlags); } // ---------------------------------------------------------------------------- -AI_FORCE_INLINE void Importer::GetExtensionList(std::string& szOut) const { +AI_FORCE_INLINE void Importer::GetExtensionList(std::string &szOut) const { aiString s; GetExtensionList(s); szOut = s.data; } // ---------------------------------------------------------------------------- -AI_FORCE_INLINE bool Importer::IsExtensionSupported(const std::string& szExtension) const { +AI_FORCE_INLINE bool Importer::IsExtensionSupported(const std::string &szExtension) const { return IsExtensionSupported(szExtension.c_str()); } -} // !namespace Assimp +} // namespace Assimp #endif // AI_ASSIMP_HPP_INC diff --git a/Source/ThirdParty/assimp/LICENSE b/Source/ThirdParty/assimp/LICENSE index 262606aff..acaaf016e 100644 --- a/Source/ThirdParty/assimp/LICENSE +++ b/Source/ThirdParty/assimp/LICENSE @@ -1,6 +1,6 @@ Open Asset Import Library (assimp) -Copyright (c) 2006-2016, assimp team +Copyright (c) 2006-2021, assimp team All rights reserved. Redistribution and use of this software in source and binary forms, diff --git a/Source/ThirdParty/assimp/LineSplitter.h b/Source/ThirdParty/assimp/LineSplitter.h index 4afe45b92..635349dc0 100644 --- a/Source/ThirdParty/assimp/LineSplitter.h +++ b/Source/ThirdParty/assimp/LineSplitter.h @@ -2,8 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2019, assimp team - +Copyright (c) 2006-2024, assimp team All rights reserved. @@ -48,9 +47,13 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef INCLUDED_LINE_SPLITTER_H #define INCLUDED_LINE_SPLITTER_H +#ifdef __GNUC__ +# pragma GCC system_header +#endif + #include -#include "StreamReader.h" -#include "ParsingUtils.h" +#include +#include namespace Assimp { @@ -68,7 +71,7 @@ for(LineSplitter splitter(stream);splitter;++splitter) { if (strtol(splitter[2]) > 5) { .. } } - std::cout << "Current line is: " << splitter.get_index() << std::endl; + ASSIMP_LOG_VERBOSE_DEBUG("Current line is: ", splitter.get_index()); } @endcode */ @@ -83,7 +86,7 @@ public: */ LineSplitter(StreamReaderLE& stream, bool skip_empty_lines = true, bool trim = true); - ~LineSplitter(); + ~LineSplitter() = default; // ----------------------------------------- /** pseudo-iterator increment */ @@ -107,6 +110,8 @@ public: std::string operator* () const; + const char *getEnd() const; + // ----------------------------------------- /** boolean context */ operator bool() const; @@ -136,30 +141,26 @@ public: private: line_idx mIdx; std::string mCur; + const char *mEnd; StreamReaderLE& mStream; bool mSwallow, mSkip_empty_lines, mTrim; }; -inline -LineSplitter::LineSplitter(StreamReaderLE& stream, bool skip_empty_lines, bool trim ) -: mIdx(0) -, mCur() -, mStream(stream) -, mSwallow() -, mSkip_empty_lines(skip_empty_lines) -, mTrim(trim) { +AI_FORCE_INLINE LineSplitter::LineSplitter(StreamReaderLE& stream, bool skip_empty_lines, bool trim ) : + mIdx(0), + mCur(), + mEnd(nullptr), + mStream(stream), + mSwallow(), + mSkip_empty_lines(skip_empty_lines), + mTrim(trim) { mCur.reserve(1024); + mEnd = mCur.c_str() + 1024; operator++(); mIdx = 0; } -inline -LineSplitter::~LineSplitter() { - // empty -} - -inline -LineSplitter& LineSplitter::operator++() { +AI_FORCE_INLINE LineSplitter& LineSplitter::operator++() { if (mSwallow) { mSwallow = false; return *this; @@ -199,34 +200,30 @@ LineSplitter& LineSplitter::operator++() { return *this; } -inline -LineSplitter &LineSplitter::operator++(int) { +AI_FORCE_INLINE LineSplitter &LineSplitter::operator++(int) { return ++(*this); } -inline -const char *LineSplitter::operator[] (size_t idx) const { +AI_FORCE_INLINE const char *LineSplitter::operator[] (size_t idx) const { const char* s = operator->()->c_str(); - SkipSpaces(&s); + SkipSpaces(&s, mEnd); for (size_t i = 0; i < idx; ++i) { - for (; !IsSpace(*s); ++s) { if (IsLineEnd(*s)) { throw std::range_error("Token index out of range, EOL reached"); } } - SkipSpaces(&s); + SkipSpaces(&s, mEnd); } return s; } template -inline -void LineSplitter::get_tokens(const char* (&tokens)[N]) const { +AI_FORCE_INLINE void LineSplitter::get_tokens(const char* (&tokens)[N]) const { const char* s = operator->()->c_str(); - SkipSpaces(&s); + SkipSpaces(&s, mEnd); for (size_t i = 0; i < N; ++i) { if (IsLineEnd(*s)) { throw std::range_error("Token count out of range, EOL reached"); @@ -234,49 +231,45 @@ void LineSplitter::get_tokens(const char* (&tokens)[N]) const { tokens[i] = s; for (; *s && !IsSpace(*s); ++s); - SkipSpaces(&s); + SkipSpaces(&s, mEnd); } } -inline -const std::string* LineSplitter::operator -> () const { +AI_FORCE_INLINE const std::string* LineSplitter::operator -> () const { return &mCur; } -inline -std::string LineSplitter::operator* () const { +AI_FORCE_INLINE std::string LineSplitter::operator* () const { return mCur; } -inline -LineSplitter::operator bool() const { +AI_FORCE_INLINE const char* LineSplitter::getEnd() const { + return mEnd; +} + +AI_FORCE_INLINE LineSplitter::operator bool() const { return mStream.GetRemainingSize() > 0; } -inline -LineSplitter::operator line_idx() const { +AI_FORCE_INLINE LineSplitter::operator line_idx() const { return mIdx; } -inline -LineSplitter::line_idx LineSplitter::get_index() const { +AI_FORCE_INLINE LineSplitter::line_idx LineSplitter::get_index() const { return mIdx; } -inline -StreamReaderLE &LineSplitter::get_stream() { +AI_FORCE_INLINE StreamReaderLE &LineSplitter::get_stream() { return mStream; } -inline -bool LineSplitter::match_start(const char* check) { +AI_FORCE_INLINE bool LineSplitter::match_start(const char* check) { const size_t len = ::strlen(check); return len <= mCur.length() && std::equal(check, check + len, mCur.begin()); } -inline -void LineSplitter::swallow_next_increment() { +AI_FORCE_INLINE void LineSplitter::swallow_next_increment() { mSwallow = true; } diff --git a/Source/ThirdParty/assimp/LogAux.h b/Source/ThirdParty/assimp/LogAux.h index 558485272..20a7564b8 100644 --- a/Source/ThirdParty/assimp/LogAux.h +++ b/Source/ThirdParty/assimp/LogAux.h @@ -2,8 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2019, assimp team - +Copyright (c) 2006-2024, assimp team All rights reserved. @@ -43,89 +42,76 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /** @file LogAux.h * @brief Common logging usage patterns for importer implementations */ +#pragma once #ifndef INCLUDED_AI_LOGAUX_H #define INCLUDED_AI_LOGAUX_H +#ifdef __GNUC__ +# pragma GCC system_header +#endif + #include #include #include namespace Assimp { +/// @brief Logger class, which will extend the class by log-functions. +/// @tparam TDeriving template class LogFunctions { public: // ------------------------------------------------------------------------------------------------ - static void ThrowException(const std::string& msg) + template + static void ThrowException(T&&... args) { - throw DeadlyImportError(Prefix()+msg); + throw DeadlyImportError(Prefix(), std::forward(args)...); } // ------------------------------------------------------------------------------------------------ - static void LogWarn(const Formatter::format& message) { + template + static void LogWarn(T&&... args) { if (!DefaultLogger::isNullLogger()) { - ASSIMP_LOG_WARN(Prefix()+(std::string)message); + ASSIMP_LOG_WARN(Prefix(), std::forward(args)...); } } // ------------------------------------------------------------------------------------------------ - static void LogError(const Formatter::format& message) { + template + static void LogError(T&&... args) { if (!DefaultLogger::isNullLogger()) { - ASSIMP_LOG_ERROR(Prefix()+(std::string)message); + ASSIMP_LOG_ERROR(Prefix(), std::forward(args)...); } } // ------------------------------------------------------------------------------------------------ - static void LogInfo(const Formatter::format& message) { + template + static void LogInfo(T&&... args) { if (!DefaultLogger::isNullLogger()) { - ASSIMP_LOG_INFO(Prefix()+(std::string)message); + ASSIMP_LOG_INFO(Prefix(), std::forward(args)...); } } // ------------------------------------------------------------------------------------------------ - static void LogDebug(const Formatter::format& message) { + template + static void LogDebug(T&&... args) { if (!DefaultLogger::isNullLogger()) { - ASSIMP_LOG_DEBUG(Prefix()+(std::string)message); - } - } - - // https://sourceforge.net/tracker/?func=detail&atid=1067632&aid=3358562&group_id=226462 -#if !defined(__GNUC__) || !defined(__APPLE__) || __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6) - - // ------------------------------------------------------------------------------------------------ - static void LogWarn (const char* message) { - if (!DefaultLogger::isNullLogger()) { - LogWarn(Formatter::format(message)); + ASSIMP_LOG_DEBUG(Prefix(), std::forward(args)...); } } // ------------------------------------------------------------------------------------------------ - static void LogError (const char* message) { + template + static void LogVerboseDebug(T&&... args) { if (!DefaultLogger::isNullLogger()) { - LogError(Formatter::format(message)); + ASSIMP_LOG_VERBOSE_DEBUG(Prefix(), std::forward(args)...); } } - // ------------------------------------------------------------------------------------------------ - static void LogInfo (const char* message) { - if (!DefaultLogger::isNullLogger()) { - LogInfo(Formatter::format(message)); - } - } - - // ------------------------------------------------------------------------------------------------ - static void LogDebug (const char* message) { - if (!DefaultLogger::isNullLogger()) { - LogDebug(Formatter::format(message)); - } - } - -#endif - private: static const char* Prefix(); - }; + } // ! Assimp -#endif +#endif // INCLUDED_AI_LOGAUX_H diff --git a/Source/ThirdParty/assimp/LogStream.hpp b/Source/ThirdParty/assimp/LogStream.hpp index d0281e2d0..2d9f1d350 100644 --- a/Source/ThirdParty/assimp/LogStream.hpp +++ b/Source/ThirdParty/assimp/LogStream.hpp @@ -2,8 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2019, assimp team - +Copyright (c) 2006-2024, assimp team All rights reserved. @@ -43,12 +42,17 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /** @file LogStream.hpp * @brief Abstract base class 'LogStream', representing an output log stream. */ +#pragma once #ifndef INCLUDED_AI_LOGSTREAM_H #define INCLUDED_AI_LOGSTREAM_H +#ifdef __GNUC__ +#pragma GCC system_header +#endif + #include "types.h" -namespace Assimp { +namespace Assimp { class IOSystem; @@ -60,7 +64,7 @@ class IOSystem; * are not enough for your purpose. */ class ASSIMP_API LogStream #ifndef SWIG - : public Intern::AllocateFromAssimpHeap + : public Intern::AllocateFromAssimpHeap #endif { protected: @@ -80,32 +84,25 @@ public: * #DefaultLogger:set(). Usually you can *expect* that a log message * is exactly one line and terminated with a single \n character. * @param message Message to be written */ - virtual void write(const char* message) = 0; + virtual void write(const char *message) = 0; // ------------------------------------------------------------------- /** @brief Creates a default log stream * @param streams Type of the default stream * @param name For aiDefaultLogStream_FILE: name of the output file * @param io For aiDefaultLogStream_FILE: IOSystem to be used to open the output - * file. Pass NULL for the default implementation. + * file. Pass nullptr for the default implementation. * @return New LogStream instance. */ - static LogStream* createDefaultStream(aiDefaultLogStream stream, - const char* name = "AssimpLog.txt", - IOSystem* io = nullptr ); + static LogStream *createDefaultStream(aiDefaultLogStream stream, + const char *name = "AssimpLog.txt", + IOSystem *io = nullptr); }; // !class LogStream -inline -LogStream::LogStream() AI_NO_EXCEPT { - // empty -} +inline LogStream::LogStream() AI_NO_EXCEPT = default; -inline -LogStream::~LogStream() { - // empty -} +inline LogStream::~LogStream() = default; -// ------------------------------------------------------------------------------------ } // Namespace Assimp -#endif +#endif // INCLUDED_AI_LOGSTREAM_H diff --git a/Source/ThirdParty/assimp/Logger.hpp b/Source/ThirdParty/assimp/Logger.hpp index 89cade6c3..0051153e2 100644 --- a/Source/ThirdParty/assimp/Logger.hpp +++ b/Source/ThirdParty/assimp/Logger.hpp @@ -2,8 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2019, assimp team - +Copyright (c) 2006-2024, assimp team All rights reserved. @@ -43,6 +42,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /** @file Logger.hpp * @brief Abstract base class 'Logger', base of the logging system. */ +#pragma once #ifndef INCLUDED_AI_LOGGER_H #define INCLUDED_AI_LOGGER_H @@ -73,8 +73,9 @@ public: * @brief Log severity to describe the granularity of logging. */ enum LogSeverity { - NORMAL, //!< Normal granularity of logging - VERBOSE //!< Debug infos will be logged, too + NORMAL, ///< Normal granularity of logging + DEBUGGING, ///< Debug messages will be logged, but not verbose debug messages. + VERBOSE ///< All messages will be logged }; // ---------------------------------------------------------------------- @@ -92,34 +93,58 @@ public: Err = 8 //!< Error log message }; -public: - /** @brief Virtual destructor */ virtual ~Logger(); // ---------------------------------------------------------------------- /** @brief Writes a debug message - * @param message Debug message*/ + * @param message Debug message*/ void debug(const char* message); - void debug(const std::string &message); + + template + void debug(T&&... args) { + debug(formatMessage(std::forward(args)...).c_str()); + } + + // ---------------------------------------------------------------------- + /** @brief Writes a debug message + * @param message Debug message*/ + void verboseDebug(const char* message); + + template + void verboseDebug(T&&... args) { + verboseDebug(formatMessage(std::forward(args)...).c_str()); + } // ---------------------------------------------------------------------- /** @brief Writes a info message * @param message Info message*/ void info(const char* message); - void info(const std::string &message); + + template + void info(T&&... args) { + info(formatMessage(std::forward(args)...).c_str()); + } // ---------------------------------------------------------------------- /** @brief Writes a warning message * @param message Warn message*/ void warn(const char* message); - void warn(const std::string &message); + + template + void warn(T&&... args) { + warn(formatMessage(std::forward(args)...).c_str()); + } // ---------------------------------------------------------------------- /** @brief Writes an error message * @param message Error message*/ void error(const char* message); - void error(const std::string &message); + + template + void error(T&&... args) { + error(formatMessage(std::forward(args)...).c_str()); + } // ---------------------------------------------------------------------- /** @brief Set a new log severity. @@ -154,7 +179,7 @@ public: * if the result is 0 the stream is detached from the Logger and * the caller retakes the possession of the stream. * @return true if the stream has been detached, false otherwise.*/ - virtual bool detatchStream(LogStream *pStream, + virtual bool detachStream(LogStream *pStream, unsigned int severity = Debugging | Err | Warn | Info) = 0; protected: @@ -178,6 +203,16 @@ protected: */ virtual void OnDebug(const char* message)= 0; + // ---------------------------------------------------------------------- + /** + * @brief Called as a request to write a specific verbose debug message + * @param message Debug message. Never longer than + * MAX_LOG_MESSAGE_LENGTH characters (excluding the '0'). + * @note The message string is only valid until the scope of + * the function is left. + */ + virtual void OnVerboseDebug(const char *message) = 0; + // ---------------------------------------------------------------------- /** * @brief Called as a request to write a specific info message @@ -207,99 +242,62 @@ protected: * the function is left. */ virtual void OnError(const char* message) = 0; +protected: + std::string formatMessage(Assimp::Formatter::format f) { + return f; + } + + template + std::string formatMessage(Assimp::Formatter::format f, U&& u, T&&... args) { + return formatMessage(std::move(f << std::forward(u)), std::forward(args)...); + } protected: LogSeverity m_Severity; }; // ---------------------------------------------------------------------------------- -// Default constructor -inline -Logger::Logger() AI_NO_EXCEPT -: m_Severity(NORMAL) { +inline Logger::Logger() AI_NO_EXCEPT : + m_Severity(NORMAL) { // empty } // ---------------------------------------------------------------------------------- -// Virtual destructor -inline -Logger::~Logger() { +inline Logger::~Logger() = default; + +// ---------------------------------------------------------------------------------- +inline Logger::Logger(LogSeverity severity) : + m_Severity(severity) { // empty } // ---------------------------------------------------------------------------------- -// Construction with given logging severity -inline -Logger::Logger(LogSeverity severity) -: m_Severity(severity) { - // empty -} - -// ---------------------------------------------------------------------------------- -// Log severity setter -inline -void Logger::setLogSeverity(LogSeverity log_severity){ +inline void Logger::setLogSeverity(LogSeverity log_severity){ m_Severity = log_severity; } // ---------------------------------------------------------------------------------- // Log severity getter -inline -Logger::LogSeverity Logger::getLogSeverity() const { +inline Logger::LogSeverity Logger::getLogSeverity() const { return m_Severity; } -// ---------------------------------------------------------------------------------- -inline -void Logger::debug(const std::string &message) { - return debug(message.c_str()); -} - -// ---------------------------------------------------------------------------------- -inline -void Logger::error(const std::string &message) { - return error(message.c_str()); -} - -// ---------------------------------------------------------------------------------- -inline -void Logger::warn(const std::string &message) { - return warn(message.c_str()); -} - -// ---------------------------------------------------------------------------------- -inline -void Logger::info(const std::string &message) { - return info(message.c_str()); -} - -// ------------------------------------------------------------------------------------------------ -#define ASSIMP_LOG_WARN_F(string,...)\ - DefaultLogger::get()->warn((Formatter::format(string),__VA_ARGS__)) - -#define ASSIMP_LOG_ERROR_F(string,...)\ - DefaultLogger::get()->error((Formatter::format(string),__VA_ARGS__)) - -#define ASSIMP_LOG_DEBUG_F(string,...)\ - DefaultLogger::get()->debug((Formatter::format(string),__VA_ARGS__)) - -#define ASSIMP_LOG_INFO_F(string,...)\ - DefaultLogger::get()->info((Formatter::format(string),__VA_ARGS__)) - - -#define ASSIMP_LOG_WARN(string)\ - DefaultLogger::get()->warn(string) - -#define ASSIMP_LOG_ERROR(string)\ - DefaultLogger::get()->error(string) - -#define ASSIMP_LOG_DEBUG(string)\ - DefaultLogger::get()->debug(string) - -#define ASSIMP_LOG_INFO(string)\ - DefaultLogger::get()->info(string) - - } // Namespace Assimp +// ------------------------------------------------------------------------------------------------ +#define ASSIMP_LOG_WARN(...) \ + Assimp::DefaultLogger::get()->warn(__VA_ARGS__) + +#define ASSIMP_LOG_ERROR(...) \ + Assimp::DefaultLogger::get()->error(__VA_ARGS__) + +#define ASSIMP_LOG_DEBUG(...) \ + Assimp::DefaultLogger::get()->debug(__VA_ARGS__) + +#define ASSIMP_LOG_VERBOSE_DEBUG(...) \ + Assimp::DefaultLogger::get()->verboseDebug(__VA_ARGS__) + +#define ASSIMP_LOG_INFO(...) \ + Assimp::DefaultLogger::get()->info(__VA_ARGS__) + #endif // !! INCLUDED_AI_LOGGER_H diff --git a/Source/ThirdParty/assimp/MathFunctions.h b/Source/ThirdParty/assimp/MathFunctions.h index cb3b69607..eaa8b4ac4 100644 --- a/Source/ThirdParty/assimp/MathFunctions.h +++ b/Source/ThirdParty/assimp/MathFunctions.h @@ -3,7 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2016, assimp team +Copyright (c) 2006-2024, assimp team All rights reserved. @@ -39,39 +39,67 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --------------------------------------------------------------------------- */ +#pragma once + +#ifdef __GNUC__ +# pragma GCC system_header +#endif + /** @file MathFunctions.h - * @brief Implementation of the math functions (gcd and lcm) +* @brief Implementation of math utility functions. * - * Copied from BoostWorkaround/math - */ +*/ + +#include namespace Assimp { namespace Math { -// TODO: use binary GCD for unsigned integers .... -template < typename IntegerType > -IntegerType gcd( IntegerType a, IntegerType b ) -{ +/// @brief Will return the greatest common divisor. +/// @param a [in] Value a. +/// @param b [in] Value b. +/// @return The greatest common divisor. +template +inline IntegerType gcd( IntegerType a, IntegerType b ) { const IntegerType zero = (IntegerType)0; - while ( true ) - { - if ( a == zero ) + while ( true ) { + if ( a == zero ) { return b; + } b %= a; - if ( b == zero ) + if ( b == zero ) { return a; + } a %= b; } } +/// @brief Will return the greatest common divisor. +/// @param a [in] Value a. +/// @param b [in] Value b. +/// @return The greatest common divisor. template < typename IntegerType > -IntegerType lcm( IntegerType a, IntegerType b ) -{ +inline IntegerType lcm( IntegerType a, IntegerType b ) { const IntegerType t = gcd (a,b); - if (!t)return t; + if (!t) { + return t; + } return a / t * b; } +/// @brief Will return the smallest epsilon-value for the requested type. +/// @return The numercical limit epsilon depending on its type. +template +inline T getEpsilon() { + return std::numeric_limits::epsilon(); +} +/// @brief Will return the constant PI for the requested type. +/// @return Pi +template +inline T aiPi() { + return static_cast(3.14159265358979323846); } -} + +} // namespace Math +} // namespace Assimp diff --git a/Source/ThirdParty/assimp/MemoryIOWrapper.h b/Source/ThirdParty/assimp/MemoryIOWrapper.h index c52278718..ef06af273 100644 --- a/Source/ThirdParty/assimp/MemoryIOWrapper.h +++ b/Source/ThirdParty/assimp/MemoryIOWrapper.h @@ -2,8 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2019, assimp team - +Copyright (c) 2006-2024, assimp team All rights reserved. @@ -41,17 +40,23 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** @file MemoryIOWrapper.h - * Handy IOStream/IOSystem implemetation to read directly from a memory buffer */ + * Handy IOStream/IOSystem implementation to read directly from a memory buffer */ +#pragma once #ifndef AI_MEMORYIOSTREAM_H_INC #define AI_MEMORYIOSTREAM_H_INC +#ifdef __GNUC__ +# pragma GCC system_header +#endif + #include #include #include + #include namespace Assimp { - + #define AI_MEMORYIO_MAGIC_FILENAME "$$$___magic___$$$" #define AI_MEMORYIO_MAGIC_FILENAME_LENGTH 17 @@ -60,26 +65,24 @@ namespace Assimp { // ---------------------------------------------------------------------------------- class MemoryIOStream : public IOStream { public: - MemoryIOStream (const uint8_t* buff, size_t len, bool own = false) - : buffer (buff) - , length(len) - , pos((size_t)0) - , own(own) { + MemoryIOStream (const uint8_t* buff, size_t len, bool own = false) : + buffer (buff), + length(len), + pos(static_cast(0)), + own(own) { // empty } - ~MemoryIOStream () { + ~MemoryIOStream() override { if(own) { delete[] buffer; } } - // ------------------------------------------------------------------- - // Read from stream - size_t Read(void* pvBuffer, size_t pSize, size_t pCount) { + size_t Read(void* pvBuffer, size_t pSize, size_t pCount) override { ai_assert(nullptr != pvBuffer); ai_assert(0 != pSize); - + const size_t cnt = std::min( pCount, (length-pos) / pSize); const size_t ofs = pSize * cnt; @@ -89,16 +92,12 @@ public: return cnt; } - // ------------------------------------------------------------------- - // Write to stream - size_t Write(const void* /*pvBuffer*/, size_t /*pSize*/,size_t /*pCount*/) { + size_t Write(const void*, size_t, size_t ) override { ai_assert(false); // won't be needed return 0; } - // ------------------------------------------------------------------- - // Seek specific position - aiReturn Seek(size_t pOffset, aiOrigin pOrigin) { + aiReturn Seek(size_t pOffset, aiOrigin pOrigin) override { if (aiOrigin_SET == pOrigin) { if (pOffset > length) { return AI_FAILURE; @@ -118,21 +117,15 @@ public: return AI_SUCCESS; } - // ------------------------------------------------------------------- - // Get current seek position - size_t Tell() const { + size_t Tell() const override { return pos; } - // ------------------------------------------------------------------- - // Get size of file - size_t FileSize() const { + size_t FileSize() const override { return length; } - // ------------------------------------------------------------------- - // Flush file contents - void Flush() { + void Flush() override{ ai_assert(false); // won't be needed } @@ -143,24 +136,19 @@ private: }; // --------------------------------------------------------------------------- -/** Dummy IO system to read from a memory buffer */ +/// @brief Dummy IO system to read from a memory buffer. class MemoryIOSystem : public IOSystem { public: - /** Constructor. */ - MemoryIOSystem(const uint8_t* buff, size_t len, IOSystem* io) - : buffer(buff) - , length(len) - , existing_io(io) - , created_streams() { + /// @brief Constructor. + MemoryIOSystem(const uint8_t* buff, size_t len, IOSystem* io) : buffer(buff), length(len), existing_io(io) { // empty } - /** Destructor. */ - ~MemoryIOSystem() { - } + /// @brief Destructor. + ~MemoryIOSystem() override = default; // ------------------------------------------------------------------- - /** Tests for the existence of a file at the given path. */ + /// @brief Tests for the existence of a file at the given path. bool Exists(const char* pFile) const override { if (0 == strncmp( pFile, AI_MEMORYIO_MAGIC_FILENAME, AI_MEMORYIO_MAGIC_FILENAME_LENGTH ) ) { return true; @@ -169,24 +157,24 @@ public: } // ------------------------------------------------------------------- - /** Returns the directory separator. */ + /// @brief Returns the directory separator. char getOsSeparator() const override { return existing_io ? existing_io->getOsSeparator() : '/'; // why not? it doesn't care } // ------------------------------------------------------------------- - /** Open a new file with a given path. */ + /// @brief Open a new file with a given path. IOStream* Open(const char* pFile, const char* pMode = "rb") override { if ( 0 == strncmp( pFile, AI_MEMORYIO_MAGIC_FILENAME, AI_MEMORYIO_MAGIC_FILENAME_LENGTH ) ) { created_streams.emplace_back(new MemoryIOStream(buffer, length)); return created_streams.back(); } - return existing_io ? existing_io->Open(pFile, pMode) : NULL; + return existing_io ? existing_io->Open(pFile, pMode) : nullptr; } // ------------------------------------------------------------------- - /** Closes the given file and releases all resources associated with it. */ + /// @brief Closes the given file and releases all resources associated with it. void Close( IOStream* pFile) override { auto it = std::find(created_streams.begin(), created_streams.end(), pFile); if (it != created_streams.end()) { @@ -198,36 +186,43 @@ public: } // ------------------------------------------------------------------- - /** Compare two paths */ + /// @brief Compare two paths bool ComparePaths(const char* one, const char* second) const override { return existing_io ? existing_io->ComparePaths(one, second) : false; } - bool PushDirectory( const std::string &path ) override { + /// @brief Will push the directory. + bool PushDirectory( const std::string &path ) override { return existing_io ? existing_io->PushDirectory(path) : false; } + /// @brief Will return the current directory from the stack top. const std::string &CurrentDirectory() const override { static std::string empty; return existing_io ? existing_io->CurrentDirectory() : empty; } + /// @brief Returns the stack size. size_t StackSize() const override { return existing_io ? existing_io->StackSize() : 0; } + /// @brief Will pop the upper directory. bool PopDirectory() override { return existing_io ? existing_io->PopDirectory() : false; } + /// @brief Will create the directory. bool CreateDirectory( const std::string &path ) override { return existing_io ? existing_io->CreateDirectory(path) : false; } + /// @brief Will change the directory. bool ChangeDirectory( const std::string &path ) override { return existing_io ? existing_io->ChangeDirectory(path) : false; } + /// @brief Will delete the file. bool DeleteFile( const std::string &file ) override { return existing_io ? existing_io->DeleteFile(file) : false; } @@ -241,4 +236,4 @@ private: } // end namespace Assimp -#endif +#endif // AI_MEMORYIOSTREAM_H_INC diff --git a/Source/ThirdParty/assimp/NullLogger.hpp b/Source/ThirdParty/assimp/NullLogger.hpp index c45d01bd4..552bcf66a 100644 --- a/Source/ThirdParty/assimp/NullLogger.hpp +++ b/Source/ThirdParty/assimp/NullLogger.hpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2019, assimp team +Copyright (c) 2006-2024, assimp team All rights reserved. @@ -44,9 +44,14 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * @brief Dummy logger */ +#pragma once #ifndef INCLUDED_AI_NULLLOGGER_H #define INCLUDED_AI_NULLLOGGER_H +#ifdef __GNUC__ +#pragma GCC system_header +#endif + #include "Logger.hpp" namespace Assimp { @@ -66,6 +71,11 @@ public: (void)message; //this avoids compiler warnings } + /** @brief Logs a verbose debug message */ + void OnVerboseDebug(const char *message) { + (void)message; //this avoids compiler warnings + } + /** @brief Logs an info message */ void OnInfo(const char* message) { (void)message; //this avoids compiler warnings @@ -88,7 +98,7 @@ public: } /** @brief Detach a still attached stream from logger */ - bool detatchStream(LogStream *pStream, unsigned int severity) { + bool detachStream(LogStream *pStream, unsigned int severity) { (void)pStream; (void)severity; //this avoids compiler warnings return false; } diff --git a/Source/ThirdParty/assimp/ObjMaterial.h b/Source/ThirdParty/assimp/ObjMaterial.h new file mode 100644 index 000000000..21087ebcb --- /dev/null +++ b/Source/ThirdParty/assimp/ObjMaterial.h @@ -0,0 +1,84 @@ +/* +--------------------------------------------------------------------------- +Open Asset Import Library (assimp) +--------------------------------------------------------------------------- + +Copyright (c) 2006-2024, assimp team + +All rights reserved. + +Redistribution and use of this software in source and binary forms, +with or without modification, are permitted provided that the following +conditions are met: + +* Redistributions of source code must retain the above + copyright notice, this list of conditions and the + following disclaimer. + +* Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the + following disclaimer in the documentation and/or other + materials provided with the distribution. + +* Neither the name of the assimp team, nor the names of its + contributors may be used to endorse or promote products + derived from this software without specific prior + written permission of the assimp team. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(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 OBJMATERIAL.h + * @brief Obj-specific material macros + * + */ + +#ifndef AI_OBJMATERIAL_H_INC +#define AI_OBJMATERIAL_H_INC + +#ifdef __GNUC__ +# pragma GCC system_header +#endif + +#include + +// --------------------------------------------------------------------------- + +// the original illum property +#define AI_MATKEY_OBJ_ILLUM "$mat.illum", 0, 0 + +// --------------------------------------------------------------------------- + +// --------------------------------------------------------------------------- +// Pure key names for all obj texture-related properties +//! @cond MATS_DOC_FULL + +// support for bump -bm +#define _AI_MATKEY_OBJ_BUMPMULT_BASE "$tex.bumpmult" +//! @endcond + +// --------------------------------------------------------------------------- +#define AI_MATKEY_OBJ_BUMPMULT(type, N) _AI_MATKEY_OBJ_BUMPMULT_BASE, type, N + +//! @cond MATS_DOC_FULL +#define AI_MATKEY_OBJ_BUMPMULT_NORMALS(N) \ + AI_MATKEY_OBJ_BUMPMULT(aiTextureType_NORMALS, N) + +#define AI_MATKEY_OBJ_BUMPMULT_HEIGHT(N) \ + AI_MATKEY_OBJ_BUMPMULT(aiTextureType_HEIGHT, N) + +//! @endcond + + +#endif diff --git a/Source/ThirdParty/assimp/ParsingUtils.h b/Source/ThirdParty/assimp/ParsingUtils.h index ca30ce13b..e0ee2d77c 100644 --- a/Source/ThirdParty/assimp/ParsingUtils.h +++ b/Source/ThirdParty/assimp/ParsingUtils.h @@ -2,8 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2019, assimp team - +Copyright (c) 2006-2024, assimp team All rights reserved. @@ -40,17 +39,24 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ---------------------------------------------------------------------- */ - /** @file ParsingUtils.h * @brief Defines helper functions for text parsing */ +#pragma once #ifndef AI_PARSING_UTILS_H_INC #define AI_PARSING_UTILS_H_INC -#include "StringComparison.h" -#include "StringUtils.h" +#ifdef __GNUC__ +#pragma GCC system_header +#endif + +#include +#include #include +#include +#include + namespace Assimp { // NOTE: the functions below are mostly intended as replacement for @@ -66,58 +72,38 @@ static const unsigned int BufferSize = 4096; // --------------------------------------------------------------------------------- template -AI_FORCE_INLINE -char_t ToLower( char_t in ) { - return (in >= (char_t)'A' && in <= (char_t)'Z') ? (char_t)(in+0x20) : in; -} - -// --------------------------------------------------------------------------------- -template -AI_FORCE_INLINE -char_t ToUpper( char_t in) { - return (in >= (char_t)'a' && in <= (char_t)'z') ? (char_t)(in-0x20) : in; -} - -// --------------------------------------------------------------------------------- -template -AI_FORCE_INLINE -bool IsUpper( char_t in) { +AI_FORCE_INLINE bool IsUpper(char_t in) { return (in >= (char_t)'A' && in <= (char_t)'Z'); } // --------------------------------------------------------------------------------- template -AI_FORCE_INLINE -bool IsLower( char_t in) { +AI_FORCE_INLINE bool IsLower(char_t in) { return (in >= (char_t)'a' && in <= (char_t)'z'); } // --------------------------------------------------------------------------------- template -AI_FORCE_INLINE -bool IsSpace( char_t in) { +AI_FORCE_INLINE bool IsSpace(char_t in) { return (in == (char_t)' ' || in == (char_t)'\t'); } // --------------------------------------------------------------------------------- template -AI_FORCE_INLINE -bool IsLineEnd( char_t in) { - return (in==(char_t)'\r'||in==(char_t)'\n'||in==(char_t)'\0'||in==(char_t)'\f'); +AI_FORCE_INLINE bool IsLineEnd(char_t in) { + return (in == (char_t)'\r' || in == (char_t)'\n' || in == (char_t)'\0' || in == (char_t)'\f'); } // --------------------------------------------------------------------------------- template -AI_FORCE_INLINE -bool IsSpaceOrNewLine( char_t in) { +AI_FORCE_INLINE bool IsSpaceOrNewLine(char_t in) { return IsSpace(in) || IsLineEnd(in); } // --------------------------------------------------------------------------------- template -AI_FORCE_INLINE -bool SkipSpaces( const char_t* in, const char_t** out) { - while( *in == ( char_t )' ' || *in == ( char_t )'\t' ) { +AI_FORCE_INLINE bool SkipSpaces(const char_t *in, const char_t **out, const char_t *end) { + while ((*in == (char_t)' ' || *in == (char_t)'\t') && in != end) { ++in; } *out = in; @@ -126,21 +112,19 @@ bool SkipSpaces( const char_t* in, const char_t** out) { // --------------------------------------------------------------------------------- template -AI_FORCE_INLINE -bool SkipSpaces( const char_t** inout) { - return SkipSpaces(*inout,inout); +AI_FORCE_INLINE bool SkipSpaces(const char_t **inout, const char_t *end) { + return SkipSpaces(*inout, inout, end); } // --------------------------------------------------------------------------------- template -AI_FORCE_INLINE -bool SkipLine( const char_t* in, const char_t** out) { - while( *in != ( char_t )'\r' && *in != ( char_t )'\n' && *in != ( char_t )'\0' ) { +AI_FORCE_INLINE bool SkipLine(const char_t *in, const char_t **out, const char_t *end) { + while ((*in != (char_t)'\r' && *in != (char_t)'\n' && *in != (char_t)'\0') && in != end) { ++in; } // files are opened in binary mode. Ergo there are both NL and CR - while( *in == ( char_t )'\r' || *in == ( char_t )'\n' ) { + while ((*in == (char_t)'\r' || *in == (char_t)'\n') && in != end) { ++in; } *out = in; @@ -149,16 +133,14 @@ bool SkipLine( const char_t* in, const char_t** out) { // --------------------------------------------------------------------------------- template -AI_FORCE_INLINE -bool SkipLine( const char_t** inout) { - return SkipLine(*inout,inout); +AI_FORCE_INLINE bool SkipLine(const char_t **inout, const char_t *end) { + return SkipLine(*inout, inout, end); } // --------------------------------------------------------------------------------- template -AI_FORCE_INLINE -bool SkipSpacesAndLineEnd( const char_t* in, const char_t** out) { - while( *in == ( char_t )' ' || *in == ( char_t )'\t' || *in == ( char_t )'\r' || *in == ( char_t )'\n' ) { +AI_FORCE_INLINE bool SkipSpacesAndLineEnd(const char_t *in, const char_t **out, const char_t *end) { + while ((*in == (char_t)' ' || *in == (char_t)'\t' || *in == (char_t)'\r' || *in == (char_t)'\n') && in != end) { ++in; } *out = in; @@ -167,27 +149,25 @@ bool SkipSpacesAndLineEnd( const char_t* in, const char_t** out) { // --------------------------------------------------------------------------------- template -AI_FORCE_INLINE -bool SkipSpacesAndLineEnd( const char_t** inout) { - return SkipSpacesAndLineEnd(*inout,inout); +AI_FORCE_INLINE bool SkipSpacesAndLineEnd(const char_t **inout, const char_t *end) { + return SkipSpacesAndLineEnd(*inout, inout, end); } // --------------------------------------------------------------------------------- template -AI_FORCE_INLINE -bool GetNextLine( const char_t*& buffer, char_t out[ BufferSize ] ) { - if( ( char_t )'\0' == *buffer ) { +AI_FORCE_INLINE bool GetNextLine(const char_t *&buffer, char_t out[BufferSize]) { + if ((char_t)'\0' == *buffer) { return false; } - char* _out = out; - char* const end = _out + BufferSize; - while( !IsLineEnd( *buffer ) && _out < end ) { + char *_out = out; + char *const end = _out + BufferSize; + while (!IsLineEnd(*buffer) && _out < end) { *_out++ = *buffer++; } *_out = (char_t)'\0'; - while( IsLineEnd( *buffer ) && '\0' != *buffer ) { + while (IsLineEnd(*buffer) && '\0' != *buffer) { ++buffer; } @@ -196,19 +176,16 @@ bool GetNextLine( const char_t*& buffer, char_t out[ BufferSize ] ) { // --------------------------------------------------------------------------------- template -AI_FORCE_INLINE bool IsNumeric( char_t in) -{ - return ( in >= '0' && in <= '9' ) || '-' == in || '+' == in; +AI_FORCE_INLINE bool IsNumeric(char_t in) { + return (in >= '0' && in <= '9') || '-' == in || '+' == in; } // --------------------------------------------------------------------------------- template -AI_FORCE_INLINE -bool TokenMatch(char_t*& in, const char* token, unsigned int len) -{ - if (!::strncmp(token,in,len) && IsSpaceOrNewLine(in[len])) { +AI_FORCE_INLINE bool TokenMatch(char_t *&in, const char *token, unsigned int len) { + if (!::strncmp(token, in, len) && IsSpaceOrNewLine(in[len])) { if (in[len] != '\0') { - in += len+1; + in += len + 1; } else { // If EOF after the token make sure we don't go past end of buffer in += len; @@ -224,37 +201,71 @@ bool TokenMatch(char_t*& in, const char* token, unsigned int len) * @param token Token to check for * @param len Number of characters to check */ -AI_FORCE_INLINE -bool TokenMatchI(const char*& in, const char* token, unsigned int len) { - if (!ASSIMP_strincmp(token,in,len) && IsSpaceOrNewLine(in[len])) { - in += len+1; +AI_FORCE_INLINE bool TokenMatchI(const char *&in, const char *token, unsigned int len) { + if (!ASSIMP_strincmp(token, in, len) && IsSpaceOrNewLine(in[len])) { + in += len + 1; return true; } return false; } // --------------------------------------------------------------------------------- -AI_FORCE_INLINE -void SkipToken(const char*& in) { - SkipSpaces(&in); - while ( !IsSpaceOrNewLine( *in ) ) { +AI_FORCE_INLINE void SkipToken(const char *&in, const char *end) { + SkipSpaces(&in, end); + while (!IsSpaceOrNewLine(*in)) { ++in; } } // --------------------------------------------------------------------------------- -AI_FORCE_INLINE -std::string GetNextToken(const char*& in) { - SkipSpacesAndLineEnd(&in); - const char* cur = in; - while ( !IsSpaceOrNewLine( *in ) ) { +AI_FORCE_INLINE std::string GetNextToken(const char *&in, const char *end) { + SkipSpacesAndLineEnd(&in, end); + const char *cur = in; + while (!IsSpaceOrNewLine(*in)) { ++in; } - return std::string(cur,(size_t)(in-cur)); + return std::string(cur, (size_t)(in - cur)); } // --------------------------------------------------------------------------------- +/** @brief Will perform a simple tokenize. + * @param str String to tokenize. + * @param tokens Array with tokens, will be empty if no token was found. + * @param delimiters Delimiter for tokenize. + * @return Number of found token. + */ +template +AI_FORCE_INLINE unsigned int tokenize(const string_type &str, std::vector &tokens, + const string_type &delimiters) { + // Skip delimiters at beginning. + typename string_type::size_type lastPos = str.find_first_not_of(delimiters, 0); -} // ! namespace Assimp + // Find first "non-delimiter". + typename string_type::size_type pos = str.find_first_of(delimiters, lastPos); + while (string_type::npos != pos || string_type::npos != lastPos) { + // Found a token, add it to the vector. + string_type tmp = str.substr(lastPos, pos - lastPos); + if (!tmp.empty() && ' ' != tmp[0]) + tokens.push_back(tmp); + + // Skip delimiters. Note the "not_of" + lastPos = str.find_first_not_of(delimiters, pos); + + // Find next "non-delimiter" + pos = str.find_first_of(delimiters, lastPos); + } + + return static_cast(tokens.size()); +} + +inline std::string ai_stdStrToLower(const std::string &str) { + std::string out(str); + for (size_t i = 0; i < str.size(); ++i) { + out[i] = (char) tolower((unsigned char)out[i]); + } + return out; +} + +} // namespace Assimp #endif // ! AI_PARSING_UTILS_H_INC diff --git a/Source/ThirdParty/assimp/Profiler.h b/Source/ThirdParty/assimp/Profiler.h index 6ff9d41c0..ff4f590c3 100644 --- a/Source/ThirdParty/assimp/Profiler.h +++ b/Source/ThirdParty/assimp/Profiler.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2019, assimp team +Copyright (c) 2006-2024, assimp team All rights reserved. @@ -43,12 +43,17 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /** @file Profiler.h * @brief Utility to measure the respective runtime of each import step */ -#ifndef INCLUDED_PROFILER_H -#define INCLUDED_PROFILER_H +#pragma once +#ifndef AI_INCLUDED_PROFILER_H +#define AI_INCLUDED_PROFILER_H + +#ifdef __GNUC__ +# pragma GCC system_header +#endif #include #include -#include "TinyFormatter.h" +#include #include @@ -63,16 +68,13 @@ using namespace Formatter; */ class Profiler { public: - Profiler() { - // empty - } + Profiler() = default; -public: /** Start a named timer */ void BeginRegion(const std::string& region) { regions[region] = std::chrono::system_clock::now(); - ASSIMP_LOG_DEBUG((format("START `"),region,"`")); + ASSIMP_LOG_DEBUG("START `",region,"`"); } @@ -84,7 +86,7 @@ public: } std::chrono::duration elapsedSeconds = std::chrono::system_clock::now() - regions[region]; - ASSIMP_LOG_DEBUG((format("END `"),region,"`, dt= ", elapsedSeconds.count()," s")); + ASSIMP_LOG_DEBUG("END `",region,"`, dt= ", elapsedSeconds.count()," s"); } private: @@ -95,5 +97,5 @@ private: } } -#endif +#endif // AI_INCLUDED_PROFILER_H diff --git a/Source/ThirdParty/assimp/ProgressHandler.hpp b/Source/ThirdParty/assimp/ProgressHandler.hpp index 4e47f1d0a..2a1ab309c 100644 --- a/Source/ThirdParty/assimp/ProgressHandler.hpp +++ b/Source/ThirdParty/assimp/ProgressHandler.hpp @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2019, assimp team +Copyright (c) 2006-2024, assimp team All rights reserved. @@ -47,9 +47,13 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef AI_PROGRESSHANDLER_H_INC #define AI_PROGRESSHANDLER_H_INC -#include "types.h" +#ifdef __GNUC__ +# pragma GCC system_header +#endif -namespace Assimp { +#include + +namespace Assimp { // ------------------------------------------------------------------------------------ /** @brief CPP-API: Abstract interface for custom progress report receivers. @@ -63,14 +67,11 @@ class ASSIMP_API ProgressHandler { protected: /// @brief Default constructor - ProgressHandler () AI_NO_EXCEPT { - // empty - } + ProgressHandler () AI_NO_EXCEPT = default; public: /// @brief Virtual destructor. - virtual ~ProgressHandler () { - } + virtual ~ProgressHandler () = default; // ------------------------------------------------------------------- /** @brief Progress callback. @@ -87,7 +88,7 @@ public: * occasion (loaders and Assimp are generally allowed to perform * all needed cleanup tasks prior to returning control to the * caller). If the loading is aborted, #Importer::ReadFile() - * returns always NULL. + * returns always nullptr. * */ virtual bool Update(float percentage = -1.f) = 0; diff --git a/Source/ThirdParty/assimp/RemoveComments.h b/Source/ThirdParty/assimp/RemoveComments.h index 404b49671..a7a9a2381 100644 --- a/Source/ThirdParty/assimp/RemoveComments.h +++ b/Source/ThirdParty/assimp/RemoveComments.h @@ -2,8 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2019, assimp team - +Copyright (c) 2006-2024, assimp team All rights reserved. @@ -43,9 +42,13 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /** @file Declares a helper class, "CommentRemover", which can be * used to remove comments (single and multi line) from a text file. */ +#pragma once #ifndef AI_REMOVE_COMMENTS_H_INC #define AI_REMOVE_COMMENTS_H_INC +#ifdef __GNUC__ +# pragma GCC system_header +#endif #include @@ -58,8 +61,7 @@ namespace Assimp { * to those in C or C++ so this code has been moved to a separate * module. */ -class ASSIMP_API CommentRemover -{ +class ASSIMP_API CommentRemover { // class cannot be instanced CommentRemover() {} diff --git a/Source/ThirdParty/assimp/SGSpatialSort.h b/Source/ThirdParty/assimp/SGSpatialSort.h index 5b4f3f41f..13a214d44 100644 --- a/Source/ThirdParty/assimp/SGSpatialSort.h +++ b/Source/ThirdParty/assimp/SGSpatialSort.h @@ -2,8 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2019, assimp team - +Copyright (c) 2006-2024, assimp team All rights reserved. @@ -42,9 +41,14 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /** Small helper classes to optimize finding vertices close to a given location */ +#pragma once #ifndef AI_D3DSSPATIALSORT_H_INC #define AI_D3DSSPATIALSORT_H_INC +#ifdef __GNUC__ +# pragma GCC system_header +#endif + #include #include #include @@ -58,10 +62,8 @@ namespace Assimp { * implementation to handle all details of its file format correctly. */ // ---------------------------------------------------------------------------------- -class ASSIMP_API SGSpatialSort -{ +class ASSIMP_API SGSpatialSort { public: - SGSpatialSort(); // ------------------------------------------------------------------- @@ -85,7 +87,7 @@ public: void Prepare(); /** Destructor */ - ~SGSpatialSort(); + ~SGSpatialSort() = default; // ------------------------------------------------------------------- /** Returns an iterator for all positions close to the given position. diff --git a/Source/ThirdParty/assimp/SceneCombiner.h b/Source/ThirdParty/assimp/SceneCombiner.h index 679a2acea..790a18c2d 100644 --- a/Source/ThirdParty/assimp/SceneCombiner.h +++ b/Source/ThirdParty/assimp/SceneCombiner.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2019, assimp team +Copyright (c) 2006-2024, assimp team All rights reserved. @@ -43,17 +43,21 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /** @file Declares a helper class, "SceneCombiner" providing various * utilities to merge scenes. */ +#pragma once #ifndef AI_SCENE_COMBINER_H_INC #define AI_SCENE_COMBINER_H_INC +#ifdef __GNUC__ +#pragma GCC system_header +#endif + #include #include -#include -#include -#include -#include -#include +#include +#include +#include +#include #include struct aiScene; @@ -65,71 +69,63 @@ struct aiLight; struct aiMetadata; struct aiBone; struct aiMesh; +struct aiAnimMesh; struct aiAnimation; struct aiNodeAnim; +struct aiMeshMorphAnim; -namespace Assimp { +namespace Assimp { // --------------------------------------------------------------------------- /** \brief Helper data structure for SceneCombiner. * * Describes to which node a scene must be attached to. */ -struct AttachmentInfo -{ - AttachmentInfo() - : scene (NULL) - , attachToNode (NULL) - {} +struct AttachmentInfo { + AttachmentInfo() : + scene(nullptr), + attachToNode(nullptr) {} - AttachmentInfo(aiScene* _scene, aiNode* _attachToNode) - : scene (_scene) - , attachToNode (_attachToNode) - {} + AttachmentInfo(aiScene *_scene, aiNode *_attachToNode) : + scene(_scene), attachToNode(_attachToNode) {} - aiScene* scene; - aiNode* attachToNode; + aiScene *scene; + aiNode *attachToNode; }; // --------------------------------------------------------------------------- -struct NodeAttachmentInfo -{ - NodeAttachmentInfo() - : node (NULL) - , attachToNode (NULL) - , resolved (false) - , src_idx (SIZE_MAX) - {} +struct NodeAttachmentInfo { + NodeAttachmentInfo() : + node(nullptr), + attachToNode(nullptr), + resolved(false), + src_idx(SIZE_MAX) {} - NodeAttachmentInfo(aiNode* _scene, aiNode* _attachToNode,size_t idx) - : node (_scene) - , attachToNode (_attachToNode) - , resolved (false) - , src_idx (idx) - {} + NodeAttachmentInfo(aiNode *_scene, aiNode *_attachToNode, size_t idx) : + node(_scene), attachToNode(_attachToNode), resolved(false), src_idx(idx) {} - aiNode* node; - aiNode* attachToNode; - bool resolved; - size_t src_idx; + aiNode *node; + aiNode *attachToNode; + bool resolved; + size_t src_idx; }; // --------------------------------------------------------------------------- /** @def AI_INT_MERGE_SCENE_GEN_UNIQUE_NAMES * Generate unique names for all named scene items */ -#define AI_INT_MERGE_SCENE_GEN_UNIQUE_NAMES 0x1 +#define AI_INT_MERGE_SCENE_GEN_UNIQUE_NAMES 0x1 /** @def AI_INT_MERGE_SCENE_GEN_UNIQUE_MATNAMES * Generate unique names for materials, too. * This is not absolutely required to pass the validation. */ -#define AI_INT_MERGE_SCENE_GEN_UNIQUE_MATNAMES 0x2 +#define AI_INT_MERGE_SCENE_GEN_UNIQUE_MATNAMES 0x2 /** @def AI_INT_MERGE_SCENE_DUPLICATES_DEEP_CPY * Use deep copies of duplicate scenes */ -#define AI_INT_MERGE_SCENE_DUPLICATES_DEEP_CPY 0x4 +#define AI_INT_MERGE_SCENE_DUPLICATES_DEEP_CPY 0x4 /** @def AI_INT_MERGE_SCENE_RESOLVE_CROSS_ATTACHMENTS * If attachment nodes are not found in the given master scene, @@ -144,44 +140,39 @@ struct NodeAttachmentInfo */ #define AI_INT_MERGE_SCENE_GEN_UNIQUE_NAMES_IF_NECESSARY 0x10 -typedef std::pair BoneSrcIndex; +typedef std::pair BoneSrcIndex; // --------------------------------------------------------------------------- /** @brief Helper data structure for SceneCombiner::MergeBones. */ -struct BoneWithHash : public std::pair { +struct BoneWithHash : public std::pair { std::vector pSrcBones; }; // --------------------------------------------------------------------------- /** @brief Utility for SceneCombiner */ -struct SceneHelper -{ - SceneHelper () - : scene (NULL) - , idlen (0) - { +struct SceneHelper { + SceneHelper() : + scene(nullptr), + idlen(0) { id[0] = 0; } - explicit SceneHelper (aiScene* _scene) - : scene (_scene) - , idlen (0) - { + explicit SceneHelper(aiScene *_scene) : + scene(_scene), idlen(0) { id[0] = 0; } - AI_FORCE_INLINE aiScene* operator-> () const - { + AI_FORCE_INLINE aiScene *operator->() const { return scene; } // scene we're working on - aiScene* scene; + aiScene *scene; // prefix to be added to all identifiers in the scene ... - char id [32]; + char id[32]; // and its strlen() unsigned int idlen; @@ -200,34 +191,30 @@ struct SceneHelper */ class ASSIMP_API SceneCombiner { // class cannot be instanced - SceneCombiner() { - // empty - } + SceneCombiner() = delete; - ~SceneCombiner() { - // empty - } + ~SceneCombiner() = delete; public: // ------------------------------------------------------------------- /** Merges two or more scenes. * * @param dest Receives a pointer to the destination scene. If the - * pointer doesn't point to NULL when the function is called, the + * pointer doesn't point to nullptr when the function is called, the * existing scene is cleared and refilled. * @param src Non-empty list of scenes to be merged. The function * deletes the input scenes afterwards. There may be duplicate scenes. * @param flags Combination of the AI_INT_MERGE_SCENE flags defined above */ - static void MergeScenes(aiScene** dest,std::vector& src, - unsigned int flags = 0); + static void MergeScenes(aiScene **dest, std::vector &src, + unsigned int flags = 0); // ------------------------------------------------------------------- /** Merges two or more scenes and attaches all scenes to a specific * position in the node graph of the master scene. * * @param dest Receives a pointer to the destination scene. If the - * pointer doesn't point to NULL when the function is called, the + * pointer doesn't point to nullptr when the function is called, the * existing scene is cleared and refilled. * @param master Master scene. It will be deleted afterwards. All * other scenes will be inserted in its node graph. @@ -236,9 +223,9 @@ public: * deletes the input scenes afterwards. There may be duplicate scenes. * @param flags Combination of the AI_INT_MERGE_SCENE flags defined above */ - static void MergeScenes(aiScene** dest, aiScene* master, - std::vector& src, - unsigned int flags = 0); + static void MergeScenes(aiScene **dest, aiScene *master, + std::vector &src, + unsigned int flags = 0); // ------------------------------------------------------------------- /** Merges two or more meshes @@ -254,9 +241,9 @@ public: * @param begin First mesh to be processed * @param end Points to the mesh after the last mesh to be processed */ - static void MergeMeshes(aiMesh** dest,unsigned int flags, - std::vector::const_iterator begin, - std::vector::const_iterator end); + static void MergeMeshes(aiMesh **dest, unsigned int flags, + std::vector::const_iterator begin, + std::vector::const_iterator end); // ------------------------------------------------------------------- /** Merges two or more bones @@ -266,8 +253,8 @@ public: * @param begin First mesh to be processed * @param end Points to the mesh after the last mesh to be processed */ - static void MergeBones(aiMesh* out,std::vector::const_iterator it, - std::vector::const_iterator end); + static void MergeBones(aiMesh *out, std::vector::const_iterator it, + std::vector::const_iterator end); // ------------------------------------------------------------------- /** Merges two or more materials @@ -280,9 +267,9 @@ public: * @param begin First material to be processed * @param end Points to the material after the last material to be processed */ - static void MergeMaterials(aiMaterial** dest, - std::vector::const_iterator begin, - std::vector::const_iterator end); + static void MergeMaterials(aiMaterial **dest, + std::vector::const_iterator begin, + std::vector::const_iterator end); // ------------------------------------------------------------------- /** Builds a list of uniquely named bones in a mesh list @@ -291,9 +278,9 @@ public: * @param it First mesh to be processed * @param end Last mesh to be processed */ - static void BuildUniqueBoneList(std::list& asBones, - std::vector::const_iterator it, - std::vector::const_iterator end); + static void BuildUniqueBoneList(std::list &asBones, + std::vector::const_iterator it, + std::vector::const_iterator end); // ------------------------------------------------------------------- /** Add a name prefix to all nodes in a scene. @@ -302,8 +289,8 @@ public: * @param prefix Prefix to be added to all nodes * @param len STring length */ - static void AddNodePrefixes(aiNode* node, const char* prefix, - unsigned int len); + static void AddNodePrefixes(aiNode *node, const char *prefix, + unsigned int len); // ------------------------------------------------------------------- /** Add an offset to all mesh indices in a node graph @@ -311,7 +298,7 @@ public: * @param Current node. This function is called recursively. * @param offset Offset to be added to all mesh indices */ - static void OffsetNodeMeshIndices (aiNode* node, unsigned int offset); + static void OffsetNodeMeshIndices(aiNode *node, unsigned int offset); // ------------------------------------------------------------------- /** Attach a list of node graphs to well-defined nodes in a master @@ -319,18 +306,17 @@ public: * * @param master Master scene * @param srcList List of source scenes along with their attachment - * points. If an attachment point is NULL (or does not exist in + * points. If an attachment point is nullptr (or does not exist in * the master graph), a scene is attached to the root of the master * graph (as an additional child node) * @duplicates List of duplicates. If elem[n] == n the scene is not * a duplicate. Otherwise elem[n] links scene n to its first occurrence. */ - static void AttachToGraph ( aiScene* master, - std::vector& srcList); - - static void AttachToGraph (aiNode* attach, - std::vector& srcList); + static void AttachToGraph(aiScene *master, + std::vector &srcList); + static void AttachToGraph(aiNode *attach, + std::vector &srcList); // ------------------------------------------------------------------- /** Get a deep copy of a scene @@ -338,21 +324,19 @@ public: * @param dest Receives a pointer to the destination scene * @param src Source scene - remains unmodified. */ - static void CopyScene(aiScene** dest,const aiScene* source,bool allocate = true); - + static void CopyScene(aiScene **dest, const aiScene *source, bool allocate = true); // ------------------------------------------------------------------- /** Get a flat copy of a scene * * Only the first hierarchy layer is copied. All pointer members of * aiScene are shared by source and destination scene. If the - * pointer doesn't point to NULL when the function is called, the + * pointer doesn't point to nullptr when the function is called, the * existing scene is cleared and refilled. * @param dest Receives a pointer to the destination scene * @param src Source scene - remains unmodified. */ - static void CopySceneFlat(aiScene** dest,const aiScene* source); - + static void CopySceneFlat(aiScene **dest, const aiScene *source); // ------------------------------------------------------------------- /** Get a deep copy of a mesh @@ -360,42 +344,42 @@ public: * @param dest Receives a pointer to the destination mesh * @param src Source mesh - remains unmodified. */ - static void Copy (aiMesh** dest, const aiMesh* src); + static void Copy(aiMesh **dest, const aiMesh *src); // similar to Copy(): - static void Copy (aiMaterial** dest, const aiMaterial* src); - static void Copy (aiTexture** dest, const aiTexture* src); - static void Copy (aiAnimation** dest, const aiAnimation* src); - static void Copy (aiCamera** dest, const aiCamera* src); - static void Copy (aiBone** dest, const aiBone* src); - static void Copy (aiLight** dest, const aiLight* src); - static void Copy (aiNodeAnim** dest, const aiNodeAnim* src); - static void Copy (aiMetadata** dest, const aiMetadata* src); + static void Copy(aiAnimMesh **dest, const aiAnimMesh *src); + static void Copy(aiMaterial **dest, const aiMaterial *src); + static void Copy(aiTexture **dest, const aiTexture *src); + static void Copy(aiAnimation **dest, const aiAnimation *src); + static void Copy(aiCamera **dest, const aiCamera *src); + static void Copy(aiBone **dest, const aiBone *src); + static void Copy(aiLight **dest, const aiLight *src); + 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); - + static void Copy(aiNode **dest, const aiNode *src); private: - // ------------------------------------------------------------------- // Same as AddNodePrefixes, but with an additional check - static void AddNodePrefixesChecked(aiNode* node, const char* prefix, - unsigned int len, - std::vector& input, - unsigned int cur); + static void AddNodePrefixesChecked(aiNode *node, const char *prefix, + unsigned int len, + std::vector &input, + unsigned int cur); // ------------------------------------------------------------------- // Add node identifiers to a hashing set - static void AddNodeHashes(aiNode* node, std::set& hashes); - + static void AddNodeHashes(aiNode *node, std::set &hashes); // ------------------------------------------------------------------- // Search for duplicate names - static bool FindNameMatch(const aiString& name, - std::vector& input, unsigned int cur); + static bool FindNameMatch(const aiString &name, + std::vector &input, unsigned int cur); }; -} +} // namespace Assimp #endif // !! AI_SCENE_COMBINER_H_INC diff --git a/Source/ThirdParty/assimp/SkeletonMeshBuilder.h b/Source/ThirdParty/assimp/SkeletonMeshBuilder.h index f9b8d9f55..620748632 100644 --- a/Source/ThirdParty/assimp/SkeletonMeshBuilder.h +++ b/Source/ThirdParty/assimp/SkeletonMeshBuilder.h @@ -4,8 +4,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2019, assimp team - +Copyright (c) 2006-2024, assimp team All rights reserved. @@ -47,17 +46,22 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * for animation skeletons. */ +#pragma once #ifndef AI_SKELETONMESHBUILDER_H_INC #define AI_SKELETONMESHBUILDER_H_INC -#include +#ifdef __GNUC__ +#pragma GCC system_header +#endif + #include +#include struct aiMaterial; struct aiScene; struct aiNode; -namespace Assimp { +namespace Assimp { // --------------------------------------------------------------------------- /** @@ -65,57 +69,56 @@ namespace Assimp { * the resembles the node hierarchy. This is useful for file formats * that don't carry any mesh data but only animation data. */ -class ASSIMP_API SkeletonMeshBuilder -{ +class ASSIMP_API SkeletonMeshBuilder { public: - // ------------------------------------------------------------------- /** The constructor processes the given scene and adds a mesh there. * * Does nothing if the scene already has mesh data. * @param pScene The scene for which a skeleton mesh should be constructed. - * @param root The node to start with. NULL is the scene root + * @param root The node to start with. nullptr is the scene root * @param bKnobsOnly Set this to true if you don't want the connectors * between the knobs representing the nodes. */ - SkeletonMeshBuilder( aiScene* pScene, aiNode* root = NULL, - bool bKnobsOnly = false); + SkeletonMeshBuilder(aiScene *pScene, aiNode *root = nullptr, + bool bKnobsOnly = false); protected: - // ------------------------------------------------------------------- /** Recursively builds a simple mesh representation for the given node * and also creates a joint for the node that affects this part of * the mesh. * @param pNode The node to build geometry for. */ - void CreateGeometry( const aiNode* pNode); + void CreateGeometry(const aiNode *pNode); // ------------------------------------------------------------------- /** Creates the mesh from the internally accumulated stuff and returns it. */ - aiMesh* CreateMesh(); + aiMesh *CreateMesh(); // ------------------------------------------------------------------- /** Creates a dummy material and returns it. */ - aiMaterial* CreateMaterial(); + aiMaterial *CreateMaterial(); -protected: +private: /** space to assemble the mesh data: points */ std::vector mVertices; /** faces */ - struct Face - { + struct Face { unsigned int mIndices[3]; Face(); - Face( unsigned int p0, unsigned int p1, unsigned int p2) - { mIndices[0] = p0; mIndices[1] = p1; mIndices[2] = p2; } + Face(unsigned int p0, unsigned int p1, unsigned int p2) { + mIndices[0] = p0; + mIndices[1] = p1; + mIndices[2] = p2; + } }; std::vector mFaces; /** bones */ - std::vector mBones; + std::vector mBones; bool mKnobsOnly; }; diff --git a/Source/ThirdParty/assimp/SmallVector.h b/Source/ThirdParty/assimp/SmallVector.h new file mode 100644 index 000000000..8e8e2db5f --- /dev/null +++ b/Source/ThirdParty/assimp/SmallVector.h @@ -0,0 +1,164 @@ +/* +Open Asset Import Library (assimp) +---------------------------------------------------------------------- + +Copyright (c) 2006-2024, assimp team + +All rights reserved. + +Redistribution and use of this software in source and binary forms, +with or without modification, are permitted provided that the +following conditions are met: + +* Redistributions of source code must retain the above + copyright notice, this list of conditions and the + following disclaimer. + +* Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the + following disclaimer in the documentation and/or other + materials provided with the distribution. + +* Neither the name of the assimp team, nor the names of its + contributors may be used to endorse or promote products + derived from this software without specific prior + written permission of the assimp team. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(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 Defines small vector with inplace storage. +Based on CppCon 2016: Chandler Carruth "High Performance Code 201: Hybrid Data Structures" */ + +#pragma once +#ifndef AI_SMALLVECTOR_H_INC +#define AI_SMALLVECTOR_H_INC + +#ifdef __GNUC__ +# pragma GCC system_header +#endif + +namespace Assimp { + +// -------------------------------------------------------------------------------------------- +/// @brief Small vector with inplace storage. +/// +/// Reduces heap allocations when list is shorter. It uses a small array for a dedicated size. +/// When the growing gets bigger than this small cache a dynamic growing algorithm will be +/// used. +// -------------------------------------------------------------------------------------------- +template +class SmallVector { +public: + /// @brief The default class constructor. + SmallVector() : + mStorage(mInplaceStorage), + mSize(0), + mCapacity(Capacity) { + // empty + } + + /// @brief The class destructor. + ~SmallVector() { + if (mStorage != mInplaceStorage) { + delete [] mStorage; + } + } + + /// @brief Will push a new item. The capacity will grow in case of a too small capacity. + /// @param item [in] The item to push at the end of the vector. + void push_back(const T& item) { + if (mSize < mCapacity) { + mStorage[mSize++] = item; + return; + } + + push_back_and_grow(item); + } + + /// @brief Will resize the vector. + /// @param newSize [in] The new size. + void resize(size_t newSize) { + if (newSize > mCapacity) { + grow(newSize); + } + mSize = newSize; + } + + /// @brief Returns the current size of the vector. + /// @return The current size. + size_t size() const { + return mSize; + } + + /// @brief Returns a pointer to the first item. + /// @return The first item as a pointer. + T* begin() { + return mStorage; + } + + /// @brief Returns a pointer to the end. + /// @return The end as a pointer. + T* end() { + return &mStorage[mSize]; + } + + /// @brief Returns a const pointer to the first item. + /// @return The first item as a const pointer. + T* begin() const { + return mStorage; + } + + /// @brief Returns a const pointer to the end. + /// @return The end as a const pointer. + T* end() const { + return &mStorage[mSize]; + } + + SmallVector(const SmallVector &) = delete; + SmallVector(SmallVector &&) = delete; + SmallVector &operator = (const SmallVector &) = delete; + SmallVector &operator = (SmallVector &&) = delete; + +private: + void grow( size_t newCapacity) { + T* oldStorage = mStorage; + T* newStorage = new T[newCapacity]; + + std::memcpy(newStorage, oldStorage, mSize * sizeof(T)); + + mStorage = newStorage; + mCapacity = newCapacity; + + if (oldStorage != mInplaceStorage) { + delete [] oldStorage; + } + } + + void push_back_and_grow(const T& item) { + grow(mCapacity + Capacity); + + mStorage[mSize++] = item; + } + + T* mStorage; + size_t mSize; + size_t mCapacity; + T mInplaceStorage[Capacity]; +}; + +} // end namespace Assimp + +#endif // !! AI_SMALLVECTOR_H_INC diff --git a/Source/ThirdParty/assimp/SmoothingGroups.h b/Source/ThirdParty/assimp/SmoothingGroups.h index 92d65cea0..e77a8b2d9 100644 --- a/Source/ThirdParty/assimp/SmoothingGroups.h +++ b/Source/ThirdParty/assimp/SmoothingGroups.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2019, assimp team +Copyright (c) 2006-2024, assimp team All rights reserved. @@ -43,10 +43,16 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /** @file Defines the helper data structures for importing 3DS files. http://www.jalix.org/ressources/graphics/3DS/_unofficials/3ds-unofficial.txt */ +#pragma once #ifndef AI_SMOOTHINGGROUPS_H_INC #define AI_SMOOTHINGGROUPS_H_INC +#ifdef __GNUC__ +# pragma GCC system_header +#endif + #include + #include #include diff --git a/Source/ThirdParty/assimp/SmoothingGroups.inl b/Source/ThirdParty/assimp/SmoothingGroups.inl index 84ea4a1b0..6de5ee997 100644 --- a/Source/ThirdParty/assimp/SmoothingGroups.inl +++ b/Source/ThirdParty/assimp/SmoothingGroups.inl @@ -3,12 +3,12 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2012, assimp team +Copyright (c) 2006-2024, assimp team All rights reserved. -Redistribution and use of this software in source and binary forms, -with or without modification, are permitted provided that the following +Redistribution and use of this software in source and binary forms, +with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above @@ -25,29 +25,32 @@ conditions are met: derived from this software without specific prior written permission of the assimp team. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(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 Generation of normal vectors basing on smoothing groups */ +#pragma once #ifndef AI_SMOOTHINGGROUPS_INL_INCLUDED #define AI_SMOOTHINGGROUPS_INL_INCLUDED -// internal headers +#ifdef __GNUC__ +# pragma GCC system_header +#endif + #include -// CRT header #include using namespace Assimp; @@ -74,7 +77,7 @@ void ComputeNormalsWithSmoothingsGroups(MeshWithSmoothingGroups& sMesh) sMesh.mNormals[face.mIndices[c]] = vNor; } - // calculate the position bounds so we have a reliable epsilon to check position differences against + // calculate the position bounds so we have a reliable epsilon to check position differences against aiVector3D minVec( 1e10f, 1e10f, 1e10f), maxVec( -1e10f, -1e10f, -1e10f); for( unsigned int a = 0; a < sMesh.mPositions.size(); a++) { @@ -88,7 +91,7 @@ void ComputeNormalsWithSmoothingsGroups(MeshWithSmoothingGroups& sMesh) const float posEpsilon = (maxVec - minVec).Length() * 1e-5f; std::vector avNormals; avNormals.resize(sMesh.mNormals.size()); - + // now generate the spatial sort tree SGSpatialSort sSort; for( typename std::vector::iterator i = sMesh.mFaces.begin(); diff --git a/Source/ThirdParty/assimp/SpatialSort.h b/Source/ThirdParty/assimp/SpatialSort.h index 61b345bcb..e527b15a2 100644 --- a/Source/ThirdParty/assimp/SpatialSort.h +++ b/Source/ThirdParty/assimp/SpatialSort.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2019, assimp team +Copyright (c) 2006-2024, assimp team All rights reserved. @@ -41,11 +41,17 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** Small helper classes to optimise finding vertizes close to a given location */ +#pragma once #ifndef AI_SPATIALSORT_H_INC #define AI_SPATIALSORT_H_INC -#include +#ifdef __GNUC__ +#pragma GCC system_header +#endif + #include +#include +#include namespace Assimp { @@ -57,10 +63,8 @@ namespace Assimp { * time, with O(n) worst case complexity when all vertices lay on the plane. The plane is chosen * so that it avoids common planes in usual data sets. */ // ------------------------------------------------------------------------------------------------ -class ASSIMP_API SpatialSort -{ +class ASSIMP_API SpatialSort { public: - SpatialSort(); // ------------------------------------------------------------------------------------ @@ -71,14 +75,12 @@ public: * @param pNumPositions Number of vectors to expect in that array. * @param pElementOffset Offset in bytes from the beginning of one vector in memory * to the beginning of the next vector. */ - SpatialSort( const aiVector3D* pPositions, unsigned int pNumPositions, - unsigned int pElementOffset); + SpatialSort(const aiVector3D *pPositions, unsigned int pNumPositions, + unsigned int pElementOffset); /** Destructor */ ~SpatialSort(); -public: - // ------------------------------------------------------------------------------------ /** Sets the input data for the SpatialSort. This replaces existing data, if any. * The new data receives new indices in ascending order. @@ -92,17 +94,15 @@ public: * required in order to use #FindPosition() or #GenerateMappingTable(). * If you don't finalize yet, you can use #Append() to add data from * other sources.*/ - void Fill( const aiVector3D* pPositions, unsigned int pNumPositions, - unsigned int pElementOffset, - bool pFinalize = true); - + void Fill(const aiVector3D *pPositions, unsigned int pNumPositions, + unsigned int pElementOffset, + bool pFinalize = true); // ------------------------------------------------------------------------------------ /** Same as #Fill(), except the method appends to existing data in the #SpatialSort. */ - void Append( const aiVector3D* pPositions, unsigned int pNumPositions, - unsigned int pElementOffset, - bool pFinalize = true); - + void Append(const aiVector3D *pPositions, unsigned int pNumPositions, + unsigned int pElementOffset, + bool pFinalize = true); // ------------------------------------------------------------------------------------ /** Finalize the spatial hash data structure. This can be useful after @@ -118,8 +118,8 @@ public: * @param poResults The container to store the indices of the found positions. * Will be emptied by the call so it may contain anything. * @return An iterator to iterate over all vertices in the given area.*/ - void FindPositions( const aiVector3D& pPosition, ai_real pRadius, - std::vector& poResults) const; + void FindPositions(const aiVector3D &pPosition, ai_real pRadius, + std::vector &poResults) const; // ------------------------------------------------------------------------------------ /** Fills an array with indices of all positions identical to the given position. In @@ -128,8 +128,8 @@ public: * @param pPosition The position to look for vertices. * @param poResults The container to store the indices of the found positions. * Will be emptied by the call so it may contain anything.*/ - void FindIdenticalPositions( const aiVector3D& pPosition, - std::vector& poResults) const; + void FindIdenticalPositions(const aiVector3D &pPosition, + std::vector &poResults) const; // ------------------------------------------------------------------------------------ /** Compute a table that maps each vertex ID referring to a spatially close @@ -139,34 +139,50 @@ public: * @param pRadius Maximal distance from the position a vertex may have to * be counted in. * @return Number of unique vertices (n). */ - unsigned int GenerateMappingTable(std::vector& fill, - ai_real pRadius) const; + unsigned int GenerateMappingTable(std::vector &fill, + ai_real pRadius) const; protected: - /** Normal of the sorting plane, normalized. The center is always at (0, 0, 0) */ + /** Return the distance to the sorting plane. */ + ai_real CalculateDistance(const aiVector3D &pPosition) const; + +protected: + /** Normal of the sorting plane, normalized. + */ aiVector3D mPlaneNormal; + /** The centroid of the positions, which is used as a point on the sorting plane + * when calculating distance. This value is calculated in Finalize. + */ + aiVector3D mCentroid; + /** An entry in a spatially sorted position array. Consists of a vertex index, * its position and its pre-calculated distance from the reference plane */ struct Entry { unsigned int mIndex; ///< The vertex referred by this entry aiVector3D mPosition; ///< Position - ai_real mDistance; ///< Distance of this vertex to the sorting plane + /// Distance of this vertex to the sorting plane. This is set by Finalize. + ai_real mDistance; Entry() AI_NO_EXCEPT - : mIndex( 999999999 ), mPosition(), mDistance( 99999. ) { - // empty + : mIndex(std::numeric_limits::max()), + mPosition(), + mDistance(std::numeric_limits::max()) { + // empty } - Entry( unsigned int pIndex, const aiVector3D& pPosition, ai_real pDistance) - : mIndex( pIndex), mPosition( pPosition), mDistance( pDistance) { + Entry(unsigned int pIndex, const aiVector3D &pPosition) : + mIndex(pIndex), mPosition(pPosition), mDistance(std::numeric_limits::max()) { // empty } - bool operator < (const Entry& e) const { return mDistance < e.mDistance; } + bool operator<(const Entry &e) const { return mDistance < e.mDistance; } }; // all positions, sorted by distance to the sorting plane std::vector mPositions; + + /// false until the Finalize method is called. + bool mFinalized; }; } // end of namespace Assimp diff --git a/Source/ThirdParty/assimp/StandardShapes.h b/Source/ThirdParty/assimp/StandardShapes.h index 3791569b8..aad2ce395 100644 --- a/Source/ThirdParty/assimp/StandardShapes.h +++ b/Source/ThirdParty/assimp/StandardShapes.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2019, assimp team +Copyright (c) 2006-2024, assimp team All rights reserved. @@ -41,12 +41,18 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** @file Declares a helper class, "StandardShapes" which generates - * vertices for standard shapes, such as cylnders, cones, spheres .. + * vertices for standard shapes, such as cylinders, cones, spheres .. */ +#pragma once #ifndef AI_STANDARD_SHAPES_H_INC #define AI_STANDARD_SHAPES_H_INC +#ifdef __GNUC__ +# pragma GCC system_header +#endif + #include +#include #include struct aiMesh; diff --git a/Source/ThirdParty/assimp/StreamReader.h b/Source/ThirdParty/assimp/StreamReader.h index 9116c1426..cc74bd652 100644 --- a/Source/ThirdParty/assimp/StreamReader.h +++ b/Source/ThirdParty/assimp/StreamReader.h @@ -3,9 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2019, assimp team - - +Copyright (c) 2006-2024, assimp team All rights reserved. @@ -44,15 +42,18 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /** @file Defines the StreamReader class which reads data from * a binary stream with a well-defined endianness. */ - +#pragma once #ifndef AI_STREAMREADER_H_INCLUDED #define AI_STREAMREADER_H_INCLUDED -#include -#include +#ifdef __GNUC__ +# pragma GCC system_header +#endif + +#include +#include +#include -#include "ByteSwapper.h" -#include "Exceptional.h" #include namespace Assimp { @@ -67,13 +68,11 @@ namespace Assimp { * * XXX switch from unsigned int for size types to size_t? or ptrdiff_t?*/ // -------------------------------------------------------------------------------------------- -template +template class StreamReader { public: - // FIXME: use these data types throughout the whole library, - // then change them to 64 bit values :-) - using diff = int; - using pos = unsigned int; + using diff = size_t; + using pos = size_t; // --------------------------------------------------------------------- /** Construction from a given stream with a well-defined endianness. @@ -85,42 +84,47 @@ public: * reads from the current position to the end of the stream. * @param le If @c RuntimeSwitch is true: specifies whether the * stream is in little endian byte order. Otherwise the - * endianness information is contained in the @c SwapEndianess + * endianness information is contained in the @c SwapEndianness * template parameter and this parameter is meaningless. */ - StreamReader(std::shared_ptr stream, bool le = false) - : stream(stream) - , le(le) - { + StreamReader(std::shared_ptr stream, bool le = false) : + mStream(stream), + mBuffer(nullptr), + mCurrent(nullptr), + mEnd(nullptr), + mLimit(nullptr), + mLe(le) { ai_assert(stream); InternBegin(); } // --------------------------------------------------------------------- - StreamReader(IOStream* stream, bool le = false) - : stream(std::shared_ptr(stream)) - , le(le) - { - ai_assert(stream); + StreamReader(IOStream *stream, bool le = false) : + mStream(std::shared_ptr(stream)), + mBuffer(nullptr), + mCurrent(nullptr), + mEnd(nullptr), + mLimit(nullptr), + mLe(le) { + ai_assert(nullptr != stream); InternBegin(); } // --------------------------------------------------------------------- ~StreamReader() { - delete[] buffer; + delete[] mBuffer; } // deprecated, use overloaded operator>> instead // --------------------------------------------------------------------- - /** Read a float from the stream */ - float GetF4() - { + /// Read a float from the stream. + float GetF4() { return Get(); } // --------------------------------------------------------------------- - /** Read a double from the stream */ - double GetF8() { + /// Read a double from the stream. + double GetF8() { return Get(); } @@ -132,7 +136,7 @@ public: // --------------------------------------------------------------------- /** Read a signed 8 bit integer from the stream */ - int8_t GetI1() { + int8_t GetI1() { return Get(); } @@ -150,66 +154,66 @@ public: // --------------------------------------------------------------------- /** Read a unsigned 16 bit integer from the stream */ - uint16_t GetU2() { + uint16_t GetU2() { return Get(); } // --------------------------------------------------------------------- - /** Read a unsigned 8 bit integer from the stream */ + /// Read a unsigned 8 bit integer from the stream uint8_t GetU1() { return Get(); } // --------------------------------------------------------------------- - /** Read an unsigned 32 bit integer from the stream */ - uint32_t GetU4() { + /// Read an unsigned 32 bit integer from the stream + uint32_t GetU4() { return Get(); } // --------------------------------------------------------------------- - /** Read a unsigned 64 bit integer from the stream */ - uint64_t GetU8() { + /// Read a unsigned 64 bit integer from the stream + uint64_t GetU8() { return Get(); } // --------------------------------------------------------------------- - /** Get the remaining stream size (to the end of the stream) */ - unsigned int GetRemainingSize() const { - return (unsigned int)(end - current); + /// Get the remaining stream size (to the end of the stream) + size_t GetRemainingSize() const { + return (unsigned int)(mEnd - mCurrent); } // --------------------------------------------------------------------- /** Get the remaining stream size (to the current read limit). The * return value is the remaining size of the stream if no custom * read limit has been set. */ - unsigned int GetRemainingSizeToLimit() const { - return (unsigned int)(limit - current); + size_t GetRemainingSizeToLimit() const { + return (unsigned int)(mLimit - mCurrent); } // --------------------------------------------------------------------- /** Increase the file pointer (relative seeking) */ - void IncPtr(intptr_t plus) { - current += plus; - if (current > limit) { + void IncPtr(intptr_t plus) { + mCurrent += plus; + if (mCurrent > mLimit) { throw DeadlyImportError("End of file or read limit was reached"); } } // --------------------------------------------------------------------- /** Get the current file pointer */ - int8_t* GetPtr() const { - return current; + int8_t *GetPtr() const { + return mCurrent; } // --------------------------------------------------------------------- /** Set current file pointer (Get it from #GetPtr). This is if you - * prefer to do pointer arithmetics on your own or want to copy + * prefer to do pointer arithmetic on your own or want to copy * large chunks of data at once. * @param p The new pointer, which is validated against the size * limit and buffer boundaries. */ - void SetPtr(int8_t* p) { - current = p; - if (current > limit || current < buffer) { + void SetPtr(int8_t *p) { + mCurrent = p; + if (mCurrent > mLimit || mCurrent < mBuffer) { throw DeadlyImportError("End of file or read limit was reached"); } } @@ -218,21 +222,20 @@ public: /** Copy n bytes to an external buffer * @param out Destination for copying * @param bytes Number of bytes to copy */ - void CopyAndAdvance(void* out, size_t bytes) { - int8_t* ur = GetPtr(); - SetPtr(ur+bytes); // fire exception if eof + void CopyAndAdvance(void *out, size_t bytes) { + int8_t *ur = GetPtr(); + SetPtr(ur + bytes); // fire exception if eof - ::memcpy(out,ur,bytes); + ::memcpy(out, ur, bytes); } - // --------------------------------------------------------------------- - /** Get the current offset from the beginning of the file */ - int GetCurrentPos() const { - return (unsigned int)(current - buffer); + /// @brief Get the current offset from the beginning of the file + int GetCurrentPos() const { + return (unsigned int)(mCurrent - mBuffer); } void SetCurrentPos(size_t pos) { - SetPtr(buffer + pos); + SetPtr(mBuffer + pos); } // --------------------------------------------------------------------- @@ -242,15 +245,15 @@ public: * the beginning of the file. Specifying UINT_MAX * resets the limit to the original end of the stream. * Returns the previously set limit. */ - unsigned int SetReadLimit(unsigned int _limit) { + unsigned int SetReadLimit(unsigned int _limit) { unsigned int prev = GetReadLimit(); if (UINT_MAX == _limit) { - limit = end; + mLimit = mEnd; return prev; } - limit = buffer + _limit; - if (limit > end) { + mLimit = mBuffer + _limit; + if (mLimit > mEnd) { throw DeadlyImportError("StreamReader: Invalid read limit"); } return prev; @@ -259,21 +262,21 @@ public: // --------------------------------------------------------------------- /** Get the current read limit in bytes. Reading over this limit * accidentally raises an exception. */ - unsigned int GetReadLimit() const { - return (unsigned int)(limit - buffer); + unsigned int GetReadLimit() const { + return (unsigned int)(mLimit - mBuffer); } // --------------------------------------------------------------------- /** Skip to the read limit in bytes. Reading over this limit * accidentally raises an exception. */ - void SkipToReadLimit() { - current = limit; + void SkipToReadLimit() { + mCurrent = mLimit; } // --------------------------------------------------------------------- /** overload operator>> and allow chaining of >> ops. */ template - StreamReader& operator >> (T& f) { + StreamReader &operator>>(T &f) { f = Get(); return *this; } @@ -282,14 +285,14 @@ public: /** Generic read method. ByteSwap::Swap(T*) *must* be defined */ template T Get() { - if ( current + sizeof(T) > limit) { + if (mCurrent + sizeof(T) > mLimit) { throw DeadlyImportError("End of file or stream limit was reached"); } T f; - ::memcpy (&f, current, sizeof(T)); - Intern::Getter() (&f,le); - current += sizeof(T); + ::memcpy(&f, mCurrent, sizeof(T)); + Intern::Getter()(&f, mLe); + mCurrent += sizeof(T); return f; } @@ -297,46 +300,44 @@ public: private: // --------------------------------------------------------------------- void InternBegin() { - if (!stream) { - // in case someone wonders: StreamReader is frequently invoked with - // no prior validation whether the input stream is valid. Since - // no one bothers changing the error message, this message here - // is passed down to the caller and 'unable to open file' - // simply describes best what happened. + if (nullptr == mStream) { throw DeadlyImportError("StreamReader: Unable to open file"); } - const size_t s = stream->FileSize() - stream->Tell(); - if (!s) { + const size_t filesize = mStream->FileSize() - mStream->Tell(); + if (0 == filesize) { throw DeadlyImportError("StreamReader: File is empty or EOF is already reached"); } - current = buffer = new int8_t[s]; - const size_t read = stream->Read(current,1,s); + mCurrent = mBuffer = new int8_t[filesize]; + const size_t read = mStream->Read(mCurrent, 1, filesize); // (read < s) can only happen if the stream was opened in text mode, in which case FileSize() is not reliable - ai_assert(read <= s); - end = limit = &buffer[read-1] + 1; + ai_assert(read <= filesize); + mEnd = mLimit = &mBuffer[read - 1] + 1; } private: - std::shared_ptr stream; - int8_t *buffer, *current, *end, *limit; - bool le; + std::shared_ptr mStream; + int8_t *mBuffer; + int8_t *mCurrent; + int8_t *mEnd; + int8_t *mLimit; + bool mLe; }; // -------------------------------------------------------------------------------------------- // `static` StreamReaders. Their byte order is fixed and they might be a little bit faster. #ifdef AI_BUILD_BIG_ENDIAN - typedef StreamReader StreamReaderLE; - typedef StreamReader StreamReaderBE; +typedef StreamReader StreamReaderLE; +typedef StreamReader StreamReaderBE; #else - typedef StreamReader StreamReaderBE; - typedef StreamReader StreamReaderLE; +typedef StreamReader StreamReaderBE; +typedef StreamReader StreamReaderLE; #endif // `dynamic` StreamReader. The byte order of the input data is specified in the // c'tor. This involves runtime branching and might be a little bit slower. -typedef StreamReader StreamReaderAny; +typedef StreamReader StreamReaderAny; } // end namespace Assimp diff --git a/Source/ThirdParty/assimp/StreamWriter.h b/Source/ThirdParty/assimp/StreamWriter.h index c7cf6c0d7..32da6911b 100644 --- a/Source/ThirdParty/assimp/StreamWriter.h +++ b/Source/ThirdParty/assimp/StreamWriter.h @@ -3,9 +3,7 @@ Open Asset Import Library (assimp) --------------------------------------------------------------------------- -Copyright (c) 2006-2019, assimp team - - +Copyright (c) 2006-2024, assimp team All rights reserved. @@ -43,11 +41,15 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /** @file Defines the StreamWriter class which writes data to * a binary stream with a well-defined endianness. */ - +#pragma once #ifndef AI_STREAMWRITER_H_INCLUDED #define AI_STREAMWRITER_H_INCLUDED -#include "ByteSwapper.h" +#ifdef __GNUC__ +# pragma GCC system_header +#endif + +#include #include #include @@ -63,9 +65,8 @@ namespace Assimp { * stream is to be determined at runtime. */ // -------------------------------------------------------------------------------------------- -template -class StreamWriter -{ +template +class StreamWriter { enum { INITIAL_CAPACITY = 1024 }; @@ -81,7 +82,7 @@ public: continues at the current position of the stream cursor. * @param le If @c RuntimeSwitch is true: specifies whether the * stream is in little endian byte order. Otherwise the - * endianness information is defined by the @c SwapEndianess + * endianness information is defined by the @c SwapEndianness * template parameter and this parameter is meaningless. */ StreamWriter(std::shared_ptr stream, bool le = false) : stream(stream) @@ -259,7 +260,7 @@ public: /** Generic write method. ByteSwap::Swap(T*) *must* be defined */ template void Put(T f) { - Intern :: Getter() (&f, le); + Intern :: Getter() (&f, le); if (cursor + sizeof(T) >= buffer.size()) { buffer.resize(cursor + sizeof(T)); diff --git a/Source/ThirdParty/assimp/StringComparison.h b/Source/ThirdParty/assimp/StringComparison.h index 8acef277b..283d8ba6b 100644 --- a/Source/ThirdParty/assimp/StringComparison.h +++ b/Source/ThirdParty/assimp/StringComparison.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2019, assimp team +Copyright (c) 2006-2024, assimp team All rights reserved. @@ -49,18 +49,23 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. These functions are not consistently available on all platforms, or the provided implementations behave too differently. */ +#pragma once #ifndef INCLUDED_AI_STRING_WORKERS_H #define INCLUDED_AI_STRING_WORKERS_H +#ifdef __GNUC__ +#pragma GCC system_header +#endif + +#include #include #include -#include "StringComparison.h" -#include -#include +#include +#include #include -namespace Assimp { +namespace Assimp { // ------------------------------------------------------------------------------- /** @brief itoa with a fixed base 10 @@ -73,13 +78,12 @@ namespace Assimp { * @param number Number to be written * @return Length of the output string, excluding the '\0' */ -AI_FORCE_INLINE -unsigned int ASSIMP_itoa10( char* out, unsigned int max, int32_t number) { - ai_assert(NULL != out); +inline unsigned int ASSIMP_itoa10(char *out, unsigned int max, int32_t number) { + ai_assert(nullptr != out); // write the unary minus to indicate we have a negative number unsigned int written = 1u; - if (number < 0 && written < max) { + if (number < 0 && written < max) { *out++ = '-'; ++written; number = -number; @@ -88,17 +92,17 @@ unsigned int ASSIMP_itoa10( char* out, unsigned int max, int32_t number) { // We begin with the largest number that is not zero. int32_t cur = 1000000000; // 2147483648 bool mustPrint = false; - while (written < max) { + while (written < max) { const unsigned int digit = number / cur; if (mustPrint || digit > 0 || 1 == cur) { - // print all future zeroe's from now + // print all future zero's from now mustPrint = true; - *out++ = '0'+static_cast(digit); + *out++ = '0' + static_cast(digit); ++written; - number -= digit*cur; + number -= digit * cur; if (1 == cur) { break; } @@ -108,7 +112,7 @@ unsigned int ASSIMP_itoa10( char* out, unsigned int max, int32_t number) { // append a terminal zero *out++ = '\0'; - return written-1; + return written - 1; } // ------------------------------------------------------------------------------- @@ -117,9 +121,8 @@ unsigned int ASSIMP_itoa10( char* out, unsigned int max, int32_t number) { * size of the array automatically. */ template -AI_FORCE_INLINE -unsigned int ASSIMP_itoa10( char(& out)[length], int32_t number) { - return ASSIMP_itoa10(out,length,number); +inline unsigned int ASSIMP_itoa10(char (&out)[length], int32_t number) { + return ASSIMP_itoa10(out, length, number); } // ------------------------------------------------------------------------------- @@ -133,25 +136,19 @@ unsigned int ASSIMP_itoa10( char(& out)[length], int32_t number) { * @param s2 Second input string * @return 0 if the given strings are identical */ -AI_FORCE_INLINE -int ASSIMP_stricmp(const char *s1, const char *s2) { - ai_assert( NULL != s1 ); - ai_assert( NULL != s2 ); +inline int ASSIMP_stricmp(const char *s1, const char *s2) { + ai_assert(nullptr != s1); + ai_assert(nullptr != s2); #if (defined _MSC_VER) - return ::_stricmp(s1,s2); -#elif defined( __GNUC__ ) - - return ::strcasecmp(s1,s2); + return ::_stricmp(s1, s2); #else - char c1, c2; - do { - c1 = tolower(*s1++); - c2 = tolower(*s2++); - } - while ( c1 && (c1 == c2) ); + do { + c1 = tolower((unsigned char)*(s1++)); + c2 = tolower((unsigned char)*(s2++)); + } while (c1 && (c1 == c2)); return c1 - c2; #endif } @@ -163,10 +160,9 @@ int ASSIMP_stricmp(const char *s1, const char *s2) { * @param b Second string * @return 0 if a == b */ -AI_FORCE_INLINE -int ASSIMP_stricmp(const std::string& a, const std::string& b) { - int i = (int)b.length()-(int)a.length(); - return (i ? i : ASSIMP_stricmp(a.c_str(),b.c_str())); +inline int ASSIMP_stricmp(const std::string &a, const std::string &b) { + int i = (int)b.length() - (int)a.length(); + return (i ? i : ASSIMP_stricmp(a.c_str(), b.c_str())); } // ------------------------------------------------------------------------------- @@ -178,56 +174,51 @@ int ASSIMP_stricmp(const std::string& a, const std::string& b) { * * @param s1 First input string * @param s2 Second input string - * @param n Macimum number of characters to compare + * @param n Maximum number of characters to compare * @return 0 if the given strings are identical */ -AI_FORCE_INLINE -int ASSIMP_strincmp(const char *s1, const char *s2, unsigned int n) { - ai_assert( NULL != s1 ); - ai_assert( NULL != s2 ); - if ( !n ) { +inline int ASSIMP_strincmp(const char *s1, const char *s2, unsigned int n) { + ai_assert(nullptr != s1); + ai_assert(nullptr != s2); + if (!n) { return 0; } #if (defined _MSC_VER) - return ::_strnicmp(s1,s2,n); + return ::_strnicmp(s1, s2, n); -#elif defined( __GNUC__ ) +#elif defined(__GNUC__) - return ::strncasecmp(s1,s2, n); + return ::strncasecmp(s1, s2, n); #else char c1, c2; unsigned int p = 0; - do - { - if (p++ >= n)return 0; - c1 = tolower(*s1++); - c2 = tolower(*s2++); - } - while ( c1 && (c1 == c2) ); + do { + if (p++ >= n) return 0; + c1 = tolower((unsigned char)*(s1++)); + c2 = tolower((unsigned char)*(s2++)); + } while (c1 && (c1 == c2)); return c1 - c2; #endif } - // ------------------------------------------------------------------------------- /** @brief Evaluates an integer power * * todo: move somewhere where it fits better in than here */ -AI_FORCE_INLINE -unsigned int integer_pow( unsigned int base, unsigned int power ) { +inline unsigned int integer_pow(unsigned int base, unsigned int power) { unsigned int res = 1; - for ( unsigned int i = 0; i < power; ++i ) { + for (unsigned int i = 0; i < power; ++i) { res *= base; } return res; } -} // end of namespace +} // namespace Assimp #endif // ! AI_STRINGCOMPARISON_H_INC diff --git a/Source/ThirdParty/assimp/StringUtils.h b/Source/ThirdParty/assimp/StringUtils.h index d68b7fa47..4002d2daf 100644 --- a/Source/ThirdParty/assimp/StringUtils.h +++ b/Source/ThirdParty/assimp/StringUtils.h @@ -2,8 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2019, assimp team - +Copyright (c) 2006-2024, assimp team All rights reserved. @@ -39,105 +38,252 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ---------------------------------------------------------------------- */ +#pragma once #ifndef INCLUDED_AI_STRINGUTILS_H #define INCLUDED_AI_STRINGUTILS_H +#ifdef __GNUC__ +#pragma GCC system_header +#endif + #include -#include -#include +#include +#include +#include #include +#include +#include +#include +#if defined(_MSC_VER) && !defined(__clang__) +# define AI_SIZEFMT "%Iu" +#else +# define AI_SIZEFMT "%zu" +#endif + +// --------------------------------------------------------------------------------- /// @fn ai_snprintf -/// @brief The portable version of the function snprintf ( C99 standard ), which works on visual studio compilers 2013 and earlier. +/// @brief The portable version of the function snprintf ( C99 standard ), which +/// works on visual studio compilers 2013 and earlier. /// @param outBuf The buffer to write in /// @param size The buffer size /// @param format The format string /// @param ap The additional arguments. -/// @return The number of written characters if the buffer size was big enough. If an encoding error occurs, a negative number is returned. +/// @return The number of written characters if the buffer size was big enough. +/// If an encoding error occurs, a negative number is returned. +// --------------------------------------------------------------------------------- #if defined(_MSC_VER) && _MSC_VER < 1900 - AI_FORCE_INLINE - int c99_ai_vsnprintf(char *outBuf, size_t size, const char *format, va_list ap) { - int count(-1); - if (0 != size) { - count = _vsnprintf_s(outBuf, size, _TRUNCATE, format, ap); - } - if (count == -1) { - count = _vscprintf(format, ap); - } +inline int c99_ai_vsnprintf(char *outBuf, size_t size, const char *format, va_list ap) { + int count(-1); + if (0 != size) { + count = _vsnprintf_s(outBuf, size, _TRUNCATE, format, ap); + } + if (count == -1) { + count = _vscprintf(format, ap); + } - return count; - } + return count; +} - AI_FORCE_INLINE - int ai_snprintf(char *outBuf, size_t size, const char *format, ...) { - int count; - va_list ap; +inline int ai_snprintf(char *outBuf, size_t size, const char *format, ...) { + int count; + va_list ap; - va_start(ap, format); - count = c99_ai_vsnprintf(outBuf, size, format, ap); - va_end(ap); + va_start(ap, format); + count = c99_ai_vsnprintf(outBuf, size, format, ap); + va_end(ap); - return count; - } + return count; +} +#elif defined(__MINGW32__) +# define ai_snprintf __mingw_snprintf #else -# define ai_snprintf snprintf +# define ai_snprintf snprintf #endif +// --------------------------------------------------------------------------------- /// @fn to_string -/// @brief The portable version of to_string ( some gcc-versions on embedded devices are not supporting this). +/// @brief The portable version of to_string ( some gcc-versions on embedded +/// devices are not supporting this). /// @param value The value to write into the std::string. /// @return The value as a std::string +// --------------------------------------------------------------------------------- template -AI_FORCE_INLINE -std::string to_string( T value ) { +AI_FORCE_INLINE std::string ai_to_string(T value) { std::ostringstream os; os << value; return os.str(); } +// --------------------------------------------------------------------------------- /// @fn ai_strtof /// @brief The portable version of strtof. /// @param begin The first character of the string. /// @param end The last character -/// @return The float value, 0.0f in cas of an error. +/// @return The float value, 0.0f in case of an error. +// --------------------------------------------------------------------------------- AI_FORCE_INLINE -float ai_strtof( const char *begin, const char *end ) { - if ( nullptr == begin ) { +float ai_strtof(const char *begin, const char *end) { + if (nullptr == begin) { return 0.0f; } - float val( 0.0f ); - if ( nullptr == end ) { - val = static_cast< float >( ::atof( begin ) ); + float val(0.0f); + if (nullptr == end) { + val = static_cast(::atof(begin)); } else { - std::string::size_type len( end - begin ); - std::string token( begin, len ); - val = static_cast< float >( ::atof( token.c_str() ) ); + std::string::size_type len(end - begin); + std::string token(begin, len); + val = static_cast(::atof(token.c_str())); } return val; } +// --------------------------------------------------------------------------------- /// @fn DecimalToHexa /// @brief The portable to convert a decimal value into a hexadecimal string. /// @param toConvert Value to convert /// @return The hexadecimal string, is empty in case of an error. -template -AI_FORCE_INLINE -std::string DecimalToHexa( T toConvert ) { +// --------------------------------------------------------------------------------- +template +AI_FORCE_INLINE std::string ai_decimal_to_hexa(T toConvert) { std::string result; std::stringstream ss; ss << std::hex << toConvert; ss >> result; - for ( size_t i = 0; i < result.size(); ++i ) { - result[ i ] = toupper( result[ i ] ); + for (size_t i = 0; i < result.size(); ++i) { + result[i] = (char)toupper((unsigned char)result[i]); } return result; } +// --------------------------------------------------------------------------------- +/// @brief translate RGBA to String +/// @param r aiColor.r +/// @param g aiColor.g +/// @param b aiColor.b +/// @param a aiColor.a +/// @param with_head # +/// @return The hexadecimal string, is empty in case of an error. +// --------------------------------------------------------------------------------- +AI_FORCE_INLINE std::string ai_rgba2hex(int r, int g, int b, int a, bool with_head) { + std::stringstream ss; + if (with_head) { + ss << "#"; + } + ss << std::hex << std::setfill('0') << std::setw(8) << (r << 24 | g << 16 | b << 8 | a); + + return ss.str(); +} + +// --------------------------------------------------------------------------------- +/// @brief Performs a trim from start (in place) +/// @param s string to trim. +// --------------------------------------------------------------------------------- +AI_FORCE_INLINE void ai_trim_left(std::string &s) { + s.erase(s.begin(), std::find_if(s.begin(), s.end(), [](unsigned char ch) { + return !std::isspace(ch); + })); +} + +// --------------------------------------------------------------------------------- +/// @brief Performs a trim from end (in place). +/// @param s string to trim. +// --------------------------------------------------------------------------------- +AI_FORCE_INLINE void ai_trim_right(std::string &s) { + s.erase(std::find_if(s.rbegin(), s.rend(), [](unsigned char ch) { + return !std::isspace(ch); + }).base(), s.end()); +} + +// --------------------------------------------------------------------------------- +/// @brief Performs a trim from both ends (in place). +/// @param s string to trim. +// --------------------------------------------------------------------------------- +AI_FORCE_INLINE std::string ai_trim(std::string &s) { + std::string out(s); + ai_trim_left(out); + ai_trim_right(out); + + return out; +} + +// --------------------------------------------------------------------------------- +/// @brief Performs a to lower operation onto on single character. +/// @param in The character +/// @return the character as lower-case. +// --------------------------------------------------------------------------------- +template +AI_FORCE_INLINE char_t ai_tolower(char_t in) { + return (in >= (char_t)'A' && in <= (char_t)'Z') ? (char_t)(in + 0x20) : in; +} + +// --------------------------------------------------------------------------------- +/// @brief Performs a ToLower-operation and return the lower-case string. +/// @param in The incoming string. +/// @return The string as lowercase. +// --------------------------------------------------------------------------------- +AI_FORCE_INLINE std::string ai_tolower(const std::string &in) { + std::string out(in); + ai_trim_left(out); + ai_trim_right(out); + std::transform(out.begin(), out.end(), out.begin(), [](unsigned char c) { return ai_tolower(c); }); + return out; +} + +// --------------------------------------------------------------------------------- +/// @brief Performs a to upper operation onto on single character. +/// @param in The character +/// @return the character as upper-case. +// --------------------------------------------------------------------------------- +template +AI_FORCE_INLINE char_t ai_toupper(char_t in) { + return (in >= (char_t)'a' && in <= (char_t)'z') ? (char_t)(in - 0x20) : in; +} + +// --------------------------------------------------------------------------------- +/// @brief Performs a ToLower-operation and return the upper-case string. +/// @param in The incoming string. +/// @return The string as uppercase. +// --------------------------------------------------------------------------------- +AI_FORCE_INLINE std::string ai_str_toupper(const std::string &in) { + std::string out(in); + std::transform(out.begin(), out.end(), out.begin(), [](char c) { return ai_toupper(c); }); + return out; +} + +// --------------------------------------------------------------------------------- +/// @brief Make a string printable by replacing all non-printable characters with +/// the specified placeholder character. +/// @param in The incoming string. +/// @param placeholder Placeholder character, default is a question mark. +/// @return The string, with all non-printable characters replaced. +// --------------------------------------------------------------------------------- +AI_FORCE_INLINE std::string ai_str_toprintable(const std::string &in, char placeholder = '?') { + std::string out(in); + std::transform(out.begin(), out.end(), out.begin(), [placeholder] (unsigned char c) { + return isprint(c) ? (char)c : placeholder; + }); + return out; +} + +// --------------------------------------------------------------------------------- +/// @brief Make a string printable by replacing all non-printable characters with +/// the specified placeholder character. +/// @param in The incoming string. +/// @param len The length of the incoming string. +/// @param placeholder Placeholder character, default is a question mark. +/// @return The string, with all non-printable characters replaced. Will return an +/// empty string if in is null or len is <= 0. +// --------------------------------------------------------------------------------- +AI_FORCE_INLINE std::string ai_str_toprintable(const char *in, int len, char placeholder = '?') { + return (in && len > 0) ? ai_str_toprintable(std::string(in, len), placeholder) : std::string(); +} + #endif // INCLUDED_AI_STRINGUTILS_H diff --git a/Source/ThirdParty/assimp/Subdivision.h b/Source/ThirdParty/assimp/Subdivision.h index 43feb73b3..75f44cbb5 100644 --- a/Source/ThirdParty/assimp/Subdivision.h +++ b/Source/ThirdParty/assimp/Subdivision.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2019, assimp team +Copyright (c) 2006-2024, assimp team All rights reserved. @@ -45,7 +45,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef AI_SUBDISIVION_H_INC #define AI_SUBDISIVION_H_INC -#include +#ifdef __GNUC__ +# pragma GCC system_header +#endif + #include struct aiMesh; @@ -119,10 +122,7 @@ public: }; -inline -Subdivider::~Subdivider() { - // empty -} +inline Subdivider::~Subdivider() = default; } // end namespace Assimp diff --git a/Source/ThirdParty/assimp/TinyFormatter.h b/Source/ThirdParty/assimp/TinyFormatter.h index 1226b482e..387fc86b6 100644 --- a/Source/ThirdParty/assimp/TinyFormatter.h +++ b/Source/ThirdParty/assimp/TinyFormatter.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2019, assimp team +Copyright (c) 2006-2024, assimp team All rights reserved. @@ -45,9 +45,14 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * to get rid of the boost::format dependency. Much slinker, * basically just extends stringstream. */ +#pragma once #ifndef INCLUDED_TINY_FORMATTER_H #define INCLUDED_TINY_FORMATTER_H +#ifdef __GNUC__ +# pragma GCC system_header +#endif + #include namespace Assimp { @@ -65,24 +70,15 @@ namespace Formatter { * @endcode */ template < typename T, typename CharTraits = std::char_traits, - typename Allocator = std::allocator -> -class basic_formatter -{ - + typename Allocator = std::allocator > +class basic_formatter { public: + typedef class std::basic_string string; + typedef class std::basic_ostringstream stringstream; - typedef class std::basic_string< - T,CharTraits,Allocator - > string; - - typedef class std::basic_ostringstream< - T,CharTraits,Allocator - > stringstream; - -public: - - basic_formatter() {} + basic_formatter() { + // empty + } /* Allow basic_formatter's to be used almost interchangeably * with std::(w)string or const (w)char* arguments because the @@ -92,6 +88,17 @@ public: underlying << sin; } + // Same problem as the copy constructor below, but with root cause is that stream move + // is not permitted on older GCC versions. Small performance impact on those platforms. +#if defined(__GNUC__) && (__GNUC__ == 4 && __GNUC_MINOR__ <= 9) + basic_formatter(basic_formatter&& other) { + underlying << (string)other; + } +#else + basic_formatter(basic_formatter&& other) + : underlying(std::move(other.underlying)) { + } +#endif // The problem described here: // https://sourceforge.net/tracker/?func=detail&atid=1067632&aid=3358562&group_id=226462 @@ -104,41 +111,49 @@ public: } #endif - -public: - operator string () const { return underlying.str(); } - /* note - this is declared const because binding temporaries does only * work for const references, so many function prototypes will * include const basic_formatter& s but might still want to * modify the formatted string without the need for a full copy.*/ - template - const basic_formatter& operator << (const TToken& s) const { + template ::value>::type * = nullptr> + const basic_formatter &operator<<(const TToken &s) const { underlying << s; return *this; } - template - basic_formatter& operator << (const TToken& s) { + template ::value>::type * = nullptr> + const basic_formatter &operator<<(const TToken &s) const { + underlying << s.what(); + return *this; + } + + template ::value>::type * = nullptr> + basic_formatter &operator<<(const TToken &s) { underlying << s; return *this; } + template ::value>::type * = nullptr> + basic_formatter &operator<<(const TToken &s) { + underlying << s.what(); + return *this; + } + // comma operator overloaded as well, choose your preferred way. template const basic_formatter& operator, (const TToken& s) const { - underlying << s; + *this << s; return *this; } template basic_formatter& operator, (const TToken& s) { - underlying << s; + *this << s; return *this; } @@ -146,7 +161,7 @@ public: // See https://sourceforge.net/projects/assimp/forums/forum/817654/topic/4372824 template basic_formatter& operator, (TToken& s) { - underlying << s; + *this << s; return *this; } diff --git a/Source/ThirdParty/assimp/Vertex.h b/Source/ThirdParty/assimp/Vertex.h index 2a7f0256a..62a531ce2 100644 --- a/Source/ThirdParty/assimp/Vertex.h +++ b/Source/ThirdParty/assimp/Vertex.h @@ -2,7 +2,7 @@ Open Asset Import Library (assimp) ---------------------------------------------------------------------- -Copyright (c) 2006-2019, assimp team +Copyright (c) 2006-2024, assimp team All rights reserved. @@ -47,12 +47,18 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. that are not currently well-defined (and would cause compile errors due to missing operators in the math library), are commented. */ +#pragma once #ifndef AI_VERTEX_H_INC #define AI_VERTEX_H_INC +#ifdef __GNUC__ +# pragma GCC system_header +#endif + #include #include #include + #include namespace Assimp { @@ -87,28 +93,25 @@ namespace Assimp { // ------------------------------------------------------------------------------------------------ /** Intermediate description a vertex with all possible components. Defines a full set of - * operators, so you may use such a 'Vertex' in basic arithmetics. All operators are applied + * operators, so you may use such a 'Vertex' in basic arithmetic. All operators are applied * to *all* vertex components equally. This is useful for stuff like interpolation * or subdivision, but won't work if special handling is required for some vertex components. */ // ------------------------------------------------------------------------------------------------ -class Vertex -{ +struct Vertex { friend Vertex operator + (const Vertex&,const Vertex&); friend Vertex operator - (const Vertex&,const Vertex&); - -// friend Vertex operator + (const Vertex&,ai_real); -// friend Vertex operator - (const Vertex&,ai_real); friend Vertex operator * (const Vertex&,ai_real); friend Vertex operator / (const Vertex&,ai_real); - -// friend Vertex operator + (ai_real, const Vertex&); -// friend Vertex operator - (ai_real, const Vertex&); friend Vertex operator * (ai_real, const Vertex&); -// friend Vertex operator / (ai_real, const Vertex&); -public: + aiVector3D position; + aiVector3D normal; + aiVector3D tangent, bitangent; - Vertex() {} + aiVector3D texcoords[AI_MAX_NUMBER_OF_TEXTURECOORDS]; + aiColor4D colors[AI_MAX_NUMBER_OF_COLOR_SETS]; + + Vertex() = default; // ---------------------------------------------------------------------------- /** Extract a particular vertex from a mesh and interleave all components */ @@ -138,7 +141,9 @@ public: /** Extract a particular vertex from a anim mesh and interleave all components */ explicit Vertex(const aiAnimMesh* msh, unsigned int idx) { ai_assert(idx < msh->mNumVertices); - position = msh->mVertices[idx]; + if (msh->HasPositions()) { + position = msh->mVertices[idx]; + } if (msh->HasNormals()) { normal = msh->mNormals[idx]; @@ -158,8 +163,6 @@ public: } } -public: - Vertex& operator += (const Vertex& v) { *this = *this+v; return *this; @@ -170,18 +173,6 @@ public: return *this; } - -/* - Vertex& operator += (ai_real v) { - *this = *this+v; - return *this; - } - - Vertex& operator -= (ai_real v) { - *this = *this-v; - return *this; - } -*/ Vertex& operator *= (ai_real v) { *this = *this*v; return *this; @@ -192,12 +183,9 @@ public: return *this; } -public: - // ---------------------------------------------------------------------------- - /** Convert back to non-interleaved storage */ + /// Convert back to non-interleaved storage void SortBack(aiMesh* out, unsigned int idx) const { - ai_assert(idxmNumVertices); out->mVertices[idx] = position; @@ -222,7 +210,7 @@ public: private: // ---------------------------------------------------------------------------- - /** Construct from two operands and a binary operation to combine them */ + /// Construct from two operands and a binary operation to combine them template