From fe6b3166953fd2fe8611fbfd8d4122297ed78cb9 Mon Sep 17 00:00:00 2001 From: Richard Date: Thu, 10 Jan 2019 17:27:54 +0000 Subject: [PATCH 01/46] Set MSVC projects to default to Unicode MBCS is deprecated and shouldn't be used in new projects --- CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index a97174de4..9f9327a93 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -133,6 +133,8 @@ IF(MSVC) "Install MSVC debug files." ON ) + # Multibyte character set is deprecated, but default + ADD_DEFINITIONS( -DUNICODE -D_UNICODE ) ENDIF(MSVC) IF (BUILD_FRAMEWORK) From 3c651be6404c024fb70ed9b22243dea3fd3022de Mon Sep 17 00:00:00 2001 From: Richard Date: Thu, 17 Jan 2019 13:55:05 +0000 Subject: [PATCH 02/46] Exporter::ExportToBlob() Pass on preprocessing and properties. Issue #2302 --- code/Exporter.cpp | 4 ++-- include/assimp/Exporter.hpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/Exporter.cpp b/code/Exporter.cpp index 0acde75bf..0414f661c 100644 --- a/code/Exporter.cpp +++ b/code/Exporter.cpp @@ -288,7 +288,7 @@ void Exporter::SetProgressHandler(ProgressHandler* pHandler) { // ------------------------------------------------------------------------------------------------ const aiExportDataBlob* Exporter::ExportToBlob( const aiScene* pScene, const char* pFormatId, - unsigned int, const ExportProperties* /*pProperties*/ ) { + unsigned int pPreprocessing, const ExportProperties* pProperties) { if (pimpl->blob) { delete pimpl->blob; pimpl->blob = nullptr; @@ -298,7 +298,7 @@ const aiExportDataBlob* Exporter::ExportToBlob( const aiScene* pScene, const cha BlobIOSystem* blobio = new BlobIOSystem(); pimpl->mIOSystem = std::shared_ptr( blobio ); - if (AI_SUCCESS != Export(pScene,pFormatId,blobio->GetMagicFileName())) { + if (AI_SUCCESS != Export(pScene,pFormatId,blobio->GetMagicFileName(), pPreprocessing, pProperties)) { pimpl->mIOSystem = old; return nullptr; } diff --git a/include/assimp/Exporter.hpp b/include/assimp/Exporter.hpp index 4e0843b60..d254aae66 100644 --- a/include/assimp/Exporter.hpp +++ b/include/assimp/Exporter.hpp @@ -190,7 +190,7 @@ public: * @note Use aiCopyScene() to get a modifiable copy of a previously * imported scene. */ const aiExportDataBlob* ExportToBlob(const aiScene* pScene, const char* pFormatId, - unsigned int pPreprocessing = 0u, const ExportProperties* = nullptr); + unsigned int pPreprocessing = 0u, const ExportProperties* pProperties = nullptr); const aiExportDataBlob* ExportToBlob( const aiScene* pScene, const std::string& pFormatId, unsigned int pPreprocessing = 0u, const ExportProperties* pProperties = nullptr); From 3a610d3d66511c3ed35977f85625d5e8316c37df Mon Sep 17 00:00:00 2001 From: Rich ard Date: Fri, 8 Mar 2019 15:49:18 +0000 Subject: [PATCH 03/46] Embed version information under Windows --- .gitignore | 1 + code/CMakeLists.txt | 4 ++++ code/res/assimp.rc | 8 ++++---- revision.h.in | 11 +++++++++++ 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index d383f3ec8..49cd60ca8 100644 --- a/.gitignore +++ b/.gitignore @@ -17,6 +17,7 @@ CMakeLists.txt.user # Generated assimp.pc +assimp.aps revision.h contrib/zlib/zconf.h contrib/zlib/zlib.pc diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index 37ad34b85..ee2602b54 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -145,6 +145,10 @@ SET( Core_SRCS Assimp.cpp ) +IF(MSVC) + list(APPEND Core_SRCS "res/assimp.rc") +ENDIF(MSVC) + SET( Logging_SRCS ${HEADER_PATH}/DefaultLogger.hpp ${HEADER_PATH}/LogStream.hpp diff --git a/code/res/assimp.rc b/code/res/assimp.rc index 0fe98c05d..ae0c87b8a 100644 --- a/code/res/assimp.rc +++ b/code/res/assimp.rc @@ -31,8 +31,8 @@ LANGUAGE LANG_GERMAN, SUBLANG_GERMAN // VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,1,SVNRevision, 0 - PRODUCTVERSION 1,1,SVNRevision,0 + FILEVERSION VER_FILEVERSION + PRODUCTVERSION VER_FILEVERSION FILEFLAGSMASK 0x17L #ifdef _DEBUG FILEFLAGS 0x1L @@ -50,12 +50,12 @@ BEGIN VALUE "Comments", "Licensed under a 3-clause BSD license" VALUE "CompanyName", "assimp team" VALUE "FileDescription", "Open Asset Import Library" - VALUE "FileVersion", 1,1,SVNRevision,0 + VALUE "FileVersion", VER_FILEVERSION VALUE "InternalName", "assimp " VALUE "LegalCopyright", "Copyright (C) 2006-2010" VALUE "OriginalFilename", "assimpNN.dll" VALUE "ProductName", "Open Asset Import Library" - VALUE "ProductVersion", 1,1,SVNRevision,0 + VALUE "ProductVersion", VER_FILEVERSION_STR ,0 END END diff --git a/revision.h.in b/revision.h.in index 87c41fa89..0ad58feb7 100644 --- a/revision.h.in +++ b/revision.h.in @@ -4,4 +4,15 @@ #define GitVersion 0x@GIT_COMMIT_HASH@ #define GitBranch "@GIT_BRANCH@" +#define VER_MAJOR @ASSIMP_VERSION_MAJOR@ +#define VER_MINOR @ASSIMP_VERSION_MINOR@ +#define VER_PATCH @ASSIMP_VERSION_PATCH@ +#define VER_BUILD @ASSIMP_PACKAGE_VERSION@ + +#define STR_HELP(x) #x +#define STR(x) STR_HELP(x) + +#define VER_FILEVERSION VER_MAJOR,VER_MINOR,VER_PATCH,VER_BUILD +#define VER_FILEVERSION_STR STR(VER_MAJOR) "." STR(VER_MINOR) "." STR(VER_PATCH) "." STR(VER_BUILD) + #endif // ASSIMP_REVISION_H_INC From 07bbb2c000587f9ebba78ddb1da2cf141134de2b Mon Sep 17 00:00:00 2001 From: Rich ard Date: Fri, 15 Mar 2019 10:18:43 +0000 Subject: [PATCH 04/46] Nicer name for Assimp Binary importer .assbin is not a nice name to show a user --- code/AssbinLoader.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/AssbinLoader.cpp b/code/AssbinLoader.cpp index 7adb8db6f..c68daf101 100644 --- a/code/AssbinLoader.cpp +++ b/code/AssbinLoader.cpp @@ -68,7 +68,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. using namespace Assimp; static const aiImporterDesc desc = { - ".assbin Importer", + "Assimp Binary Importer", "Gargaj / Conspiracy", "", "", From d66166675a5845d8be78f7b8c42c00bb519df9d5 Mon Sep 17 00:00:00 2001 From: RichardTea <31507749+RichardTea@users.noreply.github.com> Date: Mon, 8 Apr 2019 17:11:50 +0100 Subject: [PATCH 05/46] first pass at collada metadata --- code/ColladaLoader.cpp | 6 ++++++ code/ColladaParser.cpp | 17 +++++++++++++++-- code/ColladaParser.h | 3 +++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/code/ColladaLoader.cpp b/code/ColladaLoader.cpp index 6837dca4a..47a40f5d9 100644 --- a/code/ColladaLoader.cpp +++ b/code/ColladaLoader.cpp @@ -207,6 +207,12 @@ void ColladaLoader::InternReadFile( const std::string& pFile, aiScene* pScene, I 0, 0, 0, 1); } + // Store scene metadata + for (auto it = parser.mAssetMetaData.cbegin(); it != parser.mAssetMetaData.cend(); ++it) + { + pScene->mMetaData->Add((*it).first, (*it).second); + } + // store all meshes StoreSceneMeshes( pScene); diff --git a/code/ColladaParser.cpp b/code/ColladaParser.cpp index 0fa59362b..c38d18283 100644 --- a/code/ColladaParser.cpp +++ b/code/ColladaParser.cpp @@ -264,9 +264,22 @@ void ColladaParser::ReadAssetInfo() // check element end TestClosing( "up_axis"); - } else + } + else if(IsElement("contributor")) { - SkipElement(); + // This has no data of its own, will get children next time through + } + else + { + const char* metadata_key = mReader->getNodeName(); + const char* metadata_value = TestTextContent(); + if (metadata_key != nullptr && metadata_value != nullptr) + { + aiString aistr; + aistr.Set(metadata_value); + mAssetMetaData.emplace(metadata_key, aistr); + } + //SkipElement(); } } else if( mReader->getNodeType() == irr::io::EXN_ELEMENT_END) diff --git a/code/ColladaParser.h b/code/ColladaParser.h index 232d85654..9fdca86c8 100644 --- a/code/ColladaParser.h +++ b/code/ColladaParser.h @@ -343,6 +343,9 @@ namespace Assimp /** Which is the up vector */ enum { UP_X, UP_Y, UP_Z } mUpDirection; + typedef std::map AssetMetaData; + AssetMetaData mAssetMetaData; + /** Collada file format version */ Collada::FormatVersion mFormat; }; From 1f55bdd9a7ac5e512599bc775793dc4e41adfaa9 Mon Sep 17 00:00:00 2001 From: RichardTea <31507749+RichardTea@users.noreply.github.com> Date: Tue, 9 Apr 2019 16:28:15 +0100 Subject: [PATCH 06/46] Save/Load Collada 1.4 Root Asset Metadata Add Collada 1.4 metadata to export and import. Can store in the Scene or the Root Node for export, will be loaded into the Scene during Import --- code/ColladaExporter.cpp | 38 ++++++++++++++++-- code/ColladaLoader.cpp | 11 ++++-- code/ColladaParser.cpp | 83 ++++++++++++++++++++++++++++++++++------ code/ColladaParser.h | 16 +++++++- 4 files changed, 128 insertions(+), 20 deletions(-) diff --git a/code/ColladaExporter.cpp b/code/ColladaExporter.cpp index 37a6ba4e0..e7cc6907d 100644 --- a/code/ColladaExporter.cpp +++ b/code/ColladaExporter.cpp @@ -238,7 +238,11 @@ void ColladaExporter::WriteHeader() mOutput << startstr << "" << endstr; PushTag(); - aiMetadata* meta = mScene->mRootNode->mMetaData; + // If no Scene metadata, use root node metadata + aiMetadata* meta = mScene->mMetaData; + if (!meta) + meta = mScene->mRootNode->mMetaData; + aiString value; if (!meta || !meta->Get("Author", value)) mOutput << startstr << "" << "Assimp" << "" << endstr; @@ -250,13 +254,39 @@ void ColladaExporter::WriteHeader() else mOutput << startstr << "" << XMLEscape(value.C_Str()) << "" << endstr; - //mOutput << startstr << "" << mScene->author.C_Str() << "" << endstr; - //mOutput << startstr << "" << mScene->authoringTool.C_Str() << "" << endstr; + if (meta) + { + if (meta->Get("Comments", value)) + mOutput << startstr << "" << XMLEscape(value.C_Str()) << "" << endstr; + if (meta->Get("Copyright", value)) + mOutput << startstr << "" << XMLEscape(value.C_Str()) << "" << endstr; + if (meta->Get("SourceData", value)) + mOutput << startstr << "" << XMLEscape(value.C_Str()) << "" << endstr; + } PopTag(); mOutput << startstr << "" << endstr; - mOutput << startstr << "" << date_str << "" << endstr; + + if (!meta || !meta->Get("Created", value)) + mOutput << startstr << "" << date_str << "" << endstr; + else + mOutput << startstr << "" << XMLEscape(value.C_Str()) << "" << endstr; + + // Modified date is always the date saved mOutput << startstr << "" << date_str << "" << endstr; + + if (meta) + { + if (meta->Get("Keywords", value)) + mOutput << startstr << "" << XMLEscape(value.C_Str()) << "" << endstr; + if (meta->Get("Revision", value)) + mOutput << startstr << "" << XMLEscape(value.C_Str()) << "" << endstr; + if (meta->Get("Subject", value)) + mOutput << startstr << "" << XMLEscape(value.C_Str()) << "" << endstr; + if (meta->Get("Title", value)) + mOutput << startstr << "" << XMLEscape(value.C_Str()) << "" << endstr; + } + mOutput << startstr << "" << endstr; mOutput << startstr << "" << up_axis << "" << endstr; PopTag(); diff --git a/code/ColladaLoader.cpp b/code/ColladaLoader.cpp index 47a40f5d9..cf548e890 100644 --- a/code/ColladaLoader.cpp +++ b/code/ColladaLoader.cpp @@ -208,9 +208,14 @@ void ColladaLoader::InternReadFile( const std::string& pFile, aiScene* pScene, I } // Store scene metadata - for (auto it = parser.mAssetMetaData.cbegin(); it != parser.mAssetMetaData.cend(); ++it) - { - pScene->mMetaData->Add((*it).first, (*it).second); + if (!parser.mAssetMetaData.empty()) { + const size_t numMeta(parser.mAssetMetaData.size()); + pScene->mMetaData = aiMetadata::Alloc(static_cast(numMeta)); + size_t i = 0; + for (auto it = parser.mAssetMetaData.cbegin(); it != parser.mAssetMetaData.cend(); ++it, ++i) + { + pScene->mMetaData->Set(static_cast(i), (*it).first, (*it).second); + } } // store all meshes diff --git a/code/ColladaParser.cpp b/code/ColladaParser.cpp index c38d18283..2106bf01c 100644 --- a/code/ColladaParser.cpp +++ b/code/ColladaParser.cpp @@ -267,24 +267,16 @@ void ColladaParser::ReadAssetInfo() } else if(IsElement("contributor")) { - // This has no data of its own, will get children next time through + ReadContributorInfo(); } else { - const char* metadata_key = mReader->getNodeName(); - const char* metadata_value = TestTextContent(); - if (metadata_key != nullptr && metadata_value != nullptr) - { - aiString aistr; - aistr.Set(metadata_value); - mAssetMetaData.emplace(metadata_key, aistr); - } - //SkipElement(); + ReadMetaDataItem(mAssetMetaData); } } else if( mReader->getNodeType() == irr::io::EXN_ELEMENT_END) { - if( strcmp( mReader->getNodeName(), "asset") != 0) + if (strcmp( mReader->getNodeName(), "asset") != 0) ThrowException( "Expected end of element."); break; @@ -292,6 +284,75 @@ void ColladaParser::ReadAssetInfo() } } +// ------------------------------------------------------------------------------------------------ +// Reads the contributor info +void ColladaParser::ReadContributorInfo() +{ + if (mReader->isEmptyElement()) + return; + + while (mReader->read()) + { + if (mReader->getNodeType() == irr::io::EXN_ELEMENT) + { + ReadMetaDataItem(mAssetMetaData); + } + else if (mReader->getNodeType() == irr::io::EXN_ELEMENT_END) + { + if (strcmp(mReader->getNodeName(), "contributor") != 0) + ThrowException("Expected end of element."); + break; + } + } +} + +// ------------------------------------------------------------------------------------------------ +// Reads a single string metadata item +void ColladaParser::ReadMetaDataItem(StringMetaData &metadata) +{ + // Metadata such as created, keywords, subject etc + const char* key_char = mReader->getNodeName(); + if (key_char != nullptr) + { + const std::string key_str(key_char); + const char* value_char = TestTextContent(); + if (value_char != nullptr) + { + std::string camel_key_str = key_str; + ToCamelCase(camel_key_str); + aiString aistr; + aistr.Set(value_char); + metadata.emplace(camel_key_str, aistr); + TestClosing(key_str.c_str()); + } + else + SkipElement(); + } + else + SkipElement(); +} + +// ------------------------------------------------------------------------------------------------ +// Convert underscore_seperated to CamelCase: "authoring_tool" becomes "AuthoringTool" +void ColladaParser::ToCamelCase(std::string &text) +{ + if (text.empty()) + return; + // Capitalise first character + text[0] = ToUpper(text[0]); + for (auto it = text.begin(); it != text.end(); /*iterated below*/) + { + if ((*it) == '_') + { + it = text.erase(it); + if (it != text.end()) + (*it) = ToUpper(*it); + } + else + ++it; + } +} + // ------------------------------------------------------------------------------------------------ // Reads the animation clips void ColladaParser::ReadAnimationClipLibrary() diff --git a/code/ColladaParser.h b/code/ColladaParser.h index 9fdca86c8..22b96c5e0 100644 --- a/code/ColladaParser.h +++ b/code/ColladaParser.h @@ -66,6 +66,9 @@ namespace Assimp friend class ColladaLoader; protected: + /** Map for generic metadata as aiString */ + typedef std::map StringMetaData; + /** Constructor from XML file */ ColladaParser( IOSystem* pIOHandler, const std::string& pFile); @@ -81,6 +84,15 @@ namespace Assimp /** Reads asset information such as coordinate system information and legal blah */ void ReadAssetInfo(); + /** Reads contributor information such as author and legal blah */ + void ReadContributorInfo(); + + /** Reads generic metadata into provided map */ + void ReadMetaDataItem(StringMetaData &metadata); + + /** Convert underscore_seperated to CamelCase "authoring_tool" becomes "AuthoringTool" */ + static void ToCamelCase(std::string &text); + /** Reads the animation library */ void ReadAnimationLibrary(); @@ -343,8 +355,8 @@ namespace Assimp /** Which is the up vector */ enum { UP_X, UP_Y, UP_Z } mUpDirection; - typedef std::map AssetMetaData; - AssetMetaData mAssetMetaData; + /** Asset metadata (global for scene) */ + StringMetaData mAssetMetaData; /** Collada file format version */ Collada::FormatVersion mFormat; From 9aae110161a0100e9a8a00a65bf681d7b2d1832c Mon Sep 17 00:00:00 2001 From: Charlie Gettys Date: Wed, 10 Apr 2019 09:29:21 -0400 Subject: [PATCH 07/46] * Remove old non-maintained mingw makefile to prevent confusion * Add notes on building with MinGW to Build.md --- Build.md | 13 +++++- code/makefile.mingw | 105 -------------------------------------------- 2 files changed, 12 insertions(+), 106 deletions(-) delete mode 100644 code/makefile.mingw diff --git a/Build.md b/Build.md index d5b443a79..04bec04f0 100644 --- a/Build.md +++ b/Build.md @@ -23,7 +23,7 @@ This will generate the project files for the visual studio. All dependencies use See https://stackoverflow.com/questions/40803170/cmake-uwp-using-cmake-to-build-universal-windows-app -# Build instrcutions for Linux / Unix +# Build instructions for Linux / Unix Open a terminal and got to your repository. You can generate the makefiles and build the library via: ``` @@ -34,6 +34,17 @@ The option -j descripes the number of parallel processes for the build. In this If you want to use a IDE for linux you can try QTCreator for instance. +# Build instructions for MinGW + +Please see [CMake Cross Compiling](https://cmake.org/cmake/help/latest/manual/cmake-toolchains.7.html#cross-compiling) for general information on CMake Toolchains. + +Some users have had success building assimp using MinGW on Linux using the following toolchain, which is not maintained by assimp. [linux-mingw-w64-gnuxx11.cmake](https://github.com/ruslo/polly/blob/master/linux-mingw-w64-gnuxx11.cmake) + +The following toolchain may or may not be helpful for building assimp using MinGW on Windows (untested): + [mingw-cxx17.cmake](https://github.com/ruslo/polly/blob/master/mingw-cxx17.cmake) + +Besides the toolchain, compilation should be the same as for Linux / Unix + # CMake build options The cmake-build-environment provides options to configure the build. The following options can be used: - **BUILD_SHARED_LIBS ( default ON )**: Generation of shared libs ( dll for windows, so for Linux ). Set this to OFF to get a static lib. diff --git a/code/makefile.mingw b/code/makefile.mingw deleted file mode 100644 index 711d57f57..000000000 --- a/code/makefile.mingw +++ /dev/null @@ -1,105 +0,0 @@ -### USE OF THIS MAKEFILE IS NOT RECOMMENDED. -### It is no longer maintained. Use CMAKE instead. - -# --------------------------------------------------------------------------- -# Makefile for Open Asset Import Library (MinGW32-make) -# aramis_acg@users.sourceforge.net -# - just a quick'n'dirty one, could be buggy ... -# -# Usage: mingw32-make -f makefile.mingw - -# TARGETS: -# all Build a shared so from the whole library -# clean Cleanup object files, prepare for rebuild -# static Build a static library (*.a) - -# MACROS: (make clean before you change one) -# NOBOOST=1 Build against boost workaround -# SINGLETHREADED=1 Build single-threaded library -# DEBUG=1 Build debug build of library -# -# --------------------------------------------------------------------------- - -# C++ object files -OBJECTS := $(patsubst %.cpp,%.o, $(wildcard *.cpp)) -OBJECTS += $(patsubst %.cpp,%.o, $(wildcard extra/*.cpp)) -OBJECTS += $(patsubst %.cpp,%.o, $(wildcard ./../contrib/irrXML/*.cpp)) - -# C object files -OBJECTSC := $(patsubst %.c,%.oc, $(wildcard ./../contrib/zlib/*.c)) -OBJECTSC += $(patsubst %.c,%.oc, $(wildcard ./../contrib/ConvertUTF/*.c)) -OBJECTSC += $(patsubst %.c,%.oc, $(wildcard ./../contrib/unzip/*.c)) - -# Include flags for gcc -INCLUDEFLAGS = - -# Preprocessor defines for gcc -DEFINEFLAGS = - -# Suffix for the output binary, represents build type -NAMESUFFIX = - -# Output path for binaries -BINPATH = ../bin/mingw/ - -# GCC compiler flags -CPPFLAGS=-Wall - -# Setup environment for noboost build -ifeq ($(NOBOOST),1) - SINGLETHREADED = 1 - INCLUDEFLAGS += -I./BoostWorkaround/ - DEFINEFLAGS += -DASSIMP_BUILD_BOOST_WORKAROUND -# NAMESUFFIX += -noboost -else - # adjust this manually if your boost is stored elsewhere - INCLUDEFLAGS += -I"C:/Program Files/boost/boost_1_38" - #INCLUDEFLAGS += -I"$(BOOST_DIR)" - -endif - -# Setup environment for st build -ifeq ($(SINGLETHREADED),1) - DEFINEFLAGS += -DASSIMP_BUILD_SINGLETHREADED -# NAMESUFFIX += -st -endif - -# Setup environment for debug build -ifeq ($(DEBUG),1) - DEFINEFLAGS += -D_DEBUG -DDEBUG - CPPFLAGS += -g -# NAMESUFFIX += -debug -else - CPPFLAGS += -O2 -s - DEFINEFLAGS += -DNDEBUG -D_NDEBUG -endif - -# Output name of shared library -SHARED_TARGET = $(BINPATH)/libassimp$(NAMESUFFIX).so - -# Output name of static library -STATIC = $(BINPATH)/libassimp$(NAMESUFFIX).a - -# target: all -# usage : build a shared library (*.so) -all: $(SHARED_TARGET) - -$(SHARED_TARGET): $(OBJECTS) $(OBJECTSC) - gcc -o $@ $(OBJECTS) $(OBJECTSC) -shared -lstdc++ -%.o:%.cpp - $(CXX) -c $(CPPFLAGS) $? -o $@ $(INCLUDEFLAGS) $(DEFINEFLAGS) -%.oc:%.c - $(CXX) -x c -c -ansi $(CPPFLAGS) $? -o $@ - -# target: clean -# usage : cleanup all object files, prepare for a rebuild -.PHONY: clean -clean: - -del *.o .\..\contrib\irrXML\*.o .\..\contrib\zlib\*.oc .\..\contrib\unzip\*.oc .\..\contrib\ConvertUTF\*.oc - -# target: static -# usage : build a static library (*.a) -static: $(STATIC) -$(STATIC): $(OBJECTS) $(OBJECTSC) - ar rcs $@ $(OBJECTS) $(OBJECTSC) - From f7384dec95832c6e91f5b7896749a195c8daab52 Mon Sep 17 00:00:00 2001 From: Charlie Gettys Date: Wed, 10 Apr 2019 09:45:31 -0400 Subject: [PATCH 08/46] Possible fix for #2406. Shouldn't affect other compiled files, but have not verified this. Also, if anyone tries to debug StepFileGen1.cpp on MinGW, the debug info may not be there, but I think this is the best we can do. --- code/CMakeLists.txt | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index a265a01dc..be70ba88c 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -800,6 +800,18 @@ ADD_ASSIMP_IMPORTER( MMD MMDVmdParser.h ) +# Workaround for issue #2406 - force problematic large file to be optimized to prevent string table overflow error +# Used -Os instead of -O2 as previous issues had mentioned, since -Os is roughly speaking -O2, excluding any +# optimizations that take up extra space. Given that the issue is a string table overflowing, -Os seemed appropriate +# Also, I'm not positive if both link & compile flags are needed, but this hopefully ensures that the issue should not +# recur for edge cases such as static builds. +if ((CMAKE_COMPILER_IS_MINGW) AND (CMAKE_BUILD_TYPE MATCHES Debug)) + message("-- Applying MinGW StepFileGen1.cpp Debug Workaround") + SET_SOURCE_FILES_PROPERTIES(Importer/StepFile/StepFileGen1.cpp PROPERTIES COMPILE_FLAGS -Os ) + SET_SOURCE_FILES_PROPERTIES(Importer/StepFile/StepFileGen1.cpp PROPERTIES LINK_FLAGS -Os ) + SET_SOURCE_FILES_PROPERTIES(Importer/StepFile/StepFileGen1.cpp PROPERTIES STATIC_LIBRARY_FLAGS -Os ) +endif() + ADD_ASSIMP_IMPORTER( STEP STEPFile.h Importer/StepFile/StepFileImporter.h From 6a373d55c7c78cf8aabc2c829abc62d9b9a5d47f Mon Sep 17 00:00:00 2001 From: Charlie Gettys Date: Wed, 10 Apr 2019 10:07:24 -0400 Subject: [PATCH 09/46] * Add notes on MinGW compiler version requirements * Add check on MinGW compiler version to force compliance. * Closes #2315 ? --- Build.md | 5 ++++- CMakeLists.txt | 7 ++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/Build.md b/Build.md index 04bec04f0..2e47c8cab 100644 --- a/Build.md +++ b/Build.md @@ -35,6 +35,9 @@ The option -j descripes the number of parallel processes for the build. In this If you want to use a IDE for linux you can try QTCreator for instance. # Build instructions for MinGW + Older versions of MinGW's compiler (e.g. 5.1.0) do not support the -mbig_obj flag +required to compile some of assimp's files, especially for debug builds. +Version 7.3.0 of g++-mingw-w64 & gcc-mingw-w64 appears to work. Please see [CMake Cross Compiling](https://cmake.org/cmake/help/latest/manual/cmake-toolchains.7.html#cross-compiling) for general information on CMake Toolchains. @@ -43,7 +46,7 @@ Some users have had success building assimp using MinGW on Linux using the follo The following toolchain may or may not be helpful for building assimp using MinGW on Windows (untested): [mingw-cxx17.cmake](https://github.com/ruslo/polly/blob/master/mingw-cxx17.cmake) -Besides the toolchain, compilation should be the same as for Linux / Unix +Besides the toolchain, compilation should be the same as for Linux / Unix. # CMake build options The cmake-build-environment provides options to configure the build. The following options can be used: diff --git a/CMakeLists.txt b/CMakeLists.txt index 13a054de2..755bef89a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -234,7 +234,12 @@ ELSEIF ( "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" ) SET(CMAKE_CXX_FLAGS "-g -fvisibility=hidden -fPIC -fno-strict-aliasing -Wall -Wno-long-long -std=c++11 ${CMAKE_CXX_FLAGS}" ) SET(CMAKE_C_FLAGS "-fPIC -fno-strict-aliasing ${CMAKE_C_FLAGS}") ELSEIF( CMAKE_COMPILER_IS_MINGW ) - SET( CMAKE_CXX_FLAGS "-fvisibility=hidden -fno-strict-aliasing -Wall -Wno-long-long -std=c++11 -Wa,-mbig-obj ${CMAKE_CXX_FLAGS}" ) + IF (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 7.0) + message(FATAL_ERROR "MinGW is too old") + ELSEIF(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 7.3) + message(WARNING "MinGW is old, if you experience errors, update MinGW") + ENDIF() + SET( CMAKE_CXX_FLAGS "-fvisibility=hidden -fPIC -fno-strict-aliasing -Wall -Wno-long-long -std=c++11 -Wa,-mbig-obj ${CMAKE_CXX_FLAGS}" ) SET(CMAKE_C_FLAGS "-fPIC -fno-strict-aliasing ${CMAKE_C_FLAGS} ") ADD_DEFINITIONS( -U__STRICT_ANSI__ ) ENDIF() From 567a645c4fa3fdad65c1004ac92e62384ff7bff5 Mon Sep 17 00:00:00 2001 From: Charlie Gettys Date: Wed, 10 Apr 2019 10:31:57 -0400 Subject: [PATCH 10/46] * Improve error message for new check on MinGW compiler version --- CMakeLists.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 755bef89a..2250e8006 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -235,11 +235,11 @@ ELSEIF ( "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" ) SET(CMAKE_C_FLAGS "-fPIC -fno-strict-aliasing ${CMAKE_C_FLAGS}") ELSEIF( CMAKE_COMPILER_IS_MINGW ) IF (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 7.0) - message(FATAL_ERROR "MinGW is too old") + message(FATAL_ERROR "MinGW is too old to be supported. Please update MinGW and try again.") ELSEIF(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 7.3) - message(WARNING "MinGW is old, if you experience errors, update MinGW") + message(WARNING "MinGW is old, if you experience errors, update MinGW.") ENDIF() - SET( CMAKE_CXX_FLAGS "-fvisibility=hidden -fPIC -fno-strict-aliasing -Wall -Wno-long-long -std=c++11 -Wa,-mbig-obj ${CMAKE_CXX_FLAGS}" ) + SET( CMAKE_CXX_FLAGS "-fvisibility=hidden -fno-strict-aliasing -Wall -Wno-long-long -std=c++11 -Wa,-mbig-obj ${CMAKE_CXX_FLAGS}" ) SET(CMAKE_C_FLAGS "-fPIC -fno-strict-aliasing ${CMAKE_C_FLAGS} ") ADD_DEFINITIONS( -U__STRICT_ANSI__ ) ENDIF() From 24a0aaeb779d0b30e4e1640afebab8159e596d6c Mon Sep 17 00:00:00 2001 From: Charlie Gettys Date: Wed, 10 Apr 2019 11:02:36 -0400 Subject: [PATCH 11/46] Fix Codacy Warning --- Build.md | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Build.md b/Build.md index 2e47c8cab..afee8caf7 100644 --- a/Build.md +++ b/Build.md @@ -1,16 +1,17 @@ -# Install CMake +# Build Instructions +## Install CMake Asset-Importer-Lib can be build for a lot of different platforms. We are using cmake to generate the build environment for these via cmake. So you have to make sure that you have a working cmake-installation on your system. You can download it at https://cmake.org/ or for linux install it via ``` sudo apt-get install cmake ``` -# Get the source +## Get the source Make sure you have a working git-installation. Open a command prompt and clone the Asset-Importer-Lib via: ``` git clone https://github.com/assimp/assimp.git ``` -# Build instructions for Windows with Visual-Studio +## Build instructions for Windows with Visual-Studio First you have to install Visual-Studio on your windows-system. You can get the Community-Version for free here: https://visualstudio.microsoft.com/de/downloads/ To generate the build environment for your IDE open a command prompt, navigate to your repo and type: @@ -19,11 +20,11 @@ To generate the build environment for your IDE open a command prompt, navigate t ``` This will generate the project files for the visual studio. All dependencies used to build Asset-IMporter-Lib shall be part of the repo. If you want to use you own zlib.installation this is possible as well. Check the options for it. -# Build instructions for Windows with UWP +## Build instructions for Windows with UWP See https://stackoverflow.com/questions/40803170/cmake-uwp-using-cmake-to-build-universal-windows-app -# Build instructions for Linux / Unix +## Build instructions for Linux / Unix Open a terminal and got to your repository. You can generate the makefiles and build the library via: ``` @@ -34,7 +35,7 @@ The option -j descripes the number of parallel processes for the build. In this If you want to use a IDE for linux you can try QTCreator for instance. -# Build instructions for MinGW +## Build instructions for MinGW Older versions of MinGW's compiler (e.g. 5.1.0) do not support the -mbig_obj flag required to compile some of assimp's files, especially for debug builds. Version 7.3.0 of g++-mingw-w64 & gcc-mingw-w64 appears to work. @@ -48,7 +49,7 @@ The following toolchain may or may not be helpful for building assimp using MinG Besides the toolchain, compilation should be the same as for Linux / Unix. -# CMake build options +## CMake build options The cmake-build-environment provides options to configure the build. The following options can be used: - **BUILD_SHARED_LIBS ( default ON )**: Generation of shared libs ( dll for windows, so for Linux ). Set this to OFF to get a static lib. - **BUILD_FRAMEWORK ( default OFF, MacOnly)**: Build package as Mac OS X Framework bundle From c1f3624f5b18f7207a6dff5674bbf1c3e7c70c13 Mon Sep 17 00:00:00 2001 From: Charlie Gettys Date: Wed, 10 Apr 2019 11:06:00 -0400 Subject: [PATCH 12/46] Fix more codacy warnings --- Build.md | 49 ++++++++++++++++++++++++------------------------- 1 file changed, 24 insertions(+), 25 deletions(-) diff --git a/Build.md b/Build.md index afee8caf7..dc81fe0d7 100644 --- a/Build.md +++ b/Build.md @@ -1,13 +1,13 @@ # Build Instructions ## Install CMake Asset-Importer-Lib can be build for a lot of different platforms. We are using cmake to generate the build environment for these via cmake. So you have to make sure that you have a working cmake-installation on your system. You can download it at https://cmake.org/ or for linux install it via -``` +```bash sudo apt-get install cmake ``` ## Get the source Make sure you have a working git-installation. Open a command prompt and clone the Asset-Importer-Lib via: -``` +```bash git clone https://github.com/assimp/assimp.git ``` @@ -15,19 +15,18 @@ git clone https://github.com/assimp/assimp.git First you have to install Visual-Studio on your windows-system. You can get the Community-Version for free here: https://visualstudio.microsoft.com/de/downloads/ To generate the build environment for your IDE open a command prompt, navigate to your repo and type: -``` -> cmake CMakeLists.txt +```bash +cmake CMakeLists.txt ``` This will generate the project files for the visual studio. All dependencies used to build Asset-IMporter-Lib shall be part of the repo. If you want to use you own zlib.installation this is possible as well. Check the options for it. ## Build instructions for Windows with UWP See https://stackoverflow.com/questions/40803170/cmake-uwp-using-cmake-to-build-universal-windows-app - ## Build instructions for Linux / Unix Open a terminal and got to your repository. You can generate the makefiles and build the library via: -``` +```bash cmake CMakeLists.txt make -j4 ``` @@ -51,23 +50,23 @@ Besides the toolchain, compilation should be the same as for Linux / Unix. ## CMake build options The cmake-build-environment provides options to configure the build. The following options can be used: -- **BUILD_SHARED_LIBS ( default ON )**: Generation of shared libs ( dll for windows, so for Linux ). Set this to OFF to get a static lib. -- **BUILD_FRAMEWORK ( default OFF, MacOnly)**: Build package as Mac OS X Framework bundle -- **ASSIMP_DOUBLE_PRECISION( default OFF )**: All data will be stored as double values. -- **ASSIMP_OPT_BUILD_PACKAGES ( default OFF)**: Set to ON to generate CPack configuration files and packaging targets -- **ASSIMP_ANDROID_JNIIOSYSTEM ( default OFF )**: Android JNI IOSystem support is active -- **ASSIMP_NO_EXPORT ( default OFF )**: Disable Assimp's export functionality -- **ASSIMP_BUILD_ZLIB ( default OFF )**: Build your own zlib -- **ASSIMP_BUILD_ASSIMP_TOOLS ( default ON )**: If the supplementary tools for Assimp are built in addition to the library. -- **ASSIMP_BUILD_SAMPLES ( default OFF )**: If the official samples are built as well (needs Glut). -- **ASSIMP_BUILD_TESTS ( default ON )**: If the test suite for Assimp is built in addition to the library. -- **ASSIMP_COVERALLS ( default OFF )**: Enable this to measure test coverage. -- **ASSIMP_WERROR( default OFF )**: Treat warnings as errors. -- **ASSIMP_ASAN ( default OFF )**: Enable AddressSanitizer. -- **ASSIMP_UBSAN ( default OFF )**: Enable Undefined Behavior sanitizer. -- **SYSTEM_IRRXML ( default OFF )**: Use system installed Irrlicht/IrrXML library. -- **BUILD_DOCS ( default OFF )**: Build documentation using Doxygen. -- **INJECT_DEBUG_POSTFIX( default ON )**: Inject debug postfix in .a/.so lib names -- **IGNORE_GIT_HASH ( default OFF )**: Don't call git to get the hash. -- **ASSIMP_INSTALL_PDB ( default ON )**: Install MSVC debug files. + - **BUILD_SHARED_LIBS ( default ON )**: Generation of shared libs ( dll for windows, so for Linux ). Set this to OFF to get a static lib. + - **BUILD_FRAMEWORK ( default OFF, MacOnly)**: Build package as Mac OS X Framework bundle + - **ASSIMP_DOUBLE_PRECISION( default OFF )**: All data will be stored as double values. + - **ASSIMP_OPT_BUILD_PACKAGES ( default OFF)**: Set to ON to generate CPack configuration files and packaging targets + - **ASSIMP_ANDROID_JNIIOSYSTEM ( default OFF )**: Android JNI IOSystem support is active + - **ASSIMP_NO_EXPORT ( default OFF )**: Disable Assimp's export functionality + - **ASSIMP_BUILD_ZLIB ( default OFF )**: Build your own zlib + - **ASSIMP_BUILD_ASSIMP_TOOLS ( default ON )**: If the supplementary tools for Assimp are built in addition to the library. + - **ASSIMP_BUILD_SAMPLES ( default OFF )**: If the official samples are built as well (needs Glut). + - **ASSIMP_BUILD_TESTS ( default ON )**: If the test suite for Assimp is built in addition to the library. + - **ASSIMP_COVERALLS ( default OFF )**: Enable this to measure test coverage. + - **ASSIMP_WERROR( default OFF )**: Treat warnings as errors. + - **ASSIMP_ASAN ( default OFF )**: Enable AddressSanitizer. + - **ASSIMP_UBSAN ( default OFF )**: Enable Undefined Behavior sanitizer. + - **SYSTEM_IRRXML ( default OFF )**: Use system installed Irrlicht/IrrXML library. + - **BUILD_DOCS ( default OFF )**: Build documentation using Doxygen. + - **INJECT_DEBUG_POSTFIX( default ON )**: Inject debug postfix in .a/.so lib names + - **IGNORE_GIT_HASH ( default OFF )**: Don't call git to get the hash. + - **ASSIMP_INSTALL_PDB ( default ON )**: Install MSVC debug files. From 1b0c1139ebe306beaa55f3f5911d707b0d578a6f Mon Sep 17 00:00:00 2001 From: Charlie Gettys Date: Wed, 10 Apr 2019 11:45:30 -0400 Subject: [PATCH 13/46] Fix more codacy warnings! --- Build.md | 41 ++++++++++++++++++++--------------------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/Build.md b/Build.md index dc81fe0d7..1e28c648f 100644 --- a/Build.md +++ b/Build.md @@ -21,7 +21,7 @@ cmake CMakeLists.txt This will generate the project files for the visual studio. All dependencies used to build Asset-IMporter-Lib shall be part of the repo. If you want to use you own zlib.installation this is possible as well. Check the options for it. ## Build instructions for Windows with UWP -See https://stackoverflow.com/questions/40803170/cmake-uwp-using-cmake-to-build-universal-windows-app +See ## Build instructions for Linux / Unix Open a terminal and got to your repository. You can generate the makefiles and build the library via: @@ -50,23 +50,22 @@ Besides the toolchain, compilation should be the same as for Linux / Unix. ## CMake build options The cmake-build-environment provides options to configure the build. The following options can be used: - - **BUILD_SHARED_LIBS ( default ON )**: Generation of shared libs ( dll for windows, so for Linux ). Set this to OFF to get a static lib. - - **BUILD_FRAMEWORK ( default OFF, MacOnly)**: Build package as Mac OS X Framework bundle - - **ASSIMP_DOUBLE_PRECISION( default OFF )**: All data will be stored as double values. - - **ASSIMP_OPT_BUILD_PACKAGES ( default OFF)**: Set to ON to generate CPack configuration files and packaging targets - - **ASSIMP_ANDROID_JNIIOSYSTEM ( default OFF )**: Android JNI IOSystem support is active - - **ASSIMP_NO_EXPORT ( default OFF )**: Disable Assimp's export functionality - - **ASSIMP_BUILD_ZLIB ( default OFF )**: Build your own zlib - - **ASSIMP_BUILD_ASSIMP_TOOLS ( default ON )**: If the supplementary tools for Assimp are built in addition to the library. - - **ASSIMP_BUILD_SAMPLES ( default OFF )**: If the official samples are built as well (needs Glut). - - **ASSIMP_BUILD_TESTS ( default ON )**: If the test suite for Assimp is built in addition to the library. - - **ASSIMP_COVERALLS ( default OFF )**: Enable this to measure test coverage. - - **ASSIMP_WERROR( default OFF )**: Treat warnings as errors. - - **ASSIMP_ASAN ( default OFF )**: Enable AddressSanitizer. - - **ASSIMP_UBSAN ( default OFF )**: Enable Undefined Behavior sanitizer. - - **SYSTEM_IRRXML ( default OFF )**: Use system installed Irrlicht/IrrXML library. - - **BUILD_DOCS ( default OFF )**: Build documentation using Doxygen. - - **INJECT_DEBUG_POSTFIX( default ON )**: Inject debug postfix in .a/.so lib names - - **IGNORE_GIT_HASH ( default OFF )**: Don't call git to get the hash. - - **ASSIMP_INSTALL_PDB ( default ON )**: Install MSVC debug files. - +- **BUILD_SHARED_LIBS ( default ON )**: Generation of shared libs ( dll for windows, so for Linux ). Set this to OFF to get a static lib. +- **BUILD_FRAMEWORK ( default OFF, MacOnly)**: Build package as Mac OS X Framework bundle +- **ASSIMP_DOUBLE_PRECISION( default OFF )**: All data will be stored as double values. +- **ASSIMP_OPT_BUILD_PACKAGES ( default OFF)**: Set to ON to generate CPack configuration files and packaging targets +- **ASSIMP_ANDROID_JNIIOSYSTEM ( default OFF )**: Android JNI IOSystem support is active +- **ASSIMP_NO_EXPORT ( default OFF )**: Disable Assimp's export functionality +- **ASSIMP_BUILD_ZLIB ( default OFF )**: Build your own zlib +- **ASSIMP_BUILD_ASSIMP_TOOLS ( default ON )**: If the supplementary tools for Assimp are built in addition to the library. +- **ASSIMP_BUILD_SAMPLES ( default OFF )**: If the official samples are built as well (needs Glut). +- **ASSIMP_BUILD_TESTS ( default ON )**: If the test suite for Assimp is built in addition to the library. +- **ASSIMP_COVERALLS ( default OFF )**: Enable this to measure test coverage. +- **ASSIMP_WERROR( default OFF )**: Treat warnings as errors. +- **ASSIMP_ASAN ( default OFF )**: Enable AddressSanitizer. +- **ASSIMP_UBSAN ( default OFF )**: Enable Undefined Behavior sanitizer. +- **SYSTEM_IRRXML ( default OFF )**: Use system installed Irrlicht/IrrXML library. +- **BUILD_DOCS ( default OFF )**: Build documentation using Doxygen. +- **INJECT_DEBUG_POSTFIX( default ON )**: Inject debug postfix in .a/.so lib names +- **IGNORE_GIT_HASH ( default OFF )**: Don't call git to get the hash. +- **ASSIMP_INSTALL_PDB ( default ON )**: Install MSVC debug files. From 2f6f71651226874ac57538ff8e772d0821dead28 Mon Sep 17 00:00:00 2001 From: Charlie Gettys Date: Wed, 10 Apr 2019 12:42:19 -0400 Subject: [PATCH 14/46] Clarify build instructions --- Build.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Build.md b/Build.md index 1e28c648f..7c908606d 100644 --- a/Build.md +++ b/Build.md @@ -41,7 +41,9 @@ Version 7.3.0 of g++-mingw-w64 & gcc-mingw-w64 appears to work. Please see [CMake Cross Compiling](https://cmake.org/cmake/help/latest/manual/cmake-toolchains.7.html#cross-compiling) for general information on CMake Toolchains. -Some users have had success building assimp using MinGW on Linux using the following toolchain, which is not maintained by assimp. [linux-mingw-w64-gnuxx11.cmake](https://github.com/ruslo/polly/blob/master/linux-mingw-w64-gnuxx11.cmake) +Some users have had success building assimp using MinGW on Linux using [polly](https://github.com/ruslo/polly/). + +The following toolchain, which is not maintained by assimp, seems to work on Linux: [linux-mingw-w64-gnuxx11.cmake](https://github.com/ruslo/polly/blob/master/linux-mingw-w64-gnuxx11.cmake) The following toolchain may or may not be helpful for building assimp using MinGW on Windows (untested): [mingw-cxx17.cmake](https://github.com/ruslo/polly/blob/master/mingw-cxx17.cmake) From 9b9b2c83393624e6a152556e6d35cd3169e12934 Mon Sep 17 00:00:00 2001 From: Simon Puente Date: Sun, 14 Apr 2019 10:13:32 -0700 Subject: [PATCH 15/46] Fix typo on README.md changing "fascade" to "facade" --- port/AndroidJNI/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/port/AndroidJNI/README.md b/port/AndroidJNI/README.md index 7998fa3ef..0b95efd04 100644 --- a/port/AndroidJNI/README.md +++ b/port/AndroidJNI/README.md @@ -1,6 +1,6 @@ Build Asset Importer Lib for Android ==================================== -This module provides a fascade for the io-stream-access to files behind the android-asset-management within +This module provides a facade for the io-stream-access to files behind the android-asset-management within an Android-native application. - It is built as a static library - It requires Android NDK with android API > 9 support. From b6d3cbcb61f4cc4c42678d5f183351f95c97c8d4 Mon Sep 17 00:00:00 2001 From: Huarong Chen Date: Wed, 17 Apr 2019 14:19:00 +0800 Subject: [PATCH 16/46] Fix "bytes aketrans" issues in Python>=3.1 Issue https://github.com/assimp/assimp/issues/2339 --- port/PyAssimp/pyassimp/core.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/port/PyAssimp/pyassimp/core.py b/port/PyAssimp/pyassimp/core.py index ca6d8629a..44163a434 100644 --- a/port/PyAssimp/pyassimp/core.py +++ b/port/PyAssimp/pyassimp/core.py @@ -93,7 +93,7 @@ def _is_init_type(obj): return False tname = obj.__class__.__name__ return not (tname[:2] == 'c_' or tname == 'Structure' \ - or tname == 'POINTER') and not isinstance(obj,int) + or tname == 'POINTER') and not isinstance(obj, (int, str, bytes)) def _init(self, target = None, parent = None): """ From 836801d37e6ce91bea8cb436c41e55b7b47a817b Mon Sep 17 00:00:00 2001 From: RichardTea <31507749+RichardTea@users.noreply.github.com> Date: Wed, 17 Apr 2019 09:32:24 +0100 Subject: [PATCH 17/46] CMake updates for VS2015/cmake 3.12 onwards cmake 3.12 adds MSVC_TOOLSET_VERSION to define the version of MSVC toolchain in use Use that if present instead of if-elseif chain --- CMakeLists.txt | 29 +++++++++++++++++------------ code/CMakeLists.txt | 7 +++++++ 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index fb7a3d967..56b6e3c4f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -106,7 +106,7 @@ OPTION ( BUILD_DOCS OFF ) OPTION( INJECT_DEBUG_POSTFIX - "Inject debug postfix in .a/.so lib names" + "Inject debug postfix in .a/.so/.dll lib names" ON ) @@ -127,14 +127,15 @@ if (WIN32) ADD_DEFINITIONS( -DWIN32_LEAN_AND_MEAN ) endif() - IF(MSVC) OPTION( ASSIMP_INSTALL_PDB "Install MSVC debug files." ON ) - # Multibyte character set is deprecated, but default - ADD_DEFINITIONS( -DUNICODE -D_UNICODE ) + IF(NOT (MSVC_VERSION LESS 1900)) + # Multibyte character set is deprecated since at least MSVC2015 (possibly earlier) + ADD_DEFINITIONS( -DUNICODE -D_UNICODE ) + ENDIF() ENDIF(MSVC) IF (BUILD_FRAMEWORK) @@ -545,18 +546,22 @@ if(WIN32) if (CMAKE_SIZEOF_VOID_P EQUAL 8) SET(BIN_DIR "${PROJECT_SOURCE_DIR}/bin64/") SET(LIB_DIR "${PROJECT_SOURCE_DIR}/lib64/") - elseif() + else() SET(BIN_DIR "${PROJECT_SOURCE_DIR}/bin32/") SET(LIB_DIR "${PROJECT_SOURCE_DIR}/lib32/") ENDIF() - IF(MSVC12) - SET(ASSIMP_MSVC_VERSION "vc120") - ELSEIF(MSVC14) - SET(ASSIMP_MSVC_VERSION "vc140") - ELSEIF(MSVC15) - SET(ASSIMP_MSVC_VERSION "vc141") - ENDIF(MSVC12) + IF(MSVC_TOOLSET_VERSION) + set(MSVC_PREFIX "vc${MSVC_TOOLSET_VERSION}") + ELSE() + IF(MSVC12) + SET(ASSIMP_MSVC_VERSION "vc120") + ELSEIF(MSVC14) + SET(ASSIMP_MSVC_VERSION "vc140") + ELSEIF(MSVC15) + SET(ASSIMP_MSVC_VERSION "vc141") + ENDIF(MSVC12) + ENDIF() IF(MSVC12 OR MSVC14 OR MSVC15 ) ADD_CUSTOM_TARGET(UpdateAssimpLibsDebugSymbolsAndDLLs COMMENT "Copying Assimp Libraries ..." VERBATIM) diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index e310e6423..05f916abd 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -1037,6 +1037,10 @@ ENDIF (ASSIMP_BUILD_NONFREE_C4D_IMPORTER) if( MSVC ) # in order to prevent DLL hell, each of the DLLs have to be suffixed with the major version and msvc prefix + # CMake 3.12 added a variable for this + if(MSVC_TOOLSET_VERSION) + set(MSVC_PREFIX "vc${MSVC_TOOLSET_VERSION}") + else() if( MSVC70 OR MSVC71 ) set(MSVC_PREFIX "vc70") elseif( MSVC80 ) @@ -1051,9 +1055,12 @@ if( MSVC ) set(MSVC_PREFIX "vc120") elseif( MSVC14 ) set(MSVC_PREFIX "vc140") + elseif( MSVC15 ) + set(MSVC_PREFIX "vc141") else() set(MSVC_PREFIX "vc150") endif() + endif() set(LIBRARY_SUFFIX "${ASSIMP_LIBRARY_SUFFIX}-${MSVC_PREFIX}-mt" CACHE STRING "the suffix for the assimp windows library") endif() From 9242a12bf5e69974b00fee257ed3f219b8c6df06 Mon Sep 17 00:00:00 2001 From: RichardTea <31507749+RichardTea@users.noreply.github.com> Date: Wed, 17 Apr 2019 09:32:59 +0100 Subject: [PATCH 18/46] Qt5 requires cmake 3.1 Earlier versions are not supported --- tools/assimp_qt_viewer/CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/assimp_qt_viewer/CMakeLists.txt b/tools/assimp_qt_viewer/CMakeLists.txt index cd15372b5..d8d8e27a9 100644 --- a/tools/assimp_qt_viewer/CMakeLists.txt +++ b/tools/assimp_qt_viewer/CMakeLists.txt @@ -1,7 +1,8 @@ set(PROJECT_VERSION "") project(assimp_qt_viewer) -cmake_minimum_required(VERSION 3.0) +# Qt5 requires cmake 3.1 or newer +cmake_minimum_required(VERSION 3.1) FIND_PACKAGE(OpenGL QUIET) From 692927a8a1bd123402ee04ab1ec917d160b3be2d Mon Sep 17 00:00:00 2001 From: RichardTea <31507749+RichardTea@users.noreply.github.com> Date: Wed, 17 Apr 2019 10:03:18 +0100 Subject: [PATCH 19/46] Default CMAKE_DEBUG_POSTFIX to 'd' on multiconfig When the generator is multi config (eg MSVC, xcode) always set the debug postfix to 'd' --- CMakeLists.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 56b6e3c4f..c5d5b15b1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -304,7 +304,9 @@ SET( ASSIMP_INCLUDE_INSTALL_DIR "include" CACHE STRING SET( ASSIMP_BIN_INSTALL_DIR "bin" CACHE STRING "Path the tool executables are installed to." ) -IF (CMAKE_BUILD_TYPE STREQUAL "Debug") +get_cmake_property(is_multi_config GENERATOR_IS_MULTI_CONFIG) + +IF (is_multi_config OR (CMAKE_BUILD_TYPE STREQUAL "Debug")) SET(CMAKE_DEBUG_POSTFIX "d" CACHE STRING "Debug Postfix for lib, samples and tools") ELSE() SET(CMAKE_DEBUG_POSTFIX "" CACHE STRING "Debug Postfix for lib, samples and tools") From b515f04ce6e19394121b5d01ca06f824157d4437 Mon Sep 17 00:00:00 2001 From: RichardTea <31507749+RichardTea@users.noreply.github.com> Date: Wed, 17 Apr 2019 10:48:14 +0100 Subject: [PATCH 20/46] assimp_view is ANSI (MBCS) only It should really be ported to UNICODE at some point, however I do not have the DirectX9 SDK so cannot confirm whether such a port is working. --- tools/assimp_view/CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/assimp_view/CMakeLists.txt b/tools/assimp_view/CMakeLists.txt index f5365e11a..8112c19e8 100644 --- a/tools/assimp_view/CMakeLists.txt +++ b/tools/assimp_view/CMakeLists.txt @@ -88,6 +88,8 @@ SET_PROPERTY(TARGET assimp_viewer PROPERTY DEBUG_POSTFIX ${CMAKE_DEBUG_POSTFIX}) IF ( MSVC ) ADD_DEFINITIONS( -D_SCL_SECURE_NO_WARNINGS ) ADD_DEFINITIONS( -D_CRT_SECURE_NO_WARNINGS ) + # assimp_viewer is ANSI (MBCS) throughout + REMOVE_DEFINITIONS( -DUNICODE -D_UNICODE ) ENDIF ( MSVC ) From e8bcf162ddc5daeffbe2dfd408b33c3cde153e46 Mon Sep 17 00:00:00 2001 From: RichardTea <31507749+RichardTea@users.noreply.github.com> Date: Wed, 17 Apr 2019 13:55:08 +0100 Subject: [PATCH 21/46] OBJ coerce invalid nan or inf texture coords to 0 Some exporters (eg Vectorworks 2019) may export texture coordinate components as "nan". While this is invalid, it's better to coerce these values to 0 rather than reject the entire file. --- code/ObjFileParser.cpp | 28 +++++++++++++++++++++++++--- code/ObjFileParser.h | 2 +- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/code/ObjFileParser.cpp b/code/ObjFileParser.cpp index a8509b583..f9dd17bed 100644 --- a/code/ObjFileParser.cpp +++ b/code/ObjFileParser.cpp @@ -151,7 +151,7 @@ void ObjFileParser::parseFile( IOStreamBuffer &streamBuffer ) { } else if (*m_DataIt == 't') { // read in texture coordinate ( 2D or 3D ) ++m_DataIt; - size_t dim = getVector(m_pModel->m_TextureCoord); + size_t dim = getTexCoordVector(m_pModel->m_TextureCoord); m_pModel->m_TextureCoordDim = std::max(m_pModel->m_TextureCoordDim, (unsigned int)dim); } else if (*m_DataIt == 'n') { // Read in normal vector definition @@ -272,6 +272,17 @@ static bool isDataDefinitionEnd( const char *tmp ) { return false; } +static bool isNanOrInf(const char * in) { + // Look for "nan" or "inf", case insensitive + if ((in[0] == 'N' || in[0] == 'n') && ASSIMP_strincmp(in, "nan", 3) == 0) { + return true; + } + else if ((in[0] == 'I' || in[0] == 'i') && ASSIMP_strincmp(in, "inf", 3) == 0) { + return true; + } + return false; +} + size_t ObjFileParser::getNumComponentsInDataDefinition() { size_t numComponents( 0 ); const char* tmp( &m_DataIt[0] ); @@ -285,7 +296,7 @@ size_t ObjFileParser::getNumComponentsInDataDefinition() { if ( !SkipSpaces( &tmp ) ) { break; } - const bool isNum( IsNumeric( *tmp ) ); + const bool isNum( IsNumeric( *tmp ) || isNanOrInf(tmp)); SkipToken( tmp ); if ( isNum ) { ++numComponents; @@ -297,7 +308,7 @@ size_t ObjFileParser::getNumComponentsInDataDefinition() { return numComponents; } -size_t ObjFileParser::getVector( std::vector &point3d_array ) { +size_t ObjFileParser::getTexCoordVector( std::vector &point3d_array ) { size_t numComponents = getNumComponentsInDataDefinition(); ai_real x, y, z; if( 2 == numComponents ) { @@ -319,6 +330,17 @@ size_t ObjFileParser::getVector( std::vector &point3d_array ) { } else { throw DeadlyImportError( "OBJ: Invalid number of components" ); } + + // Coerce nan and inf to 0 as is the OBJ default value + if (!isfinite(x)) + x = 0; + + if (!isfinite(y)) + y = 0; + + if (!isfinite(z)) + z = 0; + point3d_array.push_back( aiVector3D( x, y, z ) ); m_DataIt = skipLine( m_DataIt, m_DataItEnd, m_uiLine ); return numComponents; diff --git a/code/ObjFileParser.h b/code/ObjFileParser.h index a8961452d..7d1b806ce 100644 --- a/code/ObjFileParser.h +++ b/code/ObjFileParser.h @@ -96,7 +96,7 @@ protected: /// Get the number of components in a line. size_t getNumComponentsInDataDefinition(); /// Stores the vector - size_t getVector( std::vector &point3d_array ); + size_t getTexCoordVector( std::vector &point3d_array ); /// Stores the following 3d vector. void getVector3( std::vector &point3d_array ); /// Stores the following homogeneous vector as a 3D vector From c34327b35575b1dd9ca123fa0c4b440241b25d85 Mon Sep 17 00:00:00 2001 From: RichardTea <31507749+RichardTea@users.noreply.github.com> Date: Wed, 17 Apr 2019 14:30:40 +0100 Subject: [PATCH 22/46] use std::isfinite() GCC is more standards compliant than MSVC --- code/ObjFileParser.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/ObjFileParser.cpp b/code/ObjFileParser.cpp index f9dd17bed..2265e0c35 100644 --- a/code/ObjFileParser.cpp +++ b/code/ObjFileParser.cpp @@ -332,13 +332,13 @@ size_t ObjFileParser::getTexCoordVector( std::vector &point3d_array } // Coerce nan and inf to 0 as is the OBJ default value - if (!isfinite(x)) + if (!std::isfinite(x)) x = 0; - if (!isfinite(y)) + if (!std::isfinite(y)) y = 0; - if (!isfinite(z)) + if (!std::isfinite(z)) z = 0; point3d_array.push_back( aiVector3D( x, y, z ) ); From 5713be615c6939535d8e467b0449f3de19aab500 Mon Sep 17 00:00:00 2001 From: Hugo Pereira Date: Thu, 18 Apr 2019 16:52:47 +0100 Subject: [PATCH 23/46] [FBX export] fixed ordering of skin indices and weights, to be consistent between systems --- code/FBXExporter.cpp | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/code/FBXExporter.cpp b/code/FBXExporter.cpp index acb122714..6b1ac0e5e 100644 --- a/code/FBXExporter.cpp +++ b/code/FBXExporter.cpp @@ -1575,11 +1575,22 @@ void FBXExporter::WriteObjects () // one sticky point is that the number of vertices may not match, // because assimp splits vertices by normal, uv, etc. + // functor for aiNode sorting + struct SortNodeByName + { + bool operator()(const aiNode *lhs, const aiNode *rhs) const + { + return strcmp(lhs->mName.C_Str(), rhs->mName.C_Str()) < 0; + } + }; + // first we should mark the skeleton for each mesh. // the skeleton must include not only the aiBones, // but also all their parent nodes. // anything that affects the position of any bone node must be included. - std::vector> skeleton_by_mesh(mScene->mNumMeshes); + // Use SorNodeByName to make sure the exported result will be the same across all systems + // Otherwise the aiNodes of the skeleton would be sorted based on the pointer address, which isn't consistent + std::vector> skeleton_by_mesh(mScene->mNumMeshes); // at the same time we can build a list of all the skeleton nodes, // which will be used later to mark them as type "limbNode". std::unordered_set limbnodes; @@ -1587,7 +1598,7 @@ void FBXExporter::WriteObjects () std::map node_by_bone; for (size_t mi = 0; mi < mScene->mNumMeshes; ++mi) { const aiMesh* m = mScene->mMeshes[mi]; - std::set skeleton; + std::set skeleton; for (size_t bi =0; bi < m->mNumBones; ++bi) { const aiBone* b = m->mBones[bi]; const std::string name(b->mName.C_Str()); @@ -1728,7 +1739,7 @@ void FBXExporter::WriteObjects () aiMatrix4x4 mesh_xform = get_world_transform(mesh_node, mScene); // now make a subdeformer for each bone in the skeleton - const std::set &skeleton = skeleton_by_mesh[mi]; + const std::set skeleton= skeleton_by_mesh[mi]; for (const aiNode* bone_node : skeleton) { // if there's a bone for this node, find it const aiBone* b = nullptr; From 42202c22043923946b87481ff01669d4bf633fc4 Mon Sep 17 00:00:00 2001 From: Vitaly Ovchinnikov Date: Fri, 26 Apr 2019 22:13:29 +1200 Subject: [PATCH 24/46] a test for bad OBJ file format and code fix that handles it --- code/ObjFileParser.cpp | 10 +++------- test/unit/utObjImportExport.cpp | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 7 deletions(-) diff --git a/code/ObjFileParser.cpp b/code/ObjFileParser.cpp index a8509b583..17c83ee8f 100644 --- a/code/ObjFileParser.cpp +++ b/code/ObjFileParser.cpp @@ -429,13 +429,6 @@ void ObjFileParser::getFace( aiPrimitiveType type ) { if (type == aiPrimitiveType_POINT) { ASSIMP_LOG_ERROR("Obj: Separator unexpected in point statement"); } - if (iPos == 0) { - //if there are no texture coordinates in the file, but normals - if (!vt && vn) { - iPos = 1; - iStep++; - } - } iPos++; } else if( IsSpaceOrNewLine( *m_DataIt ) ) { iPos = 0; @@ -452,6 +445,9 @@ void ObjFileParser::getFace( aiPrimitiveType type ) { ++iStep; } + if (iPos == 1 && !vt && vn) + iPos = 2; // skip texture coords for normals if there are no tex coords + if ( iVal > 0 ) { // Store parsed index if ( 0 == iPos ) { diff --git a/test/unit/utObjImportExport.cpp b/test/unit/utObjImportExport.cpp index 2d1933094..bb0d36b13 100644 --- a/test/unit/utObjImportExport.cpp +++ b/test/unit/utObjImportExport.cpp @@ -391,6 +391,39 @@ TEST_F(utObjImportExport, invalid_normals_uvs) { EXPECT_NE(nullptr, scene); } +TEST_F(utObjImportExport, no_vt_just_vns) { + static const char *ObjModel = + "v 0 0 0\n" + "v 0 0 0\n" + "v 0 0 0\n" + "v 0 0 0\n" + "v 0 0 0\n" + "v 0 0 0\n" + "v 0 0 0\n" + "v 0 0 0\n" + "v 0 0 0\n" + "v 0 0 0\n" + "v 10 0 0\n" + "v 0 10 0\n" + "vn 0 0 1\n" + "vn 0 0 1\n" + "vn 0 0 1\n" + "vn 0 0 1\n" + "vn 0 0 1\n" + "vn 0 0 1\n" + "vn 0 0 1\n" + "vn 0 0 1\n" + "vn 0 0 1\n" + "vn 0 0 1\n" + "vn 0 0 1\n" + "vn 0 0 1\n" + "f 10/10 11/11 12/12\n"; + + Assimp::Importer myImporter; + const aiScene *scene = myImporter.ReadFileFromMemory(ObjModel, strlen(ObjModel), 0); + EXPECT_NE(nullptr, scene); +} + TEST_F( utObjImportExport, mtllib_after_g ) { ::Assimp::Importer importer; const aiScene *scene = importer.ReadFile( ASSIMP_TEST_MODELS_DIR "/OBJ/cube_mtllib_after_g.obj", aiProcess_ValidateDataStructure ); From bc4e4112848c007122b7ad4d523705a35051c18e Mon Sep 17 00:00:00 2001 From: b1skit Date: Sat, 27 Apr 2019 17:20:27 -0700 Subject: [PATCH 25/46] Updated the FBXConverter to correctly set the material shading mode when a Phong shader is detected --- code/FBXConverter.cpp | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/code/FBXConverter.cpp b/code/FBXConverter.cpp index 0abfdafdc..c76d3ccad 100644 --- a/code/FBXConverter.cpp +++ b/code/FBXConverter.cpp @@ -67,6 +67,19 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include + + + + // MY DEBUG STUFF: + +#include +using std::cout; + +// END MY DEBUG STUF + + + + namespace Assimp { namespace FBX { @@ -1596,6 +1609,13 @@ namespace Assimp { out_mat->AddProperty(&str, AI_MATKEY_NAME); } + // Set the shading mode as best we can: The FBX specification only mentions Lambert and Phong, and only Phong is mentioned in Assimp's aiShadingMode enum. + if (material.GetShadingModel() == "phong") + { + aiShadingMode shadingMode = aiShadingMode_Phong; + out_mat->AddProperty(&shadingMode, 1, AI_MATKEY_SHADING_MODEL); + } + // shading stuff and colors SetShadingPropertiesCommon(out_mat, props); SetShadingPropertiesRaw( out_mat, props, material.Textures(), mesh ); From 243b2618a9209eb5a2c10d2fcec13dc2aa29af43 Mon Sep 17 00:00:00 2001 From: b1skit Date: Sat, 27 Apr 2019 17:37:23 -0700 Subject: [PATCH 26/46] Updated the FBXConverter to correctly set the material shading mode when a Phong shader is detected --- code/FBXConverter.cpp | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/code/FBXConverter.cpp b/code/FBXConverter.cpp index c76d3ccad..4780188ac 100644 --- a/code/FBXConverter.cpp +++ b/code/FBXConverter.cpp @@ -68,18 +68,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include - - - // MY DEBUG STUFF: - -#include -using std::cout; - -// END MY DEBUG STUF - - - - namespace Assimp { namespace FBX { From bcd17481e5970dba3cd68e64a32e1f8fafabf355 Mon Sep 17 00:00:00 2001 From: Jeongseok Lee Date: Sun, 28 Apr 2019 22:16:20 -0700 Subject: [PATCH 27/46] Fix element access operator of aiColor4D --- include/assimp/color4.inl | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/include/assimp/color4.inl b/include/assimp/color4.inl index 3192d55f3..afa53dcb5 100644 --- a/include/assimp/color4.inl +++ b/include/assimp/color4.inl @@ -85,6 +85,8 @@ AI_FORCE_INLINE TReal aiColor4t::operator[](unsigned int i) const { return g; case 2: return b; + case 3: + return a; default: break; } @@ -100,6 +102,8 @@ AI_FORCE_INLINE TReal& aiColor4t::operator[](unsigned int i) { return g; case 2: return b; + case 3: + return a; default: break; } From c821c6f30161783da1fd0a8827c118c36dcdcd33 Mon Sep 17 00:00:00 2001 From: kimkulling Date: Tue, 30 Apr 2019 15:33:31 +0200 Subject: [PATCH 28/46] Fix names of dlls. --- appveyor.yml | 9 ++- .../{script.iss => script_x64.iss} | 36 +--------- packaging/windows-innosetup/script_x86.iss | 72 +++++++++++++++++++ 3 files changed, 82 insertions(+), 35 deletions(-) rename packaging/windows-innosetup/{script.iss => script_x64.iss} (56%) create mode 100644 packaging/windows-innosetup/script_x86.iss diff --git a/appveyor.yml b/appveyor.yml index 39ef36179..c8a5a27b9 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -53,7 +53,14 @@ build: project: Assimp.sln after_build: - - if "%APPVEYOR_BUILD_WORKER_IMAGE%"=="Visual Studio 2017" iscc packaging\windows-innosetup\script.iss + - if "%APPVEYOR_BUILD_WORKER_IMAGE%"=="Visual Studio 2017" ( + if "%platform%"=="x64" ( + iscc packaging\windows-innosetup\script_x64.iss + ) + if "%platform%"!="x64" ( + iscc packaging\windows-innosetup\script_x86.iss + ) + ) - 7z a assimp.7z bin\%CONFIGURATION%\* lib\%CONFIGURATION%\* test_script: diff --git a/packaging/windows-innosetup/script.iss b/packaging/windows-innosetup/script_x64.iss similarity index 56% rename from packaging/windows-innosetup/script.iss rename to packaging/windows-innosetup/script_x64.iss index 695740679..1738fd4b1 100644 --- a/packaging/windows-innosetup/script.iss +++ b/packaging/windows-innosetup/script_x64.iss @@ -24,25 +24,20 @@ Name: "compact"; Description: "Compact installation, no test models or language Name: "custom"; Description: "Custom installation"; Flags: iscustom [Components] -Name: "main"; Description: "Main Files (32 and 64 Bit)"; Types: full compact custom; Flags: fixed +Name: "main"; Description: "Main Files ( 64 Bit )"; Types: full compact custom; Flags: fixed Name: "tools"; Description: "Asset Viewer & Command Line Tools (32 and 64 Bit)"; Types: full compact Name: "help"; Description: "Help Files"; Types: full compact Name: "samples"; Description: "Samples"; Types: full Name: "test"; Description: "Test Models (BSD-licensed)"; Types: full Name: "test_nonbsd"; Description: "Test Models (other (free) licenses)"; Types: full -;Name: "pyassimp"; Description: "Python Bindings"; Types: full -;Name: "dassimp"; Description: "D Bindings"; Types: full -;Name: "assimp_net"; Description: "C#/.NET Bindings"; Types: full [Run] -;Filename: "{app}\stub\vc_redist.x86.exe"; Parameters: "/qb"; StatusMsg: "Installing VS2017 redistributable package (32 Bit)"; Check: not IsWin64 Filename: "{app}\stub\vc_redist.x64.exe"; Parameters: "/qb"; StatusMsg: "Installing VS2017 redistributable package (64 Bit)"; Check: IsWin64 [Files] Source: "readme_installer.txt"; DestDir: "{app}"; Flags: isreadme ; Installer stub -;Source: "vc_redist.x86.exe"; DestDir: "{app}\stub\"; Check: not IsWin64 Source: "vc_redist.x64.exe"; DestDir: "{app}\stub\"; Check: IsWin64 ; Common stuff @@ -53,27 +48,14 @@ Source: "WEB"; DestDir: "{app}" Source: "..\..\scripts\*"; DestDir: "{app}\scripts"; Flags: recursesubdirs -; x86 binaries -;Source: "..\..\bin\release\x86\assimp-vc140-mt.dll"; DestDir: "{app}\bin\x86" -;Source: "..\..\bin\release\x86\assimp_viewer.exe"; DestDir: "{app}\bin\x86"; Components: tools -;Source: "C:\Windows\SysWOW64\D3DCompiler_42.dll"; DestDir: "{app}\bin\x86"; Components: tools -;Source: "C:\Windows\SysWOW64\D3DX9_42.dll"; DestDir: "{app}\bin\x86"; Components: tools -;Source: "..\..\bin\release\x86\assimp.exe"; DestDir: "{app}\bin\x86"; Components: tools - ; x64 binaries -Source: "..\..\bin\release\assimp-vc140-mt.dll"; DestDir: "{app}\bin\x64" +Source: "..\..\bin\release\assimp-vc141-mt.dll"; DestDir: "{app}\bin\x64" Source: "..\..\bin\release\assimp_viewer.exe"; DestDir: "{app}\bin\x64"; Components: tools Source: "C:\Windows\SysWOW64\D3DCompiler_42.dll"; DestDir: "{app}\bin\x64"; DestName: "D3DCompiler_42.dll"; Components: tools Source: "C:\Windows\SysWOW64\D3DX9_42.dll"; DestDir: "{app}\bin\x64"; DestName: "D3DX9_42.dll"; Components: tools Source: "..\..\bin\release\assimp.exe"; DestDir: "{app}\bin\x64"; Components: tools -; Documentation -;Source: "..\..\doc\AssimpDoc_Html\AssimpDoc.chm"; DestDir: "{app}\doc"; Components: help -;Source: "..\..\doc\AssimpCmdDoc_Html\AssimpCmdDoc.chm"; DestDir: "{app}\doc"; Components: help -;Source: "..\..\doc\datastructure.xml"; DestDir: "{app}\doc"; Components: help - ; Import libraries -;Source: "..\..\lib\release\x86\assimp.lib"; DestDir: "{app}\lib\x86" Source: "..\..\lib\release\assimp-vc140-mt.lib"; DestDir: "{app}\lib\x64" ; Samples @@ -82,20 +64,6 @@ Source: "..\..\samples\*"; DestDir: "{app}\samples"; Flags: recursesubdirs; Comp ; Include files Source: "..\..\include\*"; DestDir: "{app}\include"; Flags: recursesubdirs -; dAssimp -;Source: "..\..\port\dAssimp\*"; DestDir: "{app}\port\D"; Flags: recursesubdirs; Components: dassimp - -; Assimp.NET -;Source: "..\..\port\Assimp.NET\*"; DestDir: "{app}\port\C#"; Flags: recursesubdirs; Components: assimp_net - -; PyAssimp -;Source: "..\..\port\PyAssimp\*"; DestDir: "{app}\port\Python"; Excludes: "*.pyc,*.dll"; Flags: recursesubdirs; Components: pyassimp - -; Test repository -;Source: "..\..\test\models\*"; DestDir: "{app}\test\models"; Flags: recursesubdirs; Components: test -;Source: "..\..\test\regression\*"; DestDir: "{app}\test\regression"; Flags: recursesubdirs; Components: test -;Source: "..\..\test\models-nonbsd\*"; DestDir: "{app}\test\models-nonbsd"; Flags: recursesubdirs; Components: test_nonbsd - [Icons] Name: "{group}\Assimp Manual"; Filename: "{app}\doc\AssimpDoc.chm" ; Components: help Name: "{group}\Assimp Command Line Manual"; Filename: "{app}\doc\AssimpCmdDoc.chm"; Components: help diff --git a/packaging/windows-innosetup/script_x86.iss b/packaging/windows-innosetup/script_x86.iss new file mode 100644 index 000000000..cf2660235 --- /dev/null +++ b/packaging/windows-innosetup/script_x86.iss @@ -0,0 +1,72 @@ +; Setup script for use with Inno Setup. + +[Setup] +AppName=Open Asset Import Library - SDK +AppVerName=Open Asset Import Library - SDK (v4.1.0) +DefaultDirName={pf}\Assimp +DefaultGroupName=Assimp +UninstallDisplayIcon={app}\bin\x86\assimp.exe +OutputDir=out +AppCopyright=Assimp Development Team +SetupIconFile=..\..\tools\shared\assimp_tools_icon.ico +WizardImageFile=compiler:WizModernImage-IS.BMP +WizardSmallImageFile=compiler:WizModernSmallImage-IS.BMP +LicenseFile=License.rtf +OutputBaseFileName=assimp-sdk-4.1.0-setup +VersionInfoVersion=4.1.0.0 +VersionInfoTextVersion=4.1.0 +VersionInfoCompany=Assimp Development Team +ArchitecturesInstallIn64BitMode=x64 + +[Types] +Name: "full"; Description: "Full installation" +Name: "compact"; Description: "Compact installation, no test models or language bindings" +Name: "custom"; Description: "Custom installation"; Flags: iscustom + +[Components] +Name: "main"; Description: "Main Files (32 and 64 Bit)"; Types: full compact custom; Flags: fixed +Name: "tools"; Description: "Asset Viewer & Command Line Tools (32 and 64 Bit)"; Types: full compact +Name: "help"; Description: "Help Files"; Types: full compact +Name: "samples"; Description: "Samples"; Types: full +Name: "test"; Description: "Test Models (BSD-licensed)"; Types: full +Name: "test_nonbsd"; Description: "Test Models (other (free) licenses)"; Types: full + +[Run] +Filename: "{app}\stub\vc_redist.x86.exe"; Parameters: "/qb"; StatusMsg: "Installing VS2017 redistributable package (32 Bit)"; Check: not IsWin64 + +[Files] +Source: "readme_installer.txt"; DestDir: "{app}"; Flags: isreadme + +; Installer stub +Source: "vc_redist.x86.exe"; DestDir: "{app}\stub\"; Check: not IsWin64 + +; Common stuff +Source: "..\..\CREDITS"; DestDir: "{app}" +Source: "..\..\LICENSE"; DestDir: "{app}" +Source: "..\..\README"; DestDir: "{app}" +Source: "WEB"; DestDir: "{app}" + +Source: "..\..\scripts\*"; DestDir: "{app}\scripts"; Flags: recursesubdirs + +; x86 binaries +Source: "..\..\bin\release\x86\assimp-vc141-mt.dll"; DestDir: "{app}\bin\x86" +Source: "..\..\bin\release\x86\assimp_viewer.exe"; DestDir: "{app}\bin\x86"; Components: tools +Source: "C:\Windows\SysWOW64\D3DCompiler_42.dll"; DestDir: "{app}\bin\x86"; Components: tools +Source: "C:\Windows\SysWOW64\D3DX9_42.dll"; DestDir: "{app}\bin\x86"; Components: tools +Source: "..\..\bin\release\x86\assimp.exe"; DestDir: "{app}\bin\x86"; Components: tools + + +; Import libraries +Source: "..\..\lib\release\x86\assimp.lib"; DestDir: "{app}\lib\x86" + +; Samples +Source: "..\..\samples\*"; DestDir: "{app}\samples"; Flags: recursesubdirs; Components: samples + +; Include files +Source: "..\..\include\*"; DestDir: "{app}\include"; Flags: recursesubdirs + +[Icons] +Name: "{group}\Assimp Manual"; Filename: "{app}\doc\AssimpDoc.chm" ; Components: help +Name: "{group}\Assimp Command Line Manual"; Filename: "{app}\doc\AssimpCmdDoc.chm"; Components: help +Name: "{group}\AssimpView"; Filename: "{app}\bin\x64\assimp_view.exe"; Components: tools; Check: IsWin64 +Name: "{group}\AssimpView"; Filename: "{app}\bin\x86\assimp_view.exe"; Components: tools; Check: not IsWin64 From 800616e83a7898f38ab851b4ac3144d4ad0e49d7 Mon Sep 17 00:00:00 2001 From: kimkulling Date: Tue, 30 Apr 2019 15:51:32 +0200 Subject: [PATCH 29/46] Fix if block --- appveyor.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index c8a5a27b9..851d9c096 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -56,8 +56,7 @@ after_build: - if "%APPVEYOR_BUILD_WORKER_IMAGE%"=="Visual Studio 2017" ( if "%platform%"=="x64" ( iscc packaging\windows-innosetup\script_x64.iss - ) - if "%platform%"!="x64" ( + ) else ( iscc packaging\windows-innosetup\script_x86.iss ) ) From a2ca6910726414c7e2eba18477e7b7e0db99b367 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Wed, 1 May 2019 11:09:20 +0200 Subject: [PATCH 30/46] Update script_x86.iss Fix invalid folder names. --- packaging/windows-innosetup/script_x86.iss | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packaging/windows-innosetup/script_x86.iss b/packaging/windows-innosetup/script_x86.iss index cf2660235..6dfba80b2 100644 --- a/packaging/windows-innosetup/script_x86.iss +++ b/packaging/windows-innosetup/script_x86.iss @@ -49,8 +49,8 @@ Source: "WEB"; DestDir: "{app}" Source: "..\..\scripts\*"; DestDir: "{app}\scripts"; Flags: recursesubdirs ; x86 binaries -Source: "..\..\bin\release\x86\assimp-vc141-mt.dll"; DestDir: "{app}\bin\x86" -Source: "..\..\bin\release\x86\assimp_viewer.exe"; DestDir: "{app}\bin\x86"; Components: tools +Source: "..\..\bin\release\assimp-vc140-mt.dll"; DestDir: "{app}\bin\x86" +Source: "..\..\bin\release\assimp_viewer.exe"; DestDir: "{app}\bin\x86"; Components: tools Source: "C:\Windows\SysWOW64\D3DCompiler_42.dll"; DestDir: "{app}\bin\x86"; Components: tools Source: "C:\Windows\SysWOW64\D3DX9_42.dll"; DestDir: "{app}\bin\x86"; Components: tools Source: "..\..\bin\release\x86\assimp.exe"; DestDir: "{app}\bin\x86"; Components: tools @@ -66,7 +66,7 @@ Source: "..\..\samples\*"; DestDir: "{app}\samples"; Flags: recursesubdirs; Comp Source: "..\..\include\*"; DestDir: "{app}\include"; Flags: recursesubdirs [Icons] -Name: "{group}\Assimp Manual"; Filename: "{app}\doc\AssimpDoc.chm" ; Components: help -Name: "{group}\Assimp Command Line Manual"; Filename: "{app}\doc\AssimpCmdDoc.chm"; Components: help -Name: "{group}\AssimpView"; Filename: "{app}\bin\x64\assimp_view.exe"; Components: tools; Check: IsWin64 -Name: "{group}\AssimpView"; Filename: "{app}\bin\x86\assimp_view.exe"; Components: tools; Check: not IsWin64 +; Name: "{group}\Assimp Manual"; Filename: "{app}\doc\AssimpDoc.chm" ; Components: help +; Name: "{group}\Assimp Command Line Manual"; Filename: "{app}\doc\AssimpCmdDoc.chm"; Components: help +; Name: "{group}\AssimpView"; Filename: "{app}\bin\x64\assimp_view.exe"; Components: tools; Check: IsWin64 +; Name: "{group}\AssimpView"; Filename: "{app}\bin\x86\assimp_view.exe"; Components: tools; Check: not IsWin64 From 6ff7635338e35ce54ced3950ade4f5271976d982 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Wed, 1 May 2019 11:10:16 +0200 Subject: [PATCH 31/46] Update script_x64.iss put icons into comments. --- packaging/windows-innosetup/script_x64.iss | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packaging/windows-innosetup/script_x64.iss b/packaging/windows-innosetup/script_x64.iss index 1738fd4b1..57182fcf5 100644 --- a/packaging/windows-innosetup/script_x64.iss +++ b/packaging/windows-innosetup/script_x64.iss @@ -65,7 +65,7 @@ Source: "..\..\samples\*"; DestDir: "{app}\samples"; Flags: recursesubdirs; Comp Source: "..\..\include\*"; DestDir: "{app}\include"; Flags: recursesubdirs [Icons] -Name: "{group}\Assimp Manual"; Filename: "{app}\doc\AssimpDoc.chm" ; Components: help -Name: "{group}\Assimp Command Line Manual"; Filename: "{app}\doc\AssimpCmdDoc.chm"; Components: help -Name: "{group}\AssimpView"; Filename: "{app}\bin\x64\assimp_view.exe"; Components: tools; Check: IsWin64 -Name: "{group}\AssimpView"; Filename: "{app}\bin\x86\assimp_view.exe"; Components: tools; Check: not IsWin64 +; Name: "{group}\Assimp Manual"; Filename: "{app}\doc\AssimpDoc.chm" ; Components: help +; Name: "{group}\Assimp Command Line Manual"; Filename: "{app}\doc\AssimpCmdDoc.chm"; Components: help +; Name: "{group}\AssimpView"; Filename: "{app}\bin\x64\assimp_view.exe"; Components: tools; Check: IsWin64 +; Name: "{group}\AssimpView"; Filename: "{app}\bin\x86\assimp_view.exe"; Components: tools; Check: not IsWin64 From 84e7f542fba2d788490584e3af37e3f4f762f24e Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Wed, 1 May 2019 12:10:52 +0200 Subject: [PATCH 32/46] Update script_x86.iss Fix version of dll. --- packaging/windows-innosetup/script_x86.iss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/windows-innosetup/script_x86.iss b/packaging/windows-innosetup/script_x86.iss index 6dfba80b2..8b8278c58 100644 --- a/packaging/windows-innosetup/script_x86.iss +++ b/packaging/windows-innosetup/script_x86.iss @@ -49,7 +49,7 @@ Source: "WEB"; DestDir: "{app}" Source: "..\..\scripts\*"; DestDir: "{app}\scripts"; Flags: recursesubdirs ; x86 binaries -Source: "..\..\bin\release\assimp-vc140-mt.dll"; DestDir: "{app}\bin\x86" +Source: "..\..\bin\release\assimp-vc141-mt.dll"; DestDir: "{app}\bin\x86" Source: "..\..\bin\release\assimp_viewer.exe"; DestDir: "{app}\bin\x86"; Components: tools Source: "C:\Windows\SysWOW64\D3DCompiler_42.dll"; DestDir: "{app}\bin\x86"; Components: tools Source: "C:\Windows\SysWOW64\D3DX9_42.dll"; DestDir: "{app}\bin\x86"; Components: tools From 615a78e38f80f8baddebb78e408b6370dc137dff Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Wed, 1 May 2019 14:41:51 +0200 Subject: [PATCH 33/46] Update script_x86.iss Fix wrong folder for assimp.exe --- packaging/windows-innosetup/script_x86.iss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/windows-innosetup/script_x86.iss b/packaging/windows-innosetup/script_x86.iss index 8b8278c58..1ecd13c7f 100644 --- a/packaging/windows-innosetup/script_x86.iss +++ b/packaging/windows-innosetup/script_x86.iss @@ -53,7 +53,7 @@ Source: "..\..\bin\release\assimp-vc141-mt.dll"; DestDir: "{app}\bin\x86" Source: "..\..\bin\release\assimp_viewer.exe"; DestDir: "{app}\bin\x86"; Components: tools Source: "C:\Windows\SysWOW64\D3DCompiler_42.dll"; DestDir: "{app}\bin\x86"; Components: tools Source: "C:\Windows\SysWOW64\D3DX9_42.dll"; DestDir: "{app}\bin\x86"; Components: tools -Source: "..\..\bin\release\x86\assimp.exe"; DestDir: "{app}\bin\x86"; Components: tools +Source: "..\..\bin\release\assimp.exe"; DestDir: "{app}\bin\x86"; Components: tools ; Import libraries From 3ee85a8cc8d117afd3987d5d9dbb24340808eeb1 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Wed, 1 May 2019 15:13:56 +0200 Subject: [PATCH 34/46] Update script_x86.iss Fix another wrong folder. --- packaging/windows-innosetup/script_x86.iss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/windows-innosetup/script_x86.iss b/packaging/windows-innosetup/script_x86.iss index 1ecd13c7f..f1999860e 100644 --- a/packaging/windows-innosetup/script_x86.iss +++ b/packaging/windows-innosetup/script_x86.iss @@ -57,7 +57,7 @@ Source: "..\..\bin\release\assimp.exe"; DestDir: "{app}\bin\x86"; Comp ; Import libraries -Source: "..\..\lib\release\x86\assimp.lib"; DestDir: "{app}\lib\x86" +Source: "..\..\lib\release\assimp.lib"; DestDir: "{app}\lib\x86" ; Samples Source: "..\..\samples\*"; DestDir: "{app}\samples"; Flags: recursesubdirs; Components: samples From c93886e87bcc315837b312d858854d422aad5a81 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Wed, 1 May 2019 15:52:27 +0200 Subject: [PATCH 35/46] Update script_x64.iss Fix eport lib name. --- packaging/windows-innosetup/script_x64.iss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/windows-innosetup/script_x64.iss b/packaging/windows-innosetup/script_x64.iss index 57182fcf5..cd4837f0a 100644 --- a/packaging/windows-innosetup/script_x64.iss +++ b/packaging/windows-innosetup/script_x64.iss @@ -56,7 +56,7 @@ Source: "C:\Windows\SysWOW64\D3DX9_42.dll"; DestDir: "{app}\bin\x64"; Dest Source: "..\..\bin\release\assimp.exe"; DestDir: "{app}\bin\x64"; Components: tools ; Import libraries -Source: "..\..\lib\release\assimp-vc140-mt.lib"; DestDir: "{app}\lib\x64" +Source: "..\..\lib\release\assimp-vc141-mt.lib"; DestDir: "{app}\lib\x64" ; Samples Source: "..\..\samples\*"; DestDir: "{app}\samples"; Flags: recursesubdirs; Components: samples From d9cfc48a665adaba251dcdf1d0fa145388812ec7 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Wed, 1 May 2019 15:53:04 +0200 Subject: [PATCH 36/46] Update script_x86.iss fix export lib name --- packaging/windows-innosetup/script_x86.iss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/windows-innosetup/script_x86.iss b/packaging/windows-innosetup/script_x86.iss index f1999860e..9aca78550 100644 --- a/packaging/windows-innosetup/script_x86.iss +++ b/packaging/windows-innosetup/script_x86.iss @@ -57,7 +57,7 @@ Source: "..\..\bin\release\assimp.exe"; DestDir: "{app}\bin\x86"; Comp ; Import libraries -Source: "..\..\lib\release\assimp.lib"; DestDir: "{app}\lib\x86" +Source: "..\..\lib\release\assimp-vc141-mt.lib"; DestDir: "{app}\lib\x86" ; Samples Source: "..\..\samples\*"; DestDir: "{app}\samples"; Flags: recursesubdirs; Components: samples From fcff12b219963af6012f948edee9f6200afa84f2 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Sun, 5 May 2019 13:39:10 +0200 Subject: [PATCH 37/46] closes https://github.com/assimp/assimp/issues/2054: make empty bone validation optional. --- code/ASELoader.cpp | 2 +- code/ASEParser.cpp | 2 +- code/ASEParser.h | 10 +++++----- code/FBXConverter.cpp | 21 ++++++++++----------- code/FBXConverter.h | 4 +++- code/FBXImportSettings.h | 34 ++++++++++++++++++++-------------- code/FBXImporter.cpp | 3 ++- code/ValidateDataStructure.cpp | 26 ++++++++++---------------- 8 files changed, 52 insertions(+), 50 deletions(-) diff --git a/code/ASELoader.cpp b/code/ASELoader.cpp index 321e8548a..556e8ce66 100644 --- a/code/ASELoader.cpp +++ b/code/ASELoader.cpp @@ -1299,7 +1299,7 @@ void ASEImporter::BuildMaterialIndices() } } - // Dekete our temporary array + // Delete our temporary array delete[] pcIntMaterials; } diff --git a/code/ASEParser.cpp b/code/ASEParser.cpp index e8d6febc2..f21f49eeb 100644 --- a/code/ASEParser.cpp +++ b/code/ASEParser.cpp @@ -45,7 +45,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * @brief Implementation of the ASE parser class */ - +#pragma once #ifndef ASSIMP_BUILD_NO_ASE_IMPORTER #ifndef ASSIMP_BUILD_NO_3DS_IMPORTER diff --git a/code/ASEParser.h b/code/ASEParser.h index b8c820632..0cfd5313c 100644 --- a/code/ASEParser.h +++ b/code/ASEParser.h @@ -188,10 +188,11 @@ struct Animation { } mRotationType, mScalingType, mPositionType; Animation() AI_NO_EXCEPT - : mRotationType (TRACK) - , mScalingType (TRACK) - , mPositionType (TRACK) - {} + : mRotationType (TRACK) + , mScalingType (TRACK) + , mPositionType (TRACK) { + // empty + } //! List of track rotation keyframes std::vector< aiQuatKey > akeyRotations; @@ -243,7 +244,6 @@ struct BaseNode { mTargetPosition.x = qnan; } - //! Name of the mesh std::string mName; diff --git a/code/FBXConverter.cpp b/code/FBXConverter.cpp index 0abfdafdc..8d7c087ca 100644 --- a/code/FBXConverter.cpp +++ b/code/FBXConverter.cpp @@ -76,7 +76,7 @@ namespace Assimp { #define CONVERT_FBX_TIME(time) static_cast(time) / 46186158000L - FBXConverter::FBXConverter(aiScene* out, const Document& doc) + FBXConverter::FBXConverter(aiScene* out, const Document& doc, bool removeEmptyBones) : defaultMaterialIndex() , lights() , cameras() @@ -89,7 +89,8 @@ namespace Assimp { , mNodeNames() , anim_fps() , out(out) - , doc(doc) { + , doc(doc) + , mRemoveEmptyBones( removeEmptyBones ) { // animations need to be converted first since this will // populate the node_anim_chain_bits map, which is needed // to determine which nodes need to be generated. @@ -1407,9 +1408,9 @@ namespace Assimp { const WeightIndexArray& indices = cluster->GetIndices(); - if (indices.empty()) { + /*if (indices.empty()) { continue; - } + }*/ const MatIndexArray& mats = geo.GetMaterialIndices(); @@ -1439,13 +1440,11 @@ namespace Assimp { if (index_out_indices.back() == no_index_sentinel) { index_out_indices.back() = out_indices.size(); - } if (no_mat_check) { out_indices.push_back(out_idx[i]); - } - else { + } else { // this extra lookup is in O(logn), so the entire algorithm becomes O(nlogn) const std::vector::iterator it = std::lower_bound( outputVertStartIndices->begin(), @@ -1465,10 +1464,10 @@ namespace Assimp { // if we found at least one, generate the output bones // XXX this could be heavily simplified by collecting the bone // data in a single step. - if (ok) { + //if (ok) { ConvertCluster(bones, model, *cluster, out_indices, index_out_indices, count_out_indices, node_global_transform); - } + //} } } catch (std::exception&) { @@ -3525,9 +3524,9 @@ void FBXConverter::SetShadingPropertiesRaw(aiMaterial* out_mat, const PropertyTa } // ------------------------------------------------------------------------------------------------ - void ConvertToAssimpScene(aiScene* out, const Document& doc) + void ConvertToAssimpScene(aiScene* out, const Document& doc, bool removeEmptyBones) { - FBXConverter converter(out, doc); + FBXConverter converter(out, doc, removeEmptyBones); } } // !FBX diff --git a/code/FBXConverter.h b/code/FBXConverter.h index 50637468b..fe4e916be 100644 --- a/code/FBXConverter.h +++ b/code/FBXConverter.h @@ -112,7 +112,7 @@ public: }; public: - FBXConverter(aiScene* out, const Document& doc); + FBXConverter(aiScene* out, const Document& doc, bool removeEmptyBones ); ~FBXConverter(); private: @@ -453,6 +453,8 @@ private: aiScene* const out; const FBX::Document& doc; + + bool mRemoveEmptyBones; }; } diff --git a/code/FBXImportSettings.h b/code/FBXImportSettings.h index d5e1c2060..eaf127382 100644 --- a/code/FBXImportSettings.h +++ b/code/FBXImportSettings.h @@ -53,19 +53,21 @@ namespace FBX { struct ImportSettings { ImportSettings() - : strictMode(true) - , readAllLayers(true) - , readAllMaterials(false) - , readMaterials(true) - , readTextures(true) - , readCameras(true) - , readLights(true) - , readAnimations(true) - , readWeights(true) - , preservePivots(true) - , optimizeEmptyAnimationCurves(true) - , useLegacyEmbeddedTextureNaming(false) - {} + : strictMode(true) + , readAllLayers(true) + , readAllMaterials(false) + , readMaterials(true) + , readTextures(true) + , readCameras(true) + , readLights(true) + , readAnimations(true) + , readWeights(true) + , preservePivots(true) + , optimizeEmptyAnimationCurves(true) + , useLegacyEmbeddedTextureNaming(false) + , removeEmptyBones( true ) { + // empty + } /** enable strict mode: @@ -141,8 +143,12 @@ struct ImportSettings bool optimizeEmptyAnimationCurves; /** use legacy naming for embedded textures eg: (*0, *1, *2) - **/ + */ bool useLegacyEmbeddedTextureNaming; + + /** Empty bones shall be removed + */ + bool removeEmptyBones; }; diff --git a/code/FBXImporter.cpp b/code/FBXImporter.cpp index 2cc8bffc2..60a19223c 100644 --- a/code/FBXImporter.cpp +++ b/code/FBXImporter.cpp @@ -140,6 +140,7 @@ void FBXImporter::SetupProperties(const Importer* pImp) settings.preservePivots = pImp->GetPropertyBool(AI_CONFIG_IMPORT_FBX_PRESERVE_PIVOTS, true); settings.optimizeEmptyAnimationCurves = pImp->GetPropertyBool(AI_CONFIG_IMPORT_FBX_OPTIMIZE_EMPTY_ANIMATION_CURVES, true); settings.useLegacyEmbeddedTextureNaming = pImp->GetPropertyBool(AI_CONFIG_IMPORT_FBX_EMBEDDED_TEXTURES_LEGACY_NAMING, false); + settings.removeEmptyBones = pImp->GetPropertyBool(AI_CONFIG_IMPORT_REMOVE_EMPTY_BONES, true); } // ------------------------------------------------------------------------------------------------ @@ -184,7 +185,7 @@ void FBXImporter::InternReadFile( const std::string& pFile, aiScene* pScene, IOS Document doc(parser,settings); // convert the FBX DOM to aiScene - ConvertToAssimpScene(pScene,doc); + ConvertToAssimpScene(pScene,doc, settings.removeEmptyBones); std::for_each(tokens.begin(),tokens.end(),Util::delete_fun()); } diff --git a/code/ValidateDataStructure.cpp b/code/ValidateDataStructure.cpp index 657b0361b..58f700b0e 100644 --- a/code/ValidateDataStructure.cpp +++ b/code/ValidateDataStructure.cpp @@ -46,8 +46,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * the data structure returned by Assimp. */ - - // internal headers #include "ValidateDataStructure.h" #include @@ -110,8 +108,8 @@ void ValidateDSProcess::ReportWarning(const char* msg,...) } // ------------------------------------------------------------------------------------------------ -inline int HasNameMatch(const aiString& in, aiNode* node) -{ +inline +int HasNameMatch(const aiString& in, aiNode* node) { int result = (node->mName == in ? 1 : 0 ); for (unsigned int i = 0; i < node->mNumChildren;++i) { result += HasNameMatch(in,node->mChildren[i]); @@ -121,9 +119,8 @@ inline int HasNameMatch(const aiString& in, aiNode* node) // ------------------------------------------------------------------------------------------------ template -inline void ValidateDSProcess::DoValidation(T** parray, unsigned int size, - const char* firstName, const char* secondName) -{ +inline +void ValidateDSProcess::DoValidation(T** parray, unsigned int size, const char* firstName, const char* secondName) { // validate all entries if (size) { @@ -516,13 +513,12 @@ void ValidateDSProcess::Validate( const aiMesh* pMesh) } // ------------------------------------------------------------------------------------------------ -void ValidateDSProcess::Validate( const aiMesh* pMesh, - const aiBone* pBone,float* afSum) -{ +void ValidateDSProcess::Validate( const aiMesh* pMesh, const aiBone* pBone,float* afSum) { this->Validate(&pBone->mName); if (!pBone->mNumWeights) { - ReportError("aiBone::mNumWeights is zero"); + // ReportError("aiBone::mNumWeights is zero"); + } // check whether all vertices affected by this bone are valid @@ -563,9 +559,6 @@ void ValidateDSProcess::Validate( const aiAnimation* pAnimation) else { ReportError("aiAnimation::mNumChannels is 0. At least one node animation channel must be there."); } - - // Animation duration is allowed to be zero in cases where the anim contains only a single key frame. - // if (!pAnimation->mDuration)this->ReportError("aiAnimation::mDuration is zero"); } // ------------------------------------------------------------------------------------------------ @@ -746,8 +739,9 @@ void ValidateDSProcess::Validate( const aiMaterial* pMaterial) "AI_MATKEY_SHININESS_STRENGTH key is 0.0"); } break; - default: ; - }; + default: + break; + } } if (AI_SUCCESS == aiGetMaterialFloat( pMaterial,AI_MATKEY_OPACITY,&fTemp) && (!fTemp || fTemp > 1.01)) { From 69ece762d13cb38be2147399d5d56d74aa0488f1 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Sun, 5 May 2019 16:00:57 +0200 Subject: [PATCH 38/46] fix the build: remove errorenous pragma statement. --- code/ASEParser.cpp | 1 - code/FBXConverter.cpp | 15 +++++++++------ code/ValidateDataStructure.cpp | 11 +++++------ 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/code/ASEParser.cpp b/code/ASEParser.cpp index f21f49eeb..14b962320 100644 --- a/code/ASEParser.cpp +++ b/code/ASEParser.cpp @@ -45,7 +45,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * @brief Implementation of the ASE parser class */ -#pragma once #ifndef ASSIMP_BUILD_NO_ASE_IMPORTER #ifndef ASSIMP_BUILD_NO_3DS_IMPORTER diff --git a/code/FBXConverter.cpp b/code/FBXConverter.cpp index 8d7c087ca..76b6c6b4e 100644 --- a/code/FBXConverter.cpp +++ b/code/FBXConverter.cpp @@ -388,6 +388,7 @@ namespace Assimp { break; default: ai_assert(false); + break; } } @@ -978,7 +979,9 @@ namespace Assimp { unsigned int epcount = 0; for (unsigned i = 0; i < indices.size(); i++) { - if (indices[i] < 0) epcount++; + if (indices[i] < 0) { + epcount++; + } } unsigned int pcount = static_cast( indices.size() ); unsigned int scount = out_mesh->mNumFaces = pcount - epcount; @@ -1408,9 +1411,9 @@ namespace Assimp { const WeightIndexArray& indices = cluster->GetIndices(); - /*if (indices.empty()) { + if (indices.empty() && mRemoveEmptyBones ) { continue; - }*/ + } const MatIndexArray& mats = geo.GetMaterialIndices(); @@ -1460,14 +1463,14 @@ namespace Assimp { } } } - + // if we found at least one, generate the output bones // XXX this could be heavily simplified by collecting the bone // data in a single step. - //if (ok) { + if (ok && mRemoveEmptyBones) { ConvertCluster(bones, model, *cluster, out_indices, index_out_indices, count_out_indices, node_global_transform); - //} + } } } catch (std::exception&) { diff --git a/code/ValidateDataStructure.cpp b/code/ValidateDataStructure.cpp index 58f700b0e..712fd6943 100644 --- a/code/ValidateDataStructure.cpp +++ b/code/ValidateDataStructure.cpp @@ -178,7 +178,8 @@ inline void ValidateDSProcess::DoValidationEx(T** parray, unsigned int size, // ------------------------------------------------------------------------------------------------ template inline -void ValidateDSProcess::DoValidationWithNameCheck(T** array, unsigned int size, const char* firstName, const char* secondName) { +void ValidateDSProcess::DoValidationWithNameCheck(T** array, unsigned int size, const char* firstName, + const char* secondName) { // validate all entries DoValidationEx(array,size,firstName,secondName); @@ -198,9 +199,8 @@ void ValidateDSProcess::DoValidationWithNameCheck(T** array, unsigned int size, // ------------------------------------------------------------------------------------------------ // Executes the post processing step on the given imported data. -void ValidateDSProcess::Execute( aiScene* pScene) -{ - this->mScene = pScene; +void ValidateDSProcess::Execute( aiScene* pScene) { + mScene = pScene; ASSIMP_LOG_DEBUG("ValidateDataStructureProcess begin"); // validate the node graph of the scene @@ -517,8 +517,7 @@ void ValidateDSProcess::Validate( const aiMesh* pMesh, const aiBone* pBone,float this->Validate(&pBone->mName); if (!pBone->mNumWeights) { - // ReportError("aiBone::mNumWeights is zero"); - + //ReportError("aiBone::mNumWeights is zero"); } // check whether all vertices affected by this bone are valid From 1324409c7b50ba8afa686facdb2b9468bd606bb5 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Sun, 5 May 2019 16:23:42 +0200 Subject: [PATCH 39/46] fix build: fix wrong function prototype. --- code/FBXConverter.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/code/FBXConverter.h b/code/FBXConverter.h index fe4e916be..a77cb4310 100644 --- a/code/FBXConverter.h +++ b/code/FBXConverter.h @@ -79,9 +79,10 @@ class Document; /** * Convert a FBX #Document to #aiScene * @param out Empty scene to be populated - * @param doc Parsed FBX document + * @param doc Parsed FBX document + * @param removeEmptyBones Will remove bones, which do not have any references to vertices. */ -void ConvertToAssimpScene(aiScene* out, const Document& doc); +void ConvertToAssimpScene(aiScene* out, const Document& doc, bool removeEmptyBones ); /** Dummy class to encapsulate the conversion process */ class FBXConverter { From eb1a2586c3e4ee5097b207b07feb5cfb61cd05bf Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Sun, 5 May 2019 17:44:15 +0200 Subject: [PATCH 40/46] add missing define in config.h.in --- include/assimp/config.h.in | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/include/assimp/config.h.in b/include/assimp/config.h.in index a37ff0b8c..50a5512e2 100644 --- a/include/assimp/config.h.in +++ b/include/assimp/config.h.in @@ -657,7 +657,11 @@ enum aiComponent */ #define AI_CONFIG_IMPORT_FBX_EMBEDDED_TEXTURES_LEGACY_NAMING \ "AI_CONFIG_IMPORT_FBX_EMBEDDED_TEXTURES_LEGACY_NAMING" - + +// --------------------------------------------------------------------------- +#define AI_CONFIG_IMPORT_REMOVE_EMPTY_BONES \ + "AI_CONFIG_IMPORT_REMOVE_EMPTY_BONES" + // --------------------------------------------------------------------------- /** @brief Set the vertex animation keyframe to be imported * From 1203d4658c157a188b1ba78547f6d503069a6798 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Mon, 6 May 2019 18:44:30 +0200 Subject: [PATCH 41/46] Add missing doc. --- include/assimp/config.h.in | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/include/assimp/config.h.in b/include/assimp/config.h.in index 50a5512e2..ba027cf40 100644 --- a/include/assimp/config.h.in +++ b/include/assimp/config.h.in @@ -651,14 +651,18 @@ enum aiComponent // --------------------------------------------------------------------------- /** @brief Set whether the fbx importer will use the legacy embedded texture naming. -* -* The default value is false (0) -* Property type: bool -*/ + * + * The default value is false (0) + * Property type: bool + */ #define AI_CONFIG_IMPORT_FBX_EMBEDDED_TEXTURES_LEGACY_NAMING \ "AI_CONFIG_IMPORT_FBX_EMBEDDED_TEXTURES_LEGACY_NAMING" // --------------------------------------------------------------------------- +/** @brief Set wether the FBX importer shall not remove empty bones. + * + * Empty bone are often used to define connections for other models. + * #define AI_CONFIG_IMPORT_REMOVE_EMPTY_BONES \ "AI_CONFIG_IMPORT_REMOVE_EMPTY_BONES" From 02324123e54bd967c20070f99fcff58a80574003 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Mon, 6 May 2019 19:15:28 +0200 Subject: [PATCH 42/46] Fix typo in comment. --- include/assimp/config.h.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/assimp/config.h.in b/include/assimp/config.h.in index ba027cf40..07be7cdad 100644 --- a/include/assimp/config.h.in +++ b/include/assimp/config.h.in @@ -662,7 +662,7 @@ enum aiComponent /** @brief Set wether the FBX importer shall not remove empty bones. * * Empty bone are often used to define connections for other models. - * + */ #define AI_CONFIG_IMPORT_REMOVE_EMPTY_BONES \ "AI_CONFIG_IMPORT_REMOVE_EMPTY_BONES" From 4a9cd0845171070fb971eb90c03f7ca6b8234039 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Mon, 6 May 2019 20:51:04 +0200 Subject: [PATCH 43/46] Prepaation for conversion. --- code/FBXConverter.cpp | 7 ++++++- code/FBXConverter.h | 17 +++++++++++++++++ code/FBXMeshGeometry.cpp | 4 ++-- code/FBXParser.cpp | 2 +- 4 files changed, 26 insertions(+), 4 deletions(-) diff --git a/code/FBXConverter.cpp b/code/FBXConverter.cpp index 76b6c6b4e..ab600e53d 100644 --- a/code/FBXConverter.cpp +++ b/code/FBXConverter.cpp @@ -90,7 +90,8 @@ namespace Assimp { , anim_fps() , out(out) , doc(doc) - , mRemoveEmptyBones( removeEmptyBones ) { + , mRemoveEmptyBones( removeEmptyBones ) + , mCurrentUnit( FbxUnit::Undefined ) { // animations need to be converted first since this will // populate the node_anim_chain_bits map, which is needed // to determine which nodes need to be generated. @@ -3474,6 +3475,10 @@ void FBXConverter::SetShadingPropertiesRaw(aiMaterial* out_mat, const PropertyTa out->mMetaData->Set(14, "CustomFrameRate", doc.GlobalSettings().CustomFrameRate()); } + void FBXConverter::ConvertToUnitScale(FbxUnit unit) { + + } + void FBXConverter::TransferDataToScene() { ai_assert(!out->mMeshes); diff --git a/code/FBXConverter.h b/code/FBXConverter.h index a77cb4310..75f24713e 100644 --- a/code/FBXConverter.h +++ b/code/FBXConverter.h @@ -415,6 +415,21 @@ private: void ConvertGlobalSettings(); + enum class FbxUnit { + cm = 0, + m, + km, + inch, + foot, + mile, + yard, + NumUnits, + + Undefined + }; + + void ConvertToUnitScale(FbxUnit unit); + // ------------------------------------------------------------------------------------------------ // copy generated meshes, animations, lights, cameras and textures to the output scene void TransferDataToScene(); @@ -456,6 +471,8 @@ private: const FBX::Document& doc; bool mRemoveEmptyBones; + + FbxUnit mCurrentUnit; }; } diff --git a/code/FBXMeshGeometry.cpp b/code/FBXMeshGeometry.cpp index 2debfa651..468ba1c2e 100644 --- a/code/FBXMeshGeometry.cpp +++ b/code/FBXMeshGeometry.cpp @@ -568,8 +568,8 @@ void MeshGeometry::ReadVertexDataColors(std::vector& colors_out, cons } // ------------------------------------------------------------------------------------------------ -static const std::string TangentIndexToken = "TangentIndex"; -static const std::string TangentsIndexToken = "TangentsIndex"; +static const char *TangentIndexToken = "TangentIndex"; +static const char *TangentsIndexToken = "TangentsIndex"; void MeshGeometry::ReadVertexDataTangents(std::vector& tangents_out, const Scope& source, const std::string& MappingInformationType, diff --git a/code/FBXParser.cpp b/code/FBXParser.cpp index b255c4734..fe63866a0 100644 --- a/code/FBXParser.cpp +++ b/code/FBXParser.cpp @@ -117,7 +117,7 @@ namespace FBX { Element::Element(const Token& key_token, Parser& parser) : key_token(key_token) { - TokenPtr n = NULL; + TokenPtr n = nullptr; do { n = parser.AdvanceToNextToken(); if(!n) { From 4155f005bee4a06c4bb724d748e9a3c69166d1c8 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Mon, 6 May 2019 21:21:58 +0200 Subject: [PATCH 44/46] Add implementation to convert from cm to m. --- code/FBXConverter.cpp | 44 +++++++++++++++++++++++++++++++++++--- code/FBXConverter.h | 6 ++---- code/FBXImportSettings.h | 7 +++++- code/FBXImporter.cpp | 1 + code/FBXMeshGeometry.cpp | 2 +- include/assimp/config.h.in | 9 +++++++- 6 files changed, 59 insertions(+), 10 deletions(-) diff --git a/code/FBXConverter.cpp b/code/FBXConverter.cpp index ab600e53d..bd8347408 100644 --- a/code/FBXConverter.cpp +++ b/code/FBXConverter.cpp @@ -91,7 +91,7 @@ namespace Assimp { , out(out) , doc(doc) , mRemoveEmptyBones( removeEmptyBones ) - , mCurrentUnit( FbxUnit::Undefined ) { + , mCurrentUnit(FbxUnit::cm) { // animations need to be converted first since this will // populate the node_anim_chain_bits map, which is needed // to determine which nodes need to be generated. @@ -119,6 +119,7 @@ namespace Assimp { ConvertGlobalSettings(); TransferDataToScene(); + ConvertToUnitScale(doc.GlobalSettings().UnitScaleFactor()); // if we didn't read any meshes set the AI_SCENE_FLAGS_INCOMPLETE // to make sure the scene passes assimp's validation. FBX files @@ -3410,8 +3411,9 @@ void FBXConverter::SetShadingPropertiesRaw(aiMaterial* out_mat, const PropertyTa na->mNumScalingKeys = static_cast(keys.size()); na->mScalingKeys = new aiVectorKey[keys.size()]; - if (keys.size() > 0) + if (keys.size() > 0) { InterpolateKeys(na->mScalingKeys, keys, inputs, aiVector3D(1.0f, 1.0f, 1.0f), maxTime, minTime); + } } void FBXConverter::ConvertTranslationKeys(aiNodeAnim* na, const std::vector& nodes, @@ -3475,8 +3477,44 @@ void FBXConverter::SetShadingPropertiesRaw(aiMaterial* out_mat, const PropertyTa out->mMetaData->Set(14, "CustomFrameRate", doc.GlobalSettings().CustomFrameRate()); } - void FBXConverter::ConvertToUnitScale(FbxUnit unit) { + void FBXConverter::ConvertToUnitScale( FbxUnit unit ) { + if (mCurrentUnit == unit) { + return; + } + ai_real scale = 1.0; + if (mCurrentUnit == FbxUnit::cm) { + if (unit == FbxUnit::m) { + scale = (ai_real)0.01; + } else if (unit == FbxUnit::km) { + scale = (ai_real)0.00001; + } + } else if (mCurrentUnit == FbxUnit::m) { + if (unit == FbxUnit::cm) { + scale = (ai_real)100.0; + } else if (unit == FbxUnit::km) { + scale = (ai_real)0.001; + } + } else if (mCurrentUnit == FbxUnit::km) { + if (unit == FbxUnit::cm) { + scale = (ai_real)100000.0; + } else if (unit == FbxUnit::m) { + scale = (ai_real)1000.0; + } + } + + for (auto mesh : meshes) { + if (nullptr == mesh) { + continue; + } + + if (mesh->HasPositions()) { + for (unsigned int i = 0; i < mesh->mNumVertices; ++i) { + aiVector3D &pos = mesh->mVertices[i]; + pos *= scale; + } + } + } } void FBXConverter::TransferDataToScene() diff --git a/code/FBXConverter.h b/code/FBXConverter.h index 75f24713e..dbbeee158 100644 --- a/code/FBXConverter.h +++ b/code/FBXConverter.h @@ -419,15 +419,13 @@ private: cm = 0, m, km, - inch, - foot, - mile, - yard, NumUnits, Undefined }; + // ------------------------------------------------------------------------------------------------ + // Will perform the conversion from a given unit to the requested unit. void ConvertToUnitScale(FbxUnit unit); // ------------------------------------------------------------------------------------------------ diff --git a/code/FBXImportSettings.h b/code/FBXImportSettings.h index eaf127382..1a4c80f8b 100644 --- a/code/FBXImportSettings.h +++ b/code/FBXImportSettings.h @@ -65,7 +65,8 @@ struct ImportSettings , preservePivots(true) , optimizeEmptyAnimationCurves(true) , useLegacyEmbeddedTextureNaming(false) - , removeEmptyBones( true ) { + , removeEmptyBones( true ) + , convertToMeters( false ) { // empty } @@ -149,6 +150,10 @@ struct ImportSettings /** Empty bones shall be removed */ bool removeEmptyBones; + + /** Set to true to perform a conversion from cm to meter after the import + */ + bool convertToMeters; }; diff --git a/code/FBXImporter.cpp b/code/FBXImporter.cpp index 60a19223c..4f75b9c2e 100644 --- a/code/FBXImporter.cpp +++ b/code/FBXImporter.cpp @@ -141,6 +141,7 @@ void FBXImporter::SetupProperties(const Importer* pImp) settings.optimizeEmptyAnimationCurves = pImp->GetPropertyBool(AI_CONFIG_IMPORT_FBX_OPTIMIZE_EMPTY_ANIMATION_CURVES, true); settings.useLegacyEmbeddedTextureNaming = pImp->GetPropertyBool(AI_CONFIG_IMPORT_FBX_EMBEDDED_TEXTURES_LEGACY_NAMING, false); settings.removeEmptyBones = pImp->GetPropertyBool(AI_CONFIG_IMPORT_REMOVE_EMPTY_BONES, true); + settings.convertToMeters = pImpl->GetPropertyBool(AI_CONFIG_FBX_CONVERT_TO_M, false); } // ------------------------------------------------------------------------------------------------ diff --git a/code/FBXMeshGeometry.cpp b/code/FBXMeshGeometry.cpp index 468ba1c2e..44a0264ca 100644 --- a/code/FBXMeshGeometry.cpp +++ b/code/FBXMeshGeometry.cpp @@ -576,7 +576,7 @@ void MeshGeometry::ReadVertexDataTangents(std::vector& tangents_out, const std::string& ReferenceInformationType) { const char * str = source.Elements().count( "Tangents" ) > 0 ? "Tangents" : "Tangent"; - const char * strIdx = source.Elements().count( "Tangents" ) > 0 ? TangentsIndexToken.c_str() : TangentIndexToken.c_str(); + const char * strIdx = source.Elements().count( "Tangents" ) > 0 ? TangentsIndexToken : TangentIndexToken; ResolveVertexDataArray(tangents_out,source,MappingInformationType,ReferenceInformationType, str, strIdx, diff --git a/include/assimp/config.h.in b/include/assimp/config.h.in index 07be7cdad..c42aa63da 100644 --- a/include/assimp/config.h.in +++ b/include/assimp/config.h.in @@ -659,13 +659,20 @@ enum aiComponent "AI_CONFIG_IMPORT_FBX_EMBEDDED_TEXTURES_LEGACY_NAMING" // --------------------------------------------------------------------------- -/** @brief Set wether the FBX importer shall not remove empty bones. +/** @brief Set wether the importer shall not remove empty bones. * * Empty bone are often used to define connections for other models. */ #define AI_CONFIG_IMPORT_REMOVE_EMPTY_BONES \ "AI_CONFIG_IMPORT_REMOVE_EMPTY_BONES" + +// --------------------------------------------------------------------------- +/** @brief Set wether the FBX importer shall convert the unit from cm to m. + */ +#define AI_CONFIG_FBX_CONVERT_TO_M \ + "AI_CONFIG_FBX_CONVERT_TO_M" + // --------------------------------------------------------------------------- /** @brief Set the vertex animation keyframe to be imported * From e917b288a160e466288982cb0e148d5ac7ce6945 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Mon, 6 May 2019 21:38:45 +0200 Subject: [PATCH 45/46] fix a typo. --- code/FBXImporter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/FBXImporter.cpp b/code/FBXImporter.cpp index 4f75b9c2e..339a9421a 100644 --- a/code/FBXImporter.cpp +++ b/code/FBXImporter.cpp @@ -141,7 +141,7 @@ void FBXImporter::SetupProperties(const Importer* pImp) settings.optimizeEmptyAnimationCurves = pImp->GetPropertyBool(AI_CONFIG_IMPORT_FBX_OPTIMIZE_EMPTY_ANIMATION_CURVES, true); settings.useLegacyEmbeddedTextureNaming = pImp->GetPropertyBool(AI_CONFIG_IMPORT_FBX_EMBEDDED_TEXTURES_LEGACY_NAMING, false); settings.removeEmptyBones = pImp->GetPropertyBool(AI_CONFIG_IMPORT_REMOVE_EMPTY_BONES, true); - settings.convertToMeters = pImpl->GetPropertyBool(AI_CONFIG_FBX_CONVERT_TO_M, false); + settings.convertToMeters = pImp->GetPropertyBool(AI_CONFIG_FBX_CONVERT_TO_M, false); } // ------------------------------------------------------------------------------------------------ From 390452bd06f510c3c2933ab5915ef2add1b35fec Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Tue, 7 May 2019 20:32:45 +0200 Subject: [PATCH 46/46] Fix the build. --- code/FBXConverter.cpp | 8 ++++---- code/FBXConverter.h | 22 +++++++++++----------- code/FBXImporter.cpp | 6 +++++- 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/code/FBXConverter.cpp b/code/FBXConverter.cpp index bd8347408..f45129cae 100644 --- a/code/FBXConverter.cpp +++ b/code/FBXConverter.cpp @@ -76,7 +76,7 @@ namespace Assimp { #define CONVERT_FBX_TIME(time) static_cast(time) / 46186158000L - FBXConverter::FBXConverter(aiScene* out, const Document& doc, bool removeEmptyBones) + FBXConverter::FBXConverter(aiScene* out, const Document& doc, bool removeEmptyBones, FbxUnit unit ) : defaultMaterialIndex() , lights() , cameras() @@ -119,7 +119,7 @@ namespace Assimp { ConvertGlobalSettings(); TransferDataToScene(); - ConvertToUnitScale(doc.GlobalSettings().UnitScaleFactor()); + ConvertToUnitScale(unit); // if we didn't read any meshes set the AI_SCENE_FLAGS_INCOMPLETE // to make sure the scene passes assimp's validation. FBX files @@ -3570,9 +3570,9 @@ void FBXConverter::SetShadingPropertiesRaw(aiMaterial* out_mat, const PropertyTa } // ------------------------------------------------------------------------------------------------ - void ConvertToAssimpScene(aiScene* out, const Document& doc, bool removeEmptyBones) + void ConvertToAssimpScene(aiScene* out, const Document& doc, bool removeEmptyBones, FbxUnit unit) { - FBXConverter converter(out, doc, removeEmptyBones); + FBXConverter converter(out, doc, removeEmptyBones, unit); } } // !FBX diff --git a/code/FBXConverter.h b/code/FBXConverter.h index dbbeee158..f75222d5b 100644 --- a/code/FBXConverter.h +++ b/code/FBXConverter.h @@ -76,13 +76,22 @@ namespace FBX { class Document; +enum class FbxUnit { + cm = 0, + m, + km, + NumUnits, + + Undefined +}; + /** * Convert a FBX #Document to #aiScene * @param out Empty scene to be populated * @param doc Parsed FBX document * @param removeEmptyBones Will remove bones, which do not have any references to vertices. */ -void ConvertToAssimpScene(aiScene* out, const Document& doc, bool removeEmptyBones ); +void ConvertToAssimpScene(aiScene* out, const Document& doc, bool removeEmptyBones, FbxUnit unit); /** Dummy class to encapsulate the conversion process */ class FBXConverter { @@ -113,7 +122,7 @@ public: }; public: - FBXConverter(aiScene* out, const Document& doc, bool removeEmptyBones ); + FBXConverter(aiScene* out, const Document& doc, bool removeEmptyBones, FbxUnit unit); ~FBXConverter(); private: @@ -415,15 +424,6 @@ private: void ConvertGlobalSettings(); - enum class FbxUnit { - cm = 0, - m, - km, - NumUnits, - - Undefined - }; - // ------------------------------------------------------------------------------------------------ // Will perform the conversion from a given unit to the requested unit. void ConvertToUnitScale(FbxUnit unit); diff --git a/code/FBXImporter.cpp b/code/FBXImporter.cpp index 339a9421a..988735a77 100644 --- a/code/FBXImporter.cpp +++ b/code/FBXImporter.cpp @@ -185,8 +185,12 @@ void FBXImporter::InternReadFile( const std::string& pFile, aiScene* pScene, IOS // take the raw parse-tree and convert it to a FBX DOM Document doc(parser,settings); + FbxUnit unit(FbxUnit::cm); + if (settings.convertToMeters) { + unit = FbxUnit::m; + } // convert the FBX DOM to aiScene - ConvertToAssimpScene(pScene,doc, settings.removeEmptyBones); + ConvertToAssimpScene(pScene,doc, settings.removeEmptyBones, unit); std::for_each(tokens.begin(),tokens.end(),Util::delete_fun()); }