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/CMakeLists.txt b/CMakeLists.txt
index b21f0c5b8..c5d5b15b1 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,12 +127,15 @@ if (WIN32)
ADD_DEFINITIONS( -DWIN32_LEAN_AND_MEAN )
endif()
-
IF(MSVC)
OPTION( ASSIMP_INSTALL_PDB
"Install MSVC debug files."
ON
)
+ 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)
@@ -301,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")
@@ -543,18 +548,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/appveyor.yml b/appveyor.yml
index 39ef36179..851d9c096 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -53,7 +53,13 @@ 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
+ ) else (
+ iscc packaging\windows-innosetup\script_x86.iss
+ )
+ )
- 7z a assimp.7z bin\%CONFIGURATION%\* lib\%CONFIGURATION%\*
test_script:
diff --git a/code/AssbinLoader.cpp b/code/AssbinLoader.cpp
index acba8b3dd..249e29863 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",
"",
"",
diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt
index 9631b4e41..05f916abd 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
@@ -1033,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 )
@@ -1047,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()
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 6837dca4a..cf548e890 100644
--- a/code/ColladaLoader.cpp
+++ b/code/ColladaLoader.cpp
@@ -207,6 +207,17 @@ void ColladaLoader::InternReadFile( const std::string& pFile, aiScene* pScene, I
0, 0, 0, 1);
}
+ // Store scene metadata
+ 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
StoreSceneMeshes( pScene);
diff --git a/code/ColladaParser.cpp b/code/ColladaParser.cpp
index 0fa59362b..2106bf01c 100644
--- a/code/ColladaParser.cpp
+++ b/code/ColladaParser.cpp
@@ -264,14 +264,19 @@ void ColladaParser::ReadAssetInfo()
// check element end
TestClosing( "up_axis");
- } else
+ }
+ else if(IsElement("contributor"))
{
- SkipElement();
+ ReadContributorInfo();
+ }
+ else
+ {
+ 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;
@@ -279,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 232d85654..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,6 +355,9 @@ namespace Assimp
/** Which is the up vector */
enum { UP_X, UP_Y, UP_Z } mUpDirection;
+ /** Asset metadata (global for scene) */
+ StringMetaData mAssetMetaData;
+
/** Collada file format version */
Collada::FormatVersion mFormat;
};
diff --git a/code/Exporter.cpp b/code/Exporter.cpp
index 8848e87f5..4ecb07081 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/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/include/assimp/Exporter.hpp b/include/assimp/Exporter.hpp
index bf0096e7e..ea0303e80 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);
diff --git a/packaging/windows-innosetup/script.iss b/packaging/windows-innosetup/script.iss
deleted file mode 100644
index 695740679..000000000
--- a/packaging/windows-innosetup/script.iss
+++ /dev/null
@@ -1,103 +0,0 @@
-; 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
-;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
-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-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_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
-Source: "..\..\samples\*"; DestDir: "{app}\samples"; Flags: recursesubdirs; Components: samples
-
-; 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
-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
diff --git a/packaging/windows-innosetup/script_x64.iss b/packaging/windows-innosetup/script_x64.iss
new file mode 100644
index 000000000..cd4837f0a
--- /dev/null
+++ b/packaging/windows-innosetup/script_x64.iss
@@ -0,0 +1,71 @@
+; 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 ( 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.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.x64.exe"; DestDir: "{app}\stub\"; Check: 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
+
+; x64 binaries
+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
+
+; Import libraries
+Source: "..\..\lib\release\assimp-vc141-mt.lib"; DestDir: "{app}\lib\x64"
+
+; 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
diff --git a/packaging/windows-innosetup/script_x86.iss b/packaging/windows-innosetup/script_x86.iss
new file mode 100644
index 000000000..9aca78550
--- /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\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\assimp.exe"; DestDir: "{app}\bin\x86"; Components: tools
+
+
+; Import libraries
+Source: "..\..\lib\release\assimp-vc141-mt.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
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
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)
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 )