From 87c309566fd7e32a9c54c18ab8155f412e863f25 Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Sat, 1 Apr 2023 18:35:57 +0800 Subject: [PATCH 01/40] Fix warning related to missing-noreturn. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/AssetLib/AMF/AMFImporter.hpp | 10 +++++----- code/AssetLib/FBX/FBXBinaryTokenizer.cpp | 1 + code/AssetLib/FBX/FBXParser.cpp | 1 + code/AssetLib/HMP/HMPLoader.h | 2 +- code/AssetLib/MD5/MD5Parser.h | 7 ++++--- code/AssetLib/MDL/MDLLoader.h | 2 +- code/AssetLib/MMD/MMDPmxParser.h | 3 ++- code/AssetLib/X3D/X3DImporter.hpp | 12 ++++++++++++ code/CMakeLists.txt | 1 - contrib/Open3DGC/o3dgcArithmeticCodec.cpp | 1 + include/assimp/AssertHandler.h | 2 +- include/assimp/defs.h | 6 ++++++ 12 files changed, 35 insertions(+), 13 deletions(-) diff --git a/code/AssetLib/AMF/AMFImporter.hpp b/code/AssetLib/AMF/AMFImporter.hpp index 601eae4e4..27f733043 100644 --- a/code/AssetLib/AMF/AMFImporter.hpp +++ b/code/AssetLib/AMF/AMFImporter.hpp @@ -282,11 +282,11 @@ public: bool Find_NodeElement(const std::string &pID, const AMFNodeElementBase::EType pType, AMFNodeElementBase **pNodeElement) const; bool Find_ConvertedNode(const std::string &pID, NodeArray &nodeArray, aiNode **pNode) const; bool Find_ConvertedMaterial(const std::string &pID, const SPP_Material **pConvertedMaterial) const; - void Throw_CloseNotFound(const std::string &nodeName); - void Throw_IncorrectAttr(const std::string &nodeName, const std::string &pAttrName); - void Throw_IncorrectAttrValue(const std::string &nodeName, const std::string &pAttrName); - void Throw_MoreThanOnceDefined(const std::string &nodeName, const std::string &pNodeType, const std::string &pDescription); - void Throw_ID_NotFound(const std::string &pID) const; + AI_WONT_RETURN void Throw_CloseNotFound(const std::string &nodeName) AI_WONT_RETURN_SUFFIX; + AI_WONT_RETURN void Throw_IncorrectAttr(const std::string &nodeName, const std::string &pAttrName) AI_WONT_RETURN_SUFFIX; + AI_WONT_RETURN void Throw_IncorrectAttrValue(const std::string &nodeName, const std::string &pAttrName) AI_WONT_RETURN_SUFFIX; + AI_WONT_RETURN void Throw_MoreThanOnceDefined(const std::string &nodeName, const std::string &pNodeType, const std::string &pDescription) AI_WONT_RETURN_SUFFIX; + AI_WONT_RETURN void Throw_ID_NotFound(const std::string &pID) const AI_WONT_RETURN_SUFFIX; void XML_CheckNode_MustHaveChildren(pugi::xml_node &node); bool XML_SearchNode(const std::string &nodeName); void ParseHelper_FixTruncatedFloatString(const char *pInStr, std::string &pOutString); diff --git a/code/AssetLib/FBX/FBXBinaryTokenizer.cpp b/code/AssetLib/FBX/FBXBinaryTokenizer.cpp index 8fb700179..4ab73f681 100644 --- a/code/AssetLib/FBX/FBXBinaryTokenizer.cpp +++ b/code/AssetLib/FBX/FBXBinaryTokenizer.cpp @@ -139,6 +139,7 @@ size_t Offset(const char* begin, const char* cursor) { } // ------------------------------------------------------------------------------------------------ +AI_WONT_RETURN void TokenizeError(const std::string& message, const char* begin, const char* cursor) AI_WONT_RETURN_SUFFIX; void TokenizeError(const std::string& message, const char* begin, const char* cursor) { TokenizeError(message, Offset(begin, cursor)); } diff --git a/code/AssetLib/FBX/FBXParser.cpp b/code/AssetLib/FBX/FBXParser.cpp index d71321452..c85841f8b 100644 --- a/code/AssetLib/FBX/FBXParser.cpp +++ b/code/AssetLib/FBX/FBXParser.cpp @@ -88,6 +88,7 @@ namespace { // ------------------------------------------------------------------------------------------------ + AI_WONT_RETURN void ParseError(const std::string& message, TokenPtr token) AI_WONT_RETURN_SUFFIX; void ParseError(const std::string& message, TokenPtr token) { if(token) { diff --git a/code/AssetLib/HMP/HMPLoader.h b/code/AssetLib/HMP/HMPLoader.h index 95ce0a9eb..4d5f5f22f 100644 --- a/code/AssetLib/HMP/HMPLoader.h +++ b/code/AssetLib/HMP/HMPLoader.h @@ -86,7 +86,7 @@ protected: // ------------------------------------------------------------------- /** Import a HMP4 file */ - void InternReadFile_HMP4(); + AI_WONT_RETURN void InternReadFile_HMP4() AI_WONT_RETURN_SUFFIX; // ------------------------------------------------------------------- /** Import a HMP5 file diff --git a/code/AssetLib/MD5/MD5Parser.h b/code/AssetLib/MD5/MD5Parser.h index bb4843cf9..ad7367e2a 100644 --- a/code/AssetLib/MD5/MD5Parser.h +++ b/code/AssetLib/MD5/MD5Parser.h @@ -365,9 +365,7 @@ public: static void ReportWarning (const char* warn, unsigned int line); - void ReportError (const char* error) { - return ReportError(error, lineNumber); - } + AI_WONT_RETURN void ReportError (const char* error) AI_WONT_RETURN_SUFFIX; void ReportWarning (const char* warn) { return ReportWarning(warn, lineNumber); @@ -404,6 +402,9 @@ private: unsigned int lineNumber; }; +inline void MD5Parser::ReportError(const char* error) { + ReportError(error, lineNumber); +} // ------------------------------------------------------------------- inline bool MD5Parser::SkipLine(const char* in, const char** out) { ++lineNumber; diff --git a/code/AssetLib/MDL/MDLLoader.h b/code/AssetLib/MDL/MDLLoader.h index b7d87e88d..433100938 100644 --- a/code/AssetLib/MDL/MDLLoader.h +++ b/code/AssetLib/MDL/MDLLoader.h @@ -139,7 +139,7 @@ protected: // ------------------------------------------------------------------- /** Import a CS:S/HL2 MDL file (not fully implemented) */ - void InternReadFile_HL2( ); + AI_WONT_RETURN void InternReadFile_HL2( ) AI_WONT_RETURN_SUFFIX; // ------------------------------------------------------------------- /** Check whether a given position is inside the valid range diff --git a/code/AssetLib/MMD/MMDPmxParser.h b/code/AssetLib/MMD/MMDPmxParser.h index f2e387975..424fc725a 100644 --- a/code/AssetLib/MMD/MMDPmxParser.h +++ b/code/AssetLib/MMD/MMDPmxParser.h @@ -46,6 +46,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include #include +#include #include "MMDCpp14.h" namespace pmx @@ -730,7 +731,7 @@ namespace pmx std::unique_ptr anchers; int pin_vertex_count; std::unique_ptr pin_vertices; - void Read(std::istream *stream, PmxSetting *setting); + AI_WONT_RETURN void Read(std::istream *stream, PmxSetting *setting) AI_WONT_RETURN_SUFFIX; }; class PmxModel diff --git a/code/AssetLib/X3D/X3DImporter.hpp b/code/AssetLib/X3D/X3DImporter.hpp index 8852b71ec..705a2472e 100644 --- a/code/AssetLib/X3D/X3DImporter.hpp +++ b/code/AssetLib/X3D/X3DImporter.hpp @@ -55,6 +55,18 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include namespace Assimp { +AI_WONT_RETURN inline void Throw_ArgOutOfRange(const std::string &argument) AI_WONT_RETURN_SUFFIX; +AI_WONT_RETURN inline void Throw_CloseNotFound(const std::string &node) AI_WONT_RETURN_SUFFIX; +AI_WONT_RETURN inline void Throw_ConvertFail_Str2ArrF(const std::string &nodeName, const std::string &pAttrValue) AI_WONT_RETURN_SUFFIX; +AI_WONT_RETURN inline void Throw_ConvertFail_Str2ArrD(const std::string &nodeName, const std::string &pAttrValue) AI_WONT_RETURN_SUFFIX; +AI_WONT_RETURN inline void Throw_ConvertFail_Str2ArrB(const std::string &nodeName, const std::string &pAttrValue) AI_WONT_RETURN_SUFFIX; +AI_WONT_RETURN inline void Throw_ConvertFail_Str2ArrI(const std::string &nodeName, const std::string &pAttrValue) AI_WONT_RETURN_SUFFIX; +AI_WONT_RETURN inline void Throw_DEF_And_USE(const std::string &nodeName) AI_WONT_RETURN_SUFFIX; +AI_WONT_RETURN inline void Throw_IncorrectAttr(const std::string &nodeName, const std::string &pAttrName) AI_WONT_RETURN_SUFFIX; +AI_WONT_RETURN inline void Throw_IncorrectAttrValue(const std::string &nodeName, const std::string &pAttrName) AI_WONT_RETURN_SUFFIX; +AI_WONT_RETURN inline void Throw_MoreThanOnceDefined(const std::string &nodeName, const std::string &pNodeType, const std::string &pDescription) AI_WONT_RETURN_SUFFIX; +AI_WONT_RETURN inline void Throw_TagCountIncorrect(const std::string &pNode) AI_WONT_RETURN_SUFFIX; +AI_WONT_RETURN inline void Throw_USE_NotFound(const std::string &nodeName, const std::string &pAttrValue) AI_WONT_RETURN_SUFFIX; inline void Throw_ArgOutOfRange(const std::string &argument) { throw DeadlyImportError("Argument value is out of range for: \"" + argument + "\"."); diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index fd3b1cb88..f13eadbdf 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -1236,7 +1236,6 @@ IF (ASSIMP_WARNINGS_AS_ERRORS) -Wno-header-hygiene -Wno-tautological-value-range-compare -Wno-tautological-type-limit-compare - -Wno-missing-noreturn -Wno-missing-variable-declarations -Wno-extra-semi -Wno-nonportable-system-include-path diff --git a/contrib/Open3DGC/o3dgcArithmeticCodec.cpp b/contrib/Open3DGC/o3dgcArithmeticCodec.cpp index 2ae70fa2e..c1935822d 100644 --- a/contrib/Open3DGC/o3dgcArithmeticCodec.cpp +++ b/contrib/Open3DGC/o3dgcArithmeticCodec.cpp @@ -92,6 +92,7 @@ namespace o3dgc // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - Static functions - - - - - - - - - - - - - - - - - - - - - - - - - - - + AI_WONT_RETURN static void AC_Error(const char * msg) AI_WONT_RETURN_SUFFIX; static void AC_Error(const char * msg) { fprintf(stderr, "\n\n -> Arithmetic coding error: "); diff --git a/include/assimp/AssertHandler.h b/include/assimp/AssertHandler.h index 365a924b0..1247ff490 100644 --- a/include/assimp/AssertHandler.h +++ b/include/assimp/AssertHandler.h @@ -66,7 +66,7 @@ ASSIMP_API void setAiAssertHandler(AiAssertHandler handler); * * @brief This issues a message to stderr and calls abort. */ -ASSIMP_API void defaultAiAssertHandler(const char* failedExpression, const char* file, int line); +AI_WONT_RETURN ASSIMP_API void defaultAiAssertHandler(const char* failedExpression, const char* file, int line) AI_WONT_RETURN_SUFFIX; // --------------------------------------------------------------------------- /** diff --git a/include/assimp/defs.h b/include/assimp/defs.h index ddb209bec..34121e385 100644 --- a/include/assimp/defs.h +++ b/include/assimp/defs.h @@ -184,6 +184,12 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifdef __GNUC__ # define AI_WONT_RETURN_SUFFIX __attribute__((noreturn)) +#elif _MSC_VER +#if defined(__clang__) +# define AI_WONT_RETURN_SUFFIX __attribute__((noreturn)) +#else +# define AI_WONT_RETURN_SUFFIX +#endif #else # define AI_WONT_RETURN_SUFFIX #endif // (defined __clang__) From e36812a449fcdced34bdd0fc2f7af85ce9d0bd59 Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Sat, 1 Apr 2023 19:07:13 +0800 Subject: [PATCH 02/40] Remove unused -Wno-deprecated-copy-with-user-provided-dtor. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index fd3b1cb88..3ee9c0705 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -1242,7 +1242,6 @@ IF (ASSIMP_WARNINGS_AS_ERRORS) -Wno-nonportable-system-include-path -Wno-undefined-reinterpret-cast -Wno-shift-sign-overflow - -Wno-deprecated-copy-with-user-provided-dtor -Wno-deprecated-copy-with-dtor -Wno-deprecated -Wno-format-nonliteral From 7df4efea4460056d530a65201cab0638493fc672 Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Sat, 1 Apr 2023 21:34:36 +0800 Subject: [PATCH 03/40] Fix warning related to inconsistent-missing-destructor-override. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/AssetLib/3DS/3DSLoader.h | 2 +- code/AssetLib/3MF/3MFTypes.h | 8 ++++---- code/AssetLib/Raw/RawLoader.h | 2 +- code/AssetLib/Unreal/UnrealLoader.h | 2 +- code/AssetLib/glTF2/glTF2Asset.h | 2 +- code/CMakeLists.txt | 1 - code/Common/ZipArchiveIOSystem.cpp | 2 +- include/assimp/DefaultIOStream.h | 2 +- include/assimp/MemoryIOWrapper.h | 10 +++++----- include/assimp/ZipArchiveIOSystem.h | 2 +- 10 files changed, 16 insertions(+), 17 deletions(-) diff --git a/code/AssetLib/3DS/3DSLoader.h b/code/AssetLib/3DS/3DSLoader.h index f47fcfef9..6bd73f412 100644 --- a/code/AssetLib/3DS/3DSLoader.h +++ b/code/AssetLib/3DS/3DSLoader.h @@ -68,7 +68,7 @@ using namespace D3DS; class Discreet3DSImporter : public BaseImporter { public: Discreet3DSImporter(); - ~Discreet3DSImporter(); + ~Discreet3DSImporter() override; // ------------------------------------------------------------------- /** Returns whether the class can handle the format of the given file. diff --git a/code/AssetLib/3MF/3MFTypes.h b/code/AssetLib/3MF/3MFTypes.h index 02238ceab..8207b568b 100644 --- a/code/AssetLib/3MF/3MFTypes.h +++ b/code/AssetLib/3MF/3MFTypes.h @@ -93,7 +93,7 @@ public: // empty } - ~EmbeddedTexture() = default; + ~EmbeddedTexture() override = default; ResourceType getType() const override { return ResourceType::RT_EmbeddedTexture2D; @@ -110,7 +110,7 @@ public: // empty } - ~Texture2DGroup() = default; + ~Texture2DGroup() override = default; ResourceType getType() const override { return ResourceType::RT_Texture2DGroup; @@ -127,7 +127,7 @@ public: // empty } - ~BaseMaterials() = default; + ~BaseMaterials() override = default; ResourceType getType() const override { return ResourceType::RT_BaseMaterials; @@ -152,7 +152,7 @@ public: // empty } - ~Object() = default; + ~Object() override = default; ResourceType getType() const override { return ResourceType::RT_Object; diff --git a/code/AssetLib/Raw/RawLoader.h b/code/AssetLib/Raw/RawLoader.h index 6e4c4d110..54314f728 100644 --- a/code/AssetLib/Raw/RawLoader.h +++ b/code/AssetLib/Raw/RawLoader.h @@ -58,7 +58,7 @@ namespace Assimp { class RAWImporter : public BaseImporter { public: RAWImporter(); - ~RAWImporter(); + ~RAWImporter() override; // ------------------------------------------------------------------- /** Returns whether the class can handle the format of the given file. diff --git a/code/AssetLib/Unreal/UnrealLoader.h b/code/AssetLib/Unreal/UnrealLoader.h index a931a86dd..fda784cfb 100644 --- a/code/AssetLib/Unreal/UnrealLoader.h +++ b/code/AssetLib/Unreal/UnrealLoader.h @@ -56,7 +56,7 @@ namespace Assimp { class UnrealImporter : public BaseImporter { public: UnrealImporter(); - ~UnrealImporter(); + ~UnrealImporter() override; // ------------------------------------------------------------------- /** @brief Returns whether we can handle the format of the given file diff --git a/code/AssetLib/glTF2/glTF2Asset.h b/code/AssetLib/glTF2/glTF2Asset.h index 1d7cff325..166c10038 100644 --- a/code/AssetLib/glTF2/glTF2Asset.h +++ b/code/AssetLib/glTF2/glTF2Asset.h @@ -483,7 +483,7 @@ private: public: Buffer(); - ~Buffer(); + ~Buffer() override; void Read(Value &obj, Asset &r); diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index fd3b1cb88..184347145 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -1211,7 +1211,6 @@ IF (ASSIMP_WARNINGS_AS_ERRORS) -Wno-undef -Wno-suggest-destructor-override -Wno-suggest-override - -Wno-inconsistent-missing-destructor-override -Wno-zero-as-null-pointer-constant -Wno-global-constructors -Wno-exit-time-destructors diff --git a/code/Common/ZipArchiveIOSystem.cpp b/code/Common/ZipArchiveIOSystem.cpp index d0c2f3204..51a250810 100644 --- a/code/Common/ZipArchiveIOSystem.cpp +++ b/code/Common/ZipArchiveIOSystem.cpp @@ -68,7 +68,7 @@ class ZipFile : public IOStream { public: std::string m_Filename; - virtual ~ZipFile(); + virtual ~ZipFile() override; // IOStream interface size_t Read(void *pvBuffer, size_t pSize, size_t pCount) override; diff --git a/include/assimp/DefaultIOStream.h b/include/assimp/DefaultIOStream.h index e8d9ed329..67cba3c5c 100644 --- a/include/assimp/DefaultIOStream.h +++ b/include/assimp/DefaultIOStream.h @@ -84,7 +84,7 @@ protected: public: /** Destructor public to allow simple deletion to close the file. */ - ~DefaultIOStream (); + ~DefaultIOStream () override; // ------------------------------------------------------------------- /// Read from stream diff --git a/include/assimp/MemoryIOWrapper.h b/include/assimp/MemoryIOWrapper.h index 1b986ff1b..4023f7529 100644 --- a/include/assimp/MemoryIOWrapper.h +++ b/include/assimp/MemoryIOWrapper.h @@ -65,8 +65,8 @@ namespace Assimp { // ---------------------------------------------------------------------------------- class MemoryIOStream : public IOStream { public: - MemoryIOStream (const uint8_t* buff, size_t len, bool own = false) : - buffer (buff), + MemoryIOStream (const uint8_t* buff, size_t len, bool own = false) : + buffer (buff), length(len), pos(static_cast(0)), own(own) { @@ -145,7 +145,7 @@ public: } /// @brief Destructor. - ~MemoryIOSystem() = default; + ~MemoryIOSystem() override = default; // ------------------------------------------------------------------- /// @brief Tests for the existence of a file at the given path. @@ -190,7 +190,7 @@ public: bool ComparePaths(const char* one, const char* second) const override { return existing_io ? existing_io->ComparePaths(one, second) : false; } - + /// @brief Will push the directory. bool PushDirectory( const std::string &path ) override { return existing_io ? existing_io->PushDirectory(path) : false; @@ -216,7 +216,7 @@ public: 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; diff --git a/include/assimp/ZipArchiveIOSystem.h b/include/assimp/ZipArchiveIOSystem.h index dac60b501..9f3a4783b 100644 --- a/include/assimp/ZipArchiveIOSystem.h +++ b/include/assimp/ZipArchiveIOSystem.h @@ -63,7 +63,7 @@ public: //! Open a Zip using the proffered IOSystem ZipArchiveIOSystem(IOSystem* pIOHandler, const char *pFilename, const char* pMode = "r"); ZipArchiveIOSystem(IOSystem* pIOHandler, const std::string& rFilename, const char* pMode = "r"); - virtual ~ZipArchiveIOSystem(); + virtual ~ZipArchiveIOSystem() override; bool Exists(const char* pFilename) const override; char getOsSeparator() const override; IOStream* Open(const char* pFilename, const char* pMode = "rb") override; From bddb4559a18b14494ffa1679e675ebb0580930d3 Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Sat, 1 Apr 2023 22:46:01 +0800 Subject: [PATCH 04/40] Remove -Wno-deprecated-copy-with-dtor. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index fd3b1cb88..a69d1626f 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -1243,7 +1243,6 @@ IF (ASSIMP_WARNINGS_AS_ERRORS) -Wno-undefined-reinterpret-cast -Wno-shift-sign-overflow -Wno-deprecated-copy-with-user-provided-dtor - -Wno-deprecated-copy-with-dtor -Wno-deprecated -Wno-format-nonliteral -Wno-format-non-iso From a87585668d61e69f1d5c09ef47bf0d656dc2dceb Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Sat, 1 Apr 2023 15:45:05 +0800 Subject: [PATCH 05/40] Fix warning related to unreachable-code-return, disable warning. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/AssetLib/3DS/3DSLoader.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/code/AssetLib/3DS/3DSLoader.cpp b/code/AssetLib/3DS/3DSLoader.cpp index 769e8a6ee..aa29956df 100644 --- a/code/AssetLib/3DS/3DSLoader.cpp +++ b/code/AssetLib/3DS/3DSLoader.cpp @@ -266,8 +266,15 @@ void Discreet3DSImporter::ParseMainChunk() { }; ASSIMP_3DS_END_CHUNK(); +#if defined(__clang__) +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunreachable-code-return" +#endif // recursively continue processing this hierarchy level return ParseMainChunk(); +#if defined(__clang__) +#pragma clang diagnostic pop +#endif } // ------------------------------------------------------------------------------------------------ From 502bceb6e82b687d3b70b3f9ec2ba609aa0f1307 Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Sat, 1 Apr 2023 15:45:56 +0800 Subject: [PATCH 06/40] Fix warning related to unreachable-code-return, remove redundant return. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/AssetLib/ASE/ASEParser.cpp | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/code/AssetLib/ASE/ASEParser.cpp b/code/AssetLib/ASE/ASEParser.cpp index 839d308de..8e7ca63d7 100644 --- a/code/AssetLib/ASE/ASEParser.cpp +++ b/code/AssetLib/ASE/ASEParser.cpp @@ -304,7 +304,6 @@ void Parser::Parse() { } AI_ASE_HANDLE_TOP_LEVEL_SECTION(); } - return; } // ------------------------------------------------------------------------------------------------ @@ -734,7 +733,6 @@ void Parser::ParseLV3MapBlock(Texture &map) { } AI_ASE_HANDLE_SECTION("3", "*MAP_XXXXXX"); } - return; } // ------------------------------------------------------------------------------------------------ @@ -859,7 +857,6 @@ void Parser::ParseLV1ObjectBlock(ASE::BaseNode &node) { } AI_ASE_HANDLE_TOP_LEVEL_SECTION(); } - return; } // ------------------------------------------------------------------------------------------------ @@ -883,7 +880,6 @@ void Parser::ParseLV2CameraSettingsBlock(ASE::Camera &camera) { } AI_ASE_HANDLE_SECTION("2", "CAMERA_SETTINGS"); } - return; } // ------------------------------------------------------------------------------------------------ @@ -1189,7 +1185,6 @@ void Parser::ParseLV2NodeTransformBlock(ASE::BaseNode &mesh) { } AI_ASE_HANDLE_SECTION("2", "*NODE_TM"); } - return; } // ------------------------------------------------------------------------------------------------ void Parser::ParseLV2MeshBlock(ASE::Mesh &mesh) { @@ -1310,7 +1305,6 @@ void Parser::ParseLV2MeshBlock(ASE::Mesh &mesh) { } AI_ASE_HANDLE_SECTION("2", "*MESH"); } - return; } // ------------------------------------------------------------------------------------------------ void Parser::ParseLV3MeshWeightsBlock(ASE::Mesh &mesh) { @@ -1344,7 +1338,6 @@ void Parser::ParseLV3MeshWeightsBlock(ASE::Mesh &mesh) { } AI_ASE_HANDLE_SECTION("3", "*MESH_WEIGHTS"); } - return; } // ------------------------------------------------------------------------------------------------ void Parser::ParseLV4MeshBones(unsigned int iNumBones, ASE::Mesh &mesh) { @@ -1414,7 +1407,6 @@ void Parser::ParseLV4MeshBonesVertices(unsigned int iNumVertices, ASE::Mesh &mes } AI_ASE_HANDLE_SECTION("4", "*MESH_BONE_VERTEX"); } - return; } // ------------------------------------------------------------------------------------------------ void Parser::ParseLV3MeshVertexListBlock( @@ -1443,7 +1435,6 @@ void Parser::ParseLV3MeshVertexListBlock( } AI_ASE_HANDLE_SECTION("3", "*MESH_VERTEX_LIST"); } - return; } // ------------------------------------------------------------------------------------------------ void Parser::ParseLV3MeshFaceListBlock(unsigned int iNumFaces, ASE::Mesh &mesh) { @@ -1470,7 +1461,6 @@ void Parser::ParseLV3MeshFaceListBlock(unsigned int iNumFaces, ASE::Mesh &mesh) } AI_ASE_HANDLE_SECTION("3", "*MESH_FACE_LIST"); } - return; } // ------------------------------------------------------------------------------------------------ void Parser::ParseLV3MeshTListBlock(unsigned int iNumVertices, @@ -1503,7 +1493,6 @@ void Parser::ParseLV3MeshTListBlock(unsigned int iNumVertices, } AI_ASE_HANDLE_SECTION("3", "*MESH_TVERT_LIST"); } - return; } // ------------------------------------------------------------------------------------------------ void Parser::ParseLV3MeshTFaceListBlock(unsigned int iNumFaces, @@ -1532,7 +1521,6 @@ void Parser::ParseLV3MeshTFaceListBlock(unsigned int iNumFaces, } AI_ASE_HANDLE_SECTION("3", "*MESH_TFACE_LIST"); } - return; } // ------------------------------------------------------------------------------------------------ void Parser::ParseLV3MappingChannel(unsigned int iChannel, ASE::Mesh &mesh) { @@ -1567,7 +1555,6 @@ void Parser::ParseLV3MappingChannel(unsigned int iChannel, ASE::Mesh &mesh) { } AI_ASE_HANDLE_SECTION("3", "*MESH_MAPPING_CHANNEL"); } - return; } // ------------------------------------------------------------------------------------------------ void Parser::ParseLV3MeshCListBlock(unsigned int iNumVertices, ASE::Mesh &mesh) { @@ -1595,7 +1582,6 @@ void Parser::ParseLV3MeshCListBlock(unsigned int iNumVertices, ASE::Mesh &mesh) } AI_ASE_HANDLE_SECTION("3", "*MESH_CVERTEX_LIST"); } - return; } // ------------------------------------------------------------------------------------------------ void Parser::ParseLV3MeshCFaceListBlock(unsigned int iNumFaces, ASE::Mesh &mesh) { @@ -1623,7 +1609,6 @@ void Parser::ParseLV3MeshCFaceListBlock(unsigned int iNumFaces, ASE::Mesh &mesh) } AI_ASE_HANDLE_SECTION("3", "*MESH_CFACE_LIST"); } - return; } // ------------------------------------------------------------------------------------------------ void Parser::ParseLV3MeshNormalListBlock(ASE::Mesh &sMesh) { @@ -1681,7 +1666,6 @@ void Parser::ParseLV3MeshNormalListBlock(ASE::Mesh &sMesh) { } AI_ASE_HANDLE_SECTION("3", "*MESH_NORMALS"); } - return; } // ------------------------------------------------------------------------------------------------ void Parser::ParseLV4MeshFace(ASE::Face &out) { From 55c6eaee0c30594b2dd4be775f37d795e8819559 Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Sat, 1 Apr 2023 15:47:37 +0800 Subject: [PATCH 07/40] Fix warning related to unreachable-code-return, remove redundant return. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/AssetLib/Ogre/OgreXmlSerializer.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/code/AssetLib/Ogre/OgreXmlSerializer.cpp b/code/AssetLib/Ogre/OgreXmlSerializer.cpp index a8faaec34..7f5940838 100644 --- a/code/AssetLib/Ogre/OgreXmlSerializer.cpp +++ b/code/AssetLib/Ogre/OgreXmlSerializer.cpp @@ -128,7 +128,6 @@ bool OgreXmlSerializer::ReadAttribute(XmlNode &xmlNode, const char *name) } ThrowAttibuteError(xmlNode.name(), name, "Boolean value is expected to be 'true' or 'false', encountered '" + value + "'"); - return false; } // Mesh XML constants From a7cb3b4dbb3092a15f7c3bfaa4e340f6691557b7 Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Sat, 1 Apr 2023 15:48:12 +0800 Subject: [PATCH 08/40] Fix warning related to unreachable-code-return, remove redundant return. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/AssetLib/OpenGEX/OpenGEXImporter.cpp | 9 --------- 1 file changed, 9 deletions(-) diff --git a/code/AssetLib/OpenGEX/OpenGEXImporter.cpp b/code/AssetLib/OpenGEX/OpenGEXImporter.cpp index 1bd981656..16268ead5 100644 --- a/code/AssetLib/OpenGEX/OpenGEXImporter.cpp +++ b/code/AssetLib/OpenGEX/OpenGEXImporter.cpp @@ -460,14 +460,12 @@ void OpenGEXImporter::handleMetricNode(DDLNode *node, aiScene * /*pScene*/) { void OpenGEXImporter::handleNameNode(DDLNode *node, aiScene * /*pScene*/) { if (nullptr == m_currentNode) { throw DeadlyImportError("No current node for name."); - return; } Value *val(node->getValue()); if (nullptr != val) { if (Value::ValueType::ddl_string != val->m_type) { throw DeadlyImportError("OpenGEX: invalid data type for value in node name."); - return; } const std::string name(val->getString()); @@ -508,7 +506,6 @@ static void getRefNames(DDLNode *node, std::vector &names) { void OpenGEXImporter::handleObjectRefNode(DDLNode *node, aiScene * /*pScene*/) { if (nullptr == m_currentNode) { throw DeadlyImportError("No parent node for name."); - return; } std::vector objRefNames; @@ -532,7 +529,6 @@ void OpenGEXImporter::handleObjectRefNode(DDLNode *node, aiScene * /*pScene*/) { void OpenGEXImporter::handleMaterialRefNode(ODDLParser::DDLNode *node, aiScene * /*pScene*/) { if (nullptr == m_currentNode) { throw DeadlyImportError("No parent node for name."); - return; } std::vector matRefNames; @@ -672,14 +668,12 @@ static void setMatrix(aiNode *node, DataArrayList *transformData) { void OpenGEXImporter::handleTransformNode(ODDLParser::DDLNode *node, aiScene * /*pScene*/) { if (nullptr == m_currentNode) { throw DeadlyImportError("No parent node for name."); - return; } DataArrayList *transformData(node->getDataArrayList()); if (nullptr != transformData) { if (transformData->m_numItems != 16) { throw DeadlyImportError("Invalid number of data for transform matrix."); - return; } setMatrix(m_currentNode, transformData); } @@ -835,7 +829,6 @@ static void copyColor4DArray(size_t numItems, DataArrayList *vaList, aiColor4D * void OpenGEXImporter::handleVertexArrayNode(ODDLParser::DDLNode *node, aiScene * /*pScene*/) { if (nullptr == node) { throw DeadlyImportError("No parent node for name."); - return; } Property *prop = node->getProperties(); @@ -876,12 +869,10 @@ void OpenGEXImporter::handleVertexArrayNode(ODDLParser::DDLNode *node, aiScene * void OpenGEXImporter::handleIndexArrayNode(ODDLParser::DDLNode *node, aiScene * /*pScene*/) { if (nullptr == node) { throw DeadlyImportError("No parent node for name."); - return; } if (nullptr == m_currentMesh) { throw DeadlyImportError("No current mesh for index data found."); - return; } DataArrayList *vaList = node->getDataArrayList(); From 116ceeca31cb5401aacd0af97828c4fe9b9f584f Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Sat, 1 Apr 2023 15:49:35 +0800 Subject: [PATCH 09/40] Remove -Wno-unreachable-code-return. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index 6f74823df..05e31624a 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -1247,7 +1247,6 @@ IF (ASSIMP_WARNINGS_AS_ERRORS) -Wno-format-nonliteral -Wno-comma -Wno-unreachable-code-break - -Wno-unreachable-code-return -Wno-implicit-fallthrough -Wno-unused-template -Wno-undefined-func-template From d4c21ba9a86dbba804ee8e972138ac04e545a203 Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Mon, 3 Apr 2023 12:43:28 +0800 Subject: [PATCH 10/40] Fix warning related to error=return-type. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit /home/runner/work/assimp/assimp/code/AssetLib/Ogre/OgreXmlSerializer.cpp: In member function ‘T Assimp::Ogre::OgreXmlSerializer::ReadAttribute(Assimp::XmlNode&, const char*) const [with T = bool]’: Error: /home/runner/work/assimp/assimp/code/AssetLib/Ogre/OgreXmlSerializer.cpp:131:1: error: control reaches end of non-void function [-Werror=return-type] Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/AssetLib/Ogre/OgreXmlSerializer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/AssetLib/Ogre/OgreXmlSerializer.cpp b/code/AssetLib/Ogre/OgreXmlSerializer.cpp index 7f5940838..8a1b88510 100644 --- a/code/AssetLib/Ogre/OgreXmlSerializer.cpp +++ b/code/AssetLib/Ogre/OgreXmlSerializer.cpp @@ -57,7 +57,7 @@ namespace Assimp { namespace Ogre { //AI_WONT_RETURN void ThrowAttibuteError(const XmlParser *reader, const std::string &name, const std::string &error = "") AI_WONT_RETURN_SUFFIX; - +AI_WONT_RETURN void ThrowAttibuteError(const std::string &nodeName, const std::string &name, const std::string &error) AI_WONT_RETURN_SUFFIX; AI_WONT_RETURN void ThrowAttibuteError(const std::string &nodeName, const std::string &name, const std::string &error) { if (!error.empty()) { throw DeadlyImportError(error, " in node '", nodeName, "' and attribute '", name, "'"); From 5d841ec9a5889f910fe0ed906056616babefe6cf Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Sun, 16 Apr 2023 18:20:14 +0200 Subject: [PATCH 11/40] Refactoring: Cleanup post-processing steps. --- code/AssetLib/3DS/3DSHelper.h | 4 -- code/AssetLib/X3D/X3DExporter.hpp | 2 - code/Geometry/GeometryUtils.cpp | 13 ++++ code/Geometry/GeometryUtils.h | 2 + code/PostProcessing/ArmaturePopulate.cpp | 27 +++------ code/PostProcessing/ArmaturePopulate.h | 8 +-- .../ComputeUVMappingProcess.cpp | 37 ++++-------- code/PostProcessing/ConvertToLHProcess.cpp | 9 --- code/PostProcessing/DeboneProcess.cpp | 12 ++-- code/PostProcessing/FindDegenerates.cpp | 3 +- code/PostProcessing/RemoveVCProcess.cpp | 59 ------------------- code/PostProcessing/ScaleProcess.cpp | 8 +-- code/PostProcessing/SortByPTypeProcess.cpp | 21 +++---- .../SplitByBoneCountProcess.cpp | 18 +++--- code/PostProcessing/SplitByBoneCountProcess.h | 13 +++- include/assimp/Vertex.h | 2 +- 16 files changed, 75 insertions(+), 163 deletions(-) diff --git a/code/AssetLib/3DS/3DSHelper.h b/code/AssetLib/3DS/3DSHelper.h index 06c36bfeb..2279d105c 100644 --- a/code/AssetLib/3DS/3DSHelper.h +++ b/code/AssetLib/3DS/3DSHelper.h @@ -397,10 +397,6 @@ struct Material { Material(const Material &other) = default; - Material(Material &&other) AI_NO_EXCEPT = default; - - Material &operator=(Material &&other) AI_NO_EXCEPT = default; - virtual ~Material() = default; //! Name of the material diff --git a/code/AssetLib/X3D/X3DExporter.hpp b/code/AssetLib/X3D/X3DExporter.hpp index e77aa6877..babf552dd 100644 --- a/code/AssetLib/X3D/X3DExporter.hpp +++ b/code/AssetLib/X3D/X3DExporter.hpp @@ -58,8 +58,6 @@ class X3DExporter { Value(value) { // empty } - - SAttribute(SAttribute &&rhs) AI_NO_EXCEPT = default; }; /***********************************************/ diff --git a/code/Geometry/GeometryUtils.cpp b/code/Geometry/GeometryUtils.cpp index ab735aa6e..92a3aa853 100644 --- a/code/Geometry/GeometryUtils.cpp +++ b/code/Geometry/GeometryUtils.cpp @@ -76,4 +76,17 @@ ai_real GeometryUtils::calculateAreaOfTriangle( const aiFace& face, aiMesh* mesh return area; } +// ------------------------------------------------------------------------------------------------ +// Check whether a ray intersects a plane and find the intersection point +bool GeometryUtils::PlaneIntersect(const aiRay& ray, const aiVector3D& planePos, + const aiVector3D& planeNormal, aiVector3D& pos) { + const ai_real b = planeNormal * (planePos - ray.pos); + ai_real h = ray.dir * planeNormal; + if ((h < 10e-5 && h > -10e-5) || (h = b/h) < 0) + return false; + + pos = ray.pos + (ray.dir * h); + return true; +} + } // namespace Assimp diff --git a/code/Geometry/GeometryUtils.h b/code/Geometry/GeometryUtils.h index ab49380de..bd2038f78 100644 --- a/code/Geometry/GeometryUtils.h +++ b/code/Geometry/GeometryUtils.h @@ -62,6 +62,8 @@ public: /// @param mesh The mesh containing the face /// @return The area. static ai_real calculateAreaOfTriangle( const aiFace& face, aiMesh* mesh ); + + static bool PlaneIntersect(const aiRay& ray, const aiVector3D& planePos, const aiVector3D& planeNormal, aiVector3D& pos); }; } // namespace Assimp diff --git a/code/PostProcessing/ArmaturePopulate.cpp b/code/PostProcessing/ArmaturePopulate.cpp index a05cd91e9..a29735205 100644 --- a/code/PostProcessing/ArmaturePopulate.cpp +++ b/code/PostProcessing/ArmaturePopulate.cpp @@ -47,11 +47,15 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. namespace Assimp { -/// The default class constructor. -ArmaturePopulate::ArmaturePopulate() = default; +static bool IsBoneNode(const aiString &bone_name, std::vector &bones) { + for (aiBone *bone : bones) { + if (bone->mName == bone_name) { + return true; + } + } -/// The class destructor. -ArmaturePopulate::~ArmaturePopulate() = default; + return false; +} bool ArmaturePopulate::IsActive(unsigned int pFlags) const { return (pFlags & aiProcess_PopulateArmatureData) != 0; @@ -78,9 +82,8 @@ void ArmaturePopulate::Execute(aiScene *out) { aiBone *bone = kvp.first; aiNode *bone_node = kvp.second; ASSIMP_LOG_VERBOSE_DEBUG("active node lookup: ", bone->mName.C_Str()); + // lcl transform grab - done in generate_nodes :) - - // bone->mOffsetMatrix = bone_node->mTransformation; aiNode *armature = GetArmatureRoot(bone_node, bones); ai_assert(armature); @@ -212,18 +215,6 @@ aiNode *ArmaturePopulate::GetArmatureRoot(aiNode *bone_node, return nullptr; } -// Simple IsBoneNode check if this could be a bone -bool ArmaturePopulate::IsBoneNode(const aiString &bone_name, - std::vector &bones) { - for (aiBone *bone : bones) { - if (bone->mName == bone_name) { - return true; - } - } - - return false; -} - // Pop this node by name from the stack if found // Used in multiple armature situations with duplicate node / bone names // Known flaw: cannot have nodes with bone names, will be fixed in later release diff --git a/code/PostProcessing/ArmaturePopulate.h b/code/PostProcessing/ArmaturePopulate.h index 530932f48..83cbf8cf7 100644 --- a/code/PostProcessing/ArmaturePopulate.h +++ b/code/PostProcessing/ArmaturePopulate.h @@ -69,10 +69,10 @@ namespace Assimp { class ASSIMP_API ArmaturePopulate : public BaseProcess { public: /// The default class constructor. - ArmaturePopulate(); + ArmaturePopulate() = default; /// The class destructor. - virtual ~ArmaturePopulate(); + virtual ~ArmaturePopulate() = default; /// Overwritten, @see BaseProcess virtual bool IsActive( unsigned int pFlags ) const; @@ -86,9 +86,6 @@ public: static aiNode *GetArmatureRoot(aiNode *bone_node, std::vector &bone_list); - static bool IsBoneNode(const aiString &bone_name, - std::vector &bones); - static aiNode *GetNodeFromStack(const aiString &node_name, std::vector &nodes); @@ -108,5 +105,4 @@ public: } // Namespace Assimp - #endif // SCALE_PROCESS_H_ diff --git a/code/PostProcessing/ComputeUVMappingProcess.cpp b/code/PostProcessing/ComputeUVMappingProcess.cpp index a5472668b..e81f63d42 100644 --- a/code/PostProcessing/ComputeUVMappingProcess.cpp +++ b/code/PostProcessing/ComputeUVMappingProcess.cpp @@ -4,7 +4,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2022, assimp team - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -42,10 +41,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /** @file GenUVCoords step */ - #include "ComputeUVMappingProcess.h" #include "ProcessHelper.h" #include +#include "Geometry/GeometryUtils.h" using namespace Assimp; @@ -59,31 +58,17 @@ namespace { // ------------------------------------------------------------------------------------------------ // Returns whether the processing step is present in the given flag field. -bool ComputeUVMappingProcess::IsActive( unsigned int pFlags) const -{ +bool ComputeUVMappingProcess::IsActive( unsigned int pFlags) const { return (pFlags & aiProcess_GenUVCoords) != 0; } -// ------------------------------------------------------------------------------------------------ -// Check whether a ray intersects a plane and find the intersection point -inline bool PlaneIntersect(const aiRay& ray, const aiVector3D& planePos, - const aiVector3D& planeNormal, aiVector3D& pos) -{ - const ai_real b = planeNormal * (planePos - ray.pos); - ai_real h = ray.dir * planeNormal; - if ((h < 10e-5 && h > -10e-5) || (h = b/h) < 0) - return false; - - pos = ray.pos + (ray.dir * h); - return true; -} - // ------------------------------------------------------------------------------------------------ // Find the first empty UV channel in a mesh -inline unsigned int FindEmptyUVChannel (aiMesh* mesh) -{ +inline unsigned int FindEmptyUVChannel (aiMesh* mesh) { for (unsigned int m = 0; m < AI_MAX_NUMBER_OF_TEXTURECOORDS;++m) - if (!mesh->mTextureCoords[m])return m; + if (!mesh->mTextureCoords[m]) { + return m; + } ASSIMP_LOG_ERROR("Unable to compute UV coordinates, no free UV slot found"); return UINT_MAX; @@ -91,8 +76,7 @@ inline unsigned int FindEmptyUVChannel (aiMesh* mesh) // ------------------------------------------------------------------------------------------------ // Try to remove UV seams -void RemoveUVSeams (aiMesh* mesh, aiVector3D* out) -{ +void RemoveUVSeams (aiMesh* mesh, aiVector3D* out) { // TODO: just a very rough algorithm. I think it could be done // much easier, but I don't know how and am currently too tired to // to think about a better solution. @@ -103,10 +87,11 @@ void RemoveUVSeams (aiMesh* mesh, aiVector3D* out) const static ai_real LOWER_EPSILON = ai_real( 10e-3 ); const static ai_real UPPER_EPSILON = ai_real( 1.0-10e-3 ); - for (unsigned int fidx = 0; fidx < mesh->mNumFaces;++fidx) - { + for (unsigned int fidx = 0; fidx < mesh->mNumFaces;++fidx) { const aiFace& face = mesh->mFaces[fidx]; - if (face.mNumIndices < 3) continue; // triangles and polygons only, please + if (face.mNumIndices < 3) { + continue; // triangles and polygons only, please + } unsigned int smallV = face.mNumIndices, large = smallV; bool zero = false, one = false, round_to_zero = false; diff --git a/code/PostProcessing/ConvertToLHProcess.cpp b/code/PostProcessing/ConvertToLHProcess.cpp index 08e3fe48a..e67bf030f 100644 --- a/code/PostProcessing/ConvertToLHProcess.cpp +++ b/code/PostProcessing/ConvertToLHProcess.cpp @@ -5,8 +5,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2022, assimp team - - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -219,13 +217,6 @@ void MakeLeftHandedProcess::ProcessAnimation(aiNodeAnim *pAnim) { // rotation keys for (unsigned int a = 0; a < pAnim->mNumRotationKeys; a++) { - /* That's the safe version, but the float errors add up. So we try the short version instead - aiMatrix3x3 rotmat = pAnim->mRotationKeys[a].mValue.GetMatrix(); - rotmat.a3 = -rotmat.a3; rotmat.b3 = -rotmat.b3; - rotmat.c1 = -rotmat.c1; rotmat.c2 = -rotmat.c2; - aiQuaternion rotquat( rotmat); - pAnim->mRotationKeys[a].mValue = rotquat; - */ pAnim->mRotationKeys[a].mValue.x *= -1.0f; pAnim->mRotationKeys[a].mValue.y *= -1.0f; } diff --git a/code/PostProcessing/DeboneProcess.cpp b/code/PostProcessing/DeboneProcess.cpp index 2a8499dc5..e91196ce2 100644 --- a/code/PostProcessing/DeboneProcess.cpp +++ b/code/PostProcessing/DeboneProcess.cpp @@ -4,7 +4,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2022, assimp team - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -87,7 +86,7 @@ void DeboneProcess::Execute( aiScene* pScene) { if(!!mNumBonesCanDoWithout && (!mAllOrNone||mNumBonesCanDoWithout==mNumBones)) { for(unsigned int a = 0; a < pScene->mNumMeshes; a++) { if(splitList[a]) { - numSplits++; + ++numSplits; } } } @@ -119,8 +118,8 @@ void DeboneProcess::Execute( aiScene* pScene) { aiNode *theNode = find ? pScene->mRootNode->FindNode(*find) : nullptr; std::pair push_pair(static_cast(meshes.size()),theNode); - mSubMeshIndices[a].push_back(push_pair); - meshes.push_back(newMeshes[b].first); + mSubMeshIndices[a].emplace_back(push_pair); + meshes.emplace_back(newMeshes[b].first); out+=newMeshes[b].first->mNumBones; } @@ -360,9 +359,7 @@ void DeboneProcess::UpdateNode(aiNode* pNode) const { unsigned int m = static_cast(pNode->mNumMeshes), n = static_cast(mSubMeshIndices.size()); // first pass, look for meshes which have not moved - for(unsigned int a=0;amMeshes[a]; const std::vector< std::pair< unsigned int,aiNode* > > &subMeshes = mSubMeshIndices[srcIndex]; unsigned int nSubmeshes = static_cast(subMeshes.size()); @@ -376,8 +373,7 @@ void DeboneProcess::UpdateNode(aiNode* pNode) const { // second pass, collect deboned meshes - for(unsigned int a=0;a > &subMeshes = mSubMeshIndices[a]; unsigned int nSubmeshes = static_cast(subMeshes.size()); diff --git a/code/PostProcessing/FindDegenerates.cpp b/code/PostProcessing/FindDegenerates.cpp index 5874c17d2..87ee75601 100644 --- a/code/PostProcessing/FindDegenerates.cpp +++ b/code/PostProcessing/FindDegenerates.cpp @@ -236,8 +236,7 @@ evil_jump_outside: face_src.mNumIndices = 0; face_src.mIndices = nullptr; } - } - else { + } else { // Otherwise delete it if we don't need this face delete[] face_src.mIndices; face_src.mIndices = nullptr; diff --git a/code/PostProcessing/RemoveVCProcess.cpp b/code/PostProcessing/RemoveVCProcess.cpp index 35047dc0a..bcad65423 100644 --- a/code/PostProcessing/RemoveVCProcess.cpp +++ b/code/PostProcessing/RemoveVCProcess.cpp @@ -5,8 +5,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2022, assimp team - - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -74,63 +72,6 @@ inline void ArrayDelete(T **&in, unsigned int &num) { num = 0; } -#if 0 -// ------------------------------------------------------------------------------------------------ -// Updates the node graph - removes all nodes which have the "remove" flag set and the -// "don't remove" flag not set. Nodes with meshes are never deleted. -bool UpdateNodeGraph(aiNode* node,std::list& childsOfParent,bool root) -{ - bool b = false; - - std::list mine; - for (unsigned int i = 0; i < node->mNumChildren;++i) - { - if(UpdateNodeGraph(node->mChildren[i],mine,false)) - b = true; - } - - // somewhat tricky ... mNumMeshes must be originally 0 and MSB2 may not be set, - // so we can do a simple comparison against MSB here - if (!root && AI_RC_UINT_MSB == node->mNumMeshes ) - { - // this node needs to be removed - if(node->mNumChildren) - { - childsOfParent.insert(childsOfParent.end(),mine.begin(),mine.end()); - - // set all children to nullptr to make sure they are not deleted when we delete ourself - for (unsigned int i = 0; i < node->mNumChildren;++i) - node->mChildren[i] = nullptr; - } - b = true; - delete node; - } - else - { - AI_RC_UNMASK(node->mNumMeshes); - childsOfParent.push_back(node); - - if (b) - { - // reallocate the array of our children here - node->mNumChildren = (unsigned int)mine.size(); - aiNode** const children = new aiNode*[mine.size()]; - aiNode** ptr = children; - - for (std::list::iterator it = mine.begin(), end = mine.end(); - it != end; ++it) - { - *ptr++ = *it; - } - delete[] node->mChildren; - node->mChildren = children; - return false; - } - } - return b; -} -#endif - // ------------------------------------------------------------------------------------------------ // Executes the post processing step on the given imported data. void RemoveVCProcess::Execute(aiScene *pScene) { diff --git a/code/PostProcessing/ScaleProcess.cpp b/code/PostProcessing/ScaleProcess.cpp index 665f28a7e..00df07090 100644 --- a/code/PostProcessing/ScaleProcess.cpp +++ b/code/PostProcessing/ScaleProcess.cpp @@ -86,9 +86,9 @@ void ScaleProcess::Execute( aiScene* pScene ) { return; // nothing to scale } - ai_assert( mScale != 0 ); - ai_assert( nullptr != pScene ); - ai_assert( nullptr != pScene->mRootNode ); + ai_assert(mScale != 0 ); + ai_assert(nullptr != pScene ); + ai_assert(nullptr != pScene->mRootNode ); if ( nullptr == pScene ) { return; @@ -140,7 +140,7 @@ void ScaleProcess::Execute( aiScene* pScene ) { aiMatrix4x4 scaling; aiMatrix4x4::Scaling( aiVector3D(scale), scaling ); - aiMatrix4x4 RotMatrix = aiMatrix4x4 (rotation.GetMatrix()); + const aiMatrix4x4 RotMatrix = aiMatrix4x4(rotation.GetMatrix()); bone->mOffsetMatrix = translation * RotMatrix * scaling; } diff --git a/code/PostProcessing/SortByPTypeProcess.cpp b/code/PostProcessing/SortByPTypeProcess.cpp index 1be75fc48..394ef15c8 100644 --- a/code/PostProcessing/SortByPTypeProcess.cpp +++ b/code/PostProcessing/SortByPTypeProcess.cpp @@ -5,8 +5,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2022, assimp team - - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -54,10 +52,7 @@ using namespace Assimp; // ------------------------------------------------------------------------------------------------ // Constructor to be privately used by Importer -SortByPTypeProcess::SortByPTypeProcess() : - mConfigRemoveMeshes(0) { - // empty -} +SortByPTypeProcess::SortByPTypeProcess() : mConfigRemoveMeshes(0) {} // ------------------------------------------------------------------------------------------------ // Returns whether the processing step is present in the given flag field. @@ -155,7 +150,7 @@ void SortByPTypeProcess::Execute(aiScene *pScene) { if (1 == num) { if (!(mConfigRemoveMeshes & mesh->mPrimitiveTypes)) { *meshIdx = static_cast(outMeshes.size()); - outMeshes.push_back(mesh); + outMeshes.emplace_back(mesh); } else { delete mesh; pScene->mMeshes[i] = nullptr; @@ -311,21 +306,23 @@ void SortByPTypeProcess::Execute(aiScene *pScene) { if (vert) { *vert++ = mesh->mVertices[idx]; - //mesh->mVertices[idx].x = get_qnan(); } - if (nor) *nor++ = mesh->mNormals[idx]; + if (nor) + *nor++ = mesh->mNormals[idx]; if (tan) { *tan++ = mesh->mTangents[idx]; *bit++ = mesh->mBitangents[idx]; } for (unsigned int pp = 0; pp < AI_MAX_NUMBER_OF_TEXTURECOORDS; ++pp) { - if (!uv[pp]) break; + if (!uv[pp]) + break; *uv[pp]++ = mesh->mTextureCoords[pp][idx]; } for (unsigned int pp = 0; pp < AI_MAX_NUMBER_OF_COLOR_SETS; ++pp) { - if (!cols[pp]) break; + if (!cols[pp]) + break; *cols[pp]++ = mesh->mColors[pp][idx]; } @@ -351,7 +348,7 @@ void SortByPTypeProcess::Execute(aiScene *pScene) { } } if (pp == mesh->mNumAnimMeshes) - amIdx++; + ++amIdx; in.mIndices[q] = outIdx++; } diff --git a/code/PostProcessing/SplitByBoneCountProcess.cpp b/code/PostProcessing/SplitByBoneCountProcess.cpp index 5324160d4..e44a55979 100644 --- a/code/PostProcessing/SplitByBoneCountProcess.cpp +++ b/code/PostProcessing/SplitByBoneCountProcess.cpp @@ -4,7 +4,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2022, assimp team - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -166,7 +165,7 @@ void SplitByBoneCountProcess::SplitMesh( const aiMesh* pMesh, std::vector isBoneUsed( pMesh->mNumBones, false); // indices of the faces which are going to go into this submesh - std::vector subMeshFaces; + IndexArray subMeshFaces; subMeshFaces.reserve( pMesh->mNumFaces); // accumulated vertex count of all the faces in this submesh unsigned int numSubMeshVertices = 0; @@ -202,7 +201,7 @@ void SplitByBoneCountProcess::SplitMesh( const aiMesh* pMesh, std::vector::iterator it = newBonesAtCurrentFace.begin(); it != newBonesAtCurrentFace.end(); ++it) { if (!isBoneUsed[*it]) { isBoneUsed[*it] = true; - numBones++; + ++numBones; } } @@ -212,18 +211,17 @@ void SplitByBoneCountProcess::SplitMesh( const aiMesh* pMesh, std::vectormName.length > 0 ) - { + if( pMesh->mName.length > 0 ) { newMesh->mName.Set( format() << pMesh->mName.data << "_sub" << poNewMeshes.size()); } newMesh->mMaterialIndex = pMesh->mMaterialIndex; newMesh->mPrimitiveTypes = pMesh->mPrimitiveTypes; - poNewMeshes.push_back( newMesh); + poNewMeshes.emplace_back( newMesh); // create all the arrays for this mesh if the old mesh contained them newMesh->mNumVertices = numSubMeshVertices; @@ -251,7 +249,7 @@ void SplitByBoneCountProcess::SplitMesh( const aiMesh* pMesh, std::vectormFaces = new aiFace[subMeshFaces.size()]; unsigned int nvi = 0; // next vertex index - std::vector previousVertexIndices( numSubMeshVertices, std::numeric_limits::max()); // per new vertex: its index in the source mesh + IndexArray previousVertexIndices( numSubMeshVertices, std::numeric_limits::max()); // per new vertex: its index in the source mesh for( unsigned int a = 0; a < subMeshFaces.size(); ++a ) { const aiFace& srcFace = pMesh->mFaces[subMeshFaces[a]]; aiFace& dstFace = newMesh->mFaces[a]; @@ -399,10 +397,10 @@ void SplitByBoneCountProcess::SplitMesh( const aiMesh* pMesh, std::vectormNumMeshes == 0 ) { - std::vector newMeshList; + IndexArray newMeshList; for( unsigned int a = 0; a < pNode->mNumMeshes; ++a) { unsigned int srcIndex = pNode->mMeshes[a]; - const std::vector& replaceMeshes = mSubMeshIndices[srcIndex]; + const IndexArray& replaceMeshes = mSubMeshIndices[srcIndex]; newMeshList.insert( newMeshList.end(), replaceMeshes.begin(), replaceMeshes.end()); } diff --git a/code/PostProcessing/SplitByBoneCountProcess.h b/code/PostProcessing/SplitByBoneCountProcess.h index 625019e0c..efe85824f 100644 --- a/code/PostProcessing/SplitByBoneCountProcess.h +++ b/code/PostProcessing/SplitByBoneCountProcess.h @@ -76,6 +76,10 @@ public: /// basing on the Importer's configuration property list. virtual void SetupProperties(const Importer* pImp) override; + /// @brief Will return the maximal number of bones. + /// @return The maximal number of bones. + size_t getMaxNumberOfBones() const; + protected: /// Executes the post processing step on the given imported data. /// At the moment a process is not supposed to fail. @@ -90,14 +94,19 @@ protected: /// Recursively updates the node's mesh list to account for the changed mesh list void UpdateNode( aiNode* pNode) const; -public: +private: /// Max bone count. Splitting occurs if a mesh has more than that number of bones. size_t mMaxBoneCount; /// Per mesh index: Array of indices of the new submeshes. - std::vector< std::vector > mSubMeshIndices; + using IndexArray = std::vector; + std::vector mSubMeshIndices; }; +inline size_t SplitByBoneCountProcess::getMaxNumberOfBones() const { + return mMaxBoneCount; +} + } // end of namespace Assimp #endif // !!AI_SPLITBYBONECOUNTPROCESS_H_INC diff --git a/include/assimp/Vertex.h b/include/assimp/Vertex.h index fd7eb037e..b4aa1dd2d 100644 --- a/include/assimp/Vertex.h +++ b/include/assimp/Vertex.h @@ -105,7 +105,7 @@ class Vertex { friend Vertex operator * (ai_real, const Vertex&); public: - Vertex() {} + Vertex() = default; // ---------------------------------------------------------------------------- /** Extract a particular vertex from a mesh and interleave all components */ From 01488046e6e61a4e35109b2291e6af940c208f06 Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Sat, 1 Apr 2023 16:22:14 +0800 Subject: [PATCH 12/40] Fix warning related to unreachable-code-break. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/PostProcessing/ValidateDataStructure.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/code/PostProcessing/ValidateDataStructure.cpp b/code/PostProcessing/ValidateDataStructure.cpp index e31054972..bbb08a2e9 100644 --- a/code/PostProcessing/ValidateDataStructure.cpp +++ b/code/PostProcessing/ValidateDataStructure.cpp @@ -290,7 +290,6 @@ void ValidateDSProcess::Validate(const aiMesh *pMesh) { switch (face.mNumIndices) { case 0: ReportError("aiMesh::mFaces[%i].mNumIndices is 0", i); - break; case 1: if (0 == (pMesh->mPrimitiveTypes & aiPrimitiveType_POINT)) { ReportError("aiMesh::mFaces[%i] is a POINT but aiMesh::mPrimitiveTypes " From 9e80dfc42db332130040748e5ddc6aaa43049a48 Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Sat, 1 Apr 2023 16:22:45 +0800 Subject: [PATCH 13/40] Fix warning related to unreachable-code-break. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/AssetLib/LWO/LWOBLoader.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/code/AssetLib/LWO/LWOBLoader.cpp b/code/AssetLib/LWO/LWOBLoader.cpp index a61e49a7f..e49adcf98 100644 --- a/code/AssetLib/LWO/LWOBLoader.cpp +++ b/code/AssetLib/LWO/LWOBLoader.cpp @@ -65,7 +65,6 @@ void LWOImporter::LoadLWOBFile() if (mFileBuffer + head.length > end) { throw DeadlyImportError("LWOB: Invalid chunk length"); - break; } uint8_t* const next = mFileBuffer+head.length; switch (head.type) From 7620a69e3ec7ea5226c23456ffc335148ff57407 Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Sat, 1 Apr 2023 16:23:03 +0800 Subject: [PATCH 14/40] Fix warning related to unreachable-code-break. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/AssetLib/LWO/LWOLoader.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/code/AssetLib/LWO/LWOLoader.cpp b/code/AssetLib/LWO/LWOLoader.cpp index 1bf39b2da..a7d4164bb 100644 --- a/code/AssetLib/LWO/LWOLoader.cpp +++ b/code/AssetLib/LWO/LWOLoader.cpp @@ -1486,7 +1486,6 @@ void LWOImporter::LoadLWO2File() { if (mFileBuffer + head.length > end) { throw DeadlyImportError("LWO2: Chunk length points behind the file"); - break; } uint8_t *const next = mFileBuffer + head.length; mFileBuffer += bufOffset; From cec41f6dd5d2992783163d2815ebc6e4b2699b4a Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Sat, 1 Apr 2023 16:23:22 +0800 Subject: [PATCH 15/40] Fix warning related to unreachable-code-break. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/AssetLib/Obj/ObjFileParser.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/AssetLib/Obj/ObjFileParser.cpp b/code/AssetLib/Obj/ObjFileParser.cpp index c7121083a..ed416dc93 100644 --- a/code/AssetLib/Obj/ObjFileParser.cpp +++ b/code/AssetLib/Obj/ObjFileParser.cpp @@ -236,7 +236,7 @@ void ObjFileParser::parseFile(IOStreamBuffer &streamBuffer) { getNameNoSpace(m_DataIt, m_DataItEnd, name); insideCstype = name == "cstype"; goto pf_skip_line; - } break; + } default: { pf_skip_line: From 0a05a1f17f4c6316428b5f48de74ee8b22621232 Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Sat, 1 Apr 2023 16:23:43 +0800 Subject: [PATCH 16/40] Fix warning related to unreachable-code-break. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/AssetLib/Collada/ColladaParser.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/code/AssetLib/Collada/ColladaParser.cpp b/code/AssetLib/Collada/ColladaParser.cpp index cce6a0db6..fcadd08a7 100644 --- a/code/AssetLib/Collada/ColladaParser.cpp +++ b/code/AssetLib/Collada/ColladaParser.cpp @@ -1855,7 +1855,6 @@ size_t ColladaParser::ReadPrimitives(XmlNode &node, Mesh &pMesh, std::vector Date: Sat, 1 Apr 2023 16:24:04 +0800 Subject: [PATCH 17/40] Fix warning related to unreachable-code-break. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/AssetLib/Q3D/Q3DLoader.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/AssetLib/Q3D/Q3DLoader.cpp b/code/AssetLib/Q3D/Q3DLoader.cpp index a91788c78..22d1065de 100644 --- a/code/AssetLib/Q3D/Q3DLoader.cpp +++ b/code/AssetLib/Q3D/Q3DLoader.cpp @@ -382,11 +382,10 @@ void Q3DImporter::InternReadFile(const std::string &pFile, // TODO goto outer; - } break; + } default: throw DeadlyImportError("Quick3D: Unknown chunk"); - break; }; } outer: From 4d962057e5bb78b60f417e00232f48ea6ed6c8da Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Sat, 1 Apr 2023 16:24:31 +0800 Subject: [PATCH 18/40] Fix warning related to unreachable-code-break. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/AssetLib/X/XFileParser.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/code/AssetLib/X/XFileParser.cpp b/code/AssetLib/X/XFileParser.cpp index 8786c3166..770c75a77 100644 --- a/code/AssetLib/X/XFileParser.cpp +++ b/code/AssetLib/X/XFileParser.cpp @@ -839,7 +839,6 @@ void XFileParser::ParseDataObjectAnimationKey(AnimBone *pAnimBone) { default: ThrowException("Unknown key type ", keyType, " in animation."); - break; } // end switch // key separator From 1b826afeda957e79bfdbe733601983ede17183dc Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Sat, 1 Apr 2023 16:24:55 +0800 Subject: [PATCH 19/40] Remove -Wno-unreachable-code-break. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index 05e31624a..6429de5fa 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -1246,7 +1246,6 @@ IF (ASSIMP_WARNINGS_AS_ERRORS) -Wno-deprecated -Wno-format-nonliteral -Wno-comma - -Wno-unreachable-code-break -Wno-implicit-fallthrough -Wno-unused-template -Wno-undefined-func-template From c0947b704e8a318a5cebe98377340e92c6ca1bd9 Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Wed, 19 Apr 2023 23:24:15 +0800 Subject: [PATCH 20/40] Fix warning related to missing-variable-declarations, remove unused global variables. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/AssetLib/FBX/FBXMaterial.cpp | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/code/AssetLib/FBX/FBXMaterial.cpp b/code/AssetLib/FBX/FBXMaterial.cpp index 2677d652a..2f575a511 100644 --- a/code/AssetLib/FBX/FBXMaterial.cpp +++ b/code/AssetLib/FBX/FBXMaterial.cpp @@ -138,20 +138,6 @@ Material::Material(uint64_t id, const Element& element, const Document& doc, con // ------------------------------------------------------------------------------------------------ Material::~Material() = default; - aiVector2D uvTrans; - aiVector2D uvScaling; - ai_real uvRotation; - - std::string type; - std::string relativeFileName; - std::string fileName; - std::string alphaSource; - std::shared_ptr props; - - unsigned int crop[4]{}; - - const Video* media; - // ------------------------------------------------------------------------------------------------ Texture::Texture(uint64_t id, const Element& element, const Document& doc, const std::string& name) : Object(id,element,name), From 739cf15a1eeabb006b071eec866b5ee08781b5e1 Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Wed, 19 Apr 2023 23:26:03 +0800 Subject: [PATCH 21/40] Fix warning related to missing-variable-declarations, remove unused global variables. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/AssetLib/SIB/SIBImporter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/AssetLib/SIB/SIBImporter.cpp b/code/AssetLib/SIB/SIBImporter.cpp index 323a69a00..9f299180b 100644 --- a/code/AssetLib/SIB/SIBImporter.cpp +++ b/code/AssetLib/SIB/SIBImporter.cpp @@ -85,7 +85,7 @@ static const aiImporterDesc desc = { struct SIBChunk { uint32_t Tag; uint32_t Size; -} PACK_STRUCT; +}; enum { POS, From 5738b3d172f052ebc5c1f1f523abb7e883f596e8 Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Wed, 19 Apr 2023 23:27:23 +0800 Subject: [PATCH 22/40] Fix warning related to missing-variable-declarations, add static to global variable. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/AssetLib/Assjson/cencode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/AssetLib/Assjson/cencode.c b/code/AssetLib/Assjson/cencode.c index 614a2671f..ec771536d 100644 --- a/code/AssetLib/Assjson/cencode.c +++ b/code/AssetLib/Assjson/cencode.c @@ -7,7 +7,7 @@ For details, see http://sourceforge.net/projects/libb64 #include "cencode.h" // changed from -const int CHARS_PER_LINE = 72; +static const int CHARS_PER_LINE = 72; #ifdef _MSC_VER #pragma warning(push) From 1244e582744a120c3e0f2aa192126cc8357a1b10 Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Wed, 19 Apr 2023 23:28:08 +0800 Subject: [PATCH 23/40] Fix warning related to missing-variable-declarations, add static to global variable. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- contrib/unzip/unzip.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/unzip/unzip.c b/contrib/unzip/unzip.c index ba15257a9..4bc6773ef 100644 --- a/contrib/unzip/unzip.c +++ b/contrib/unzip/unzip.c @@ -78,7 +78,7 @@ # pragma warning(disable : 4131 4244 4189 4245) #endif // _MSC_VER -const char unz_copyright[] = +static const char unz_copyright[] = " unzip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll"; /* unz_file_info_internal contain internal info about a file in zipfile*/ From 46677b835c74f28bc36a4bf125b322297d681654 Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Wed, 19 Apr 2023 23:28:36 +0800 Subject: [PATCH 24/40] Fix warning related to missing-variable-declarations, add static to global variable. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/AssetLib/Blender/BlenderCustomData.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/AssetLib/Blender/BlenderCustomData.cpp b/code/AssetLib/Blender/BlenderCustomData.cpp index c74a6bb75..2359482e1 100644 --- a/code/AssetLib/Blender/BlenderCustomData.cpp +++ b/code/AssetLib/Blender/BlenderCustomData.cpp @@ -96,7 +96,8 @@ struct CustomDataTypeDescription { * other (like CD_ORCO, ...) uses arrays of rawtypes or even arrays of Structures * use a special readfunction for that cases */ -std::array customDataTypeDescriptions = { { DECL_STRUCT_CUSTOMDATATYPEDESCRIPTION(MVert), +static std::array customDataTypeDescriptions = { { + DECL_STRUCT_CUSTOMDATATYPEDESCRIPTION(MVert), DECL_UNSUPPORTED_CUSTOMDATATYPEDESCRIPTION, DECL_UNSUPPORTED_CUSTOMDATATYPEDESCRIPTION, DECL_STRUCT_CUSTOMDATATYPEDESCRIPTION(MEdge), From ff17f1fe3de0ca2f97aa3a04af350999034d77b2 Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Wed, 19 Apr 2023 23:29:03 +0800 Subject: [PATCH 25/40] Remove -Wno-missing-variable-declarations. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index 05e31624a..6e0d0f143 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -1236,7 +1236,6 @@ IF (ASSIMP_WARNINGS_AS_ERRORS) -Wno-tautological-value-range-compare -Wno-tautological-type-limit-compare -Wno-missing-noreturn - -Wno-missing-variable-declarations -Wno-extra-semi -Wno-nonportable-system-include-path -Wno-undefined-reinterpret-cast From cd9de860cec3ea6ad3b45cb9f5435b850bb95916 Mon Sep 17 00:00:00 2001 From: Dan Rosser Date: Fri, 14 Apr 2023 18:56:08 +1000 Subject: [PATCH 26/40] Build Zlib if missing for other platforms --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0f0e5a793..20c735c4c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -138,7 +138,7 @@ IF (WIN32) ELSE() OPTION( ASSIMP_BUILD_ZLIB "Build your own zlib" - OFF + ON ) ENDIF() From 71043ec164e641ccc129797064744f15f48c7433 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Suhajda=20Tam=C3=A1s?= Date: Fri, 28 Apr 2023 11:44:29 +0200 Subject: [PATCH 27/40] Add missing cast --- code/PostProcessing/ConvertToLHProcess.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/PostProcessing/ConvertToLHProcess.cpp b/code/PostProcessing/ConvertToLHProcess.cpp index 0d5f3dc42..5524b31dc 100644 --- a/code/PostProcessing/ConvertToLHProcess.cpp +++ b/code/PostProcessing/ConvertToLHProcess.cpp @@ -241,7 +241,7 @@ void MakeLeftHandedProcess::ProcessAnimation(aiNodeAnim *pAnim) { // Converts a single camera to left handed coordinates. void MakeLeftHandedProcess::ProcessCamera( aiCamera* pCam) { - pCam->mLookAt = 2.0f * pCam->mPosition - pCam->mLookAt; + pCam->mLookAt = ai_real(2.0f) * pCam->mPosition - pCam->mLookAt; } #endif // !! ASSIMP_BUILD_NO_MAKELEFTHANDED_PROCESS From a8e7c2360508060234aca824d65b692a3d303624 Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Sat, 29 Apr 2023 00:29:33 +0800 Subject: [PATCH 28/40] Fix warning related to unreachable-code. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/AssetLib/FBX/FBXParser.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/AssetLib/FBX/FBXParser.cpp b/code/AssetLib/FBX/FBXParser.cpp index 150921db5..11cd1a934 100644 --- a/code/AssetLib/FBX/FBXParser.cpp +++ b/code/AssetLib/FBX/FBXParser.cpp @@ -190,7 +190,7 @@ Scope::Scope(Parser& parser,bool topLevel) } auto *element = new_Element(*n, parser); - + // Element() should stop at the next Key token (or right after a Close token) n = parser.CurrentToken(); if (n == nullptr) { @@ -198,8 +198,8 @@ Scope::Scope(Parser& parser,bool topLevel) elements.insert(ElementMap::value_type(str, element)); return; } - ParseError("unexpected end of file",parser.LastToken()); delete element; + ParseError("unexpected end of file",parser.LastToken()); } else { elements.insert(ElementMap::value_type(str, element)); } From cabf3a5d17be1479dd2b1a9d64eff7bc9f557501 Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Sat, 29 Apr 2023 00:30:21 +0800 Subject: [PATCH 29/40] Fix warning related to unreachable-code-return. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/AssetLib/X3D/X3DXmlHelper.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/code/AssetLib/X3D/X3DXmlHelper.cpp b/code/AssetLib/X3D/X3DXmlHelper.cpp index ff24b74b3..7ed2e8237 100644 --- a/code/AssetLib/X3D/X3DXmlHelper.cpp +++ b/code/AssetLib/X3D/X3DXmlHelper.cpp @@ -12,7 +12,6 @@ bool X3DXmlHelper::getColor3DAttribute(XmlNode &node, const char *attributeName, tokenize(val, values, " "); if (values.size() != 3) { Throw_ConvertFail_Str2ArrF(node.name(), attributeName); - return false; } auto it = values.begin(); color.r = stof(*it++); @@ -30,7 +29,6 @@ bool X3DXmlHelper::getVector2DAttribute(XmlNode &node, const char *attributeName tokenize(val, values, " "); if (values.size() != 2) { Throw_ConvertFail_Str2ArrF(node.name(), attributeName); - return false; } auto it = values.begin(); color.x = stof(*it++); @@ -47,7 +45,6 @@ bool X3DXmlHelper::getVector3DAttribute(XmlNode &node, const char *attributeName tokenize(val, values, " "); if (values.size() != 3) { Throw_ConvertFail_Str2ArrF(node.name(), attributeName); - return false; } auto it = values.begin(); color.x = stof(*it++); From cdefc9f7aa5ff59618df60cfa505c6ac180e0115 Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Sat, 29 Apr 2023 00:43:40 +0800 Subject: [PATCH 30/40] Remove unused -Wno-deprecated-copy-with-dtor. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index d5500d986..cf86225d9 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -1241,7 +1241,6 @@ IF (ASSIMP_WARNINGS_AS_ERRORS) -Wno-undefined-reinterpret-cast -Wno-shift-sign-overflow -Wno-deprecated-copy-with-user-provided-dtor - -Wno-deprecated-copy-with-dtor -Wno-deprecated -Wno-format-nonliteral -Wno-comma From 51494e1b4fec3d9086aa4a45332f46d103aa7ddc Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Sat, 29 Apr 2023 00:55:13 +0800 Subject: [PATCH 31/40] Remove unused -Wno-deprecated-copy-with-user-provided-dtor. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index cf86225d9..af260f5e9 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -1240,7 +1240,6 @@ IF (ASSIMP_WARNINGS_AS_ERRORS) -Wno-nonportable-system-include-path -Wno-undefined-reinterpret-cast -Wno-shift-sign-overflow - -Wno-deprecated-copy-with-user-provided-dtor -Wno-deprecated -Wno-format-nonliteral -Wno-comma From 92d426de2b6878ee5f8535d8ad5c51f871b632df Mon Sep 17 00:00:00 2001 From: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> Date: Sat, 29 Apr 2023 01:05:25 +0800 Subject: [PATCH 32/40] Remove unused -Wno-missing-noreturn. Signed-off-by: Jackie9527 <80555200+Jackie9527@users.noreply.github.com> --- code/CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index af260f5e9..02ba7a08e 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -1234,7 +1234,6 @@ IF (ASSIMP_WARNINGS_AS_ERRORS) -Wno-header-hygiene -Wno-tautological-value-range-compare -Wno-tautological-type-limit-compare - -Wno-missing-noreturn -Wno-missing-variable-declarations -Wno-extra-semi -Wno-nonportable-system-include-path From a923d1f89bec9af09e4978adbd78c7d1aadae5c1 Mon Sep 17 00:00:00 2001 From: ParkBook <974200701@qq.com> Date: Mon, 1 May 2023 00:38:16 +0800 Subject: [PATCH 33/40] fix unreachable code fix unreachable code --- code/AssetLib/FBX/FBXParser.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/AssetLib/FBX/FBXParser.cpp b/code/AssetLib/FBX/FBXParser.cpp index 150921db5..9278d90ab 100644 --- a/code/AssetLib/FBX/FBXParser.cpp +++ b/code/AssetLib/FBX/FBXParser.cpp @@ -198,8 +198,8 @@ Scope::Scope(Parser& parser,bool topLevel) elements.insert(ElementMap::value_type(str, element)); return; } - ParseError("unexpected end of file",parser.LastToken()); delete element; + ParseError("unexpected end of file",parser.LastToken()); } else { elements.insert(ElementMap::value_type(str, element)); } From d58201a579759305cec8330cdcc908d954d2b970 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Thu, 4 May 2023 00:00:52 +0200 Subject: [PATCH 34/40] Refactoring: Reuse code from GeometryUtils --- code/Geometry/GeometryUtils.cpp | 8 + code/Geometry/GeometryUtils.h | 14 +- .../ComputeUVMappingProcess.cpp | 289 ++++++++--------- .../PostProcessing/DropFaceNormalsProcess.cpp | 25 +- code/PostProcessing/FindDegenerates.cpp | 80 +++-- code/PostProcessing/PretransformVertices.cpp | 293 +++++++++--------- code/PostProcessing/PretransformVertices.h | 18 +- code/PostProcessing/ProcessHelper.cpp | 7 +- .../RemoveRedundantMaterials.cpp | 33 +- code/PostProcessing/ScaleProcess.cpp | 1 - code/PostProcessing/SortByPTypeProcess.cpp | 3 +- .../SplitByBoneCountProcess.cpp | 4 +- code/PostProcessing/SplitLargeMeshes.cpp | 36 +-- code/PostProcessing/TextureTransform.cpp | 6 +- code/PostProcessing/TriangulateProcess.cpp | 45 +-- code/PostProcessing/ValidateDataStructure.cpp | 83 +++-- include/assimp/StreamWriter.h | 5 +- include/assimp/Vertex.h | 25 +- test/CMakeLists.txt | 18 +- test/unit/Geometry/utGeometryUtils.cpp | 68 ++++ 20 files changed, 526 insertions(+), 535 deletions(-) create mode 100644 test/unit/Geometry/utGeometryUtils.cpp diff --git a/code/Geometry/GeometryUtils.cpp b/code/Geometry/GeometryUtils.cpp index 92a3aa853..ad99f2224 100644 --- a/code/Geometry/GeometryUtils.cpp +++ b/code/Geometry/GeometryUtils.cpp @@ -89,4 +89,12 @@ bool GeometryUtils::PlaneIntersect(const aiRay& ray, const aiVector3D& planePos, return true; } +// ------------------------------------------------------------------------------------------------ +void GeometryUtils::normalizeVectorArray(aiVector3D *vectorArrayIn, aiVector3D *vectorArrayOut, + size_t numVectors) { + for (size_t i=0; i -#include "Geometry/GeometryUtils.h" using namespace Assimp; namespace { - const static aiVector3D base_axis_y(0.0,1.0,0.0); - const static aiVector3D base_axis_x(1.0,0.0,0.0); - const static aiVector3D base_axis_z(0.0,0.0,1.0); - const static ai_real angle_epsilon = ai_real( 0.95 ); -} +const static aiVector3D base_axis_y(0.0, 1.0, 0.0); +const static aiVector3D base_axis_x(1.0, 0.0, 0.0); +const static aiVector3D base_axis_z(0.0, 0.0, 1.0); +const static ai_real angle_epsilon = ai_real(0.95); +} // namespace // ------------------------------------------------------------------------------------------------ // Returns whether the processing step is present in the given flag field. -bool ComputeUVMappingProcess::IsActive( unsigned int pFlags) const { - return (pFlags & aiProcess_GenUVCoords) != 0; +bool ComputeUVMappingProcess::IsActive(unsigned int pFlags) const { + return (pFlags & aiProcess_GenUVCoords) != 0; } // ------------------------------------------------------------------------------------------------ // Find the first empty UV channel in a mesh -inline unsigned int FindEmptyUVChannel (aiMesh* mesh) { - for (unsigned int m = 0; m < AI_MAX_NUMBER_OF_TEXTURECOORDS;++m) +inline unsigned int FindEmptyUVChannel(aiMesh *mesh) { + for (unsigned int m = 0; m < AI_MAX_NUMBER_OF_TEXTURECOORDS; ++m) if (!mesh->mTextureCoords[m]) { return m; } @@ -76,19 +76,19 @@ inline unsigned int FindEmptyUVChannel (aiMesh* mesh) { // ------------------------------------------------------------------------------------------------ // Try to remove UV seams -void RemoveUVSeams (aiMesh* mesh, aiVector3D* out) { +void RemoveUVSeams(aiMesh *mesh, aiVector3D *out) { // TODO: just a very rough algorithm. I think it could be done // much easier, but I don't know how and am currently too tired to // to think about a better solution. - const static ai_real LOWER_LIMIT = ai_real( 0.1 ); - const static ai_real UPPER_LIMIT = ai_real( 0.9 ); + const static ai_real LOWER_LIMIT = ai_real(0.1); + const static ai_real UPPER_LIMIT = ai_real(0.9); - const static ai_real LOWER_EPSILON = ai_real( 10e-3 ); - const static ai_real UPPER_EPSILON = ai_real( 1.0-10e-3 ); + const static ai_real LOWER_EPSILON = ai_real(10e-3); + const static ai_real UPPER_EPSILON = ai_real(1.0 - 10e-3); - for (unsigned int fidx = 0; fidx < mesh->mNumFaces;++fidx) { - const aiFace& face = mesh->mFaces[fidx]; + for (unsigned int fidx = 0; fidx < mesh->mNumFaces; ++fidx) { + const aiFace &face = mesh->mFaces[fidx]; if (face.mNumIndices < 3) { continue; // triangles and polygons only, please } @@ -100,20 +100,18 @@ void RemoveUVSeams (aiMesh* mesh, aiVector3D* out) { // but the assumption that a face with at least one very small // on the one side and one very large U coord on the other side // lies on a UV seam should work for most cases. - for (unsigned int n = 0; n < face.mNumIndices;++n) - { - if (out[face.mIndices[n]].x < LOWER_LIMIT) - { + for (unsigned int n = 0; n < face.mNumIndices; ++n) { + if (out[face.mIndices[n]].x < LOWER_LIMIT) { smallV = n; // If we have a U value very close to 0 we can't // round the others to 0, too. if (out[face.mIndices[n]].x <= LOWER_EPSILON) zero = true; - else round_to_zero = true; + else + round_to_zero = true; } - if (out[face.mIndices[n]].x > UPPER_LIMIT) - { + if (out[face.mIndices[n]].x > UPPER_LIMIT) { large = n; // If we have a U value very close to 1 we can't @@ -122,10 +120,8 @@ void RemoveUVSeams (aiMesh* mesh, aiVector3D* out) { one = true; } } - if (smallV != face.mNumIndices && large != face.mNumIndices) - { - for (unsigned int n = 0; n < face.mNumIndices;++n) - { + if (smallV != face.mNumIndices && large != face.mNumIndices) { + for (unsigned int n = 0; n < face.mNumIndices; ++n) { // If the u value is over the upper limit and no other u // value of that face is 0, round it to 0 if (out[face.mIndices[n]].x > UPPER_LIMIT && !zero) @@ -141,9 +137,8 @@ void RemoveUVSeams (aiMesh* mesh, aiVector3D* out) { // Due to numerical inaccuracies one U coord becomes 0, the // other 1. But we do still have a third UV coord to determine // to which side we must round to. - else if (one && zero) - { - if (round_to_zero && out[face.mIndices[n]].x >= UPPER_EPSILON) + else if (one && zero) { + if (round_to_zero && out[face.mIndices[n]].x >= UPPER_EPSILON) out[face.mIndices[n]].x = 0.0; else if (!round_to_zero && out[face.mIndices[n]].x <= LOWER_EPSILON) out[face.mIndices[n]].x = 1.0; @@ -154,8 +149,7 @@ void RemoveUVSeams (aiMesh* mesh, aiVector3D* out) { } // ------------------------------------------------------------------------------------------------ -void ComputeUVMappingProcess::ComputeSphereMapping(aiMesh* mesh,const aiVector3D& axis, aiVector3D* out) -{ +void ComputeUVMappingProcess::ComputeSphereMapping(aiMesh *mesh, const aiVector3D &axis, aiVector3D *out) { aiVector3D center, min, max; FindMeshCenter(mesh, center, min, max); @@ -163,7 +157,7 @@ void ComputeUVMappingProcess::ComputeSphereMapping(aiMesh* mesh,const aiVector3D // currently the mapping axis will always be one of x,y,z, except if the // PretransformVertices step is used (it transforms the meshes into worldspace, // thus changing the mapping axis) - if (axis * base_axis_x >= angle_epsilon) { + if (axis * base_axis_x >= angle_epsilon) { // For each point get a normalized projection vector in the sphere, // get its longitude and latitude and map them to their respective @@ -177,58 +171,54 @@ void ComputeUVMappingProcess::ComputeSphereMapping(aiMesh* mesh,const aiVector3D // Thus we can derive: // lat = arcsin (z) // lon = arctan (y/x) - for (unsigned int pnt = 0; pnt < mesh->mNumVertices;++pnt) { - const aiVector3D diff = (mesh->mVertices[pnt]-center).Normalize(); - out[pnt] = aiVector3D((std::atan2(diff.z, diff.y) + AI_MATH_PI_F ) / AI_MATH_TWO_PI_F, - (std::asin (diff.x) + AI_MATH_HALF_PI_F) / AI_MATH_PI_F, 0.0); + for (unsigned int pnt = 0; pnt < mesh->mNumVertices; ++pnt) { + const aiVector3D diff = (mesh->mVertices[pnt] - center).Normalize(); + out[pnt] = aiVector3D((std::atan2(diff.z, diff.y) + AI_MATH_PI_F) / AI_MATH_TWO_PI_F, + (std::asin(diff.x) + AI_MATH_HALF_PI_F) / AI_MATH_PI_F, 0.0); } - } - else if (axis * base_axis_y >= angle_epsilon) { + } else if (axis * base_axis_y >= angle_epsilon) { // ... just the same again - for (unsigned int pnt = 0; pnt < mesh->mNumVertices;++pnt) { - const aiVector3D diff = (mesh->mVertices[pnt]-center).Normalize(); - out[pnt] = aiVector3D((std::atan2(diff.x, diff.z) + AI_MATH_PI_F ) / AI_MATH_TWO_PI_F, - (std::asin (diff.y) + AI_MATH_HALF_PI_F) / AI_MATH_PI_F, 0.0); + for (unsigned int pnt = 0; pnt < mesh->mNumVertices; ++pnt) { + const aiVector3D diff = (mesh->mVertices[pnt] - center).Normalize(); + out[pnt] = aiVector3D((std::atan2(diff.x, diff.z) + AI_MATH_PI_F) / AI_MATH_TWO_PI_F, + (std::asin(diff.y) + AI_MATH_HALF_PI_F) / AI_MATH_PI_F, 0.0); } - } - else if (axis * base_axis_z >= angle_epsilon) { + } else if (axis * base_axis_z >= angle_epsilon) { // ... just the same again - for (unsigned int pnt = 0; pnt < mesh->mNumVertices;++pnt) { - const aiVector3D diff = (mesh->mVertices[pnt]-center).Normalize(); - out[pnt] = aiVector3D((std::atan2(diff.y, diff.x) + AI_MATH_PI_F ) / AI_MATH_TWO_PI_F, - (std::asin (diff.z) + AI_MATH_HALF_PI_F) / AI_MATH_PI_F, 0.0); + for (unsigned int pnt = 0; pnt < mesh->mNumVertices; ++pnt) { + const aiVector3D diff = (mesh->mVertices[pnt] - center).Normalize(); + out[pnt] = aiVector3D((std::atan2(diff.y, diff.x) + AI_MATH_PI_F) / AI_MATH_TWO_PI_F, + (std::asin(diff.z) + AI_MATH_HALF_PI_F) / AI_MATH_PI_F, 0.0); } } // slower code path in case the mapping axis is not one of the coordinate system axes - else { + else { aiMatrix4x4 mTrafo; - aiMatrix4x4::FromToMatrix(axis,base_axis_y,mTrafo); + aiMatrix4x4::FromToMatrix(axis, base_axis_y, mTrafo); // again the same, except we're applying a transformation now - for (unsigned int pnt = 0; pnt < mesh->mNumVertices;++pnt) { - const aiVector3D diff = ((mTrafo*mesh->mVertices[pnt])-center).Normalize(); - out[pnt] = aiVector3D((std::atan2(diff.y, diff.x) + AI_MATH_PI_F ) / AI_MATH_TWO_PI_F, - (std::asin(diff.z) + AI_MATH_HALF_PI_F) / AI_MATH_PI_F, 0.0); + for (unsigned int pnt = 0; pnt < mesh->mNumVertices; ++pnt) { + const aiVector3D diff = ((mTrafo * mesh->mVertices[pnt]) - center).Normalize(); + out[pnt] = aiVector3D((std::atan2(diff.y, diff.x) + AI_MATH_PI_F) / AI_MATH_TWO_PI_F, + (std::asin(diff.z) + AI_MATH_HALF_PI_F) / AI_MATH_PI_F, 0.0); } } - // Now find and remove UV seams. A seam occurs if a face has a tcoord // close to zero on the one side, and a tcoord close to one on the // other side. - RemoveUVSeams(mesh,out); + RemoveUVSeams(mesh, out); } // ------------------------------------------------------------------------------------------------ -void ComputeUVMappingProcess::ComputeCylinderMapping(aiMesh* mesh,const aiVector3D& axis, aiVector3D* out) -{ +void ComputeUVMappingProcess::ComputeCylinderMapping(aiMesh *mesh, const aiVector3D &axis, aiVector3D *out) { aiVector3D center, min, max; // If the axis is one of x,y,z run a faster code path. It's worth the extra effort ... // currently the mapping axis will always be one of x,y,z, except if the // PretransformVertices step is used (it transforms the meshes into worldspace, // thus changing the mapping axis) - if (axis * base_axis_x >= angle_epsilon) { + if (axis * base_axis_x >= angle_epsilon) { FindMeshCenter(mesh, center, min, max); const ai_real diff = max.x - min.x; @@ -236,116 +226,110 @@ void ComputeUVMappingProcess::ComputeCylinderMapping(aiMesh* mesh,const aiVector // directly to the texture V axis. The other axis is derived from // the angle between ( p.x - c.x, p.y - c.y ) and (1,0), where // 'c' is the center point of the mesh. - for (unsigned int pnt = 0; pnt < mesh->mNumVertices;++pnt) { - const aiVector3D& pos = mesh->mVertices[pnt]; - aiVector3D& uv = out[pnt]; + for (unsigned int pnt = 0; pnt < mesh->mNumVertices; ++pnt) { + const aiVector3D &pos = mesh->mVertices[pnt]; + aiVector3D &uv = out[pnt]; uv.y = (pos.x - min.x) / diff; - uv.x = (std::atan2( pos.z - center.z, pos.y - center.y) +(ai_real)AI_MATH_PI ) / (ai_real)AI_MATH_TWO_PI; + uv.x = (std::atan2(pos.z - center.z, pos.y - center.y) + (ai_real)AI_MATH_PI) / (ai_real)AI_MATH_TWO_PI; } - } - else if (axis * base_axis_y >= angle_epsilon) { + } else if (axis * base_axis_y >= angle_epsilon) { FindMeshCenter(mesh, center, min, max); const ai_real diff = max.y - min.y; // just the same ... - for (unsigned int pnt = 0; pnt < mesh->mNumVertices;++pnt) { - const aiVector3D& pos = mesh->mVertices[pnt]; - aiVector3D& uv = out[pnt]; + for (unsigned int pnt = 0; pnt < mesh->mNumVertices; ++pnt) { + const aiVector3D &pos = mesh->mVertices[pnt]; + aiVector3D &uv = out[pnt]; uv.y = (pos.y - min.y) / diff; - uv.x = (std::atan2( pos.x - center.x, pos.z - center.z) +(ai_real)AI_MATH_PI ) / (ai_real)AI_MATH_TWO_PI; + uv.x = (std::atan2(pos.x - center.x, pos.z - center.z) + (ai_real)AI_MATH_PI) / (ai_real)AI_MATH_TWO_PI; } - } - else if (axis * base_axis_z >= angle_epsilon) { + } else if (axis * base_axis_z >= angle_epsilon) { FindMeshCenter(mesh, center, min, max); const ai_real diff = max.z - min.z; // just the same ... - for (unsigned int pnt = 0; pnt < mesh->mNumVertices;++pnt) { - const aiVector3D& pos = mesh->mVertices[pnt]; - aiVector3D& uv = out[pnt]; + for (unsigned int pnt = 0; pnt < mesh->mNumVertices; ++pnt) { + const aiVector3D &pos = mesh->mVertices[pnt]; + aiVector3D &uv = out[pnt]; uv.y = (pos.z - min.z) / diff; - uv.x = (std::atan2( pos.y - center.y, pos.x - center.x) +(ai_real)AI_MATH_PI ) / (ai_real)AI_MATH_TWO_PI; + uv.x = (std::atan2(pos.y - center.y, pos.x - center.x) + (ai_real)AI_MATH_PI) / (ai_real)AI_MATH_TWO_PI; } } // slower code path in case the mapping axis is not one of the coordinate system axes else { aiMatrix4x4 mTrafo; - aiMatrix4x4::FromToMatrix(axis,base_axis_y,mTrafo); - FindMeshCenterTransformed(mesh, center, min, max,mTrafo); + aiMatrix4x4::FromToMatrix(axis, base_axis_y, mTrafo); + FindMeshCenterTransformed(mesh, center, min, max, mTrafo); const ai_real diff = max.y - min.y; // again the same, except we're applying a transformation now - for (unsigned int pnt = 0; pnt < mesh->mNumVertices;++pnt){ - const aiVector3D pos = mTrafo* mesh->mVertices[pnt]; - aiVector3D& uv = out[pnt]; + for (unsigned int pnt = 0; pnt < mesh->mNumVertices; ++pnt) { + const aiVector3D pos = mTrafo * mesh->mVertices[pnt]; + aiVector3D &uv = out[pnt]; uv.y = (pos.y - min.y) / diff; - uv.x = (std::atan2( pos.x - center.x, pos.z - center.z) +(ai_real)AI_MATH_PI ) / (ai_real)AI_MATH_TWO_PI; + uv.x = (std::atan2(pos.x - center.x, pos.z - center.z) + (ai_real)AI_MATH_PI) / (ai_real)AI_MATH_TWO_PI; } } // Now find and remove UV seams. A seam occurs if a face has a tcoord // close to zero on the one side, and a tcoord close to one on the // other side. - RemoveUVSeams(mesh,out); + RemoveUVSeams(mesh, out); } // ------------------------------------------------------------------------------------------------ -void ComputeUVMappingProcess::ComputePlaneMapping(aiMesh* mesh,const aiVector3D& axis, aiVector3D* out) -{ - ai_real diffu,diffv; +void ComputeUVMappingProcess::ComputePlaneMapping(aiMesh *mesh, const aiVector3D &axis, aiVector3D *out) { + ai_real diffu, diffv; aiVector3D center, min, max; // If the axis is one of x,y,z run a faster code path. It's worth the extra effort ... // currently the mapping axis will always be one of x,y,z, except if the // PretransformVertices step is used (it transforms the meshes into worldspace, // thus changing the mapping axis) - if (axis * base_axis_x >= angle_epsilon) { + if (axis * base_axis_x >= angle_epsilon) { FindMeshCenter(mesh, center, min, max); diffu = max.z - min.z; diffv = max.y - min.y; - for (unsigned int pnt = 0; pnt < mesh->mNumVertices;++pnt) { - const aiVector3D& pos = mesh->mVertices[pnt]; - out[pnt].Set((pos.z - min.z) / diffu,(pos.y - min.y) / diffv,0.0); + for (unsigned int pnt = 0; pnt < mesh->mNumVertices; ++pnt) { + const aiVector3D &pos = mesh->mVertices[pnt]; + out[pnt].Set((pos.z - min.z) / diffu, (pos.y - min.y) / diffv, 0.0); } - } - else if (axis * base_axis_y >= angle_epsilon) { + } else if (axis * base_axis_y >= angle_epsilon) { FindMeshCenter(mesh, center, min, max); diffu = max.x - min.x; diffv = max.z - min.z; - for (unsigned int pnt = 0; pnt < mesh->mNumVertices;++pnt) { - const aiVector3D& pos = mesh->mVertices[pnt]; - out[pnt].Set((pos.x - min.x) / diffu,(pos.z - min.z) / diffv,0.0); + for (unsigned int pnt = 0; pnt < mesh->mNumVertices; ++pnt) { + const aiVector3D &pos = mesh->mVertices[pnt]; + out[pnt].Set((pos.x - min.x) / diffu, (pos.z - min.z) / diffv, 0.0); } - } - else if (axis * base_axis_z >= angle_epsilon) { + } else if (axis * base_axis_z >= angle_epsilon) { FindMeshCenter(mesh, center, min, max); diffu = max.x - min.x; diffv = max.y - min.y; - for (unsigned int pnt = 0; pnt < mesh->mNumVertices;++pnt) { - const aiVector3D& pos = mesh->mVertices[pnt]; - out[pnt].Set((pos.x - min.x) / diffu,(pos.y - min.y) / diffv,0.0); + for (unsigned int pnt = 0; pnt < mesh->mNumVertices; ++pnt) { + const aiVector3D &pos = mesh->mVertices[pnt]; + out[pnt].Set((pos.x - min.x) / diffu, (pos.y - min.y) / diffv, 0.0); } } // slower code path in case the mapping axis is not one of the coordinate system axes - else - { + else { aiMatrix4x4 mTrafo; - aiMatrix4x4::FromToMatrix(axis,base_axis_y,mTrafo); - FindMeshCenterTransformed(mesh, center, min, max,mTrafo); + aiMatrix4x4::FromToMatrix(axis, base_axis_y, mTrafo); + FindMeshCenterTransformed(mesh, center, min, max, mTrafo); diffu = max.x - min.x; diffv = max.z - min.z; // again the same, except we're applying a transformation now - for (unsigned int pnt = 0; pnt < mesh->mNumVertices;++pnt) { + for (unsigned int pnt = 0; pnt < mesh->mNumVertices; ++pnt) { const aiVector3D pos = mTrafo * mesh->mVertices[pnt]; - out[pnt].Set((pos.x - min.x) / diffu,(pos.z - min.z) / diffv,0.0); + out[pnt].Set((pos.x - min.x) / diffu, (pos.z - min.z) / diffv, 0.0); } } @@ -353,14 +337,12 @@ void ComputeUVMappingProcess::ComputePlaneMapping(aiMesh* mesh,const aiVector3D& } // ------------------------------------------------------------------------------------------------ -void ComputeUVMappingProcess::ComputeBoxMapping( aiMesh*, aiVector3D* ) -{ +void ComputeUVMappingProcess::ComputeBoxMapping(aiMesh *, aiVector3D *) { ASSIMP_LOG_ERROR("Mapping type currently not implemented"); } // ------------------------------------------------------------------------------------------------ -void ComputeUVMappingProcess::Execute( aiScene* pScene) -{ +void ComputeUVMappingProcess::Execute(aiScene *pScene) { ASSIMP_LOG_DEBUG("GenUVCoordsProcess begin"); char buffer[1024]; @@ -371,23 +353,18 @@ void ComputeUVMappingProcess::Execute( aiScene* pScene) /* Iterate through all materials and search for non-UV mapped textures */ - for (unsigned int i = 0; i < pScene->mNumMaterials;++i) - { + for (unsigned int i = 0; i < pScene->mNumMaterials; ++i) { mappingStack.clear(); - aiMaterial* mat = pScene->mMaterials[i]; - for (unsigned int a = 0; a < mat->mNumProperties;++a) - { - aiMaterialProperty* prop = mat->mProperties[a]; - if (!::strcmp( prop->mKey.data, "$tex.mapping")) - { - aiTextureMapping& mapping = *((aiTextureMapping*)prop->mData); - if (aiTextureMapping_UV != mapping) - { - if (!DefaultLogger::isNullLogger()) - { + aiMaterial *mat = pScene->mMaterials[i]; + for (unsigned int a = 0; a < mat->mNumProperties; ++a) { + aiMaterialProperty *prop = mat->mProperties[a]; + if (!::strcmp(prop->mKey.data, "$tex.mapping")) { + aiTextureMapping &mapping = *((aiTextureMapping *)prop->mData); + if (aiTextureMapping_UV != mapping) { + if (!DefaultLogger::isNullLogger()) { ai_snprintf(buffer, 1024, "Found non-UV mapped texture (%s,%u). Mapping type: %s", - aiTextureTypeToString((aiTextureType)prop->mSemantic),prop->mIndex, - MappingTypeToString(mapping)); + aiTextureTypeToString((aiTextureType)prop->mSemantic), prop->mIndex, + MappingTypeToString(mapping)); ASSIMP_LOG_INFO(buffer); } @@ -395,70 +372,62 @@ void ComputeUVMappingProcess::Execute( aiScene* pScene) if (aiTextureMapping_OTHER == mapping) continue; - MappingInfo info (mapping); + MappingInfo info(mapping); // Get further properties - currently only the major axis - for (unsigned int a2 = 0; a2 < mat->mNumProperties;++a2) - { - aiMaterialProperty* prop2 = mat->mProperties[a2]; + for (unsigned int a2 = 0; a2 < mat->mNumProperties; ++a2) { + aiMaterialProperty *prop2 = mat->mProperties[a2]; if (prop2->mSemantic != prop->mSemantic || prop2->mIndex != prop->mIndex) continue; - if ( !::strcmp( prop2->mKey.data, "$tex.mapaxis")) { - info.axis = *((aiVector3D*)prop2->mData); + if (!::strcmp(prop2->mKey.data, "$tex.mapaxis")) { + info.axis = *((aiVector3D *)prop2->mData); break; } } - unsigned int idx( 99999999 ); + unsigned int idx(99999999); // Check whether we have this mapping mode already - std::list::iterator it = std::find (mappingStack.begin(),mappingStack.end(), info); - if (mappingStack.end() != it) - { + std::list::iterator it = std::find(mappingStack.begin(), mappingStack.end(), info); + if (mappingStack.end() != it) { idx = (*it).uv; - } - else - { + } else { /* We have found a non-UV mapped texture. Now - * we need to find all meshes using this material - * that we can compute UV channels for them. - */ - for (unsigned int m = 0; m < pScene->mNumMeshes;++m) - { - aiMesh* mesh = pScene->mMeshes[m]; + * we need to find all meshes using this material + * that we can compute UV channels for them. + */ + for (unsigned int m = 0; m < pScene->mNumMeshes; ++m) { + aiMesh *mesh = pScene->mMeshes[m]; unsigned int outIdx = 0; - if ( mesh->mMaterialIndex != i || ( outIdx = FindEmptyUVChannel(mesh) ) == UINT_MAX || - !mesh->mNumVertices) - { + if (mesh->mMaterialIndex != i || (outIdx = FindEmptyUVChannel(mesh)) == UINT_MAX || + !mesh->mNumVertices) { continue; } // Allocate output storage - aiVector3D* p = mesh->mTextureCoords[outIdx] = new aiVector3D[mesh->mNumVertices]; + aiVector3D *p = mesh->mTextureCoords[outIdx] = new aiVector3D[mesh->mNumVertices]; - switch (mapping) - { + switch (mapping) { case aiTextureMapping_SPHERE: - ComputeSphereMapping(mesh,info.axis,p); + ComputeSphereMapping(mesh, info.axis, p); break; case aiTextureMapping_CYLINDER: - ComputeCylinderMapping(mesh,info.axis,p); + ComputeCylinderMapping(mesh, info.axis, p); break; case aiTextureMapping_PLANE: - ComputePlaneMapping(mesh,info.axis,p); + ComputePlaneMapping(mesh, info.axis, p); break; case aiTextureMapping_BOX: - ComputeBoxMapping(mesh,p); + ComputeBoxMapping(mesh, p); break; default: ai_assert(false); } - if (m && idx != outIdx) - { + if (m && idx != outIdx) { ASSIMP_LOG_WARN("UV index mismatch. Not all meshes assigned to " - "this material have equal numbers of UV channels. The UV index stored in " - "the material structure does therefore not apply for all meshes. "); + "this material have equal numbers of UV channels. The UV index stored in " + "the material structure does therefore not apply for all meshes. "); } idx = outIdx; } @@ -468,7 +437,7 @@ void ComputeUVMappingProcess::Execute( aiScene* pScene) // Update the material property list mapping = aiTextureMapping_UV; - ((aiMaterial*)mat)->AddProperty(&idx,1,AI_MATKEY_UVWSRC(prop->mSemantic,prop->mIndex)); + ((aiMaterial *)mat)->AddProperty(&idx, 1, AI_MATKEY_UVWSRC(prop->mSemantic, prop->mIndex)); } } } diff --git a/code/PostProcessing/DropFaceNormalsProcess.cpp b/code/PostProcessing/DropFaceNormalsProcess.cpp index 223482374..c5f6333e0 100644 --- a/code/PostProcessing/DropFaceNormalsProcess.cpp +++ b/code/PostProcessing/DropFaceNormalsProcess.cpp @@ -42,27 +42,26 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** @file Implementation of the post processing step to drop face -* normals for all imported faces. -*/ - + * normals for all imported faces. + */ #include "DropFaceNormalsProcess.h" +#include #include #include #include -#include using namespace Assimp; // ------------------------------------------------------------------------------------------------ // Returns whether the processing step is present in the given flag field. -bool DropFaceNormalsProcess::IsActive( unsigned int pFlags) const { - return (pFlags & aiProcess_DropNormals) != 0; +bool DropFaceNormalsProcess::IsActive(unsigned int pFlags) const { + return (pFlags & aiProcess_DropNormals) != 0; } // ------------------------------------------------------------------------------------------------ // Executes the post processing step on the given imported data. -void DropFaceNormalsProcess::Execute( aiScene* pScene) { +void DropFaceNormalsProcess::Execute(aiScene *pScene) { ASSIMP_LOG_DEBUG("DropFaceNormalsProcess begin"); if (pScene->mFlags & AI_SCENE_FLAGS_NON_VERBOSE_FORMAT) { @@ -70,21 +69,21 @@ void DropFaceNormalsProcess::Execute( aiScene* pScene) { } bool bHas = false; - for( unsigned int a = 0; a < pScene->mNumMeshes; a++) { - bHas |= this->DropMeshFaceNormals( pScene->mMeshes[a]); + for (unsigned int a = 0; a < pScene->mNumMeshes; a++) { + bHas |= this->DropMeshFaceNormals(pScene->mMeshes[a]); } - if (bHas) { + if (bHas) { ASSIMP_LOG_INFO("DropFaceNormalsProcess finished. " - "Face normals have been removed"); + "Face normals have been removed"); } else { ASSIMP_LOG_DEBUG("DropFaceNormalsProcess finished. " - "No normals were present"); + "No normals were present"); } } // ------------------------------------------------------------------------------------------------ // Executes the post processing step on the given imported data. -bool DropFaceNormalsProcess::DropMeshFaceNormals (aiMesh* mesh) { +bool DropFaceNormalsProcess::DropMeshFaceNormals(aiMesh *mesh) { ai_assert(nullptr != mesh); if (nullptr == mesh->mNormals) { diff --git a/code/PostProcessing/FindDegenerates.cpp b/code/PostProcessing/FindDegenerates.cpp index 87ee75601..d9c14425c 100644 --- a/code/PostProcessing/FindDegenerates.cpp +++ b/code/PostProcessing/FindDegenerates.cpp @@ -41,11 +41,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /** @file FindDegenerates.cpp * @brief Implementation of the FindDegenerates post-process step. -*/ + */ -#include "ProcessHelper.h" #include "FindDegenerates.h" #include "Geometry/GeometryUtils.h" +#include "ProcessHelper.h" #include @@ -54,35 +54,35 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. using namespace Assimp; // Correct node indices to meshes and remove references to deleted mesh -static void updateSceneGraph(aiNode* pNode, const std::unordered_map& meshMap); +static void updateSceneGraph(aiNode *pNode, const std::unordered_map &meshMap); // ------------------------------------------------------------------------------------------------ // Constructor to be privately used by Importer FindDegeneratesProcess::FindDegeneratesProcess() : - mConfigRemoveDegenerates( false ), - mConfigCheckAreaOfTriangle( false ){ + mConfigRemoveDegenerates(false), + mConfigCheckAreaOfTriangle(false) { // empty } // ------------------------------------------------------------------------------------------------ // Returns whether the processing step is present in the given flag field. -bool FindDegeneratesProcess::IsActive( unsigned int pFlags) const { +bool FindDegeneratesProcess::IsActive(unsigned int pFlags) const { return 0 != (pFlags & aiProcess_FindDegenerates); } // ------------------------------------------------------------------------------------------------ // Setup import configuration -void FindDegeneratesProcess::SetupProperties(const Importer* pImp) { +void FindDegeneratesProcess::SetupProperties(const Importer *pImp) { // Get the current value of AI_CONFIG_PP_FD_REMOVE - mConfigRemoveDegenerates = (0 != pImp->GetPropertyInteger(AI_CONFIG_PP_FD_REMOVE,0)); - mConfigCheckAreaOfTriangle = ( 0 != pImp->GetPropertyInteger(AI_CONFIG_PP_FD_CHECKAREA) ); + mConfigRemoveDegenerates = (0 != pImp->GetPropertyInteger(AI_CONFIG_PP_FD_REMOVE, 0)); + mConfigCheckAreaOfTriangle = (0 != pImp->GetPropertyInteger(AI_CONFIG_PP_FD_CHECKAREA)); } // ------------------------------------------------------------------------------------------------ // Executes the post processing step on the given imported data. -void FindDegeneratesProcess::Execute( aiScene* pScene) { +void FindDegeneratesProcess::Execute(aiScene *pScene) { ASSIMP_LOG_DEBUG("FindDegeneratesProcess begin"); - if ( nullptr == pScene) { + if (nullptr == pScene) { return; } @@ -112,7 +112,7 @@ void FindDegeneratesProcess::Execute( aiScene* pScene) { ASSIMP_LOG_DEBUG("FindDegeneratesProcess finished"); } -static void updateSceneGraph(aiNode* pNode, const std::unordered_map& meshMap) { +static void updateSceneGraph(aiNode *pNode, const std::unordered_map &meshMap) { unsigned int targetIndex = 0; for (unsigned i = 0; i < pNode->mNumMeshes; ++i) { const unsigned int sourceMeshIndex = pNode->mMeshes[i]; @@ -123,7 +123,7 @@ static void updateSceneGraph(aiNode* pNode, const std::unordered_mapmNumMeshes = targetIndex; - //recurse to all children + // recurse to all children for (unsigned i = 0; i < pNode->mNumChildren; ++i) { updateSceneGraph(pNode->mChildren[i], meshMap); } @@ -131,17 +131,17 @@ static void updateSceneGraph(aiNode* pNode, const std::unordered_mapmPrimitiveTypes = 0; std::vector remove_me; if (mConfigRemoveDegenerates) { - remove_me.resize( mesh->mNumFaces, false ); + remove_me.resize(mesh->mNumFaces, false); } unsigned int deg = 0, limit; - for ( unsigned int a = 0; a < mesh->mNumFaces; ++a ) { - aiFace& face = mesh->mFaces[a]; + for (unsigned int a = 0; a < mesh->mNumFaces; ++a) { + aiFace &face = mesh->mFaces[a]; bool first = true; // check whether the face contains degenerated entries @@ -151,43 +151,43 @@ bool FindDegeneratesProcess::ExecuteOnMesh( aiMesh* mesh) { // double points may not come directly after another. limit = face.mNumIndices; if (face.mNumIndices > 4) { - limit = std::min( limit, i+2 ); + limit = std::min(limit, i + 2); } - for (unsigned int t = i+1; t < limit; ++t) { - if (mesh->mVertices[face.mIndices[ i ] ] == mesh->mVertices[ face.mIndices[ t ] ]) { + for (unsigned int t = i + 1; t < limit; ++t) { + if (mesh->mVertices[face.mIndices[i]] == mesh->mVertices[face.mIndices[t]]) { // we have found a matching vertex position // remove the corresponding index from the array --face.mNumIndices; --limit; for (unsigned int m = t; m < face.mNumIndices; ++m) { - face.mIndices[ m ] = face.mIndices[ m+1 ]; + face.mIndices[m] = face.mIndices[m + 1]; } --t; // NOTE: we set the removed vertex index to an unique value // to make sure the developer gets notified when his // application attempts to access this data. - face.mIndices[ face.mNumIndices ] = 0xdeadbeef; + face.mIndices[face.mNumIndices] = 0xdeadbeef; - if(first) { + if (first) { ++deg; first = false; } - if ( mConfigRemoveDegenerates ) { - remove_me[ a ] = true; + if (mConfigRemoveDegenerates) { + remove_me[a] = true; goto evil_jump_outside; // hrhrhrh ... yeah, this rocks baby! } } } - if ( mConfigCheckAreaOfTriangle ) { - if ( face.mNumIndices == 3 ) { - ai_real area = GeometryUtils::calculateAreaOfTriangle( face, mesh ); + if (mConfigCheckAreaOfTriangle) { + if (face.mNumIndices == 3) { + ai_real area = GeometryUtils::calculateAreaOfTriangle(face, mesh); if (area < ai_epsilon) { - if ( mConfigRemoveDegenerates ) { - remove_me[ a ] = true; + if (mConfigRemoveDegenerates) { + remove_me[a] = true; ++deg; goto evil_jump_outside; } @@ -199,8 +199,7 @@ bool FindDegeneratesProcess::ExecuteOnMesh( aiMesh* mesh) { } // We need to update the primitive flags array of the mesh. - switch (face.mNumIndices) - { + switch (face.mNumIndices) { case 1u: mesh->mPrimitiveTypes |= aiPrimitiveType_POINT; break; @@ -214,22 +213,21 @@ bool FindDegeneratesProcess::ExecuteOnMesh( aiMesh* mesh) { mesh->mPrimitiveTypes |= aiPrimitiveType_POLYGON; break; }; -evil_jump_outside: + evil_jump_outside: continue; } // If AI_CONFIG_PP_FD_REMOVE is true, remove degenerated faces from the import if (mConfigRemoveDegenerates && deg) { unsigned int n = 0; - for (unsigned int a = 0; a < mesh->mNumFaces; ++a) - { - aiFace& face_src = mesh->mFaces[a]; + for (unsigned int a = 0; a < mesh->mNumFaces; ++a) { + aiFace &face_src = mesh->mFaces[a]; if (!remove_me[a]) { - aiFace& face_dest = mesh->mFaces[n++]; + aiFace &face_dest = mesh->mFaces[n++]; // Do a manual copy, keep the index array face_dest.mNumIndices = face_src.mNumIndices; - face_dest.mIndices = face_src.mIndices; + face_dest.mIndices = face_src.mIndices; if (&face_src != &face_dest) { // clear source @@ -246,15 +244,15 @@ evil_jump_outside: // Just leave the rest of the array unreferenced, we don't care for now mesh->mNumFaces = n; if (!mesh->mNumFaces) { - //The whole mesh consists of degenerated faces - //signal upward, that this mesh should be deleted. + // The whole mesh consists of degenerated faces + // signal upward, that this mesh should be deleted. ASSIMP_LOG_VERBOSE_DEBUG("FindDegeneratesProcess removed a mesh full of degenerated primitives"); return true; } } if (deg && !DefaultLogger::isNullLogger()) { - ASSIMP_LOG_WARN( "Found ", deg, " degenerated primitives"); + ASSIMP_LOG_WARN("Found ", deg, " degenerated primitives"); } return false; } diff --git a/code/PostProcessing/PretransformVertices.cpp b/code/PostProcessing/PretransformVertices.cpp index b6bb6155e..ff066a1d3 100644 --- a/code/PostProcessing/PretransformVertices.cpp +++ b/code/PostProcessing/PretransformVertices.cpp @@ -5,8 +5,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2022, assimp team - - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -41,9 +39,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --------------------------------------------------------------------------- */ -/** @file PretransformVertices.cpp - * @brief Implementation of the "PretransformVertices" post processing step -*/ +/// @file PretransformVertices.cpp +/// @brief Implementation of the "PretransformVertices" post processing step #include "PretransformVertices.h" #include "ConvertToLHProcess.h" @@ -57,16 +54,44 @@ using namespace Assimp; #define AI_PTVS_VERTEX 0x0 #define AI_PTVS_FACE 0x1 +namespace { + +// Get a bitwise combination identifying the vertex format of a mesh +static unsigned int GetMeshVFormat(aiMesh *pcMesh) { + // the vertex format is stored in aiMesh::mBones for later retrieval. + // there isn't a good reason to compute it a few hundred times + // from scratch. The pointer is unused as animations are lost + // during PretransformVertices. + if (pcMesh->mBones) + return (unsigned int)(uint64_t)pcMesh->mBones; + + const unsigned int iRet = GetMeshVFormatUnique(pcMesh); + + // store the value for later use + pcMesh->mBones = (aiBone **)(uint64_t)iRet; + return iRet; +} + +// Get a list of all vertex formats that occur for a given material index +// The output list contains duplicate elements +static void GetVFormatList(const aiScene *pcScene, unsigned int iMat, std::list &aiOut) { + for (unsigned int i = 0; i < pcScene->mNumMeshes; ++i) { + aiMesh *pcMesh = pcScene->mMeshes[i]; + if (iMat == pcMesh->mMaterialIndex) { + aiOut.push_back(GetMeshVFormat(pcMesh)); + } + } +} + +} // ------------------------------------------------------------------------------------------------ // Constructor to be privately used by Importer PretransformVertices::PretransformVertices() : - configKeepHierarchy(false), - configNormalize(false), - configTransform(false), - configTransformation(), - mConfigPointCloud(false) { - // empty -} + mConfigKeepHierarchy(false), + mConfigNormalize(false), + mConfigTransform(false), + mConfigTransformation(), + mConfigPointCloud(false) {} // ------------------------------------------------------------------------------------------------ // Returns whether the processing step is present in the given flag field. @@ -79,11 +104,11 @@ bool PretransformVertices::IsActive(unsigned int pFlags) const { void PretransformVertices::SetupProperties(const Importer *pImp) { // Get the current value of AI_CONFIG_PP_PTV_KEEP_HIERARCHY, AI_CONFIG_PP_PTV_NORMALIZE, // AI_CONFIG_PP_PTV_ADD_ROOT_TRANSFORMATION and AI_CONFIG_PP_PTV_ROOT_TRANSFORMATION - configKeepHierarchy = (0 != pImp->GetPropertyInteger(AI_CONFIG_PP_PTV_KEEP_HIERARCHY, 0)); - configNormalize = (0 != pImp->GetPropertyInteger(AI_CONFIG_PP_PTV_NORMALIZE, 0)); - configTransform = (0 != pImp->GetPropertyInteger(AI_CONFIG_PP_PTV_ADD_ROOT_TRANSFORMATION, 0)); + mConfigKeepHierarchy = (0 != pImp->GetPropertyInteger(AI_CONFIG_PP_PTV_KEEP_HIERARCHY, 0)); + mConfigNormalize = (0 != pImp->GetPropertyInteger(AI_CONFIG_PP_PTV_NORMALIZE, 0)); + mConfigTransform = (0 != pImp->GetPropertyInteger(AI_CONFIG_PP_PTV_ADD_ROOT_TRANSFORMATION, 0)); - configTransformation = pImp->GetPropertyMatrix(AI_CONFIG_PP_PTV_ROOT_TRANSFORMATION, aiMatrix4x4()); + mConfigTransformation = pImp->GetPropertyMatrix(AI_CONFIG_PP_PTV_ROOT_TRANSFORMATION, aiMatrix4x4()); mConfigPointCloud = pImp->GetPropertyBool(AI_CONFIG_EXPORT_POINT_CLOUDS); } @@ -99,25 +124,7 @@ unsigned int PretransformVertices::CountNodes(const aiNode *pcNode) const { } // ------------------------------------------------------------------------------------------------ -// Get a bitwise combination identifying the vertex format of a mesh -unsigned int PretransformVertices::GetMeshVFormat(aiMesh *pcMesh) const { - // the vertex format is stored in aiMesh::mBones for later retrieval. - // there isn't a good reason to compute it a few hundred times - // from scratch. The pointer is unused as animations are lost - // during PretransformVertices. - if (pcMesh->mBones) - return (unsigned int)(uint64_t)pcMesh->mBones; - - const unsigned int iRet = GetMeshVFormatUnique(pcMesh); - - // store the value for later use - pcMesh->mBones = (aiBone **)(uint64_t)iRet; - return iRet; -} - -// ------------------------------------------------------------------------------------------------ -// Count the number of vertices in the whole scene and a given -// material index +// Count the number of vertices in the whole scene and a given material index void PretransformVertices::CountVerticesAndFaces(const aiScene *pcScene, const aiNode *pcNode, unsigned int iMat, unsigned int iVFormat, unsigned int *piFaces, unsigned int *piVertices) const { for (unsigned int i = 0; i < pcNode->mNumMeshes; ++i) { @@ -128,8 +135,7 @@ void PretransformVertices::CountVerticesAndFaces(const aiScene *pcScene, const a } } for (unsigned int i = 0; i < pcNode->mNumChildren; ++i) { - CountVerticesAndFaces(pcScene, pcNode->mChildren[i], iMat, - iVFormat, piFaces, piVertices); + CountVerticesAndFaces(pcScene, pcNode->mChildren[i], iMat, iVFormat, piFaces, piVertices); } } @@ -272,19 +278,6 @@ void PretransformVertices::CollectData(const aiScene *pcScene, const aiNode *pcN } } -// ------------------------------------------------------------------------------------------------ -// Get a list of all vertex formats that occur for a given material index -// The output list contains duplicate elements -void PretransformVertices::GetVFormatList(const aiScene *pcScene, unsigned int iMat, - std::list &aiOut) const { - for (unsigned int i = 0; i < pcScene->mNumMeshes; ++i) { - aiMesh *pcMesh = pcScene->mMeshes[i]; - if (iMat == pcMesh->mMaterialIndex) { - aiOut.push_back(GetMeshVFormat(pcMesh)); - } - } -} - // ------------------------------------------------------------------------------------------------ // Compute the absolute transformation matrices of each node void PretransformVertices::ComputeAbsoluteTransform(aiNode *pcNode) { @@ -297,39 +290,44 @@ void PretransformVertices::ComputeAbsoluteTransform(aiNode *pcNode) { } } +static void normalizeVectorArray(aiVector3D *vectorArrayIn, aiVector3D *vectorArrayOut, size_t numVectors) { + for (size_t i=0; iHasFaces() && mat.Determinant() < 0) { - // Reverse the mesh face winding order - FlipWindingOrderProcess::ProcessMesh(mesh); + // Check for odd negative scale (mirror) + if (mesh->HasFaces() && mat.Determinant() < 0) { + // Reverse the mesh face winding order + FlipWindingOrderProcess::ProcessMesh(mesh); + } + + // Update positions + if (mesh->HasPositions()) { + for (unsigned int i = 0; i < mesh->mNumVertices; ++i) { + mesh->mVertices[i] = mat * mesh->mVertices[i]; } + } - // Update positions - if (mesh->HasPositions()) { + // Update normals and tangents + if (mesh->HasNormals() || mesh->HasTangentsAndBitangents()) { + const aiMatrix3x3 m = aiMatrix3x3(mat).Inverse().Transpose(); + + if (mesh->HasNormals()) { + normalizeVectorArray(mesh->mNormals, mesh->mNormals, mesh->mNumVertices); + } + if (mesh->HasTangentsAndBitangents()) { for (unsigned int i = 0; i < mesh->mNumVertices; ++i) { - mesh->mVertices[i] = mat * mesh->mVertices[i]; - } - } - - // Update normals and tangents - if (mesh->HasNormals() || mesh->HasTangentsAndBitangents()) { - const aiMatrix3x3 m = aiMatrix3x3(mat).Inverse().Transpose(); - - if (mesh->HasNormals()) { - for (unsigned int i = 0; i < mesh->mNumVertices; ++i) { - mesh->mNormals[i] = (m * mesh->mNormals[i]).Normalize(); - } - } - if (mesh->HasTangentsAndBitangents()) { - for (unsigned int i = 0; i < mesh->mNumVertices; ++i) { - mesh->mTangents[i] = (m * mesh->mTangents[i]).Normalize(); - mesh->mBitangents[i] = (m * mesh->mBitangents[i]).Normalize(); - } + mesh->mTangents[i] = (m * mesh->mTangents[i]).Normalize(); + mesh->mBitangents[i] = (m * mesh->mBitangents[i]).Normalize(); } } } @@ -352,40 +350,41 @@ void PretransformVertices::BuildWCSMeshes(std::vector &out, aiMesh **i // yes, we can. mesh->mBones = reinterpret_cast(&node->mTransformation); mesh->mNumBones = UINT_MAX; - } else { + continue; + } - // try to find us in the list of newly created meshes - for (unsigned int n = 0; n < out.size(); ++n) { - aiMesh *ctz = out[n]; - if (ctz->mNumBones == node->mMeshes[i] && *reinterpret_cast(ctz->mBones) == node->mTransformation) { + // try to find us in the list of newly created meshes + for (unsigned int n = 0; n < out.size(); ++n) { + aiMesh *ctz = out[n]; + if (ctz->mNumBones == node->mMeshes[i] && *reinterpret_cast(ctz->mBones) == node->mTransformation) { - // ok, use this one. Update node mesh index - node->mMeshes[i] = numIn + n; - } + // ok, use this one. Update node mesh index + node->mMeshes[i] = numIn + n; } - if (node->mMeshes[i] < numIn) { - // Worst case. Need to operate on a full copy of the mesh - ASSIMP_LOG_INFO("PretransformVertices: Copying mesh due to mismatching transforms"); - aiMesh *ntz; + } + if (node->mMeshes[i] < numIn) { + // Worst case. Need to operate on a full copy of the mesh + ASSIMP_LOG_INFO("PretransformVertices: Copying mesh due to mismatching transforms"); + aiMesh *ntz; - const unsigned int tmp = mesh->mNumBones; // - mesh->mNumBones = 0; - SceneCombiner::Copy(&ntz, mesh); - mesh->mNumBones = tmp; + const unsigned int cacheNumBones = mesh->mNumBones; // + mesh->mNumBones = 0; + SceneCombiner::Copy(&ntz, mesh); + mesh->mNumBones = cacheNumBones; - ntz->mNumBones = node->mMeshes[i]; - ntz->mBones = reinterpret_cast(&node->mTransformation); + ntz->mNumBones = node->mMeshes[i]; + ntz->mBones = reinterpret_cast(&node->mTransformation); - out.push_back(ntz); + out.push_back(ntz); - node->mMeshes[i] = static_cast(numIn + out.size() - 1); - } + node->mMeshes[i] = static_cast(numIn + out.size() - 1); } } // call children - for (unsigned int i = 0; i < node->mNumChildren; ++i) + for (unsigned int i = 0; i < node->mNumChildren; ++i) { BuildWCSMeshes(out, in, numIn, node->mChildren[i]); + } } // ------------------------------------------------------------------------------------------------ @@ -394,8 +393,9 @@ void PretransformVertices::MakeIdentityTransform(aiNode *nd) const { nd->mTransformation = aiMatrix4x4(); // call children - for (unsigned int i = 0; i < nd->mNumChildren; ++i) + for (unsigned int i = 0; i < nd->mNumChildren; ++i) { MakeIdentityTransform(nd->mChildren[i]); + } } // ------------------------------------------------------------------------------------------------ @@ -405,8 +405,27 @@ void PretransformVertices::BuildMeshRefCountArray(const aiNode *nd, unsigned int refs[nd->mMeshes[i]]++; // call children - for (unsigned int i = 0; i < nd->mNumChildren; ++i) + for (unsigned int i = 0; i < nd->mNumChildren; ++i) { BuildMeshRefCountArray(nd->mChildren[i], refs); + } +} + +// ------------------------------------------------------------------------------------------------ +static void appendNewMeshesToScene(aiScene *pScene, std::vector &apcOutMeshes) { + ai_assert(pScene != nullptr); + + if (apcOutMeshes.empty()) { + return; + } + + aiMesh **npp = new aiMesh *[pScene->mNumMeshes + apcOutMeshes.size()]; + + ::memcpy(npp, pScene->mMeshes, sizeof(aiMesh *) * pScene->mNumMeshes); + ::memcpy(npp + pScene->mNumMeshes, &apcOutMeshes[0], sizeof(aiMesh *) * apcOutMeshes.size()); + + pScene->mNumMeshes += static_cast(apcOutMeshes.size()); + delete[] pScene->mMeshes; + pScene->mMeshes = npp; } // ------------------------------------------------------------------------------------------------ @@ -418,12 +437,12 @@ void PretransformVertices::Execute(aiScene *pScene) { if (!pScene->mNumMeshes) return; - const unsigned int iOldMeshes = pScene->mNumMeshes; - const unsigned int iOldAnimationChannels = pScene->mNumAnimations; - const unsigned int iOldNodes = CountNodes(pScene->mRootNode); + const unsigned int oldMeshes = pScene->mNumMeshes; + const unsigned int oldAnimationChannels = pScene->mNumAnimations; + const unsigned int oldNodes = CountNodes(pScene->mRootNode); - if (configTransform) { - pScene->mRootNode->mTransformation = configTransformation * pScene->mRootNode->mTransformation; + if (mConfigTransform) { + pScene->mRootNode->mTransformation = mConfigTransformation * pScene->mRootNode->mTransformation; } // first compute absolute transformation matrices for all nodes @@ -449,22 +468,13 @@ void PretransformVertices::Execute(aiScene *pScene) { // we go on and transform all meshes, if one is referenced by nodes // with different absolute transformations a depth copy of the mesh // is required. - if (configKeepHierarchy) { + if (mConfigKeepHierarchy) { // Hack: store the matrix we're transforming a mesh with in aiMesh::mBones BuildWCSMeshes(apcOutMeshes, pScene->mMeshes, pScene->mNumMeshes, pScene->mRootNode); // ... if new meshes have been generated, append them to the end of the scene - if (apcOutMeshes.size() > 0) { - aiMesh **npp = new aiMesh *[pScene->mNumMeshes + apcOutMeshes.size()]; - - memcpy(npp, pScene->mMeshes, sizeof(aiMesh *) * pScene->mNumMeshes); - memcpy(npp + pScene->mNumMeshes, &apcOutMeshes[0], sizeof(aiMesh *) * apcOutMeshes.size()); - - pScene->mNumMeshes += static_cast(apcOutMeshes.size()); - delete[] pScene->mMeshes; - pScene->mMeshes = npp; - } + appendNewMeshesToScene(pScene, apcOutMeshes); // now iterate through all meshes and transform them to world-space for (unsigned int i = 0; i < pScene->mNumMeshes; ++i) { @@ -488,34 +498,35 @@ void PretransformVertices::Execute(aiScene *pScene) { aiVFormats.sort(); aiVFormats.unique(); for (std::list::const_iterator j = aiVFormats.begin(); j != aiVFormats.end(); ++j) { - unsigned int iVertices = 0; - unsigned int iFaces = 0; - CountVerticesAndFaces(pScene, pScene->mRootNode, i, *j, &iFaces, &iVertices); - if (0 != iFaces && 0 != iVertices) { + unsigned int numVertices = 0u; + unsigned int numFaces = 0u; + CountVerticesAndFaces(pScene, pScene->mRootNode, i, *j, &numFaces, &numVertices); + if (0 != numFaces && 0 != numVertices) { apcOutMeshes.push_back(new aiMesh()); aiMesh *pcMesh = apcOutMeshes.back(); - pcMesh->mNumFaces = iFaces; - pcMesh->mNumVertices = iVertices; - pcMesh->mFaces = new aiFace[iFaces]; - pcMesh->mVertices = new aiVector3D[iVertices]; + pcMesh->mNumFaces = numFaces; + pcMesh->mNumVertices = numVertices; + pcMesh->mFaces = new aiFace[numFaces]; + pcMesh->mVertices = new aiVector3D[numVertices]; pcMesh->mMaterialIndex = i; - if ((*j) & 0x2) pcMesh->mNormals = new aiVector3D[iVertices]; + if ((*j) & 0x2) pcMesh->mNormals = new aiVector3D[numVertices]; if ((*j) & 0x4) { - pcMesh->mTangents = new aiVector3D[iVertices]; - pcMesh->mBitangents = new aiVector3D[iVertices]; + pcMesh->mTangents = new aiVector3D[numVertices]; + pcMesh->mBitangents = new aiVector3D[numVertices]; } - iFaces = 0; - while ((*j) & (0x100 << iFaces)) { - pcMesh->mTextureCoords[iFaces] = new aiVector3D[iVertices]; - if ((*j) & (0x10000 << iFaces)) - pcMesh->mNumUVComponents[iFaces] = 3; - else - pcMesh->mNumUVComponents[iFaces] = 2; - iFaces++; + numFaces = 0; + while ((*j) & (0x100 << numFaces)) { + pcMesh->mTextureCoords[numFaces] = new aiVector3D[numVertices]; + if ((*j) & (0x10000 << numFaces)) { + pcMesh->mNumUVComponents[numFaces] = 3; + } else { + pcMesh->mNumUVComponents[numFaces] = 2; + } + ++numFaces; } - iFaces = 0; - while ((*j) & (0x1000000 << iFaces)) - pcMesh->mColors[iFaces++] = new aiColor4D[iVertices]; + numFaces = 0; + while ((*j) & (0x1000000 << numFaces)) + pcMesh->mColors[numFaces++] = new aiColor4D[numVertices]; // fill the mesh ... unsigned int aiTemp[2] = { 0, 0 }; @@ -593,7 +604,7 @@ void PretransformVertices::Execute(aiScene *pScene) { l->mUp = aiMatrix3x3(nd->mTransformation) * l->mUp; } - if (!configKeepHierarchy) { + if (!mConfigKeepHierarchy) { // now delete all nodes in the scene and build a new // flat node graph with a root node and some level 1 children @@ -644,7 +655,7 @@ void PretransformVertices::Execute(aiScene *pScene) { MakeIdentityTransform(pScene->mRootNode); } - if (configNormalize) { + if (mConfigNormalize) { // compute the boundary of all meshes aiVector3D min, max; MinMaxChooser()(min, max); @@ -674,9 +685,9 @@ void PretransformVertices::Execute(aiScene *pScene) { if (!DefaultLogger::isNullLogger()) { ASSIMP_LOG_DEBUG("PretransformVerticesProcess finished"); - ASSIMP_LOG_INFO("Removed ", iOldNodes, " nodes and ", iOldAnimationChannels, " animation channels (", + ASSIMP_LOG_INFO("Removed ", oldNodes, " nodes and ", oldAnimationChannels, " animation channels (", CountNodes(pScene->mRootNode), " output nodes)"); ASSIMP_LOG_INFO("Kept ", pScene->mNumLights, " lights and ", pScene->mNumCameras, " cameras."); - ASSIMP_LOG_INFO("Moved ", iOldMeshes, " meshes to WCS (number of output meshes: ", pScene->mNumMeshes, ")"); + ASSIMP_LOG_INFO("Moved ", oldMeshes, " meshes to WCS (number of output meshes: ", pScene->mNumMeshes, ")"); } } diff --git a/code/PostProcessing/PretransformVertices.h b/code/PostProcessing/PretransformVertices.h index 7c2b5e99e..69d3d8400 100644 --- a/code/PostProcessing/PretransformVertices.h +++ b/code/PostProcessing/PretransformVertices.h @@ -90,7 +90,7 @@ public: * @param keep true for keep configuration. */ void KeepHierarchy(bool keep) { - configKeepHierarchy = keep; + mConfigKeepHierarchy = keep; } // ------------------------------------------------------------------- @@ -98,7 +98,7 @@ public: * @return ... */ bool IsHierarchyKept() const { - return configKeepHierarchy; + return mConfigKeepHierarchy; } private: @@ -108,7 +108,7 @@ private: // ------------------------------------------------------------------- // Get a bitwise combination identifying the vertex format of a mesh - unsigned int GetMeshVFormat(aiMesh *pcMesh) const; + //unsigned int GetMeshVFormat(aiMesh *pcMesh) const; // ------------------------------------------------------------------- // Count the number of vertices in the whole scene and a given @@ -131,8 +131,8 @@ private: // ------------------------------------------------------------------- // Get a list of all vertex formats that occur for a given material // The output list contains duplicate elements - void GetVFormatList(const aiScene *pcScene, unsigned int iMat, - std::list &aiOut) const; + /*void GetVFormatList(const aiScene *pcScene, unsigned int iMat, + std::list &aiOut) const;*/ // ------------------------------------------------------------------- // Compute the absolute transformation matrices of each node @@ -156,10 +156,10 @@ private: void BuildMeshRefCountArray(const aiNode *nd, unsigned int *refs) const; //! Configuration option: keep scene hierarchy as long as possible - bool configKeepHierarchy; - bool configNormalize; - bool configTransform; - aiMatrix4x4 configTransformation; + bool mConfigKeepHierarchy; + bool mConfigNormalize; + bool mConfigTransform; + aiMatrix4x4 mConfigTransformation; bool mConfigPointCloud; }; diff --git a/code/PostProcessing/ProcessHelper.cpp b/code/PostProcessing/ProcessHelper.cpp index 15f01676c..e55c17648 100644 --- a/code/PostProcessing/ProcessHelper.cpp +++ b/code/PostProcessing/ProcessHelper.cpp @@ -175,10 +175,9 @@ unsigned int GetMeshVFormatUnique(const aiMesh *pcMesh) { // tangents and bitangents if (pcMesh->HasTangentsAndBitangents()) iRet |= 0x4; -#ifdef BOOST_STATIC_ASSERT - BOOST_STATIC_ASSERT(8 >= AI_MAX_NUMBER_OF_COLOR_SETS); - BOOST_STATIC_ASSERT(8 >= AI_MAX_NUMBER_OF_TEXTURECOORDS); -#endif + + static_assert(8 >= AI_MAX_NUMBER_OF_COLOR_SETS); + static_assert(8 >= AI_MAX_NUMBER_OF_TEXTURECOORDS); // texture coordinates unsigned int p = 0; diff --git a/code/PostProcessing/RemoveRedundantMaterials.cpp b/code/PostProcessing/RemoveRedundantMaterials.cpp index dbc3c8822..ea8d154dc 100644 --- a/code/PostProcessing/RemoveRedundantMaterials.cpp +++ b/code/PostProcessing/RemoveRedundantMaterials.cpp @@ -5,8 +5,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2022, assimp team - - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -45,7 +43,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ // internal headers - #include "RemoveRedundantMaterials.h" #include #include "ProcessHelper.h" @@ -57,35 +54,28 @@ using namespace Assimp; // ------------------------------------------------------------------------------------------------ // Constructor to be privately used by Importer -RemoveRedundantMatsProcess::RemoveRedundantMatsProcess() -: mConfigFixedMaterials() { - // nothing to do here -} +RemoveRedundantMatsProcess::RemoveRedundantMatsProcess() : mConfigFixedMaterials() {} // ------------------------------------------------------------------------------------------------ // Returns whether the processing step is present in the given flag field. -bool RemoveRedundantMatsProcess::IsActive( unsigned int pFlags) const -{ +bool RemoveRedundantMatsProcess::IsActive( unsigned int pFlags) const { return (pFlags & aiProcess_RemoveRedundantMaterials) != 0; } // ------------------------------------------------------------------------------------------------ // Setup import properties -void RemoveRedundantMatsProcess::SetupProperties(const Importer* pImp) -{ +void RemoveRedundantMatsProcess::SetupProperties(const Importer* pImp) { // Get value of AI_CONFIG_PP_RRM_EXCLUDE_LIST mConfigFixedMaterials = pImp->GetPropertyString(AI_CONFIG_PP_RRM_EXCLUDE_LIST,""); } // ------------------------------------------------------------------------------------------------ // Executes the post processing step on the given imported data. -void RemoveRedundantMatsProcess::Execute( aiScene* pScene) -{ +void RemoveRedundantMatsProcess::Execute( aiScene* pScene) { ASSIMP_LOG_DEBUG("RemoveRedundantMatsProcess begin"); unsigned int redundantRemoved = 0, unreferencedRemoved = 0; - if (pScene->mNumMaterials) - { + if (pScene->mNumMaterials) { // Find out which materials are referenced by meshes std::vector abReferenced(pScene->mNumMaterials,false); for (unsigned int i = 0;i < pScene->mNumMeshes;++i) @@ -134,8 +124,7 @@ void RemoveRedundantMatsProcess::Execute( aiScene* pScene) // we do already have a specific hash. This allows us to // determine which materials are identical. uint32_t *aiHashes = new uint32_t[ pScene->mNumMaterials ];; - for (unsigned int i = 0; i < pScene->mNumMaterials;++i) - { + for (unsigned int i = 0; i < pScene->mNumMaterials;++i) { // No mesh is referencing this material, remove it. if (!abReferenced[i]) { ++unreferencedRemoved; @@ -147,8 +136,7 @@ void RemoveRedundantMatsProcess::Execute( aiScene* pScene) // Check all previously mapped materials for a matching hash. // On a match we can delete this material and just make it ref to the same index. uint32_t me = aiHashes[i] = ComputeMaterialHash(pScene->mMaterials[i]); - for (unsigned int a = 0; a < i;++a) - { + for (unsigned int a = 0; a < i;++a) { if (abReferenced[a] && me == aiHashes[a]) { ++redundantRemoved; me = 0; @@ -205,12 +193,9 @@ void RemoveRedundantMatsProcess::Execute( aiScene* pScene) delete[] aiHashes; delete[] aiMappingTable; } - if (redundantRemoved == 0 && unreferencedRemoved == 0) - { + if (redundantRemoved == 0 && unreferencedRemoved == 0) { ASSIMP_LOG_DEBUG("RemoveRedundantMatsProcess finished "); - } - else - { + } else { ASSIMP_LOG_INFO("RemoveRedundantMatsProcess finished. Removed ", redundantRemoved, " redundant and ", unreferencedRemoved, " unused materials."); } diff --git a/code/PostProcessing/ScaleProcess.cpp b/code/PostProcessing/ScaleProcess.cpp index 00df07090..1bb9196f1 100644 --- a/code/PostProcessing/ScaleProcess.cpp +++ b/code/PostProcessing/ScaleProcess.cpp @@ -4,7 +4,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2022, assimp team - All rights reserved. Redistribution and use of this software in source and binary forms, diff --git a/code/PostProcessing/SortByPTypeProcess.cpp b/code/PostProcessing/SortByPTypeProcess.cpp index 394ef15c8..47633dce5 100644 --- a/code/PostProcessing/SortByPTypeProcess.cpp +++ b/code/PostProcessing/SortByPTypeProcess.cpp @@ -99,8 +99,9 @@ void UpdateNodes(const std::vector &replaceMeshIndex, aiNode *node } // call all subnodes recursively - for (unsigned int m = 0; m < node->mNumChildren; ++m) + for (unsigned int m = 0; m < node->mNumChildren; ++m) { UpdateNodes(replaceMeshIndex, node->mChildren[m]); + } } // ------------------------------------------------------------------------------------------------ diff --git a/code/PostProcessing/SplitByBoneCountProcess.cpp b/code/PostProcessing/SplitByBoneCountProcess.cpp index e44a55979..969146fee 100644 --- a/code/PostProcessing/SplitByBoneCountProcess.cpp +++ b/code/PostProcessing/SplitByBoneCountProcess.cpp @@ -57,9 +57,7 @@ using namespace Assimp::Formatter; // ------------------------------------------------------------------------------------------------ // Constructor -SplitByBoneCountProcess::SplitByBoneCountProcess() : mMaxBoneCount(AI_SBBC_DEFAULT_MAX_BONES) { - // empty -} +SplitByBoneCountProcess::SplitByBoneCountProcess() : mMaxBoneCount(AI_SBBC_DEFAULT_MAX_BONES) {} // ------------------------------------------------------------------------------------------------ // Returns whether the processing step is present in the given flag. diff --git a/code/PostProcessing/SplitLargeMeshes.cpp b/code/PostProcessing/SplitLargeMeshes.cpp index 73e0cc5d8..b6e5b772a 100644 --- a/code/PostProcessing/SplitLargeMeshes.cpp +++ b/code/PostProcessing/SplitLargeMeshes.cpp @@ -4,7 +4,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2022, assimp team - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -40,9 +39,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ---------------------------------------------------------------------- */ -/** - * @file Implementation of the SplitLargeMeshes postprocessing step - */ + /// @file Implementation of the SplitLargeMeshes postprocessing step // internal headers of the post-processing framework #include "SplitLargeMeshes.h" @@ -75,22 +72,22 @@ void SplitLargeMeshesProcess_Triangle::Execute( aiScene* pScene) { this->SplitMesh(a, pScene->mMeshes[a],avList); } - if (avList.size() != pScene->mNumMeshes) { - // it seems something has been split. rebuild the mesh list - delete[] pScene->mMeshes; - pScene->mNumMeshes = (unsigned int)avList.size(); - pScene->mMeshes = new aiMesh*[avList.size()]; - - for (unsigned int i = 0; i < avList.size();++i) { - pScene->mMeshes[i] = avList[i].first; - } - - // now we need to update all nodes - this->UpdateNode(pScene->mRootNode,avList); - ASSIMP_LOG_INFO("SplitLargeMeshesProcess_Triangle finished. Meshes have been split"); - } else { + if (avList.size() == pScene->mNumMeshes) { ASSIMP_LOG_DEBUG("SplitLargeMeshesProcess_Triangle finished. There was nothing to do"); } + + // it seems something has been split. rebuild the mesh list + delete[] pScene->mMeshes; + pScene->mNumMeshes = (unsigned int)avList.size(); + pScene->mMeshes = new aiMesh*[avList.size()]; + + for (unsigned int i = 0; i < avList.size();++i) { + pScene->mMeshes[i] = avList[i].first; + } + + // now we need to update all nodes + this->UpdateNode(pScene->mRootNode,avList); + ASSIMP_LOG_INFO("SplitLargeMeshesProcess_Triangle finished. Meshes have been split"); } // ------------------------------------------------------------------------------------------------ @@ -102,8 +99,7 @@ void SplitLargeMeshesProcess_Triangle::SetupProperties( const Importer* pImp) { // ------------------------------------------------------------------------------------------------ // Update a node after some meshes have been split -void SplitLargeMeshesProcess_Triangle::UpdateNode(aiNode* pcNode, - const std::vector >& avList) { +void SplitLargeMeshesProcess_Triangle::UpdateNode(aiNode* pcNode, const std::vector >& avList) { // for every index in out list build a new entry std::vector aiEntries; aiEntries.reserve(pcNode->mNumMeshes + 1); diff --git a/code/PostProcessing/TextureTransform.cpp b/code/PostProcessing/TextureTransform.cpp index 2ed17f390..3de357c17 100644 --- a/code/PostProcessing/TextureTransform.cpp +++ b/code/PostProcessing/TextureTransform.cpp @@ -4,7 +4,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2022, assimp team - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -42,8 +41,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /** @file A helper class that processes texture transformations */ - - #include #include #include @@ -494,8 +491,9 @@ void TextureTransformStep::Execute( aiScene* pScene) { ai_assert(nullptr != src); // Copy the data to the destination array - if (dest != src) + if (dest != src) { ::memcpy(dest,src,sizeof(aiVector3D)*mesh->mNumVertices); + } end = dest + mesh->mNumVertices; diff --git a/code/PostProcessing/TriangulateProcess.cpp b/code/PostProcessing/TriangulateProcess.cpp index 52cfa66bf..b4c66b41e 100644 --- a/code/PostProcessing/TriangulateProcess.cpp +++ b/code/PostProcessing/TriangulateProcess.cpp @@ -158,15 +158,13 @@ namespace { // ------------------------------------------------------------------------------------------------ // Returns whether the processing step is present in the given flag field. -bool TriangulateProcess::IsActive( unsigned int pFlags) const -{ +bool TriangulateProcess::IsActive( unsigned int pFlags) const { return (pFlags & aiProcess_Triangulate) != 0; } // ------------------------------------------------------------------------------------------------ // Executes the post processing step on the given imported data. -void TriangulateProcess::Execute( aiScene* pScene) -{ +void TriangulateProcess::Execute( aiScene* pScene) { ASSIMP_LOG_DEBUG("TriangulateProcess begin"); bool bHas = false; @@ -187,8 +185,7 @@ void TriangulateProcess::Execute( aiScene* pScene) // ------------------------------------------------------------------------------------------------ // Triangulates the given mesh. -bool TriangulateProcess::TriangulateMesh( aiMesh* pMesh) -{ +bool TriangulateProcess::TriangulateMesh( aiMesh* pMesh) { // Now we have aiMesh::mPrimitiveTypes, so this is only here for test cases if (!pMesh->mPrimitiveTypes) { bool bNeed = false; @@ -218,8 +215,7 @@ bool TriangulateProcess::TriangulateMesh( aiMesh* pMesh) if( face.mNumIndices <= 3) { numOut++; - } - else { + } else { numOut += face.mNumIndices-2; max_out = std::max(max_out,face.mNumIndices); } @@ -511,22 +507,6 @@ bool TriangulateProcess::TriangulateMesh( aiMesh* pMesh) #endif num = 0; break; - - /*curOut -= (max-num); // undo all previous work - for (tmp = 0; tmp < max-2; ++tmp) { - aiFace& nface = *curOut++; - - nface.mNumIndices = 3; - if (!nface.mIndices) - nface.mIndices = new unsigned int[3]; - - nface.mIndices[0] = 0; - nface.mIndices[1] = tmp+1; - nface.mIndices[2] = tmp+2; - - } - num = 0; - break;*/ } aiFace& nface = *curOut++; @@ -580,23 +560,6 @@ bool TriangulateProcess::TriangulateMesh( aiMesh* pMesh) for(aiFace* f = last_face; f != curOut; ) { unsigned int* i = f->mIndices; - // drop dumb 0-area triangles - deactivated for now: - //FindDegenerates post processing step can do the same thing - //if (std::fabs(GetArea2D(temp_verts[i[0]],temp_verts[i[1]],temp_verts[i[2]])) < 1e-5f) { - // ASSIMP_LOG_VERBOSE_DEBUG("Dropping triangle with area 0"); - // --curOut; - - // delete[] f->mIndices; - // f->mIndices = nullptr; - - // for(aiFace* ff = f; ff != curOut; ++ff) { - // ff->mNumIndices = (ff+1)->mNumIndices; - // ff->mIndices = (ff+1)->mIndices; - // (ff+1)->mIndices = nullptr; - // } - // continue; - //} - i[0] = idx[i[0]]; i[1] = idx[i[1]]; i[2] = idx[i[2]]; diff --git a/code/PostProcessing/ValidateDataStructure.cpp b/code/PostProcessing/ValidateDataStructure.cpp index cae35b895..af4ff788e 100644 --- a/code/PostProcessing/ValidateDataStructure.cpp +++ b/code/PostProcessing/ValidateDataStructure.cpp @@ -5,8 +5,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2022, assimp team - - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -110,18 +108,21 @@ inline int HasNameMatch(const aiString &in, aiNode *node) { template inline void ValidateDSProcess::DoValidation(T **parray, unsigned int size, const char *firstName, const char *secondName) { // validate all entries - if (size) { - if (!parray) { - ReportError("aiScene::%s is nullptr (aiScene::%s is %i)", - firstName, secondName, size); - } - for (unsigned int i = 0; i < size; ++i) { - if (!parray[i]) { - ReportError("aiScene::%s[%i] is nullptr (aiScene::%s is %i)", - firstName, i, secondName, size); - } - Validate(parray[i]); + if (size == 0) { + return; + } + + if (!parray) { + ReportError("aiScene::%s is nullptr (aiScene::%s is %i)", + firstName, secondName, size); + } + + for (unsigned int i = 0; i < size; ++i) { + if (!parray[i]) { + ReportError("aiScene::%s[%i] is nullptr (aiScene::%s is %i)", + firstName, i, secondName, size); } + Validate(parray[i]); } } @@ -130,25 +131,27 @@ template inline void ValidateDSProcess::DoValidationEx(T **parray, unsigned int size, const char *firstName, const char *secondName) { // validate all entries - if (size) { - if (!parray) { - ReportError("aiScene::%s is nullptr (aiScene::%s is %i)", - firstName, secondName, size); + if (size == 0) { + return; + } + + if (!parray) { + ReportError("aiScene::%s is nullptr (aiScene::%s is %i)", + firstName, secondName, size); + } + for (unsigned int i = 0; i < size; ++i) { + if (!parray[i]) { + ReportError("aiScene::%s[%u] is nullptr (aiScene::%s is %u)", + firstName, i, secondName, size); } - for (unsigned int i = 0; i < size; ++i) { - if (!parray[i]) { - ReportError("aiScene::%s[%u] is nullptr (aiScene::%s is %u)", - firstName, i, secondName, size); - } - Validate(parray[i]); + Validate(parray[i]); - // check whether there are duplicate names - for (unsigned int a = i + 1; a < size; ++a) { - if (parray[i]->mName == parray[a]->mName) { - ReportError("aiScene::%s[%u] has the same name as " - "aiScene::%s[%u]", - firstName, i, secondName, a); - } + // check whether there are duplicate names + for (unsigned int a = i + 1; a < size; ++a) { + if (parray[i]->mName == parray[a]->mName) { + ReportError("aiScene::%s[%u] has the same name as " + "aiScene::%s[%u]", + firstName, i, secondName, a); } } } @@ -229,12 +232,6 @@ void ValidateDSProcess::Execute(aiScene *pScene) { if (pScene->mNumMaterials) { DoValidation(pScene->mMaterials, pScene->mNumMaterials, "mMaterials", "mNumMaterials"); } -#if 0 - // NOTE: ScenePreprocessor generates a default material if none is there - else if (!(mScene->mFlags & AI_SCENE_FLAGS_INCOMPLETE)) { - ReportError("aiScene::mNumMaterials is 0. At least one material must be there"); - } -#endif else if (pScene->mMaterials) { ReportError("aiScene::mMaterials is non-null although there are no materials"); } @@ -267,8 +264,7 @@ void ValidateDSProcess::Validate(const aiCamera *pCamera) { if (pCamera->mClipPlaneFar <= pCamera->mClipPlaneNear) ReportError("aiCamera::mClipPlaneFar must be >= aiCamera::mClipPlaneNear"); - // FIX: there are many 3ds files with invalid FOVs. No reason to - // reject them at all ... a warning is appropriate. + // There are many 3ds files with invalid FOVs. No reason to reject them at all ... a warning is appropriate. if (!pCamera->mHorizontalFOV || pCamera->mHorizontalFOV >= (float)AI_MATH_PI) ReportWarning("%f is not a valid value for aiCamera::mHorizontalFOV", pCamera->mHorizontalFOV); } @@ -362,15 +358,6 @@ void ValidateDSProcess::Validate(const aiMesh *pMesh) { if (face.mIndices[a] >= pMesh->mNumVertices) { ReportError("aiMesh::mFaces[%i]::mIndices[%i] is out of range", i, a); } - // the MSB flag is temporarily used by the extra verbose - // mode to tell us that the JoinVerticesProcess might have - // been executed already. - /*if ( !(this->mScene->mFlags & AI_SCENE_FLAGS_NON_VERBOSE_FORMAT ) && !(this->mScene->mFlags & AI_SCENE_FLAGS_ALLOW_SHARED) && - abRefList[face.mIndices[a]]) - { - ReportError("aiMesh::mVertices[%i] is referenced twice - second " - "time by aiMesh::mFaces[%i]::mIndices[%i]",face.mIndices[a],i,a); - }*/ abRefList[face.mIndices[a]] = true; } } @@ -466,7 +453,7 @@ void ValidateDSProcess::Validate(const aiMesh *pMesh, const aiBone *pBone, float this->Validate(&pBone->mName); if (!pBone->mNumWeights) { - //ReportError("aiBone::mNumWeights is zero"); + ReportWarning("aiBone::mNumWeights is zero"); } // check whether all vertices affected by this bone are valid diff --git a/include/assimp/StreamWriter.h b/include/assimp/StreamWriter.h index 1bdfcc650..50e28447c 100644 --- a/include/assimp/StreamWriter.h +++ b/include/assimp/StreamWriter.h @@ -5,8 +5,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2022, assimp team - - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -68,8 +66,7 @@ namespace Assimp { */ // -------------------------------------------------------------------------------------------- template -class StreamWriter -{ +class StreamWriter { enum { INITIAL_CAPACITY = 1024 }; diff --git a/include/assimp/Vertex.h b/include/assimp/Vertex.h index b4aa1dd2d..3fc974504 100644 --- a/include/assimp/Vertex.h +++ b/include/assimp/Vertex.h @@ -97,14 +97,20 @@ namespace Assimp { * 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 * (ai_real, const Vertex&); -public: + aiVector3D position; + aiVector3D normal; + aiVector3D tangent, bitangent; + + aiVector3D texcoords[AI_MAX_NUMBER_OF_TEXTURECOORDS]; + aiColor4D colors[AI_MAX_NUMBER_OF_COLOR_SETS]; + Vertex() = default; // ---------------------------------------------------------------------------- @@ -178,7 +184,7 @@ 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; @@ -204,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