diff --git a/.github/workflows/ccpp.yml b/.github/workflows/ccpp.yml
index 2c5ca438b..1c533aa80 100644
--- a/.github/workflows/ccpp.yml
+++ b/.github/workflows/ccpp.yml
@@ -16,7 +16,7 @@ jobs:
strategy:
fail-fast: false
matrix:
- name: [ubuntu-latest-g++, macos-latest-clang++, windows-latest-cl.exe, ubuntu-latest-clang++, ubuntu-gcc-hunter, macos-clang-hunter, windows-msvc-hunter]
+ name: [ubuntu-latest-g++, macos-latest-clang++, windows-latest-cl.exe, ubuntu-latest-clang++]
# For Windows msvc, for Linux and macOS let's use the clang compiler, use gcc for Linux.
include:
- name: windows-latest-cl.exe
@@ -35,15 +35,6 @@ jobs:
os: ubuntu-latest
cxx: g++
cc: gcc
- - name: ubuntu-gcc-hunter
- os: ubuntu-latest
- toolchain: ninja-gcc-cxx17-fpic
- - name: macos-clang-hunter
- os: macos-latest
- toolchain: ninja-clang-cxx17-fpic
- - name: windows-msvc-hunter
- os: windows-latest
- toolchain: ninja-vs-win64-cxx17
steps:
- uses: actions/checkout@v4
@@ -55,25 +46,11 @@ jobs:
- uses: ilammy/msvc-dev-cmd@v1
- name: Set Compiler Environment
- if: "!endsWith(matrix.name, 'hunter')"
uses: lukka/set-shell-env@v1
with:
CXX: ${{ matrix.cxx }}
CC: ${{ matrix.cc }}
- - name: Set Compiler Environment for Hunter on Windows
- if: startsWith(matrix.name, 'windows') && endsWith(matrix.name, 'hunter')
- uses: lukka/set-shell-env@v1
- with:
- VS160COMNTOOLS: C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\Tools
-
- - name: Checkout Hunter toolchains
- if: endsWith(matrix.name, 'hunter')
- uses: actions/checkout@v4
- with:
- repository: cpp-pm/polly
- path: cmake/polly
-
- name: Cache DX SDK
id: dxcache
if: contains(matrix.name, 'windows')
@@ -121,7 +98,7 @@ jobs:
run: cd build/bin && ./unit ${{ steps.hunter_extra_test_args.outputs.args }}
shell: bash
- - uses: actions/upload-artifact@v3
+ - uses: actions/upload-artifact@v4
if: matrix.name == 'windows-msvc'
with:
name: 'assimp-bins-${{ matrix.name }}-${{ github.sha }}'
diff --git a/.github/workflows/cifuzz.yml b/.github/workflows/cifuzz.yml
index a84be8cbc..38f54ce06 100644
--- a/.github/workflows/cifuzz.yml
+++ b/.github/workflows/cifuzz.yml
@@ -19,7 +19,7 @@ jobs:
dry-run: false
language: c++
- name: Upload Crash
- uses: actions/upload-artifact@v3
+ uses: actions/upload-artifact@v4
if: failure() && steps.build.outcome == 'success'
with:
name: artifacts
diff --git a/Build.md b/Build.md
index 957031b5f..9440a0073 100644
--- a/Build.md
+++ b/Build.md
@@ -43,6 +43,7 @@ cd assimp
cmake CMakeLists.txt
cmake --build .
```
+Note that by default this builds a shared library into the `bin` directory. If you want to build it as a static library see the build options at the bottom of this file.
### Build instructions for Windows with Visual-Studio
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 88f69174a..868282ef2 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -137,7 +137,7 @@ IF (WIN32)
ELSE()
OPTION( ASSIMP_BUILD_ZLIB
"Build your own zlib"
- ON
+ OFF
)
ENDIF()
@@ -311,9 +311,9 @@ ELSEIF( MINGW )
SET(CMAKE_C_FLAGS "-fPIC ${CMAKE_C_FLAGS}")
ENDIF()
IF (CMAKE_BUILD_TYPE STREQUAL "Debug")
- SET(CMAKE_CXX_FLAGS "-fvisibility=hidden -fno-strict-aliasing -Wall -Wno-long-long -Wa,-mbig-obj -g ${CMAKE_CXX_FLAGS}")
+ SET(CMAKE_CXX_FLAGS "-fvisibility=hidden -fno-strict-aliasing -Wno-dangling-reference -Wall -Wno-long-long -Wa,-mbig-obj -g ${CMAKE_CXX_FLAGS}")
ELSE()
- SET(CMAKE_CXX_FLAGS "-fvisibility=hidden -fno-strict-aliasing -Wall -Wno-long-long -Wa,-mbig-obj -O3 ${CMAKE_CXX_FLAGS}")
+ SET(CMAKE_CXX_FLAGS "-fvisibility=hidden -fno-strict-aliasing -Wno-dangling-reference -Wall -Wno-long-long -Wa,-mbig-obj -O3 ${CMAKE_CXX_FLAGS}")
ENDIF()
SET(CMAKE_C_FLAGS "-fno-strict-aliasing ${CMAKE_C_FLAGS}")
ENDIF()
diff --git a/Dockerfile b/Dockerfile
index 5da5458f8..eb5715d0f 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -6,6 +6,7 @@ RUN apt-get update && apt-get install -y ninja-build \
RUN add-apt-repository ppa:ubuntu-toolchain-r/test && apt-get update
WORKDIR /opt
+RUN apt install zlib1g-dev
# Build Assimp
RUN git clone https://github.com/assimp/assimp.git /opt/assimp
diff --git a/Readme.md b/Readme.md
index 9a8ac7c33..a1f707a95 100644
--- a/Readme.md
+++ b/Readme.md
@@ -6,25 +6,19 @@ Open Asset Import Library is a library to load various 3d file formats into a sh
### Current project status ###
[](https://opencollective.com/assimp)

-
-
-
[](https://www.codacy.com/gh/assimp/assimp/dashboard?utm_source=github.com&utm_medium=referral&utm_content=assimp/assimp&utm_campaign=Badge_Grade)
-
-[](https://coveralls.io/github/assimp/assimp?branch=master)
[](https://gitter.im/assimp/assimp?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
[](http://isitmaintained.com/project/assimp/assimp "Average time to resolve an issue")
[](http://isitmaintained.com/project/assimp/assimp "Percentage of issues still open")
APIs are provided for C and C++. There are various bindings to other languages (C#, Java, Python, Delphi, D). Assimp also runs on Android and iOS.
-Additionally, assimp features various __mesh post processing tools__: normals and tangent space generation, triangulation, vertex cache locality optimization, removal of degenerate primitives and duplicate vertices, sorting by primitive type, merging of redundant materials and many more.
+Additionally, assimp features various __mesh post-processing tools__: normals and tangent space generation, triangulation, vertex cache locality optimization, removal of degenerate primitives and duplicate vertices, sorting by primitive type, merging of redundant materials and many more.
-### Latest Doc's ###
+### Documentation ###
Please check the latest documents at [Asset-Importer-Lib-Doc](https://assimp-docs.readthedocs.io/en/latest/).
-### Prebuild binaries ###
+### Pre-built binaries ###
Please check our [Itchi Projectspace](https://kimkulling.itch.io/the-asset-importer-lib)
If you want to check our Model-Database, use the following repo: https://github.com/assimp/assimp-mdb
@@ -41,7 +35,7 @@ And we also have a Gitter-channel:Gitter [
### Building ###
-Take a look into the https://github.com/assimp/assimp/blob/master/Build.md file. We are available in vcpkg, and our build system is CMake; if you used CMake before there is a good chance you know what to do.
+Take a look [here](https://github.com/assimp/assimp/blob/master/Build.md) to get started. We are available in vcpkg, and our build system is CMake; if you used CMake before there is a good chance you know what to do.
### Ports ###
* [Android](port/AndroidJNI/README.md)
@@ -58,20 +52,21 @@ Take a look into the https://github.com/assimp/assimp/blob/master/Build.md file.
### Other tools ###
[open3mod](https://github.com/acgessler/open3mod) is a powerful 3D model viewer based on Assimp's import and export abilities.
+[Assimp-Viewer](https://github.com/assimp/assimp_view) is an experimental implementation for an Asset-Viewer based on ImGUI and Assimp (experimental).
#### Repository structure ####
-Open Asset Import Library is implemented in C++. The directory structure looks like:
+Open Asset Import Library is implemented in C++. The directory structure looks like this:
/code Source code
/contrib Third-party libraries
/doc Documentation (doxysource and pre-compiled docs)
- /fuzz Contains the test-code for the Google-Fuzzer project
+ /fuzz Contains the test code for the Google Fuzzer project
/include Public header C and C++ header files
- /scripts Scripts used to generate the loading code for some formats
+ /scripts Scripts are used to generate the loading code for some formats
/port Ports to other languages and scripts to maintain those.
/test Unit- and regression tests, test suite of models
/tools Tools (old assimp viewer, command line `assimp`)
- /samples A small number of samples to illustrate possible use-cases for Assimp
+ /samples A small number of samples to illustrate possible use cases for Assimp
The source code is organized in the following way:
@@ -79,9 +74,9 @@ The source code is organized in the following way:
code/CApi Special implementations which are only used for the C-API
code/Geometry A collection of geometry tools
code/Material The material system
- code/PBR An exporter for physical based models
+ code/PBR An exporter for physical-based models
code/PostProcessing The post-processing steps
- code/AssetLib/ Implementation for import and export for the format
+ code/AssetLib/ Implementation for import and export of the format
### Contributing ###
Contributions to assimp are highly appreciated. The easiest way to get involved is to submit
@@ -118,4 +113,4 @@ and don't sue us if our code doesn't work. Note that, unlike LGPLed code, you ma
For the legal details, see the `LICENSE` file.
### Why this name ###
-Sorry, we're germans :-), no english native speakers ...
+Sorry, we're germans :-), no English native speakers ...
diff --git a/code/AssetLib/3DS/3DSConverter.cpp b/code/AssetLib/3DS/3DSConverter.cpp
index b4f625b76..6d3f09cb7 100644
--- a/code/AssetLib/3DS/3DSConverter.cpp
+++ b/code/AssetLib/3DS/3DSConverter.cpp
@@ -52,9 +52,9 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include
#include
-using namespace Assimp;
+namespace Assimp {
-static const unsigned int NotSet = 0xcdcdcdcd;
+static constexpr unsigned int NotSet = 0xcdcdcdcd;
// ------------------------------------------------------------------------------------------------
// Setup final material indices, generae a default material if necessary
@@ -68,7 +68,7 @@ void Discreet3DSImporter::ReplaceDefaultMaterial() {
unsigned int idx(NotSet);
for (unsigned int i = 0; i < mScene->mMaterials.size(); ++i) {
std::string s = mScene->mMaterials[i].mName;
- for (char & it : s) {
+ for (char &it : s) {
it = static_cast(::tolower(static_cast(it)));
}
@@ -262,7 +262,7 @@ void Discreet3DSImporter::ConvertMaterial(D3DS::Material &oldMat,
unsigned int iWire = 1;
mat.AddProperty((int *)&iWire, 1, AI_MATKEY_ENABLE_WIREFRAME);
}
- [[fallthrough]];
+ [[fallthrough]];
case D3DS::Discreet3DS::Gouraud:
eShading = aiShadingMode_Gouraud;
@@ -593,7 +593,7 @@ void Discreet3DSImporter::AddNodeToGraph(aiScene *pcSOut, aiNode *pcOut,
// Cameras or lights define their transformation in their parent node and in the
// corresponding light or camera chunks. However, we read and process the latter
- // to to be able to return valid cameras/lights even if no scenegraph is given.
+ // to be able to return valid cameras/lights even if no scenegraph is given.
for (unsigned int n = 0; n < pcSOut->mNumCameras; ++n) {
if (pcSOut->mCameras[n]->mName == pcOut->mName) {
pcSOut->mCameras[n]->mLookAt = aiVector3D(0.f, 0.f, 1.f);
@@ -805,4 +805,6 @@ void Discreet3DSImporter::ConvertScene(aiScene *pcOut) {
}
}
+} // namespace Assimp
+
#endif // !! ASSIMP_BUILD_NO_3DS_IMPORTER
diff --git a/code/AssetLib/3DS/3DSExporter.h b/code/AssetLib/3DS/3DSExporter.h
index 82ec3512f..66e91e10d 100644
--- a/code/AssetLib/3DS/3DSExporter.h
+++ b/code/AssetLib/3DS/3DSExporter.h
@@ -4,7 +4,6 @@ Open Asset Import Library (assimp)
Copyright (c) 2006-2022, assimp team
-
All rights reserved.
Redistribution and use of this software in source and binary forms,
@@ -57,8 +56,7 @@ struct aiNode;
struct aiMaterial;
struct aiMesh;
-namespace Assimp
-{
+namespace Assimp {
// ------------------------------------------------------------------------------------------------
/**
@@ -88,7 +86,7 @@ private:
std::map trafos;
- typedef std::multimap MeshesByNodeMap;
+ using MeshesByNodeMap = std::multimap;
MeshesByNodeMap meshes;
};
diff --git a/code/AssetLib/3DS/3DSLoader.cpp b/code/AssetLib/3DS/3DSLoader.cpp
index aa29956df..a406ea1d2 100644
--- a/code/AssetLib/3DS/3DSLoader.cpp
+++ b/code/AssetLib/3DS/3DSLoader.cpp
@@ -54,9 +54,9 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include
#include
-using namespace Assimp;
+namespace Assimp {
-static const aiImporterDesc desc = {
+static constexpr aiImporterDesc desc = {
"Discreet 3DS Importer",
"",
"",
@@ -103,10 +103,6 @@ Discreet3DSImporter::Discreet3DSImporter() :
// empty
}
-// ------------------------------------------------------------------------------------------------
-// Destructor, private as well
-Discreet3DSImporter::~Discreet3DSImporter() = default;
-
// ------------------------------------------------------------------------------------------------
// Returns whether the class can handle the format of the given file.
bool Discreet3DSImporter::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool /*checkSig*/) const {
@@ -369,7 +365,7 @@ void Discreet3DSImporter::ParseChunk(const char *name, unsigned int num) {
// IMPLEMENTATION NOTE;
// Cameras or lights define their transformation in their parent node and in the
// corresponding light or camera chunks. However, we read and process the latter
- // to to be able to return valid cameras/lights even if no scenegraph is given.
+ // to be able to return valid cameras/lights even if no scenegraph is given.
// get chunk type
switch (chunk.Flag) {
@@ -1339,4 +1335,6 @@ void Discreet3DSImporter::ParseColorChunk(aiColor3D *out, bool acceptPercent) {
(void)bGamma;
}
+} // namespace Assimp
+
#endif // !! ASSIMP_BUILD_NO_3DS_IMPORTER
diff --git a/code/AssetLib/3DS/3DSLoader.h b/code/AssetLib/3DS/3DSLoader.h
index 6bd73f412..c579507e0 100644
--- a/code/AssetLib/3DS/3DSLoader.h
+++ b/code/AssetLib/3DS/3DSLoader.h
@@ -59,7 +59,6 @@ struct aiNode;
namespace Assimp {
-
using namespace D3DS;
// ---------------------------------------------------------------------------------
@@ -68,7 +67,7 @@ using namespace D3DS;
class Discreet3DSImporter : public BaseImporter {
public:
Discreet3DSImporter();
- ~Discreet3DSImporter() override;
+ ~Discreet3DSImporter() override = default;
// -------------------------------------------------------------------
/** Returns whether the class can handle the format of the given file.
diff --git a/code/AssetLib/3MF/D3MFImporter.cpp b/code/AssetLib/3MF/D3MFImporter.cpp
index 5d9644fa5..9a5081db9 100644
--- a/code/AssetLib/3MF/D3MFImporter.cpp
+++ b/code/AssetLib/3MF/D3MFImporter.cpp
@@ -68,7 +68,7 @@ namespace Assimp {
using namespace D3MF;
-static const aiImporterDesc desc = {
+static constexpr aiImporterDesc desc = {
"3mf Importer",
"",
"",
@@ -81,16 +81,17 @@ static const aiImporterDesc desc = {
"3mf"
};
-D3MFImporter::D3MFImporter() = default;
-
-D3MFImporter::~D3MFImporter() = default;
-
-bool D3MFImporter::CanRead(const std::string &filename, IOSystem *pIOHandler, bool /*checkSig*/) const {
+bool D3MFImporter::CanRead(const std::string &filename, IOSystem *pIOHandler, bool ) const {
if (!ZipArchiveIOSystem::isZipArchive(pIOHandler, filename)) {
return false;
}
- D3MF::D3MFOpcPackage opcPackage(pIOHandler, filename);
- return opcPackage.validate();
+ static const char *const ModelRef = "3D/3dmodel.model";
+ ZipArchiveIOSystem archive(pIOHandler, filename);
+ if (!archive.Exists(ModelRef)) {
+ return false;
+ }
+
+ return true;
}
void D3MFImporter::SetupProperties(const Importer*) {
diff --git a/code/AssetLib/3MF/D3MFImporter.h b/code/AssetLib/3MF/D3MFImporter.h
index a39ae790f..9ae68acb0 100644
--- a/code/AssetLib/3MF/D3MFImporter.h
+++ b/code/AssetLib/3MF/D3MFImporter.h
@@ -56,10 +56,10 @@ namespace Assimp {
class D3MFImporter : public BaseImporter {
public:
/// @brief The default class constructor.
- D3MFImporter();
+ D3MFImporter() = default;
/// @brief The class destructor.
- ~D3MFImporter() override;
+ ~D3MFImporter() override = default;
/// @brief Performs the data format detection.
/// @param pFile The filename to check.
diff --git a/code/AssetLib/3MF/D3MFOpcPackage.cpp b/code/AssetLib/3MF/D3MFOpcPackage.cpp
index 934305d49..e772d8b7e 100644
--- a/code/AssetLib/3MF/D3MFOpcPackage.cpp
+++ b/code/AssetLib/3MF/D3MFOpcPackage.cpp
@@ -68,7 +68,7 @@ using OpcPackageRelationshipPtr = std::shared_ptr;
class OpcPackageRelationshipReader {
public:
OpcPackageRelationshipReader(XmlParser &parser) :
- m_relationShips() {
+ mRelations() {
XmlNode root = parser.getRootNode();
ParseRootNode(root);
}
@@ -108,13 +108,13 @@ public:
relPtr->type = currentNode.attribute(XmlTag::RELS_ATTRIB_TYPE).as_string();
relPtr->target = currentNode.attribute(XmlTag::RELS_ATTRIB_TARGET).as_string();
if (validateRels(relPtr)) {
- m_relationShips.push_back(relPtr);
+ mRelations.push_back(relPtr);
}
}
}
}
- std::vector m_relationShips;
+ std::vector mRelations;
};
static bool IsEmbeddedTexture( const std::string &filename ) {
@@ -186,9 +186,6 @@ D3MFOpcPackage::D3MFOpcPackage(IOSystem *pIOHandler, const std::string &rFile) :
D3MFOpcPackage::~D3MFOpcPackage() {
mZipArchive->Close(mRootStream);
delete mZipArchive;
- for (auto tex : mEmbeddedTextures) {
- delete tex;
- }
}
IOStream *D3MFOpcPackage::RootStream() const {
@@ -217,11 +214,11 @@ std::string D3MFOpcPackage::ReadPackageRootRelationship(IOStream *stream) {
OpcPackageRelationshipReader reader(xmlParser);
- auto itr = std::find_if(reader.m_relationShips.begin(), reader.m_relationShips.end(), [](const OpcPackageRelationshipPtr &rel) {
+ auto itr = std::find_if(reader.mRelations.begin(), reader.mRelations.end(), [](const OpcPackageRelationshipPtr &rel) {
return rel->type == XmlTag::PACKAGE_START_PART_RELATIONSHIP_TYPE;
});
- if (itr == reader.m_relationShips.end()) {
+ if (itr == reader.mRelations.end()) {
throw DeadlyImportError("Cannot find ", XmlTag::PACKAGE_START_PART_RELATIONSHIP_TYPE);
}
diff --git a/code/AssetLib/3MF/XmlSerializer.cpp b/code/AssetLib/3MF/XmlSerializer.cpp
index c77111728..5fcdc0ccc 100644
--- a/code/AssetLib/3MF/XmlSerializer.cpp
+++ b/code/AssetLib/3MF/XmlSerializer.cpp
@@ -49,12 +49,12 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
namespace Assimp {
namespace D3MF {
-static const int IdNotSet = -1;
+static constexpr int IdNotSet = -1;
namespace {
-static const size_t ColRGBA_Len = 9;
-static const size_t ColRGB_Len = 7;
+static constexpr size_t ColRGBA_Len = 9;
+static constexpr size_t ColRGB_Len = 7;
// format of the color string: #RRGGBBAA or #RRGGBB (3MF Core chapter 5.1.1)
bool validateColorString(const char *color) {
diff --git a/code/AssetLib/AC/ACLoader.cpp b/code/AssetLib/AC/ACLoader.cpp
index e93fba5f0..f98a4d105 100644
--- a/code/AssetLib/AC/ACLoader.cpp
+++ b/code/AssetLib/AC/ACLoader.cpp
@@ -60,9 +60,9 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include
#include
-using namespace Assimp;
+namespace Assimp {
-static const aiImporterDesc desc = {
+static constexpr aiImporterDesc desc = {
"AC3D Importer",
"",
"",
@@ -170,9 +170,9 @@ bool AC3DImporter::GetNextLine() {
// ------------------------------------------------------------------------------------------------
// Parse an object section in an AC file
-void AC3DImporter::LoadObjectSection(std::vector &objects) {
+bool AC3DImporter::LoadObjectSection(std::vector &objects) {
if (!TokenMatch(buffer, "OBJECT", 6))
- return;
+ return false;
SkipSpaces(&buffer);
@@ -212,10 +212,14 @@ void AC3DImporter::LoadObjectSection(std::vector &objects) {
if (num) {
// load the children of this object recursively
obj.children.reserve(num);
- for (unsigned int i = 0; i < num; ++i)
- LoadObjectSection(obj.children);
+ for (unsigned int i = 0; i < num; ++i) {
+ if (!LoadObjectSection(obj.children)) {
+ ASSIMP_LOG_WARN("AC3D: wrong number of kids");
+ break;
+ }
+ }
}
- return;
+ return true;
} else if (TokenMatch(buffer, "name", 4)) {
SkipSpaces(&buffer);
buffer = AcGetString(buffer, obj.name);
@@ -227,9 +231,16 @@ void AC3DImporter::LoadObjectSection(std::vector &objects) {
}
} else if (TokenMatch(buffer, "texture", 7)) {
SkipSpaces(&buffer);
- std::string texture;
- buffer = AcGetString(buffer, texture);
- obj.textures.push_back(texture);
+ // skip empty acc texture
+ if (*buffer != '\"') {
+ if (!TokenMatch(buffer, "empty_texture_no_mapping", 24)) {
+ ASSIMP_LOG_ERROR("AC3D: Unquoted texture string");
+ }
+ } else {
+ std::string texture;
+ buffer = AcGetString(buffer, texture);
+ obj.textures.push_back(texture);
+ }
} else if (TokenMatch(buffer, "texrep", 6)) {
SkipSpaces(&buffer);
buffer = TAcCheckedLoadFloatArray(buffer, "", 0, 2, &obj.texRepeat);
@@ -340,6 +351,7 @@ void AC3DImporter::LoadObjectSection(std::vector &objects) {
}
}
ASSIMP_LOG_ERROR("AC3D: Unexpected EOF: \'kids\' line was expected");
+ return false;
}
// ------------------------------------------------------------------------------------------------
@@ -445,7 +457,7 @@ aiNode *AC3DImporter::ConvertObjectSection(Object &object,
idx = 0;
}
if ((*it).entries.empty()) {
- ASSIMP_LOG_WARN("AC3D: surface her zero vertex references");
+ ASSIMP_LOG_WARN("AC3D: surface has zero vertex references");
}
// validate all vertex indices to make sure we won't crash here
@@ -574,15 +586,6 @@ aiNode *AC3DImporter::ConvertObjectSection(Object &object,
const Surface::SurfaceEntry &entry2 = src.entries[i + 1];
const Surface::SurfaceEntry &entry3 = src.entries[i + 2];
- // skip degenerate triangles
- if (object.vertices[entry1.first] == object.vertices[entry2.first] ||
- object.vertices[entry1.first] == object.vertices[entry3.first] ||
- object.vertices[entry2.first] == object.vertices[entry3.first]) {
- mesh->mNumFaces--;
- mesh->mNumVertices -= 3;
- continue;
- }
-
aiFace &face = *faces++;
face.mNumIndices = 3;
face.mIndices = new unsigned int[face.mNumIndices];
@@ -804,8 +807,9 @@ void AC3DImporter::InternReadFile(const std::string &pFile,
buffer = TAcCheckedLoadFloatArray(buffer, "spec", 4, 3, &mat.spec);
buffer = TAcCheckedLoadFloatArray(buffer, "shi", 3, 1, &mat.shin);
buffer = TAcCheckedLoadFloatArray(buffer, "trans", 5, 1, &mat.trans);
+ } else {
+ LoadObjectSection(rootObjects);
}
- LoadObjectSection(rootObjects);
}
if (rootObjects.empty() || !mNumMeshes) {
@@ -862,4 +866,6 @@ void AC3DImporter::InternReadFile(const std::string &pFile,
}
}
+} // namespace Assimp
+
#endif //!defined ASSIMP_BUILD_NO_AC_IMPORTER
diff --git a/code/AssetLib/AC/ACLoader.h b/code/AssetLib/AC/ACLoader.h
index 7f8dfd03c..3b5be4b6e 100644
--- a/code/AssetLib/AC/ACLoader.h
+++ b/code/AssetLib/AC/ACLoader.h
@@ -216,7 +216,7 @@ private:
* load subobjects, the method returns after a 'kids 0' was
* encountered.
* @objects List of output objects*/
- void LoadObjectSection(std::vector &objects);
+ bool LoadObjectSection(std::vector &objects);
// -------------------------------------------------------------------
/** Convert all objects into meshes and nodes.
diff --git a/code/AssetLib/AMF/AMFImporter.cpp b/code/AssetLib/AMF/AMFImporter.cpp
index ff581b492..eabdb35e1 100644
--- a/code/AssetLib/AMF/AMFImporter.cpp
+++ b/code/AssetLib/AMF/AMFImporter.cpp
@@ -53,7 +53,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
namespace Assimp {
-const aiImporterDesc AMFImporter::Description = {
+static constexpr aiImporterDesc Description = {
"Additive manufacturing file format(AMF) Importer",
"smalcom",
"",
diff --git a/code/AssetLib/AMF/AMFImporter.hpp b/code/AssetLib/AMF/AMFImporter.hpp
index 27f733043..fbaf4fc6d 100644
--- a/code/AssetLib/AMF/AMFImporter.hpp
+++ b/code/AssetLib/AMF/AMFImporter.hpp
@@ -98,8 +98,12 @@ namespace Assimp {
/// old - and children , , , , ,
///
class AMFImporter : public BaseImporter {
-private:
- struct SPP_Material; // forward declaration
+ using AMFMetaDataArray = std::vector;
+ using MeshArray = std::vector;
+ using NodeArray = std::vector;
+
+public:
+ struct SPP_Material;
/// Data type for post-processing step. More suitable container for part of material's composition.
struct SPP_Composite {
@@ -107,22 +111,6 @@ private:
std::string Formula; ///< Formula for calculating ratio of \ref Material.
};
- /// \struct SPP_Material
- /// Data type for post-processing step. More suitable container for material.
- struct SPP_Material {
- std::string ID; ///< Material ID.
- std::list Metadata; ///< Metadata of material.
- AMFColor *Color; ///< Color of material.
- std::list Composition; ///< List of child materials if current material is composition of few another.
-
- /// Return color calculated for specified coordinate.
- /// \param [in] pX - "x" coordinate.
- /// \param [in] pY - "y" coordinate.
- /// \param [in] pZ - "z" coordinate.
- /// \return calculated color.
- aiColor4D GetColor(const float pX, const float pY, const float pZ) const;
- };
-
/// Data type for post-processing step. More suitable container for texture.
struct SPP_Texture {
std::string ID;
@@ -139,10 +127,52 @@ private:
const AMFTexMap *TexMap; ///< Face texture mapping data. Equal to nullptr if texture mapping is not set for the face.
};
- using AMFMetaDataArray = std::vector;
- using MeshArray = std::vector;
- using NodeArray = std::vector;
+ /// Data type for post-processing step. More suitable container for material.
+ struct SPP_Material {
+ std::string ID; ///< Material ID.
+ std::list Metadata; ///< Metadata of material.
+ AMFColor *Color; ///< Color of material.
+ std::list Composition; ///< List of child materials if current material is composition of few another.
+ /// Return color calculated for specified coordinate.
+ /// \param [in] pX - "x" coordinate.
+ /// \param [in] pY - "y" coordinate.
+ /// \param [in] pZ - "z" coordinate.
+ /// \return calculated color.
+ aiColor4D GetColor(const float pX, const float pY, const float pZ) const;
+ };
+
+ /// Default constructor.
+ AMFImporter() AI_NO_EXCEPT;
+
+ /// Default destructor.
+ ~AMFImporter() override;
+
+ /// Parse AMF file and fill scene graph. The function has no return value. Result can be found by analyzing the generated graph.
+ /// Also exception can be thrown if trouble will found.
+ /// \param [in] pFile - name of file to be parsed.
+ /// \param [in] pIOHandler - pointer to IO helper object.
+ void ParseFile(const std::string &pFile, IOSystem *pIOHandler);
+ void ParseHelper_Node_Enter(AMFNodeElementBase *child);
+ void ParseHelper_Node_Exit();
+ bool CanRead(const std::string &pFile, IOSystem *pIOHandler, bool pCheckSig) const override;
+ void InternReadFile(const std::string &pFile, aiScene *pScene, IOSystem *pIOHandler) override;
+ const aiImporterDesc *GetInfo() const override;
+ bool Find_NodeElement(const std::string &pID, const AMFNodeElementBase::EType pType, AMFNodeElementBase **pNodeElement) const;
+ bool Find_ConvertedNode(const std::string &pID, NodeArray &nodeArray, aiNode **pNode) const;
+ bool Find_ConvertedMaterial(const std::string &pID, const SPP_Material **pConvertedMaterial) const;
+ AI_WONT_RETURN void Throw_CloseNotFound(const std::string &nodeName) AI_WONT_RETURN_SUFFIX;
+ AI_WONT_RETURN void Throw_IncorrectAttr(const std::string &nodeName, const std::string &pAttrName) AI_WONT_RETURN_SUFFIX;
+ AI_WONT_RETURN void Throw_IncorrectAttrValue(const std::string &nodeName, const std::string &pAttrName) AI_WONT_RETURN_SUFFIX;
+ AI_WONT_RETURN void Throw_MoreThanOnceDefined(const std::string &nodeName, const std::string &pNodeType, const std::string &pDescription) AI_WONT_RETURN_SUFFIX;
+ AI_WONT_RETURN void Throw_ID_NotFound(const std::string &pID) const AI_WONT_RETURN_SUFFIX;
+ void XML_CheckNode_MustHaveChildren(pugi::xml_node &node);
+ bool XML_SearchNode(const std::string &nodeName);
+ void ParseHelper_FixTruncatedFloatString(const char *pInStr, std::string &pOutString);
+ AMFImporter(const AMFImporter &pScene) = delete;
+ AMFImporter &operator=(const AMFImporter &pScene) = delete;
+
+private:
/// Clear all temporary data.
void Clear();
@@ -262,40 +292,9 @@ private:
/// \param [in] pUseOldName - if true then use old name of node(and children) - , instead of new name - .
void ParseNode_TexMap(XmlNode &node, const bool pUseOldName = false);
-public:
- /// Default constructor.
- AMFImporter() AI_NO_EXCEPT;
- /// Default destructor.
- ~AMFImporter() override;
-
- /// Parse AMF file and fill scene graph. The function has no return value. Result can be found by analyzing the generated graph.
- /// Also exception can be thrown if trouble will found.
- /// \param [in] pFile - name of file to be parsed.
- /// \param [in] pIOHandler - pointer to IO helper object.
- void ParseFile(const std::string &pFile, IOSystem *pIOHandler);
- void ParseHelper_Node_Enter(AMFNodeElementBase *child);
- void ParseHelper_Node_Exit();
- bool CanRead(const std::string &pFile, IOSystem *pIOHandler, bool pCheckSig) const override;
- void InternReadFile(const std::string &pFile, aiScene *pScene, IOSystem *pIOHandler) override;
- const aiImporterDesc *GetInfo() const override;
- bool Find_NodeElement(const std::string &pID, const AMFNodeElementBase::EType pType, AMFNodeElementBase **pNodeElement) const;
- bool Find_ConvertedNode(const std::string &pID, NodeArray &nodeArray, aiNode **pNode) const;
- bool Find_ConvertedMaterial(const std::string &pID, const SPP_Material **pConvertedMaterial) const;
- AI_WONT_RETURN void Throw_CloseNotFound(const std::string &nodeName) AI_WONT_RETURN_SUFFIX;
- AI_WONT_RETURN void Throw_IncorrectAttr(const std::string &nodeName, const std::string &pAttrName) AI_WONT_RETURN_SUFFIX;
- AI_WONT_RETURN void Throw_IncorrectAttrValue(const std::string &nodeName, const std::string &pAttrName) AI_WONT_RETURN_SUFFIX;
- AI_WONT_RETURN void Throw_MoreThanOnceDefined(const std::string &nodeName, const std::string &pNodeType, const std::string &pDescription) AI_WONT_RETURN_SUFFIX;
- AI_WONT_RETURN void Throw_ID_NotFound(const std::string &pID) const AI_WONT_RETURN_SUFFIX;
- void XML_CheckNode_MustHaveChildren(pugi::xml_node &node);
- bool XML_SearchNode(const std::string &nodeName);
- void ParseHelper_FixTruncatedFloatString(const char *pInStr, std::string &pOutString);
- AMFImporter(const AMFImporter &pScene) = delete;
- AMFImporter &operator=(const AMFImporter &pScene) = delete;
private:
- static const aiImporterDesc Description;
-
AMFNodeElementBase *mNodeElement_Cur; ///< Current element.
std::list mNodeElement_List; ///< All elements of scene graph.
XmlParser *mXmlParser;
diff --git a/code/AssetLib/ASE/ASELoader.cpp b/code/AssetLib/ASE/ASELoader.cpp
index 4617c9ed4..f98316661 100644
--- a/code/AssetLib/ASE/ASELoader.cpp
+++ b/code/AssetLib/ASE/ASELoader.cpp
@@ -63,10 +63,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// utilities
#include
-using namespace Assimp;
+namespace Assimp {
using namespace Assimp::ASE;
-static const aiImporterDesc desc = {
+static constexpr aiImporterDesc desc = {
"ASE Importer",
"",
"",
@@ -904,7 +904,7 @@ void ASEImporter::ConvertMeshes(ASE::Mesh &mesh, std::vector &avOutMes
ASSIMP_LOG_WARN("Material index is out of range");
}
- // If the material the mesh is assigned to is consisting of submeshes, split it
+ // If the material the mesh is assigned to consists of submeshes, split it
if (!mParser->m_vMaterials[mesh.iMaterialIndex].avSubMaterials.empty()) {
std::vector vSubMaterials = mParser->m_vMaterials[mesh.iMaterialIndex].avSubMaterials;
@@ -1262,6 +1262,8 @@ bool ASEImporter::GenerateNormals(ASE::Mesh &mesh) {
return false;
}
+}
+
#endif // ASSIMP_BUILD_NO_3DS_IMPORTER
#endif // !! ASSIMP_BUILD_NO_BASE_IMPORTER
diff --git a/code/AssetLib/ASE/ASEParser.cpp b/code/AssetLib/ASE/ASEParser.cpp
index c43eb42ff..90f462598 100644
--- a/code/AssetLib/ASE/ASEParser.cpp
+++ b/code/AssetLib/ASE/ASEParser.cpp
@@ -53,7 +53,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include
#include
-using namespace Assimp;
+namespace Assimp {
using namespace Assimp::ASE;
// ------------------------------------------------------------------------------------------------
@@ -1864,6 +1864,8 @@ void Parser::ParseLV4MeshLong(unsigned int &iOut) {
iOut = strtoul10(filePtr, &filePtr);
}
+}
+
#endif // ASSIMP_BUILD_NO_3DS_IMPORTER
#endif // !! ASSIMP_BUILD_NO_BASE_IMPORTER
diff --git a/code/AssetLib/Assbin/AssbinFileWriter.cpp b/code/AssetLib/Assbin/AssbinFileWriter.cpp
index e9d857a84..782595bc1 100644
--- a/code/AssetLib/Assbin/AssbinFileWriter.cpp
+++ b/code/AssetLib/Assbin/AssbinFileWriter.cpp
@@ -50,11 +50,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include
#include
-#ifdef ASSIMP_BUILD_NO_OWN_ZLIB
-#include
-#else
-#include "../contrib/zlib/zlib.h"
-#endif
+#include "zlib.h"
#include
diff --git a/code/AssetLib/Assbin/AssbinLoader.cpp b/code/AssetLib/Assbin/AssbinLoader.cpp
index f7b35636c..6995ea976 100644
--- a/code/AssetLib/Assbin/AssbinLoader.cpp
+++ b/code/AssetLib/Assbin/AssbinLoader.cpp
@@ -65,7 +65,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using namespace Assimp;
-static const aiImporterDesc desc = {
+static constexpr aiImporterDesc desc = {
"Assimp Binary Importer",
"Gargaj / Conspiracy",
"",
diff --git a/code/AssetLib/B3D/B3DImporter.cpp b/code/AssetLib/B3D/B3DImporter.cpp
index bf8145798..670f3de53 100644
--- a/code/AssetLib/B3D/B3DImporter.cpp
+++ b/code/AssetLib/B3D/B3DImporter.cpp
@@ -59,10 +59,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include
-using namespace Assimp;
+namespace Assimp {
using namespace std;
-static const aiImporterDesc desc = {
+static constexpr aiImporterDesc desc = {
"BlitzBasic 3D Importer",
"",
"",
@@ -79,9 +79,9 @@ static const aiImporterDesc desc = {
#pragma warning(disable : 4018)
#endif
-//#define DEBUG_B3D
+// #define DEBUG_B3D
-template
+template
void DeleteAllBarePointers(std::vector &x) {
for (auto p : x) {
delete p;
@@ -329,7 +329,7 @@ void B3DImporter::ReadBRUS() {
mat->AddProperty(&i, 1, AI_MATKEY_TWOSIDED);
}
- //Textures
+ // Textures
for (int i = 0; i < n_texs; ++i) {
int texid = ReadInt();
if (texid < -1 || (texid >= 0 && texid >= static_cast(_textures.size()))) {
@@ -372,7 +372,7 @@ void B3DImporter::ReadVRTS() {
}
if (_vflags & 2) {
- ReadQuat(); //skip v 4bytes...
+ ReadQuat(); // skip v 4bytes...
}
for (int j = 0; j < _tcsets; ++j) {
@@ -704,22 +704,22 @@ void B3DImporter::ReadBB3D(aiScene *scene) {
}
}
- //nodes
+ // nodes
scene->mRootNode = _nodes[0];
_nodes.clear(); // node ownership now belongs to scene
- //material
+ // material
if (!_materials.size()) {
_materials.emplace_back(std::unique_ptr(new aiMaterial));
}
scene->mNumMaterials = static_cast(_materials.size());
scene->mMaterials = unique_to_array(_materials);
- //meshes
+ // meshes
scene->mNumMeshes = static_cast(_meshes.size());
scene->mMeshes = unique_to_array(_meshes);
- //animations
+ // animations
if (_animations.size() == 1 && _nodeAnims.size()) {
aiAnimation *anim = _animations.back().get();
@@ -738,4 +738,6 @@ void B3DImporter::ReadBB3D(aiScene *scene) {
flip.Execute(scene);
}
+} // namespace Assimp
+
#endif // !! ASSIMP_BUILD_NO_B3D_IMPORTER
diff --git a/code/AssetLib/BVH/BVHLoader.cpp b/code/AssetLib/BVH/BVHLoader.cpp
index d92887c9e..4d2cfde15 100644
--- a/code/AssetLib/BVH/BVHLoader.cpp
+++ b/code/AssetLib/BVH/BVHLoader.cpp
@@ -55,10 +55,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include
#include
-using namespace Assimp;
+namespace Assimp {
+
using namespace Assimp::Formatter;
-static const aiImporterDesc desc = {
+static constexpr aiImporterDesc desc = {
"BVH Importer (MoCap)",
"",
"",
@@ -73,8 +74,8 @@ static const aiImporterDesc desc = {
// ------------------------------------------------------------------------------------------------
// Aborts the file reading with an exception
-template
-AI_WONT_RETURN void BVHLoader::ThrowException(T&&... args) {
+template
+AI_WONT_RETURN void BVHLoader::ThrowException(T &&...args) {
throw DeadlyImportError(mFileName, ":", mLine, " - ", args...);
}
@@ -426,7 +427,7 @@ void BVHLoader::CreateAnimation(aiScene *pScene) {
nodeAnim->mNodeName.Set(nodeName);
std::map channelMap;
- //Build map of channels
+ // Build map of channels
for (unsigned int channel = 0; channel < node.mChannels.size(); ++channel) {
channelMap[node.mChannels[channel]] = channel;
}
@@ -441,7 +442,7 @@ void BVHLoader::CreateAnimation(aiScene *pScene) {
// Now compute all translations
for (BVHLoader::ChannelType channel = Channel_PositionX; channel <= Channel_PositionZ; channel = (BVHLoader::ChannelType)(channel + 1)) {
- //Find channel in node
+ // Find channel in node
std::map::iterator mapIter = channelMap.find(channel);
if (mapIter == channelMap.end())
@@ -485,30 +486,27 @@ void BVHLoader::CreateAnimation(aiScene *pScene) {
for (unsigned int fr = 0; fr < mAnimNumFrames; ++fr) {
aiMatrix4x4 temp;
aiMatrix3x3 rotMatrix;
- for (unsigned int channelIdx = 0; channelIdx < node.mChannels.size(); ++ channelIdx) {
- switch (node.mChannels[channelIdx]) {
- case Channel_RotationX:
- {
+ for (unsigned int channelIdx = 0; channelIdx < node.mChannels.size(); ++channelIdx) {
+ switch (node.mChannels[channelIdx]) {
+ case Channel_RotationX: {
const float angle = node.mChannelValues[fr * node.mChannels.size() + channelIdx] * float(AI_MATH_PI) / 180.0f;
- aiMatrix4x4::RotationX( angle, temp); rotMatrix *= aiMatrix3x3( temp);
- }
- break;
- case Channel_RotationY:
- {
+ aiMatrix4x4::RotationX(angle, temp);
+ rotMatrix *= aiMatrix3x3(temp);
+ } break;
+ case Channel_RotationY: {
const float angle = node.mChannelValues[fr * node.mChannels.size() + channelIdx] * float(AI_MATH_PI) / 180.0f;
- aiMatrix4x4::RotationY( angle, temp); rotMatrix *= aiMatrix3x3( temp);
- }
- break;
- case Channel_RotationZ:
- {
+ aiMatrix4x4::RotationY(angle, temp);
+ rotMatrix *= aiMatrix3x3(temp);
+ } break;
+ case Channel_RotationZ: {
const float angle = node.mChannelValues[fr * node.mChannels.size() + channelIdx] * float(AI_MATH_PI) / 180.0f;
- aiMatrix4x4::RotationZ( angle, temp); rotMatrix *= aiMatrix3x3( temp);
- }
- break;
+ aiMatrix4x4::RotationZ(angle, temp);
+ rotMatrix *= aiMatrix3x3(temp);
+ } break;
default:
break;
- }
- }
+ }
+ }
rotkey->mTime = double(fr);
rotkey->mValue = aiQuaternion(rotMatrix);
++rotkey;
@@ -525,4 +523,6 @@ void BVHLoader::CreateAnimation(aiScene *pScene) {
}
}
+} // namespace Assimp
+
#endif // !! ASSIMP_BUILD_NO_BVH_IMPORTER
diff --git a/code/AssetLib/Blender/BlenderLoader.cpp b/code/AssetLib/Blender/BlenderLoader.cpp
index 5c6e7bc5b..35b35f08d 100644
--- a/code/AssetLib/Blender/BlenderLoader.cpp
+++ b/code/AssetLib/Blender/BlenderLoader.cpp
@@ -69,11 +69,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// zlib is needed for compressed blend files
#ifndef ASSIMP_BUILD_NO_COMPRESSED_BLEND
#include "Common/Compression.h"
-/* #ifdef ASSIMP_BUILD_NO_OWN_ZLIB
-# include
-# else
-# include "../contrib/zlib/zlib.h"
-# endif*/
#endif
namespace Assimp {
@@ -89,7 +84,7 @@ using namespace Assimp;
using namespace Assimp::Blender;
using namespace Assimp::Formatter;
-static const aiImporterDesc blenderDesc = {
+static constexpr aiImporterDesc blenderDesc = {
"Blender 3D Importer (http://www.blender3d.org)",
"",
"",
diff --git a/code/AssetLib/Blender/BlenderModifier.cpp b/code/AssetLib/Blender/BlenderModifier.cpp
index 6cc11ec8e..f925de608 100644
--- a/code/AssetLib/Blender/BlenderModifier.cpp
+++ b/code/AssetLib/Blender/BlenderModifier.cpp
@@ -283,6 +283,11 @@ void BlenderModifier_Subdivision ::DoIt(aiNode &out, ConversionData &conv_data,
if (conv_data.meshes->empty()) {
return;
}
+ const size_t meshIndex = conv_data.meshes->size() - out.mNumMeshes;
+ if (meshIndex >= conv_data.meshes->size()) {
+ ASSIMP_LOG_ERROR("Invalid index detected.");
+ return;
+ }
aiMesh **const meshes = &conv_data.meshes[conv_data.meshes->size() - out.mNumMeshes];
std::unique_ptr tempmeshes(new aiMesh *[out.mNumMeshes]());
diff --git a/code/AssetLib/Blender/BlenderScene.cpp b/code/AssetLib/Blender/BlenderScene.cpp
index a2e4c30f2..e25dc450b 100644
--- a/code/AssetLib/Blender/BlenderScene.cpp
+++ b/code/AssetLib/Blender/BlenderScene.cpp
@@ -297,7 +297,7 @@ void Structure ::Convert (
const FileDatabase &db) const {
// note: as per https://github.com/assimp/assimp/issues/128,
// reading the Object linked list recursively is prone to stack overflow.
- // This structure converter is therefore an hand-written exception that
+ // This structure converter is therefore a hand-written exception that
// does it iteratively.
const int initial_pos = db.reader->GetCurrentPos();
diff --git a/code/AssetLib/COB/COBLoader.cpp b/code/AssetLib/COB/COBLoader.cpp
index 20df53f75..9a6e32f6d 100644
--- a/code/AssetLib/COB/COBLoader.cpp
+++ b/code/AssetLib/COB/COBLoader.cpp
@@ -61,11 +61,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include
-using namespace Assimp;
+namespace Assimp {
using namespace Assimp::COB;
using namespace Assimp::Formatter;
-static const float units[] = {
+static constexpr float units[] = {
1000.f,
100.f,
1.f,
@@ -76,7 +76,7 @@ static const float units[] = {
1.f / 1609.344f
};
-static const aiImporterDesc desc = {
+static constexpr aiImporterDesc desc = {
"TrueSpace Object Importer",
"",
"",
@@ -89,14 +89,6 @@ static const aiImporterDesc desc = {
"cob scn"
};
-// ------------------------------------------------------------------------------------------------
-// Constructor to be privately used by Importer
-COBImporter::COBImporter() = default;
-
-// ------------------------------------------------------------------------------------------------
-// Destructor, private as well
-COBImporter::~COBImporter() = default;
-
// ------------------------------------------------------------------------------------------------
// Returns whether the class can handle the format of the given file.
bool COBImporter::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool /*checkSig*/) const {
@@ -1172,4 +1164,6 @@ void COBImporter::ReadUnit_Binary(COB::Scene &out, StreamReaderLE &reader, const
ASSIMP_LOG_WARN("`Unit` chunk ", nfo.id, " is a child of ", nfo.parent_id, " which does not exist");
}
+}
+
#endif // ASSIMP_BUILD_NO_COB_IMPORTER
diff --git a/code/AssetLib/COB/COBLoader.h b/code/AssetLib/COB/COBLoader.h
index e6eb96dc1..a9755f5d7 100644
--- a/code/AssetLib/COB/COBLoader.h
+++ b/code/AssetLib/COB/COBLoader.h
@@ -56,16 +56,16 @@ class LineSplitter;
// TinyFormatter.h
namespace Formatter {
-template
-class basic_formatter;
-typedef class basic_formatter, std::allocator> format;
+ template
+ class basic_formatter;
+ typedef class basic_formatter, std::allocator> format;
} // namespace Formatter
// COBScene.h
namespace COB {
-struct ChunkInfo;
-struct Node;
-struct Scene;
+ struct ChunkInfo;
+ struct Node;
+ struct Scene;
} // namespace COB
// -------------------------------------------------------------------------------------------
@@ -75,8 +75,8 @@ struct Scene;
// -------------------------------------------------------------------------------------------
class COBImporter : public BaseImporter {
public:
- COBImporter();
- ~COBImporter() override;
+ COBImporter() = default;
+ ~COBImporter() override = default;
// --------------------
bool CanRead(const std::string &pFile, IOSystem *pIOHandler,
diff --git a/code/AssetLib/CSM/CSMLoader.cpp b/code/AssetLib/CSM/CSMLoader.cpp
index db152f453..20f2343f5 100644
--- a/code/AssetLib/CSM/CSMLoader.cpp
+++ b/code/AssetLib/CSM/CSMLoader.cpp
@@ -44,9 +44,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
/** @file CSMLoader.cpp
* Implementation of the CSM importer class.
*/
-
-
-
#ifndef ASSIMP_BUILD_NO_CSM_IMPORTER
#include "CSMLoader.h"
@@ -63,7 +60,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using namespace Assimp;
-static const aiImporterDesc desc = {
+static constexpr aiImporterDesc desc = {
"CharacterStudio Motion Importer (MoCap)",
"",
"",
@@ -79,13 +76,9 @@ static const aiImporterDesc desc = {
// ------------------------------------------------------------------------------------------------
// Constructor to be privately used by Importer
-CSMImporter::CSMImporter()
-: noSkeletonMesh()
-{}
-
-// ------------------------------------------------------------------------------------------------
-// Destructor, private as well
-CSMImporter::~CSMImporter() = default;
+CSMImporter::CSMImporter() : noSkeletonMesh(){
+ // empty
+}
// ------------------------------------------------------------------------------------------------
// Returns whether the class can handle the format of the given file.
diff --git a/code/AssetLib/CSM/CSMLoader.h b/code/AssetLib/CSM/CSMLoader.h
index e9c4cd5ee..fc9017d17 100644
--- a/code/AssetLib/CSM/CSMLoader.h
+++ b/code/AssetLib/CSM/CSMLoader.h
@@ -61,7 +61,7 @@ namespace Assimp {
class CSMImporter : public BaseImporter {
public:
CSMImporter();
- ~CSMImporter() override;
+ ~CSMImporter() override = default;
// -------------------------------------------------------------------
bool CanRead(const std::string &pFile, IOSystem *pIOHandler,
@@ -81,9 +81,8 @@ protected:
private:
bool noSkeletonMesh;
-}; // end of class CSMImporter
+};
-} // end of namespace Assimp
+} // namespace Assimp
#endif // AI_AC3DIMPORTER_H_INC
-
diff --git a/code/AssetLib/Collada/ColladaLoader.cpp b/code/AssetLib/Collada/ColladaLoader.cpp
index e1f19a5ed..41e529de0 100644
--- a/code/AssetLib/Collada/ColladaLoader.cpp
+++ b/code/AssetLib/Collada/ColladaLoader.cpp
@@ -64,7 +64,7 @@ namespace Assimp {
using namespace Assimp::Formatter;
using namespace Assimp::Collada;
-static const aiImporterDesc desc = {
+static constexpr aiImporterDesc desc = {
"Collada Importer",
"",
"",
@@ -101,10 +101,6 @@ ColladaLoader::ColladaLoader() :
// empty
}
-// ------------------------------------------------------------------------------------------------
-// Destructor, private as well
-ColladaLoader::~ColladaLoader() = default;
-
// ------------------------------------------------------------------------------------------------
// Returns whether the class can handle the format of the given file.
bool ColladaLoader::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool /*checkSig*/) const {
diff --git a/code/AssetLib/Collada/ColladaLoader.h b/code/AssetLib/Collada/ColladaLoader.h
index 74b5c06b7..3cea7f531 100644
--- a/code/AssetLib/Collada/ColladaLoader.h
+++ b/code/AssetLib/Collada/ColladaLoader.h
@@ -86,7 +86,7 @@ public:
ColladaLoader();
/// The class destructor.
- ~ColladaLoader() override;
+ ~ColladaLoader() override = default;
/// Returns whether the class can handle the format of the given file.
/// @see BaseImporter::CanRead() for more details.
diff --git a/code/AssetLib/Collada/ColladaParser.cpp b/code/AssetLib/Collada/ColladaParser.cpp
index fcadd08a7..42a8d6052 100644
--- a/code/AssetLib/Collada/ColladaParser.cpp
+++ b/code/AssetLib/Collada/ColladaParser.cpp
@@ -814,38 +814,38 @@ void ColladaParser::ReadImage(XmlNode &node, Collada::Image &pImage) {
if (!pImage.mFileName.length()) {
pImage.mFileName = "unknown_texture";
}
- }
- } else if (mFormat == FV_1_5_n) {
- std::string value;
- XmlNode refChild = currentNode.child("ref");
- XmlNode hexChild = currentNode.child("hex");
- if (refChild) {
- // element content is filename - hopefully
- if (XmlParser::getValueAsString(refChild, value)) {
- aiString filepath(value);
- UriDecodePath(filepath);
- pImage.mFileName = filepath.C_Str();
- }
- } else if (hexChild && !pImage.mFileName.length()) {
- // embedded image. get format
- pImage.mEmbeddedFormat = hexChild.attribute("format").as_string();
- if (pImage.mEmbeddedFormat.empty()) {
- ASSIMP_LOG_WARN("Collada: Unknown image file format");
- }
+ } else if (mFormat == FV_1_5_n) {
+ std::string value;
+ XmlNode refChild = currentNode.child("ref");
+ XmlNode hexChild = currentNode.child("hex");
+ if (refChild) {
+ // element content is filename - hopefully
+ if (XmlParser::getValueAsString(refChild, value)) {
+ aiString filepath(value);
+ UriDecodePath(filepath);
+ pImage.mFileName = filepath.C_Str();
+ }
+ } else if (hexChild && !pImage.mFileName.length()) {
+ // embedded image. get format
+ pImage.mEmbeddedFormat = hexChild.attribute("format").as_string();
+ if (pImage.mEmbeddedFormat.empty()) {
+ ASSIMP_LOG_WARN("Collada: Unknown image file format");
+ }
- XmlParser::getValueAsString(hexChild, value);
- const char *data = value.c_str();
- // hexadecimal-encoded binary octets. First of all, find the
- // required buffer size to reserve enough storage.
- const char *cur = data;
- while (!IsSpaceOrNewLine(*cur)) {
- ++cur;
- }
+ XmlParser::getValueAsString(hexChild, value);
+ const char *data = value.c_str();
+ // hexadecimal-encoded binary octets. First of all, find the
+ // required buffer size to reserve enough storage.
+ const char *cur = data;
+ while (!IsSpaceOrNewLine(*cur)) {
+ ++cur;
+ }
- const unsigned int size = (unsigned int)(cur - data) * 2;
- pImage.mImageData.resize(size);
- for (unsigned int i = 0; i < size; ++i) {
- pImage.mImageData[i] = HexOctetToDecimal(data + (i << 1));
+ const unsigned int size = (unsigned int)(cur - data) * 2;
+ pImage.mImageData.resize(size);
+ for (unsigned int i = 0; i < size; ++i) {
+ pImage.mImageData[i] = HexOctetToDecimal(data + (i << 1));
+ }
}
}
}
@@ -1274,9 +1274,7 @@ void ColladaParser::ReadEffectParam(XmlNode &node, Collada::EffectParam &pParam)
return;
}
- XmlNodeIterator xmlIt(node, XmlNodeIterator::PreOrderMode);
- XmlNode currentNode;
- while (xmlIt.getNext(currentNode)) {
+ for (XmlNode ¤tNode : node.children()) {
const std::string ¤tName = currentNode.name();
if (currentName == "surface") {
// image ID given inside tags
@@ -1289,22 +1287,24 @@ void ColladaParser::ReadEffectParam(XmlNode &node, Collada::EffectParam &pParam)
}
} else if (currentName == "sampler2D" && (FV_1_4_n == mFormat || FV_1_3_n == mFormat)) {
// surface ID is given inside tags
- const char *content = currentNode.value();
- pParam.mType = Param_Sampler;
- pParam.mReference = content;
+ XmlNode source = currentNode.child("source");
+ if (source) {
+ std::string v;
+ XmlParser::getValueAsString(source, v);
+ pParam.mType = Param_Sampler;
+ pParam.mReference = v.c_str();
+ }
} else if (currentName == "sampler2D") {
// surface ID is given inside tags
- std::string url;
- XmlParser::getStdStrAttribute(currentNode, "url", url);
- if (url[0] != '#') {
- throw DeadlyImportError("Unsupported URL format in instance_image");
- }
- pParam.mType = Param_Sampler;
- pParam.mReference = url.c_str() + 1;
- } else if (currentName == "source") {
- const char *source = currentNode.child_value();
- if (nullptr != source) {
- pParam.mReference = source;
+ XmlNode instance_image = currentNode.child("instance_image");
+ if (instance_image) {
+ std::string url;
+ XmlParser::getStdStrAttribute(instance_image, "url", url);
+ if (url[0] != '#') {
+ throw DeadlyImportError("Unsupported URL format in instance_image");
+ }
+ pParam.mType = Param_Sampler;
+ pParam.mReference = url.c_str() + 1;
}
}
}
@@ -1867,7 +1867,7 @@ size_t ColladaParser::ReadPrimitives(XmlNode &node, Mesh &pMesh, std::vector and tags this function will create wrong uv coordinates.
-///It's not clear from COLLADA documentation is this allowed or not. For now only exporter fixed to avoid such behavior
+///It's not clear from COLLADA documentation whether this is allowed or not. For now only exporter fixed to avoid such behavior
void ColladaParser::CopyVertex(size_t currentVertex, size_t numOffsets, size_t numPoints, size_t perVertexOffset, Mesh &pMesh,
std::vector &pPerIndexChannels, size_t currentPrimitive, const std::vector &indices) {
// calculate the base offset of the vertex whose attributes we ant to copy
diff --git a/code/AssetLib/DXF/DXFLoader.cpp b/code/AssetLib/DXF/DXFLoader.cpp
index dae665388..f69cdfce2 100644
--- a/code/AssetLib/DXF/DXFLoader.cpp
+++ b/code/AssetLib/DXF/DXFLoader.cpp
@@ -70,7 +70,7 @@ static const aiColor4D AI_DXF_DEFAULT_COLOR(aiColor4D(0.6f, 0.6f, 0.6f, 0.6f));
// color indices for DXF - 16 are supported, the table is
// taken directly from the DXF spec.
-static aiColor4D g_aclrDxfIndexColors[] = {
+static const aiColor4D g_aclrDxfIndexColors[] = {
aiColor4D(0.6f, 0.6f, 0.6f, 1.0f),
aiColor4D (1.0f, 0.0f, 0.0f, 1.0f), // red
aiColor4D (0.0f, 1.0f, 0.0f, 1.0f), // green
@@ -97,7 +97,7 @@ static const int GroupCode_XComp = 10;
static const int GroupCode_YComp = 20;
static const int GroupCode_ZComp = 30;
-static const aiImporterDesc desc = {
+static constexpr aiImporterDesc desc = {
"Drawing Interchange Format (DXF) Importer",
"",
"",
diff --git a/code/AssetLib/FBX/FBXBinaryTokenizer.cpp b/code/AssetLib/FBX/FBXBinaryTokenizer.cpp
index 8d79e2339..55424a6a8 100644
--- a/code/AssetLib/FBX/FBXBinaryTokenizer.cpp
+++ b/code/AssetLib/FBX/FBXBinaryTokenizer.cpp
@@ -51,6 +51,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "FBXUtil.h"
#include
#include
+#include
#include
#include
#include
diff --git a/code/AssetLib/FBX/FBXConverter.cpp b/code/AssetLib/FBX/FBXConverter.cpp
index c02548fc2..cf6a29220 100644
--- a/code/AssetLib/FBX/FBXConverter.cpp
+++ b/code/AssetLib/FBX/FBXConverter.cpp
@@ -55,9 +55,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include
#include
-
#include
-
#include
#include
#include
@@ -577,16 +575,17 @@ void FBXConverter::GetRotationMatrix(Model::RotOrder mode, const aiVector3D &rot
bool is_id[3] = { true, true, true };
aiMatrix4x4 temp[3];
- if (std::fabs(rotation.z) > angle_epsilon) {
- aiMatrix4x4::RotationZ(AI_DEG_TO_RAD(rotation.z), temp[2]);
+ const auto rot = AI_DEG_TO_RAD(rotation);
+ if (std::fabs(rot.z) > angle_epsilon) {
+ aiMatrix4x4::RotationZ(rot.z, temp[2]);
is_id[2] = false;
}
- if (std::fabs(rotation.y) > angle_epsilon) {
- aiMatrix4x4::RotationY(AI_DEG_TO_RAD(rotation.y), temp[1]);
+ if (std::fabs(rot.y) > angle_epsilon) {
+ aiMatrix4x4::RotationY(rot.y, temp[1]);
is_id[1] = false;
}
- if (std::fabs(rotation.x) > angle_epsilon) {
- aiMatrix4x4::RotationX(AI_DEG_TO_RAD(rotation.x), temp[0]);
+ if (std::fabs(rot.x) > angle_epsilon) {
+ aiMatrix4x4::RotationX(rot.x, temp[0]);
is_id[0] = false;
}
@@ -1205,7 +1204,7 @@ unsigned int FBXConverter::ConvertMeshSingleMaterial(const MeshGeometry &mesh, c
const auto &curNormals = shapeGeometry->GetNormals();
const auto &curIndices = shapeGeometry->GetIndices();
//losing channel name if using shapeGeometry->Name()
- // if blendShapeChannel Name is empty or don't have a ".", add geoMetryName;
+ // if blendShapeChannel Name is empty or doesn't have a ".", add geoMetryName;
auto aniName = FixAnimMeshName(blendShapeChannel->Name());
auto geoMetryName = FixAnimMeshName(shapeGeometry->Name());
if (aniName.empty()) {
@@ -1603,7 +1602,7 @@ void FBXConverter::ConvertWeights(aiMesh *out, const MeshGeometry &geo, const ai
void FBXConverter::ConvertCluster(std::vector &local_mesh_bones, const Cluster *cluster,
std::vector &out_indices, std::vector &index_out_indices,
- std::vector &count_out_indices, const aiMatrix4x4 & /* absolute_transform*/,
+ std::vector &count_out_indices, const aiMatrix4x4 &absolute_transform,
aiNode *) {
ai_assert(cluster != nullptr); // make sure cluster valid
@@ -1620,16 +1619,16 @@ void FBXConverter::ConvertCluster(std::vector &local_mesh_bones, const
bone = new aiBone();
bone->mName = bone_name;
- bone->mOffsetMatrix = cluster->Transform();
+ //bone->mOffsetMatrix = cluster->Transform();
// store local transform link for post processing
- /*
+
bone->mOffsetMatrix = cluster->TransformLink();
bone->mOffsetMatrix.Inverse();
- aiMatrix4x4 matrix = (aiMatrix4x4)absolute_transform;
+ const aiMatrix4x4 matrix = (aiMatrix4x4)absolute_transform;
bone->mOffsetMatrix = bone->mOffsetMatrix * matrix; // * mesh_offset
- */
+
//
// Now calculate the aiVertexWeights
//
@@ -3229,7 +3228,6 @@ aiNodeAnim* FBXConverter::GenerateSimpleNodeAnim(const std::string& name,
aiVector3D defTranslate = PropertyGet(props, "Lcl Translation", aiVector3D(0.f, 0.f, 0.f));
aiVector3D defRotation = PropertyGet(props, "Lcl Rotation", aiVector3D(0.f, 0.f, 0.f));
aiVector3D defScale = PropertyGet(props, "Lcl Scaling", aiVector3D(1.f, 1.f, 1.f));
- aiQuaternion defQuat = EulerToQuaternion(defRotation, rotOrder);
aiVectorKey* outTranslations = new aiVectorKey[keyCount];
aiQuatKey* outRotations = new aiQuatKey[keyCount];
@@ -3245,8 +3243,9 @@ aiNodeAnim* FBXConverter::GenerateSimpleNodeAnim(const std::string& name,
}
if (keyframeLists[TransformationComp_Rotation].size() > 0) {
- InterpolateKeys(outRotations, keytimes, keyframeLists[TransformationComp_Rotation], defRotation, maxTime, minTime, rotOrder);
+ InterpolateKeys(outRotations, keytimes, keyframeLists[TransformationComp_Rotation], AI_DEG_TO_RAD(defRotation), maxTime, minTime, rotOrder);
} else {
+ aiQuaternion defQuat = EulerToQuaternion(AI_DEG_TO_RAD(defRotation), rotOrder);
for (size_t i = 0; i < keyCount; ++i) {
outRotations[i].mTime = CONVERT_FBX_TIME(keytimes[i]) * anim_fps;
outRotations[i].mValue = defQuat;
@@ -3268,7 +3267,7 @@ aiNodeAnim* FBXConverter::GenerateSimpleNodeAnim(const std::string& name,
const aiVector3D& preRotation = PropertyGet(props, "PreRotation", ok);
if (ok && preRotation.SquareLength() > zero_epsilon) {
- const aiQuaternion preQuat = EulerToQuaternion(preRotation, Model::RotOrder_EulerXYZ);
+ const aiQuaternion preQuat = EulerToQuaternion(AI_DEG_TO_RAD(preRotation), Model::RotOrder_EulerXYZ);
for (size_t i = 0; i < keyCount; ++i) {
outRotations[i].mValue = preQuat * outRotations[i].mValue;
}
@@ -3276,7 +3275,7 @@ aiNodeAnim* FBXConverter::GenerateSimpleNodeAnim(const std::string& name,
const aiVector3D& postRotation = PropertyGet(props, "PostRotation", ok);
if (ok && postRotation.SquareLength() > zero_epsilon) {
- const aiQuaternion postQuat = EulerToQuaternion(postRotation, Model::RotOrder_EulerXYZ);
+ const aiQuaternion postQuat = EulerToQuaternion(AI_DEG_TO_RAD(postRotation), Model::RotOrder_EulerXYZ);
for (size_t i = 0; i < keyCount; ++i) {
outRotations[i].mValue = outRotations[i].mValue * postQuat;
}
diff --git a/code/AssetLib/FBX/FBXDeformer.cpp b/code/AssetLib/FBX/FBXDeformer.cpp
index 1aab55ea9..8f944527a 100644
--- a/code/AssetLib/FBX/FBXDeformer.cpp
+++ b/code/AssetLib/FBX/FBXDeformer.cpp
@@ -84,7 +84,7 @@ Cluster::Cluster(uint64_t id, const Element& element, const Document& doc, const
transform = ReadMatrix(Transform);
transformLink = ReadMatrix(TransformLink);
- // it is actually possible that there be Deformer's with no weights
+ // it is actually possible that there are Deformer's with no weights
if (!!Indexes != !!Weights) {
DOMError("either Indexes or Weights are missing from Cluster",&element);
}
diff --git a/code/AssetLib/FBX/FBXDocument.cpp b/code/AssetLib/FBX/FBXDocument.cpp
index 657f30f8c..ee4a6632b 100644
--- a/code/AssetLib/FBX/FBXDocument.cpp
+++ b/code/AssetLib/FBX/FBXDocument.cpp
@@ -390,7 +390,7 @@ void Document::ReadObjects() {
const auto foundObject = objects.find(id);
if(foundObject != objects.end()) {
DOMWarning("encountered duplicate object id, ignoring first occurrence",el.second);
- delete foundObject->second;
+ delete_LazyObject(foundObject->second);
}
objects[id] = new_LazyObject(id, *el.second, *this);
diff --git a/code/AssetLib/FBX/FBXExporter.cpp b/code/AssetLib/FBX/FBXExporter.cpp
index 9da713e5d..28299544a 100644
--- a/code/AssetLib/FBX/FBXExporter.cpp
+++ b/code/AssetLib/FBX/FBXExporter.cpp
@@ -74,8 +74,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// https://code.blender.org/2013/08/fbx-binary-file-format-specification/
// https://wiki.blender.org/index.php/User:Mont29/Foundation/FBX_File_Structure
-const ai_real DEG = ai_real( 57.29577951308232087679815481 ); // degrees per radian
-
using namespace Assimp;
using namespace Assimp::FBX;
@@ -1063,14 +1061,14 @@ aiMatrix4x4 get_world_transform(const aiNode* node, const aiScene* scene)
return transform;
}
-int64_t to_ktime(double ticks, const aiAnimation* anim) {
+inline int64_t to_ktime(double ticks, const aiAnimation* anim) {
if (anim->mTicksPerSecond <= 0) {
return static_cast(ticks) * FBX::SECOND;
}
- return (static_cast(ticks) / static_cast(anim->mTicksPerSecond)) * FBX::SECOND;
+ return (static_cast(ticks / anim->mTicksPerSecond)) * FBX::SECOND;
}
-int64_t to_ktime(double time) {
+inline int64_t to_ktime(double time) {
return (static_cast(time * FBX::SECOND));
}
@@ -2415,7 +2413,7 @@ void FBXExporter::WriteObjects ()
// position/translation
for (size_t ki = 0; ki < na->mNumPositionKeys; ++ki) {
const aiVectorKey& k = na->mPositionKeys[ki];
- times.push_back(to_ktime(k.mTime));
+ times.push_back(to_ktime(k.mTime, anim));
xval.push_back(k.mValue.x);
yval.push_back(k.mValue.y);
zval.push_back(k.mValue.z);
@@ -2429,12 +2427,12 @@ void FBXExporter::WriteObjects ()
times.clear(); xval.clear(); yval.clear(); zval.clear();
for (size_t ki = 0; ki < na->mNumRotationKeys; ++ki) {
const aiQuatKey& k = na->mRotationKeys[ki];
- times.push_back(to_ktime(k.mTime));
+ times.push_back(to_ktime(k.mTime, anim));
// TODO: aiQuaternion method to convert to Euler...
aiMatrix4x4 m(k.mValue.GetMatrix());
aiVector3D qs, qr, qt;
m.Decompose(qs, qr, qt);
- qr *= DEG;
+ qr = AI_RAD_TO_DEG(qr);
xval.push_back(qr.x);
yval.push_back(qr.y);
zval.push_back(qr.z);
@@ -2447,7 +2445,7 @@ void FBXExporter::WriteObjects ()
times.clear(); xval.clear(); yval.clear(); zval.clear();
for (size_t ki = 0; ki < na->mNumScalingKeys; ++ki) {
const aiVectorKey& k = na->mScalingKeys[ki];
- times.push_back(to_ktime(k.mTime));
+ times.push_back(to_ktime(k.mTime, anim));
xval.push_back(k.mValue.x);
yval.push_back(k.mValue.y);
zval.push_back(k.mValue.z);
@@ -2515,9 +2513,10 @@ void FBXExporter::WriteModelNode(
);
}
if (r != zero) {
+ r = AI_RAD_TO_DEG(r);
p.AddP70(
"Lcl Rotation", "Lcl Rotation", "", "A",
- double(DEG*r.x), double(DEG*r.y), double(DEG*r.z)
+ double(r.x), double(r.y), double(r.z)
);
}
if (s != one) {
@@ -2601,8 +2600,7 @@ void FBXExporter::WriteModelNodes(
transform_chain.emplace_back(elem->first, t);
break;
case 'r': // rotation
- r *= float(DEG);
- transform_chain.emplace_back(elem->first, r);
+ transform_chain.emplace_back(elem->first, AI_RAD_TO_DEG(r));
break;
case 's': // scale
transform_chain.emplace_back(elem->first, s);
diff --git a/code/AssetLib/FBX/FBXImporter.cpp b/code/AssetLib/FBX/FBXImporter.cpp
index 56e0f38e9..afd4b11c1 100644
--- a/code/AssetLib/FBX/FBXImporter.cpp
+++ b/code/AssetLib/FBX/FBXImporter.cpp
@@ -72,30 +72,25 @@ using namespace Assimp::Formatter;
using namespace Assimp::FBX;
namespace {
-
-static const aiImporterDesc desc = {
- "Autodesk FBX Importer",
- "",
- "",
- "",
- aiImporterFlags_SupportTextFlavour,
- 0,
- 0,
- 0,
- 0,
- "fbx"
-};
+ static constexpr aiImporterDesc desc = {
+ "Autodesk FBX Importer",
+ "",
+ "",
+ "",
+ aiImporterFlags_SupportTextFlavour,
+ 0,
+ 0,
+ 0,
+ 0,
+ "fbx"
+ };
}
-// ------------------------------------------------------------------------------------------------
-// Constructor to be privately used by #Importer
-FBXImporter::FBXImporter() = default;
-
// ------------------------------------------------------------------------------------------------
// Returns whether the class can handle the format of the given file.
bool FBXImporter::CanRead(const std::string & pFile, IOSystem * pIOHandler, bool /*checkSig*/) const {
// at least ASCII-FBX files usually have a 'FBX' somewhere in their head
- static const char *tokens[] = { "fbx" };
+ static const char *tokens[] = { " \n\r\n " };
return SearchFileHeaderForToken(pIOHandler, pFile, tokens, AI_COUNT_OF(tokens));
}
diff --git a/code/AssetLib/FBX/FBXImporter.h b/code/AssetLib/FBX/FBXImporter.h
index 9acabaddd..d12b45969 100644
--- a/code/AssetLib/FBX/FBXImporter.h
+++ b/code/AssetLib/FBX/FBXImporter.h
@@ -70,7 +70,7 @@ typedef class basic_formatter, std::allocator
class FBXImporter : public BaseImporter, public LogFunctions {
public:
/// @brief The class constructor.
- FBXImporter();
+ FBXImporter() = default;
/// @brief The class destructor, default implementation.
~FBXImporter() override = default;
diff --git a/code/AssetLib/FBX/FBXMaterial.cpp b/code/AssetLib/FBX/FBXMaterial.cpp
index 2f575a511..bcb9bc42a 100644
--- a/code/AssetLib/FBX/FBXMaterial.cpp
+++ b/code/AssetLib/FBX/FBXMaterial.cpp
@@ -367,7 +367,9 @@ Video::Video(uint64_t id, const Element &element, const Document &doc, const std
}
Video::~Video() {
- delete[] content;
+ if (contentLength > 0) {
+ delete[] content;
+ }
}
} //!FBX
diff --git a/code/AssetLib/FBX/FBXMeshGeometry.cpp b/code/AssetLib/FBX/FBXMeshGeometry.cpp
index fcbaac169..8c6499a91 100644
--- a/code/AssetLib/FBX/FBXMeshGeometry.cpp
+++ b/code/AssetLib/FBX/FBXMeshGeometry.cpp
@@ -467,9 +467,9 @@ void ResolveVertexDataArray(std::vector& data_out, const Scope& source,
std::vector uvIndices;
ParseVectorDataArray(uvIndices,GetRequiredElement(source,indexDataElementName));
- if (uvIndices.size() != vertex_count) {
+ if (uvIndices.size() != mapping_offsets.size()) {
FBXImporter::LogError("length of input data unexpected for ByVertice mapping: ",
- uvIndices.size(), ", expected ", vertex_count);
+ uvIndices.size(), ", expected ", mapping_offsets.size());
return;
}
diff --git a/code/AssetLib/FBX/FBXParser.cpp b/code/AssetLib/FBX/FBXParser.cpp
index 955e811cb..7baa7ed39 100644
--- a/code/AssetLib/FBX/FBXParser.cpp
+++ b/code/AssetLib/FBX/FBXParser.cpp
@@ -45,12 +45,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#ifndef ASSIMP_BUILD_NO_FBX_IMPORTER
-//#ifdef ASSIMP_BUILD_NO_OWN_ZLIB
#include "Common/Compression.h"
-//# include
-//#else
-//# include "../contrib/zlib/zlib.h"
-//#endif
#include "FBXTokenizer.h"
#include "FBXParser.h"
diff --git a/code/AssetLib/FBX/FBXUtil.cpp b/code/AssetLib/FBX/FBXUtil.cpp
index ac465d6e9..e2903c536 100644
--- a/code/AssetLib/FBX/FBXUtil.cpp
+++ b/code/AssetLib/FBX/FBXUtil.cpp
@@ -155,7 +155,7 @@ size_t DecodeBase64(const char* in, size_t inLength, uint8_t* out, size_t maxOut
const size_t realLength = inLength - size_t(in[inLength - 1] == '=') - size_t(in[inLength - 2] == '=');
size_t dst_offset = 0;
int val = 0, valb = -8;
- for (size_t src_offset = 0; src_offset < realLength; ++src_offset)
+ for (size_t src_offset = 0; src_offset < realLength && dst_offset < maxOutLength; ++src_offset)
{
const uint8_t table_value = Util::DecodeBase64(in[src_offset]);
if (table_value == 255)
diff --git a/code/AssetLib/HMP/HMPLoader.cpp b/code/AssetLib/HMP/HMPLoader.cpp
index 431783a6a..5ccb2b474 100644
--- a/code/AssetLib/HMP/HMPLoader.cpp
+++ b/code/AssetLib/HMP/HMPLoader.cpp
@@ -57,7 +57,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using namespace Assimp;
-static const aiImporterDesc desc = {
+static constexpr aiImporterDesc desc = {
"3D GameStudio Heightmap (HMP) Importer",
"",
"",
diff --git a/code/AssetLib/IFC/IFCLoader.cpp b/code/AssetLib/IFC/IFCLoader.cpp
index 89012902c..c919d9982 100644
--- a/code/AssetLib/IFC/IFCLoader.cpp
+++ b/code/AssetLib/IFC/IFCLoader.cpp
@@ -103,7 +103,7 @@ void ConvertUnit(const ::Assimp::STEP::EXPRESS::DataType &dt, ConversionData &co
} // namespace
-static const aiImporterDesc desc = {
+static constexpr aiImporterDesc desc = {
"Industry Foundation Classes (IFC) Importer",
"",
"",
@@ -185,7 +185,7 @@ void IFCImporter::InternReadFile(const std::string &pFile, aiScene *pScene, IOSy
size_t total = 0;
int read = 0;
do {
- int bufferSize = fileInfo.uncompressed_size < INT16_MAX ? fileInfo.uncompressed_size : INT16_MAX;
+ unsigned bufferSize = fileInfo.uncompressed_size < INT16_MAX ? static_cast(fileInfo.uncompressed_size) : INT16_MAX;
void *buffer = malloc(bufferSize);
read = unzReadCurrentFile(zip, buffer, bufferSize);
if (read > 0) {
diff --git a/code/AssetLib/IFC/IFCOpenings.cpp b/code/AssetLib/IFC/IFCOpenings.cpp
index 48b843aa1..c47446dda 100644
--- a/code/AssetLib/IFC/IFCOpenings.cpp
+++ b/code/AssetLib/IFC/IFCOpenings.cpp
@@ -1372,7 +1372,7 @@ std::vector GetContourInPlane2D(const std::shared_ptr& mes
const std::vector& va = mesh->mVerts;
if(va.size() <= 2) {
std::stringstream msg;
- msg << "Skipping: Only " << va.size() << " verticies in opening mesh.";
+ msg << "Skipping: Only " << va.size() << " vertices in opening mesh.";
IFCImporter::LogDebug(msg.str().c_str());
ok = false;
return contour;
diff --git a/code/AssetLib/IFC/IFCReaderGen1_2x3.cpp b/code/AssetLib/IFC/IFCReaderGen1_2x3.cpp
index 73e3c91d8..c625f1daf 100644
--- a/code/AssetLib/IFC/IFCReaderGen1_2x3.cpp
+++ b/code/AssetLib/IFC/IFCReaderGen1_2x3.cpp
@@ -2725,6 +2725,10 @@ template <> size_t GenericFill(const DB& db, const L
do { // convert the 'CompositionType' argument
std::shared_ptr arg = params[base++];
if (dynamic_cast(&*arg)) { in->ObjectHelper::aux_is_derived[1]=true; break; }
+ if (dynamic_cast(&*arg)) {
+ // Consider assigning the default value as in->CompositionType = "ELEMENT".
+ break;
+ }
try { GenericConvert( in->CompositionType, arg, db ); break; }
catch (const TypeError& t) { throw TypeError(t.what() + std::string(" - expected argument 8 to IfcSpatialStructureElement to be a `IfcElementCompositionEnum`")); }
} while (false);
diff --git a/code/AssetLib/IQM/IQMImporter.cpp b/code/AssetLib/IQM/IQMImporter.cpp
index 139b490d8..432c12113 100644
--- a/code/AssetLib/IQM/IQMImporter.cpp
+++ b/code/AssetLib/IQM/IQMImporter.cpp
@@ -59,7 +59,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// http://sauerbraten.org/iqm/
// https://github.com/lsalzman/iqm
-
inline void swap_block( uint32_t *block, size_t size ){
(void)block; // suppress 'unreferenced formal parameter' MSVC warning
size >>= 2;
@@ -67,7 +66,7 @@ inline void swap_block( uint32_t *block, size_t size ){
AI_SWAP4( block[ i ] );
}
-static const aiImporterDesc desc = {
+static constexpr aiImporterDesc desc = {
"Inter-Quake Model Importer",
"",
"",
@@ -100,13 +99,6 @@ bool IQMImporter::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool c
if (!pIOHandler) {
return true;
}
- /*
- * don't use CheckMagicToken because that checks with swapped bytes too, leading to false
- * positives. This magic is not uint32_t, but char[4], so memcmp is the best way
-
- const char* tokens[] = {"3DMO", "3dmo"};
- return CheckMagicToken(pIOHandler,pFile,tokens,2,0,4);
- */
std::unique_ptr pStream(pIOHandler->Open(pFile, "rb"));
unsigned char data[15];
if (!pStream || 15 != pStream->Read(data, 1, 15)) {
diff --git a/code/AssetLib/Irr/IRRLoader.cpp b/code/AssetLib/Irr/IRRLoader.cpp
index ba6ebc964..2a481a6d8 100644
--- a/code/AssetLib/Irr/IRRLoader.cpp
+++ b/code/AssetLib/Irr/IRRLoader.cpp
@@ -66,7 +66,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using namespace Assimp;
-static const aiImporterDesc desc = {
+static constexpr aiImporterDesc desc = {
"Irrlicht Scene Reader",
"",
"",
@@ -575,8 +575,8 @@ void SetupMapping(aiMaterial *mat, aiTextureMapping mode, const aiVector3D &axis
m->mSemantic = prop->mSemantic;
m->mType = aiPTI_Float;
- m->mDataLength = 12;
- m->mData = new char[12];
+ m->mDataLength = sizeof(aiVector3D);
+ m->mData = new char[m->mDataLength];
*((aiVector3D *)m->mData) = axis;
p.push_back(m);
}
@@ -1234,7 +1234,10 @@ void IRRImporter::InternReadFile(const std::string &pFile, aiScene *pScene, IOSy
// Parse the XML
// Find the scene root from document root.
const pugi::xml_node &sceneRoot = documentRoot.child("irr_scene");
- if (!sceneRoot) throw new DeadlyImportError("IRR: not found in file");
+ if (!sceneRoot) {
+ delete root;
+ throw new DeadlyImportError("IRR: not found in file");
+ }
for (pugi::xml_node &child : sceneRoot.children()) {
// XML elements are either nodes, animators, attributes, or materials
if (!ASSIMP_stricmp(child.name(), "node")) {
diff --git a/code/AssetLib/Irr/IRRMeshLoader.cpp b/code/AssetLib/Irr/IRRMeshLoader.cpp
index 8161a2997..b35a95c12 100644
--- a/code/AssetLib/Irr/IRRMeshLoader.cpp
+++ b/code/AssetLib/Irr/IRRMeshLoader.cpp
@@ -56,7 +56,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using namespace Assimp;
-static const aiImporterDesc desc = {
+static constexpr aiImporterDesc desc = {
"Irrlicht Mesh Reader",
"",
"",
diff --git a/code/AssetLib/LWO/LWOBLoader.cpp b/code/AssetLib/LWO/LWOBLoader.cpp
index e49adcf98..4a9792b79 100644
--- a/code/AssetLib/LWO/LWOBLoader.cpp
+++ b/code/AssetLib/LWO/LWOBLoader.cpp
@@ -51,64 +51,56 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "LWOLoader.h"
using namespace Assimp;
-
// ------------------------------------------------------------------------------------------------
-void LWOImporter::LoadLWOBFile()
-{
+void LWOImporter::LoadLWOBFile() {
LE_NCONST uint8_t* const end = mFileBuffer + fileSize;
bool running = true;
- while (running)
- {
- if (mFileBuffer + sizeof(IFF::ChunkHeader) > end)break;
+ while (running) {
+ if (mFileBuffer + sizeof(IFF::ChunkHeader) > end)
+ break;
const IFF::ChunkHeader head = IFF::LoadChunk(mFileBuffer);
- if (mFileBuffer + head.length > end)
- {
+ if (mFileBuffer + head.length > end) {
throw DeadlyImportError("LWOB: Invalid chunk length");
}
uint8_t* const next = mFileBuffer+head.length;
- switch (head.type)
- {
+ switch (head.type) {
// vertex list
- case AI_LWO_PNTS:
- {
+ case AI_LWO_PNTS: {
if (!mCurLayer->mTempPoints.empty())
ASSIMP_LOG_WARN("LWO: PNTS chunk encountered twice");
- else LoadLWOPoints(head.length);
- break;
- }
- // face list
- case AI_LWO_POLS:
- {
+ else
+ LoadLWOPoints(head.length);
+ } break;
+ case AI_LWO_POLS: { // face list
+ if (!mCurLayer->mFaces.empty())
+ ASSIMP_LOG_WARN("LWO: POLS chunk encountered twice");
+ else
+ LoadLWOBPolygons(head.length);
+ } break;
+
+ case AI_LWO_SRFS: // list of tags
+ {
+ if (!mTags->empty())
+ ASSIMP_LOG_WARN("LWO: SRFS chunk encountered twice");
+ else
+ LoadLWOTags(head.length);
+ } break;
- if (!mCurLayer->mFaces.empty())
- ASSIMP_LOG_WARN("LWO: POLS chunk encountered twice");
- else LoadLWOBPolygons(head.length);
- break;
- }
- // list of tags
- case AI_LWO_SRFS:
- {
- if (!mTags->empty())
- ASSIMP_LOG_WARN("LWO: SRFS chunk encountered twice");
- else LoadLWOTags(head.length);
- break;
- }
+ case AI_LWO_SURF: // surface chunk
+ {
+ LoadLWOBSurface(head.length);
+ } break;
- // surface chunk
- case AI_LWO_SURF:
- {
- LoadLWOBSurface(head.length);
+ default:
break;
- }
}
mFileBuffer = next;
}
}
// ------------------------------------------------------------------------------------------------
-void LWOImporter::LoadLWOBPolygons(unsigned int length)
-{
+void LWOImporter::LoadLWOBPolygons(unsigned int length) {
// first find out how many faces and vertices we'll finally need
LE_NCONST uint16_t* const end = (LE_NCONST uint16_t*)(mFileBuffer+length);
LE_NCONST uint16_t* cursor = (LE_NCONST uint16_t*)mFileBuffer;
@@ -123,8 +115,7 @@ void LWOImporter::LoadLWOBPolygons(unsigned int length)
CountVertsAndFacesLWOB(iNumVertices,iNumFaces,cursor,end);
// allocate the output array and copy face indices
- if (iNumFaces)
- {
+ if (iNumFaces) {
cursor = (LE_NCONST uint16_t*)mFileBuffer;
mCurLayer->mFaces.resize(iNumFaces);
@@ -135,10 +126,8 @@ void LWOImporter::LoadLWOBPolygons(unsigned int length)
// ------------------------------------------------------------------------------------------------
void LWOImporter::CountVertsAndFacesLWOB(unsigned int& verts, unsigned int& faces,
- LE_NCONST uint16_t*& cursor, const uint16_t* const end, unsigned int max)
-{
- while (cursor < end && max--)
- {
+ LE_NCONST uint16_t*& cursor, const uint16_t* const end, unsigned int max) {
+ while (cursor < end && max--) {
uint16_t numIndices;
// must have 2 shorts left for numIndices and surface
if (end - cursor < 2) {
@@ -154,8 +143,7 @@ void LWOImporter::CountVertsAndFacesLWOB(unsigned int& verts, unsigned int& face
cursor += numIndices;
int16_t surface;
::memcpy(&surface, cursor++, 2);
- if (surface < 0)
- {
+ if (surface < 0) {
// there are detail polygons
::memcpy(&numIndices, cursor++, 2);
CountVertsAndFacesLWOB(verts,faces,cursor,end,numIndices);
@@ -167,18 +155,14 @@ void LWOImporter::CountVertsAndFacesLWOB(unsigned int& verts, unsigned int& face
void LWOImporter::CopyFaceIndicesLWOB(FaceList::iterator& it,
LE_NCONST uint16_t*& cursor,
const uint16_t* const end,
- unsigned int max)
-{
- while (cursor < end && max--)
- {
+ unsigned int max) {
+ while (cursor < end && max--) {
LWO::Face& face = *it;++it;
uint16_t numIndices;
::memcpy(&numIndices, cursor++, 2);
face.mNumIndices = numIndices;
- if(face.mNumIndices)
- {
- if (cursor + face.mNumIndices >= end)
- {
+ if(face.mNumIndices) {
+ if (cursor + face.mNumIndices >= end) {
break;
}
face.mIndices = new unsigned int[face.mNumIndices];
@@ -187,8 +171,7 @@ void LWOImporter::CopyFaceIndicesLWOB(FaceList::iterator& it,
uint16_t index;
::memcpy(&index, cursor++, 2);
mi = index;
- if (mi > mCurLayer->mTempPoints.size())
- {
+ if (mi > mCurLayer->mTempPoints.size()) {
ASSIMP_LOG_WARN("LWOB: face index is out of range");
mi = (unsigned int)mCurLayer->mTempPoints.size()-1;
}
@@ -198,15 +181,13 @@ void LWOImporter::CopyFaceIndicesLWOB(FaceList::iterator& it,
}
int16_t surface;
::memcpy(&surface, cursor++, 2);
- if (surface < 0)
- {
+ if (surface < 0) {
surface = -surface;
// there are detail polygons.
uint16_t numPolygons;
::memcpy(&numPolygons, cursor++, 2);
- if (cursor < end)
- {
+ if (cursor < end) {
CopyFaceIndicesLWOB(it,cursor,end,numPolygons);
}
}
@@ -215,8 +196,7 @@ void LWOImporter::CopyFaceIndicesLWOB(FaceList::iterator& it,
}
// ------------------------------------------------------------------------------------------------
-LWO::Texture* LWOImporter::SetupNewTextureLWOB(LWO::TextureList& list,unsigned int size)
-{
+LWO::Texture* LWOImporter::SetupNewTextureLWOB(LWO::TextureList& list,unsigned int size) {
list.emplace_back();
LWO::Texture* tex = &list.back();
@@ -224,8 +204,7 @@ LWO::Texture* LWOImporter::SetupNewTextureLWOB(LWO::TextureList& list,unsigned i
GetS0(type,size);
const char* s = type.c_str();
- if(strstr(s, "Image Map"))
- {
+ if(strstr(s, "Image Map")) {
// Determine mapping type
if(strstr(s, "Planar"))
tex->mapMode = LWO::Texture::Planar;
@@ -237,9 +216,7 @@ LWO::Texture* LWOImporter::SetupNewTextureLWOB(LWO::TextureList& list,unsigned i
tex->mapMode = LWO::Texture::Cubic;
else if(strstr(s, "Front"))
tex->mapMode = LWO::Texture::FrontProjection;
- }
- else
- {
+ } else {
// procedural or gradient, not supported
ASSIMP_LOG_ERROR("LWOB: Unsupported legacy texture: ", type);
}
@@ -248,8 +225,7 @@ LWO::Texture* LWOImporter::SetupNewTextureLWOB(LWO::TextureList& list,unsigned i
}
// ------------------------------------------------------------------------------------------------
-void LWOImporter::LoadLWOBSurface(unsigned int size)
-{
+void LWOImporter::LoadLWOBSurface(unsigned int size) {
LE_NCONST uint8_t* const end = mFileBuffer + size;
mSurfaces->push_back( LWO::Surface () );
@@ -277,148 +253,147 @@ void LWOImporter::LoadLWOBSurface(unsigned int size)
}
uint8_t* const next = mFileBuffer+head.length;
- switch (head.type)
- {
- // diffuse color
- case AI_LWO_COLR:
- {
- AI_LWO_VALIDATE_CHUNK_LENGTH(head.length,COLR,3);
- surf.mColor.r = GetU1() / 255.0f;
- surf.mColor.g = GetU1() / 255.0f;
- surf.mColor.b = GetU1() / 255.0f;
- break;
- }
- // diffuse strength ...
- case AI_LWO_DIFF:
- {
- AI_LWO_VALIDATE_CHUNK_LENGTH(head.length,DIFF,2);
- surf.mDiffuseValue = GetU2() / 255.0f;
- break;
- }
- // specular strength ...
- case AI_LWO_SPEC:
- {
- AI_LWO_VALIDATE_CHUNK_LENGTH(head.length,SPEC,2);
- surf.mSpecularValue = GetU2() / 255.0f;
- break;
- }
- // luminosity ...
- case AI_LWO_LUMI:
- {
- AI_LWO_VALIDATE_CHUNK_LENGTH(head.length,LUMI,2);
- surf.mLuminosity = GetU2() / 255.0f;
- break;
- }
- // transparency
- case AI_LWO_TRAN:
- {
- AI_LWO_VALIDATE_CHUNK_LENGTH(head.length,TRAN,2);
- surf.mTransparency = GetU2() / 255.0f;
- break;
- }
- // surface flags
- case AI_LWO_FLAG:
- {
- AI_LWO_VALIDATE_CHUNK_LENGTH(head.length,FLAG,2);
- uint16_t flag = GetU2();
- if (flag & 0x4 ) surf.mMaximumSmoothAngle = 1.56207f;
- if (flag & 0x8 ) surf.mColorHighlights = 1.f;
- if (flag & 0x100) surf.bDoubleSided = true;
- break;
- }
- // maximum smoothing angle
- case AI_LWO_SMAN:
- {
- AI_LWO_VALIDATE_CHUNK_LENGTH(head.length,SMAN,4);
- surf.mMaximumSmoothAngle = std::fabs( GetF4() );
- break;
- }
- // glossiness
- case AI_LWO_GLOS:
- {
- AI_LWO_VALIDATE_CHUNK_LENGTH(head.length,GLOS,2);
- surf.mGlossiness = (float)GetU2();
- break;
- }
- // color texture
- case AI_LWO_CTEX:
- {
- pTex = SetupNewTextureLWOB(surf.mColorTextures,
- head.length);
- break;
- }
- // diffuse texture
- case AI_LWO_DTEX:
- {
- pTex = SetupNewTextureLWOB(surf.mDiffuseTextures,
- head.length);
- break;
- }
- // specular texture
- case AI_LWO_STEX:
- {
- pTex = SetupNewTextureLWOB(surf.mSpecularTextures,
- head.length);
- break;
- }
- // bump texture
- case AI_LWO_BTEX:
- {
- pTex = SetupNewTextureLWOB(surf.mBumpTextures,
- head.length);
- break;
- }
- // transparency texture
- case AI_LWO_TTEX:
- {
- pTex = SetupNewTextureLWOB(surf.mOpacityTextures,
- head.length);
- break;
- }
- // texture path
- case AI_LWO_TIMG:
- {
- if (pTex) {
- GetS0(pTex->mFileName,head.length);
- } else {
- ASSIMP_LOG_WARN("LWOB: Unexpected TIMG chunk");
+ switch (head.type) {
+ // diffuse color
+ case AI_LWO_COLR:
+ {
+ AI_LWO_VALIDATE_CHUNK_LENGTH(head.length,COLR,3);
+ surf.mColor.r = GetU1() / 255.0f;
+ surf.mColor.g = GetU1() / 255.0f;
+ surf.mColor.b = GetU1() / 255.0f;
+ break;
}
- break;
- }
- // texture strength
- case AI_LWO_TVAL:
- {
- AI_LWO_VALIDATE_CHUNK_LENGTH(head.length,TVAL,1);
- if (pTex) {
- pTex->mStrength = (float)GetU1()/ 255.f;
- } else {
- ASSIMP_LOG_ERROR("LWOB: Unexpected TVAL chunk");
+ // diffuse strength ...
+ case AI_LWO_DIFF:
+ {
+ AI_LWO_VALIDATE_CHUNK_LENGTH(head.length,DIFF,2);
+ surf.mDiffuseValue = GetU2() / 255.0f;
+ break;
}
- break;
- }
- // texture flags
- case AI_LWO_TFLG:
- {
- AI_LWO_VALIDATE_CHUNK_LENGTH(head.length,TFLG,2);
-
- if (nullptr != pTex) {
- const uint16_t s = GetU2();
- if (s & 1)
- pTex->majorAxis = LWO::Texture::AXIS_X;
- else if (s & 2)
- pTex->majorAxis = LWO::Texture::AXIS_Y;
- else if (s & 4)
- pTex->majorAxis = LWO::Texture::AXIS_Z;
-
- if (s & 16) {
- ASSIMP_LOG_WARN("LWOB: Ignoring \'negate\' flag on texture");
+ // specular strength ...
+ case AI_LWO_SPEC:
+ {
+ AI_LWO_VALIDATE_CHUNK_LENGTH(head.length,SPEC,2);
+ surf.mSpecularValue = GetU2() / 255.0f;
+ break;
+ }
+ // luminosity ...
+ case AI_LWO_LUMI:
+ {
+ AI_LWO_VALIDATE_CHUNK_LENGTH(head.length,LUMI,2);
+ surf.mLuminosity = GetU2() / 255.0f;
+ break;
+ }
+ // transparency
+ case AI_LWO_TRAN:
+ {
+ AI_LWO_VALIDATE_CHUNK_LENGTH(head.length,TRAN,2);
+ surf.mTransparency = GetU2() / 255.0f;
+ break;
+ }
+ // surface flags
+ case AI_LWO_FLAG:
+ {
+ AI_LWO_VALIDATE_CHUNK_LENGTH(head.length,FLAG,2);
+ uint16_t flag = GetU2();
+ if (flag & 0x4 ) surf.mMaximumSmoothAngle = 1.56207f;
+ if (flag & 0x8 ) surf.mColorHighlights = 1.f;
+ if (flag & 0x100) surf.bDoubleSided = true;
+ break;
+ }
+ // maximum smoothing angle
+ case AI_LWO_SMAN:
+ {
+ AI_LWO_VALIDATE_CHUNK_LENGTH(head.length,SMAN,4);
+ surf.mMaximumSmoothAngle = std::fabs( GetF4() );
+ break;
+ }
+ // glossiness
+ case AI_LWO_GLOS:
+ {
+ AI_LWO_VALIDATE_CHUNK_LENGTH(head.length,GLOS,2);
+ surf.mGlossiness = (float)GetU2();
+ break;
+ }
+ // color texture
+ case AI_LWO_CTEX:
+ {
+ pTex = SetupNewTextureLWOB(surf.mColorTextures,
+ head.length);
+ break;
+ }
+ // diffuse texture
+ case AI_LWO_DTEX:
+ {
+ pTex = SetupNewTextureLWOB(surf.mDiffuseTextures,
+ head.length);
+ break;
+ }
+ // specular texture
+ case AI_LWO_STEX:
+ {
+ pTex = SetupNewTextureLWOB(surf.mSpecularTextures,
+ head.length);
+ break;
+ }
+ // bump texture
+ case AI_LWO_BTEX:
+ {
+ pTex = SetupNewTextureLWOB(surf.mBumpTextures,
+ head.length);
+ break;
+ }
+ // transparency texture
+ case AI_LWO_TTEX:
+ {
+ pTex = SetupNewTextureLWOB(surf.mOpacityTextures,
+ head.length);
+ break;
+ }
+ // texture path
+ case AI_LWO_TIMG:
+ {
+ if (pTex) {
+ GetS0(pTex->mFileName,head.length);
+ } else {
+ ASSIMP_LOG_WARN("LWOB: Unexpected TIMG chunk");
}
+ break;
}
- else {
- ASSIMP_LOG_WARN("LWOB: Unexpected TFLG chunk");
+ // texture strength
+ case AI_LWO_TVAL:
+ {
+ AI_LWO_VALIDATE_CHUNK_LENGTH(head.length,TVAL,1);
+ if (pTex) {
+ pTex->mStrength = (float)GetU1()/ 255.f;
+ } else {
+ ASSIMP_LOG_ERROR("LWOB: Unexpected TVAL chunk");
+ }
+ break;
+ }
+ // texture flags
+ case AI_LWO_TFLG:
+ {
+ AI_LWO_VALIDATE_CHUNK_LENGTH(head.length,TFLG,2);
+
+ if (nullptr != pTex) {
+ const uint16_t s = GetU2();
+ if (s & 1)
+ pTex->majorAxis = LWO::Texture::AXIS_X;
+ else if (s & 2)
+ pTex->majorAxis = LWO::Texture::AXIS_Y;
+ else if (s & 4)
+ pTex->majorAxis = LWO::Texture::AXIS_Z;
+
+ if (s & 16) {
+ ASSIMP_LOG_WARN("LWOB: Ignoring \'negate\' flag on texture");
+ }
+ }
+ else {
+ ASSIMP_LOG_WARN("LWOB: Unexpected TFLG chunk");
+ }
+ break;
}
- break;
- }
}
mFileBuffer = next;
}
diff --git a/code/AssetLib/LWS/LWSLoader.cpp b/code/AssetLib/LWS/LWSLoader.cpp
index c41ff9cac..dec834495 100644
--- a/code/AssetLib/LWS/LWSLoader.cpp
+++ b/code/AssetLib/LWS/LWSLoader.cpp
@@ -63,7 +63,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using namespace Assimp;
-static const aiImporterDesc desc = {
+static constexpr aiImporterDesc desc = {
"LightWave Scene Importer",
"",
"",
@@ -139,10 +139,6 @@ LWSImporter::LWSImporter() :
// nothing to do here
}
-// ------------------------------------------------------------------------------------------------
-// Destructor, private as well
-LWSImporter::~LWSImporter() = default;
-
// ------------------------------------------------------------------------------------------------
// Returns whether the class can handle the format of the given file.
bool LWSImporter::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool /*checkSig*/) const {
diff --git a/code/AssetLib/LWS/LWSLoader.h b/code/AssetLib/LWS/LWSLoader.h
index 3df9fe9d9..4e92ef0d5 100644
--- a/code/AssetLib/LWS/LWSLoader.h
+++ b/code/AssetLib/LWS/LWSLoader.h
@@ -174,7 +174,7 @@ struct NodeDesc {
class LWSImporter : public BaseImporter {
public:
LWSImporter();
- ~LWSImporter() override;
+ ~LWSImporter() override = default;
// -------------------------------------------------------------------
// Check whether we can read a specific file
diff --git a/code/AssetLib/M3D/M3DImporter.cpp b/code/AssetLib/M3D/M3DImporter.cpp
index 895b2bf70..71f416139 100644
--- a/code/AssetLib/M3D/M3DImporter.cpp
+++ b/code/AssetLib/M3D/M3DImporter.cpp
@@ -85,7 +85,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
are listed in aiScene->mRootNode->children, but all without meshes
*/
-static const aiImporterDesc desc = {
+static constexpr aiImporterDesc desc = {
"Model 3D Importer",
"",
"",
diff --git a/code/AssetLib/MD2/MD2Loader.cpp b/code/AssetLib/MD2/MD2Loader.cpp
index ee7dbc6a6..596d26414 100644
--- a/code/AssetLib/MD2/MD2Loader.cpp
+++ b/code/AssetLib/MD2/MD2Loader.cpp
@@ -5,8 +5,6 @@ Open Asset Import Library (assimp)
Copyright (c) 2006-2022, assimp team
-
-
All rights reserved.
Redistribution and use of this software in source and binary forms,
@@ -41,7 +39,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
---------------------------------------------------------------------------
*/
-
#ifndef ASSIMP_BUILD_NO_MD2_IMPORTER
/** @file Implementation of the MD2 importer class */
@@ -65,7 +62,7 @@ using namespace Assimp::MD2;
# define ARRAYSIZE(_array) (int(sizeof(_array) / sizeof(_array[0])))
#endif
-static const aiImporterDesc desc = {
+static constexpr aiImporterDesc desc = {
"Quake II Mesh Importer",
"",
"",
@@ -79,7 +76,7 @@ static const aiImporterDesc desc = {
};
// ------------------------------------------------------------------------------------------------
-// Helper function to lookup a normal in Quake 2's precalculated table
+// Helper function to lookup a normal in Quake 2's pre-calculated table
void MD2::LookupNormalIndex(uint8_t iNormalIndex,aiVector3D& vOut)
{
// make sure the normal index has a valid value
@@ -100,10 +97,6 @@ MD2Importer::MD2Importer()
fileSize()
{}
-// ------------------------------------------------------------------------------------------------
-// Destructor, private as well
-MD2Importer::~MD2Importer() = default;
-
// ------------------------------------------------------------------------------------------------
// Returns whether the class can handle the format of the given file.
bool MD2Importer::CanRead( const std::string& pFile, IOSystem* pIOHandler, bool /*checkSig*/) const
diff --git a/code/AssetLib/MD2/MD2Loader.h b/code/AssetLib/MD2/MD2Loader.h
index a49ccb2fd..bab026ea0 100644
--- a/code/AssetLib/MD2/MD2Loader.h
+++ b/code/AssetLib/MD2/MD2Loader.h
@@ -63,7 +63,7 @@ using namespace MD2;
class MD2Importer : public BaseImporter {
public:
MD2Importer();
- ~MD2Importer() override;
+ ~MD2Importer() override = default;
// -------------------------------------------------------------------
/** Returns whether the class can handle the format of the given file.
diff --git a/code/AssetLib/MD3/MD3Loader.cpp b/code/AssetLib/MD3/MD3Loader.cpp
index fcb8d0c35..e743889e3 100644
--- a/code/AssetLib/MD3/MD3Loader.cpp
+++ b/code/AssetLib/MD3/MD3Loader.cpp
@@ -70,7 +70,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using namespace Assimp;
-static const aiImporterDesc desc = {
+static constexpr aiImporterDesc desc = {
"Quake III Mesh Importer",
"",
"",
diff --git a/code/AssetLib/MD5/MD5Loader.cpp b/code/AssetLib/MD5/MD5Loader.cpp
index 4236f32e9..697e758fb 100644
--- a/code/AssetLib/MD5/MD5Loader.cpp
+++ b/code/AssetLib/MD5/MD5Loader.cpp
@@ -64,7 +64,7 @@ using namespace Assimp;
// Minimum weight value. Weights inside [-n ... n] are ignored
#define AI_MD5_WEIGHT_EPSILON Math::getEpsilon()
-static const aiImporterDesc desc = {
+static constexpr aiImporterDesc desc = {
"Doom 3 / MD5 Mesh Importer",
"",
"",
@@ -92,10 +92,6 @@ MD5Importer::MD5Importer() :
// empty
}
-// ------------------------------------------------------------------------------------------------
-// Destructor, private as well
-MD5Importer::~MD5Importer() = default;
-
// ------------------------------------------------------------------------------------------------
// Returns whether the class can handle the format of the given file.
bool MD5Importer::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool /*checkSig*/) const {
diff --git a/code/AssetLib/MD5/MD5Loader.h b/code/AssetLib/MD5/MD5Loader.h
index 63fb1c36b..c213c04e6 100644
--- a/code/AssetLib/MD5/MD5Loader.h
+++ b/code/AssetLib/MD5/MD5Loader.h
@@ -65,7 +65,7 @@ using namespace Assimp::MD5;
class MD5Importer : public BaseImporter {
public:
MD5Importer();
- ~MD5Importer() override;
+ ~MD5Importer() override = default;
// -------------------------------------------------------------------
/** Returns whether the class can handle the format of the given file.
diff --git a/code/AssetLib/MDC/MDCLoader.cpp b/code/AssetLib/MDC/MDCLoader.cpp
index 10ea618b9..87247adec 100644
--- a/code/AssetLib/MDC/MDCLoader.cpp
+++ b/code/AssetLib/MDC/MDCLoader.cpp
@@ -60,7 +60,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using namespace Assimp;
using namespace Assimp::MDC;
-static const aiImporterDesc desc = {
+static constexpr aiImporterDesc desc = {
"Return To Castle Wolfenstein Mesh Importer",
"",
"",
@@ -103,10 +103,6 @@ MDCImporter::MDCImporter() :
// empty
}
-// ------------------------------------------------------------------------------------------------
-// Destructor, private as well
-MDCImporter::~MDCImporter() = default;
-
// ------------------------------------------------------------------------------------------------
// Returns whether the class can handle the format of the given file.
bool MDCImporter::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool /*checkSig*/) const {
diff --git a/code/AssetLib/MDC/MDCLoader.h b/code/AssetLib/MDC/MDCLoader.h
index 6e67cd12f..a1f8d9fc9 100644
--- a/code/AssetLib/MDC/MDCLoader.h
+++ b/code/AssetLib/MDC/MDCLoader.h
@@ -62,7 +62,7 @@ using namespace MDC;
class MDCImporter : public BaseImporter {
public:
MDCImporter();
- ~MDCImporter() override;
+ ~MDCImporter() override = default;
// -------------------------------------------------------------------
/** Returns whether the class can handle the format of the given file.
diff --git a/code/AssetLib/MDL/MDLLoader.cpp b/code/AssetLib/MDL/MDLLoader.cpp
index 7b2ec7115..2b14fe980 100644
--- a/code/AssetLib/MDL/MDLLoader.cpp
+++ b/code/AssetLib/MDL/MDLLoader.cpp
@@ -65,7 +65,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using namespace Assimp;
-static const aiImporterDesc desc = {
+static constexpr aiImporterDesc desc = {
"Quake Mesh / 3D GameStudio Mesh Importer",
"",
"",
@@ -96,10 +96,6 @@ MDLImporter::MDLImporter() :
// empty
}
-// ------------------------------------------------------------------------------------------------
-// Destructor, private as well
-MDLImporter::~MDLImporter() = default;
-
// ------------------------------------------------------------------------------------------------
// Returns whether the class can handle the format of the given file.
bool MDLImporter::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool /*checkSig*/) const {
diff --git a/code/AssetLib/MDL/MDLLoader.h b/code/AssetLib/MDL/MDLLoader.h
index 44ff21e3e..333f7c8b1 100644
--- a/code/AssetLib/MDL/MDLLoader.h
+++ b/code/AssetLib/MDL/MDLLoader.h
@@ -39,10 +39,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
----------------------------------------------------------------------
*/
-
-/** @file MDLLoader.h
- * @brief Declaration of the loader for MDL files
- */
+/// @file MDLLoader.h
+/// @brief Declaration of the loader for MDL files
#pragma once
#ifndef AI_MDLLOADER_H_INCLUDED
#define AI_MDLLOADER_H_INCLUDED
@@ -83,11 +81,10 @@ using namespace MDL;
* them all with a single 1000-line function-beast. However, it has been
* split into several code paths to make the code easier to read and maintain.
*/
-class MDLImporter : public BaseImporter
-{
+class MDLImporter : public BaseImporter {
public:
MDLImporter();
- ~MDLImporter() override;
+ ~MDLImporter() override = default;
// -------------------------------------------------------------------
/** Returns whether the class can handle the format of the given file.
diff --git a/code/AssetLib/MDL/MDLMaterialLoader.cpp b/code/AssetLib/MDL/MDLMaterialLoader.cpp
index 3d39fa645..f8dafdb3e 100644
--- a/code/AssetLib/MDL/MDLMaterialLoader.cpp
+++ b/code/AssetLib/MDL/MDLMaterialLoader.cpp
@@ -123,9 +123,8 @@ aiColor4D MDLImporter::ReplaceTextureWithColor(const aiTexture *pcTexture) {
// Read a texture from a MDL3 file
void MDLImporter::CreateTextureARGB8_3DGS_MDL3(const unsigned char *szData) {
const MDL::Header *pcHeader = (const MDL::Header *)mBuffer; //the endianness is already corrected in the InternReadFile_3DGS_MDL345 function
-
- VALIDATE_FILE_SIZE(szData + pcHeader->skinwidth *
- pcHeader->skinheight);
+ const size_t len = pcHeader->skinwidth * pcHeader->skinheight;
+ VALIDATE_FILE_SIZE(szData + len);
// allocate a new texture object
aiTexture *pcNew = new aiTexture();
diff --git a/code/AssetLib/MMD/MMDImporter.cpp b/code/AssetLib/MMD/MMDImporter.cpp
index 0905ce1e0..b96d45c98 100644
--- a/code/AssetLib/MMD/MMDImporter.cpp
+++ b/code/AssetLib/MMD/MMDImporter.cpp
@@ -57,7 +57,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include
#include
-static const aiImporterDesc desc = { "MMD Importer",
+static constexpr aiImporterDesc desc = { "MMD Importer",
"",
"",
"surfaces supported?",
@@ -81,10 +81,6 @@ MMDImporter::MMDImporter() :
m_strAbsPath = io.getOsSeparator();
}
-// ------------------------------------------------------------------------------------------------
-// Destructor.
-MMDImporter::~MMDImporter() = default;
-
// ------------------------------------------------------------------------------------------------
// Returns true, if file is an pmx file.
bool MMDImporter::CanRead(const std::string &pFile, IOSystem *pIOHandler,
diff --git a/code/AssetLib/MMD/MMDImporter.h b/code/AssetLib/MMD/MMDImporter.h
index 36f384829..1f584bf12 100644
--- a/code/AssetLib/MMD/MMDImporter.h
+++ b/code/AssetLib/MMD/MMDImporter.h
@@ -50,46 +50,34 @@ struct aiMesh;
namespace Assimp {
// ------------------------------------------------------------------------------------------------
-/// \class MMDImporter
-/// \brief Imports MMD a pmx/pmd/vmd file
+/// @class MMDImporter
+/// @brief Imports MMD a pmx/pmd/vmd file
// ------------------------------------------------------------------------------------------------
class MMDImporter : public BaseImporter {
public:
- /// \brief Default constructor
+ /// @brief Default constructor
MMDImporter();
- /// \brief Destructor
- ~MMDImporter() override;
+ /// @brief Destructor
+ ~MMDImporter() override = default;
public:
- /// \brief Returns whether the class can handle the format of the given file.
- /// \remark See BaseImporter::CanRead() for details.
+ /// @brief Returns whether the class can handle the format of the given file.
+ /// @remark See BaseImporter::CanRead() for details.
bool CanRead( const std::string& pFile, IOSystem* pIOHandler, bool checkSig) const override;
private:
- //! \brief Appends the supported extension.
const aiImporterDesc* GetInfo() const override;
-
- //! \brief File import implementation.
void InternReadFile(const std::string& pFile, aiScene* pScene, IOSystem* pIOHandler) override;
-
- //! \brief Create the data from imported content.
void CreateDataFromImport(const pmx::PmxModel* pModel, aiScene* pScene);
-
- //! \brief Create the mesh
aiMesh* CreateMesh(const pmx::PmxModel* pModel, const int indexStart, const int indexCount);
-
- //! \brief Create the material
aiMaterial* CreateMaterial(const pmx::PmxMaterial* pMat, const pmx::PmxModel* pModel);
private:
- //! Data buffer
std::vector m_Buffer;
- //! Absolute pathname of model in file system
std::string m_strAbsPath;
};
-// ------------------------------------------------------------------------------------------------
} // Namespace Assimp
diff --git a/code/AssetLib/MMD/MMDPmxParser.cpp b/code/AssetLib/MMD/MMDPmxParser.cpp
index ca37ba199..6b04f02e9 100644
--- a/code/AssetLib/MMD/MMDPmxParser.cpp
+++ b/code/AssetLib/MMD/MMDPmxParser.cpp
@@ -42,11 +42,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include
#include "MMDPmxParser.h"
#include
-#ifdef ASSIMP_USE_HUNTER
-# include
-#else
-# include "../contrib/utf8cpp/source/utf8.h"
-#endif
+#include "utf8.h"
#include
namespace pmx
@@ -93,7 +89,7 @@ namespace pmx
{
return std::string();
}
- buffer.reserve(size);
+ buffer.resize(size);
stream->read((char*) buffer.data(), size);
if (encoding == 0)
{
diff --git a/code/AssetLib/MS3D/MS3DLoader.cpp b/code/AssetLib/MS3D/MS3DLoader.cpp
index d4dd2be75..e0f0f8b5a 100644
--- a/code/AssetLib/MS3D/MS3DLoader.cpp
+++ b/code/AssetLib/MS3D/MS3DLoader.cpp
@@ -60,7 +60,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using namespace Assimp;
-static const aiImporterDesc desc = {
+static constexpr aiImporterDesc desc = {
"Milkshape 3D Importer",
"",
"",
@@ -84,9 +84,6 @@ MS3DImporter::MS3DImporter()
: mScene()
{}
-// ------------------------------------------------------------------------------------------------
-// Destructor, private as well
-MS3DImporter::~MS3DImporter() = default;
// ------------------------------------------------------------------------------------------------
// Returns whether the class can handle the format of the given file.
bool MS3DImporter::CanRead( const std::string& pFile, IOSystem* pIOHandler, bool /*checkSig*/) const
diff --git a/code/AssetLib/MS3D/MS3DLoader.h b/code/AssetLib/MS3D/MS3DLoader.h
index 4bd417566..3e25f1f59 100644
--- a/code/AssetLib/MS3D/MS3DLoader.h
+++ b/code/AssetLib/MS3D/MS3DLoader.h
@@ -48,6 +48,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include
#include
+
struct aiNode;
namespace Assimp {
@@ -58,7 +59,7 @@ namespace Assimp {
class MS3DImporter : public BaseImporter {
public:
MS3DImporter();
- ~MS3DImporter() override;
+ ~MS3DImporter() override = default;
// -------------------------------------------------------------------
/** Returns whether the class can handle the format of the given file.
diff --git a/code/AssetLib/NDO/NDOLoader.cpp b/code/AssetLib/NDO/NDOLoader.cpp
index edccc1624..405438dfc 100644
--- a/code/AssetLib/NDO/NDOLoader.cpp
+++ b/code/AssetLib/NDO/NDOLoader.cpp
@@ -43,8 +43,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* Implementation of the NDO importer class.
*/
-
#ifndef ASSIMP_BUILD_NO_NDO_IMPORTER
+
#include "NDOLoader.h"
#include
#include
@@ -56,7 +56,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using namespace Assimp;
-static const aiImporterDesc desc = {
+static constexpr aiImporterDesc desc = {
"Nendo Mesh Importer",
"",
"",
@@ -69,14 +69,6 @@ static const aiImporterDesc desc = {
"ndo"
};
-// ------------------------------------------------------------------------------------------------
-// Constructor to be privately used by Importer
-NDOImporter::NDOImporter() = default;
-
-// ------------------------------------------------------------------------------------------------
-// Destructor, private as well
-NDOImporter::~NDOImporter() = default;
-
// ------------------------------------------------------------------------------------------------
// Returns whether the class can handle the format of the given file.
bool NDOImporter::CanRead( const std::string& pFile, IOSystem* pIOHandler, bool /*checkSig*/) const
diff --git a/code/AssetLib/NDO/NDOLoader.h b/code/AssetLib/NDO/NDOLoader.h
index 61dd93981..c4f127851 100644
--- a/code/AssetLib/NDO/NDOLoader.h
+++ b/code/AssetLib/NDO/NDOLoader.h
@@ -65,8 +65,8 @@ class Importer;
*/
class NDOImporter : public BaseImporter {
public:
- NDOImporter();
- ~NDOImporter() override;
+ NDOImporter() = default;
+ ~NDOImporter() override = default;
//! Represents a single edge
struct Edge {
diff --git a/code/AssetLib/NFF/NFFLoader.cpp b/code/AssetLib/NFF/NFFLoader.cpp
index ce7007155..78adc27bd 100644
--- a/code/AssetLib/NFF/NFFLoader.cpp
+++ b/code/AssetLib/NFF/NFFLoader.cpp
@@ -56,9 +56,9 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include
#include
-using namespace Assimp;
+namespace Assimp {
-static const aiImporterDesc desc = {
+static constexpr aiImporterDesc desc = {
"Neutral File Format Importer",
"",
"",
@@ -71,14 +71,6 @@ static const aiImporterDesc desc = {
"enff nff"
};
-// ------------------------------------------------------------------------------------------------
-// Constructor to be privately used by Importer
-NFFImporter::NFFImporter() = default;
-
-// ------------------------------------------------------------------------------------------------
-// Destructor, private as well
-NFFImporter::~NFFImporter() = default;
-
// ------------------------------------------------------------------------------------------------
// Returns whether the class can handle the format of the given file.
bool NFFImporter::CanRead(const std::string & pFile, IOSystem * /*pIOHandler*/, bool /*checkSig*/) const {
@@ -94,7 +86,7 @@ const aiImporterDesc *NFFImporter::GetInfo() const {
// ------------------------------------------------------------------------------------------------
#define AI_NFF_PARSE_FLOAT(f) \
SkipSpaces(&sz); \
- if (!::IsLineEnd(*sz)) sz = fast_atoreal_move(sz, (ai_real &)f);
+ if (!IsLineEnd(*sz)) sz = fast_atoreal_move(sz, (ai_real &)f);
// ------------------------------------------------------------------------------------------------
#define AI_NFF_PARSE_TRIPLE(v) \
@@ -338,8 +330,8 @@ void NFFImporter::InternReadFile(const std::string &pFile,
break;
}
- // read the numbr of vertices
- unsigned int num = ::strtoul10(sz, &sz);
+ // read the number of vertices
+ unsigned int num = strtoul10(sz, &sz);
// temporary storage
std::vector tempColors;
@@ -365,7 +357,7 @@ void NFFImporter::InternReadFile(const std::string &pFile,
// color definition
if (TokenMatch(sz, "0x", 2)) {
hasColor = true;
- unsigned int numIdx = ::strtoul16(sz, &sz);
+ unsigned int numIdx = strtoul16(sz, &sz);
aiColor4D clr;
clr.a = 1.f;
@@ -403,15 +395,16 @@ void NFFImporter::InternReadFile(const std::string &pFile,
}
AI_NFF2_GET_NEXT_TOKEN();
- if (!num) throw DeadlyImportError("NFF2: There are zero vertices");
- num = ::strtoul10(sz, &sz);
+ if (!num)
+ throw DeadlyImportError("NFF2: There are zero vertices");
+ num = strtoul10(sz, &sz);
std::vector tempIdx;
tempIdx.reserve(10);
for (unsigned int i = 0; i < num; ++i) {
AI_NFF2_GET_NEXT_TOKEN();
SkipSpaces(line, &sz);
- unsigned int numIdx = ::strtoul10(sz, &sz);
+ unsigned int numIdx = strtoul10(sz, &sz);
// read all faces indices
if (numIdx) {
@@ -421,7 +414,7 @@ void NFFImporter::InternReadFile(const std::string &pFile,
for (unsigned int a = 0; a < numIdx; ++a) {
SkipSpaces(sz, &sz);
- unsigned int m = ::strtoul10(sz, &sz);
+ unsigned int m = strtoul10(sz, &sz);
if (m >= (unsigned int)tempPositions.size()) {
ASSIMP_LOG_ERROR("NFF2: Vertex index overflow");
m = 0;
@@ -446,7 +439,7 @@ void NFFImporter::InternReadFile(const std::string &pFile,
if (TokenMatch(sz, "0x", 2)) {
hasColor = true;
const char *sz2 = sz;
- numIdx = ::strtoul16(sz, &sz);
+ numIdx = strtoul16(sz, &sz);
const unsigned int diff = (unsigned int)(sz - sz2);
// 0xRRGGBB
@@ -518,7 +511,7 @@ void NFFImporter::InternReadFile(const std::string &pFile,
// Material ID?
else if (!materialTable.empty() && TokenMatch(sz, "matid", 5)) {
SkipSpaces(&sz);
- matIdx = ::strtoul10(sz, &sz);
+ matIdx = strtoul10(sz, &sz);
if (matIdx >= materialTable.size()) {
ASSIMP_LOG_ERROR("NFF2: Material index overflow.");
matIdx = 0;
@@ -1165,4 +1158,6 @@ void NFFImporter::InternReadFile(const std::string &pFile,
pScene->mRootNode = root;
}
+} // namespace Assimp
+
#endif // !! ASSIMP_BUILD_NO_NFF_IMPORTER
diff --git a/code/AssetLib/NFF/NFFLoader.h b/code/AssetLib/NFF/NFFLoader.h
index 7fd094306..b402aec84 100644
--- a/code/AssetLib/NFF/NFFLoader.h
+++ b/code/AssetLib/NFF/NFFLoader.h
@@ -63,8 +63,8 @@ namespace Assimp {
*/
class NFFImporter : public BaseImporter {
public:
- NFFImporter();
- ~NFFImporter() override;
+ NFFImporter() = default;
+ ~NFFImporter() override = default;
// -------------------------------------------------------------------
/** Returns whether the class can handle the format of the given file.
diff --git a/code/AssetLib/OFF/OFFLoader.cpp b/code/AssetLib/OFF/OFFLoader.cpp
index f50afb57b..ce8dfc2d4 100644
--- a/code/AssetLib/OFF/OFFLoader.cpp
+++ b/code/AssetLib/OFF/OFFLoader.cpp
@@ -43,7 +43,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* @brief Implementation of the OFF importer class
*/
-
#ifndef ASSIMP_BUILD_NO_OFF_IMPORTER
// internal headers
@@ -56,9 +55,9 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include
#include
-using namespace Assimp;
+namespace Assimp {
-static const aiImporterDesc desc = {
+static constexpr aiImporterDesc desc = {
"OFF Importer",
"",
"",
@@ -71,99 +70,92 @@ static const aiImporterDesc desc = {
"off"
};
-// ------------------------------------------------------------------------------------------------
-// Constructor to be privately used by Importer
-OFFImporter::OFFImporter() = default;
-
-// ------------------------------------------------------------------------------------------------
-// Destructor, private as well
-OFFImporter::~OFFImporter() = default;
-
// ------------------------------------------------------------------------------------------------
// Returns whether the class can handle the format of the given file.
-bool OFFImporter::CanRead( const std::string& pFile, IOSystem* pIOHandler, bool /*checkSig*/) const
-{
- static const char* tokens[] = { "off" };
- return SearchFileHeaderForToken(pIOHandler,pFile,tokens,AI_COUNT_OF(tokens),3);
+bool OFFImporter::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool /*checkSig*/) const {
+ static const char *tokens[] = { "off" };
+ return SearchFileHeaderForToken(pIOHandler, pFile, tokens, AI_COUNT_OF(tokens), 3);
}
// ------------------------------------------------------------------------------------------------
-const aiImporterDesc* OFFImporter::GetInfo () const
-{
+const aiImporterDesc *OFFImporter::GetInfo() const {
return &desc;
}
-
// skip blank space, lines and comments
-static void NextToken(const char **car, const char* end) {
- SkipSpacesAndLineEnd(car);
- while (*car < end && (**car == '#' || **car == '\n' || **car == '\r')) {
- SkipLine(car);
+static void NextToken(const char **car, const char *end) {
SkipSpacesAndLineEnd(car);
- }
+ while (*car < end && (**car == '#' || **car == '\n' || **car == '\r')) {
+ SkipLine(car);
+ SkipSpacesAndLineEnd(car);
+ }
}
// ------------------------------------------------------------------------------------------------
// Imports the given file into the given scene structure.
-void OFFImporter::InternReadFile( const std::string& pFile, aiScene* pScene, IOSystem* pIOHandler) {
- std::unique_ptr file( pIOHandler->Open( pFile, "rb"));
+void OFFImporter::InternReadFile(const std::string &pFile, aiScene *pScene, IOSystem *pIOHandler) {
+ std::unique_ptr file(pIOHandler->Open(pFile, "rb"));
// Check whether we can read from the file
if (file == nullptr) {
- throw DeadlyImportError("Failed to open OFF file ", pFile, ".");
+ throw DeadlyImportError("Failed to open OFF file ", pFile, ".");
}
// allocate storage and copy the contents of the file to a memory buffer
std::vector mBuffer2;
- TextFileToBuffer(file.get(),mBuffer2);
- const char* buffer = &mBuffer2[0];
+ TextFileToBuffer(file.get(), mBuffer2);
+ const char *buffer = &mBuffer2[0];
// Proper OFF header parser. We only implement normal loading for now.
bool hasTexCoord = false, hasNormals = false, hasColors = false;
bool hasHomogenous = false, hasDimension = false;
unsigned int dimensions = 3;
- const char* car = buffer;
- const char* end = buffer + mBuffer2.size();
+ const char *car = buffer;
+ const char *end = buffer + mBuffer2.size();
NextToken(&car, end);
if (car < end - 2 && car[0] == 'S' && car[1] == 'T') {
- hasTexCoord = true; car += 2;
+ hasTexCoord = true;
+ car += 2;
}
if (car < end - 1 && car[0] == 'C') {
- hasColors = true; car++;
+ hasColors = true;
+ car++;
}
- if (car < end- 1 && car[0] == 'N') {
- hasNormals = true; car++;
+ if (car < end - 1 && car[0] == 'N') {
+ hasNormals = true;
+ car++;
}
if (car < end - 1 && car[0] == '4') {
- hasHomogenous = true; car++;
+ hasHomogenous = true;
+ car++;
}
if (car < end - 1 && car[0] == 'n') {
- hasDimension = true; car++;
+ hasDimension = true;
+ car++;
}
if (car < end - 3 && car[0] == 'O' && car[1] == 'F' && car[2] == 'F') {
car += 3;
- NextToken(&car, end);
+ NextToken(&car, end);
} else {
- // in case there is no OFF header (which is allowed by the
- // specification...), then we might have unintentionally read an
- // additional dimension from the primitive count fields
- dimensions = 3;
- hasHomogenous = false;
- NextToken(&car, end);
+ // in case there is no OFF header (which is allowed by the
+ // specification...), then we might have unintentionally read an
+ // additional dimension from the primitive count fields
+ dimensions = 3;
+ hasHomogenous = false;
+ NextToken(&car, end);
- // at this point the next token should be an integer number
- if (car >= end - 1 || *car < '0' || *car > '9') {
- throw DeadlyImportError("OFF: Header is invalid");
- }
+ // at this point the next token should be an integer number
+ if (car >= end - 1 || *car < '0' || *car > '9') {
+ throw DeadlyImportError("OFF: Header is invalid");
+ }
}
if (hasDimension) {
dimensions = strtoul10(car, &car);
- NextToken(&car, end);
+ NextToken(&car, end);
}
if (dimensions > 3) {
- throw DeadlyImportError
- ("OFF: Number of vertex coordinates higher than 3 unsupported");
+ throw DeadlyImportError("OFF: Number of vertex coordinates higher than 3 unsupported");
}
NextToken(&car, end);
@@ -171,7 +163,7 @@ void OFFImporter::InternReadFile( const std::string& pFile, aiScene* pScene, IOS
NextToken(&car, end);
const unsigned int numFaces = strtoul10(car, &car);
NextToken(&car, end);
- strtoul10(car, &car); // skip edge count
+ strtoul10(car, &car); // skip edge count
NextToken(&car, end);
if (!numVertices) {
@@ -182,13 +174,13 @@ void OFFImporter::InternReadFile( const std::string& pFile, aiScene* pScene, IOS
}
pScene->mNumMeshes = 1;
- pScene->mMeshes = new aiMesh*[ pScene->mNumMeshes ];
+ pScene->mMeshes = new aiMesh *[pScene->mNumMeshes];
- aiMesh* mesh = new aiMesh();
+ aiMesh *mesh = new aiMesh();
pScene->mMeshes[0] = mesh;
mesh->mNumFaces = numFaces;
- aiFace* faces = new aiFace[mesh->mNumFaces];
+ aiFace *faces = new aiFace[mesh->mNumFaces];
mesh->mFaces = faces;
mesh->mNumVertices = numVertices;
@@ -206,100 +198,101 @@ void OFFImporter::InternReadFile( const std::string& pFile, aiScene* pScene, IOS
// now read all vertex lines
for (unsigned int i = 0; i < numVertices; ++i) {
- if(!GetNextLine(buffer, line)) {
+ if (!GetNextLine(buffer, line)) {
ASSIMP_LOG_ERROR("OFF: The number of verts in the header is incorrect");
break;
}
- aiVector3D& v = mesh->mVertices[i];
+ aiVector3D &v = mesh->mVertices[i];
sz = line;
- // helper array to write a for loop over possible dimension values
- ai_real* vec[3] = {&v.x, &v.y, &v.z};
+ // helper array to write a for loop over possible dimension values
+ ai_real *vec[3] = { &v.x, &v.y, &v.z };
- // stop at dimensions: this allows loading 1D or 2D coordinate vertices
- for (unsigned int dim = 0; dim < dimensions; ++dim ) {
- SkipSpaces(&sz);
- sz = fast_atoreal_move(sz, *vec[dim]);
- }
+ // stop at dimensions: this allows loading 1D or 2D coordinate vertices
+ for (unsigned int dim = 0; dim < dimensions; ++dim) {
+ SkipSpaces(&sz);
+ sz = fast_atoreal_move(sz, *vec[dim]);
+ }
- // if has homogeneous coordinate, divide others by this one
- if (hasHomogenous) {
- SkipSpaces(&sz);
- ai_real w = 1.;
- sz = fast_atoreal_move(sz, w);
- for (unsigned int dim = 0; dim < dimensions; ++dim ) {
- *(vec[dim]) /= w;
- }
- }
+ // if has homogeneous coordinate, divide others by this one
+ if (hasHomogenous) {
+ SkipSpaces(&sz);
+ ai_real w = 1.;
+ sz = fast_atoreal_move(sz, w);
+ for (unsigned int dim = 0; dim < dimensions; ++dim) {
+ *(vec[dim]) /= w;
+ }
+ }
- // read optional normals
- if (hasNormals) {
- aiVector3D& n = mesh->mNormals[i];
- SkipSpaces(&sz);
- sz = fast_atoreal_move(sz,(ai_real&)n.x);
- SkipSpaces(&sz);
- sz = fast_atoreal_move(sz,(ai_real&)n.y);
- SkipSpaces(&sz);
- fast_atoreal_move(sz,(ai_real&)n.z);
- }
+ // read optional normals
+ if (hasNormals) {
+ aiVector3D &n = mesh->mNormals[i];
+ SkipSpaces(&sz);
+ sz = fast_atoreal_move(sz, (ai_real &)n.x);
+ SkipSpaces(&sz);
+ sz = fast_atoreal_move(sz, (ai_real &)n.y);
+ SkipSpaces(&sz);
+ fast_atoreal_move(sz, (ai_real &)n.z);
+ }
- // reading colors is a pain because the specification says it can be
- // integers or floats, and any number of them between 1 and 4 included,
- // until the next comment or end of line
- // in theory should be testing type !
- if (hasColors) {
- aiColor4D& c = mesh->mColors[0][i];
- SkipSpaces(&sz);
- sz = fast_atoreal_move(sz,(ai_real&)c.r);
+ // reading colors is a pain because the specification says it can be
+ // integers or floats, and any number of them between 1 and 4 included,
+ // until the next comment or end of line
+ // in theory should be testing type !
+ if (hasColors) {
+ aiColor4D &c = mesh->mColors[0][i];
+ SkipSpaces(&sz);
+ sz = fast_atoreal_move(sz, (ai_real &)c.r);
if (*sz != '#' && *sz != '\n' && *sz != '\r') {
- SkipSpaces(&sz);
- sz = fast_atoreal_move(sz,(ai_real&)c.g);
+ SkipSpaces(&sz);
+ sz = fast_atoreal_move(sz, (ai_real &)c.g);
} else {
- c.g = 0.;
- }
+ c.g = 0.;
+ }
if (*sz != '#' && *sz != '\n' && *sz != '\r') {
- SkipSpaces(&sz);
- sz = fast_atoreal_move(sz,(ai_real&)c.b);
+ SkipSpaces(&sz);
+ sz = fast_atoreal_move(sz, (ai_real &)c.b);
} else {
- c.b = 0.;
- }
+ c.b = 0.;
+ }
if (*sz != '#' && *sz != '\n' && *sz != '\r') {
- SkipSpaces(&sz);
- sz = fast_atoreal_move(sz,(ai_real&)c.a);
+ SkipSpaces(&sz);
+ sz = fast_atoreal_move(sz, (ai_real &)c.a);
} else {
- c.a = 1.;
- }
- }
+ c.a = 1.;
+ }
+ }
if (hasTexCoord) {
- aiVector3D& t = mesh->mTextureCoords[0][i];
- SkipSpaces(&sz);
- sz = fast_atoreal_move(sz,(ai_real&)t.x);
- SkipSpaces(&sz);
- fast_atoreal_move(sz,(ai_real&)t.y);
- }
+ aiVector3D &t = mesh->mTextureCoords[0][i];
+ SkipSpaces(&sz);
+ sz = fast_atoreal_move(sz, (ai_real &)t.x);
+ SkipSpaces(&sz);
+ fast_atoreal_move(sz, (ai_real &)t.y);
+ }
}
// load faces with their indices
faces = mesh->mFaces;
- for (unsigned int i = 0; i < numFaces; ) {
- if(!GetNextLine(buffer,line)) {
+ for (unsigned int i = 0; i < numFaces;) {
+ if (!GetNextLine(buffer, line)) {
ASSIMP_LOG_ERROR("OFF: The number of faces in the header is incorrect");
throw DeadlyImportError("OFF: The number of faces in the header is incorrect");
}
unsigned int idx;
- sz = line; SkipSpaces(&sz);
- idx = strtoul10(sz,&sz);
- if(!idx || idx > 9) {
- ASSIMP_LOG_ERROR("OFF: Faces with zero indices aren't allowed");
+ sz = line;
+ SkipSpaces(&sz);
+ idx = strtoul10(sz, &sz);
+ if (!idx || idx > 9) {
+ ASSIMP_LOG_ERROR("OFF: Faces with zero indices aren't allowed");
--mesh->mNumFaces;
++i;
continue;
- }
- faces->mNumIndices = idx;
+ }
+ faces->mNumIndices = idx;
faces->mIndices = new unsigned int[faces->mNumIndices];
- for (unsigned int m = 0; m < faces->mNumIndices;++m) {
+ for (unsigned int m = 0; m < faces->mNumIndices; ++m) {
SkipSpaces(&sz);
- idx = strtoul10(sz,&sz);
+ idx = strtoul10(sz, &sz);
if (idx >= numVertices) {
ASSIMP_LOG_ERROR("OFF: Vertex index is out of range");
idx = numVertices - 1;
@@ -314,20 +307,22 @@ void OFFImporter::InternReadFile( const std::string& pFile, aiScene* pScene, IOS
pScene->mRootNode = new aiNode();
pScene->mRootNode->mName.Set("");
pScene->mRootNode->mNumMeshes = 1;
- pScene->mRootNode->mMeshes = new unsigned int [pScene->mRootNode->mNumMeshes];
+ pScene->mRootNode->mMeshes = new unsigned int[pScene->mRootNode->mNumMeshes];
pScene->mRootNode->mMeshes[0] = 0;
// generate a default material
pScene->mNumMaterials = 1;
- pScene->mMaterials = new aiMaterial*[pScene->mNumMaterials];
- aiMaterial* pcMat = new aiMaterial();
+ pScene->mMaterials = new aiMaterial *[pScene->mNumMaterials];
+ aiMaterial *pcMat = new aiMaterial();
- aiColor4D clr( ai_real( 0.6 ), ai_real( 0.6 ), ai_real( 0.6 ), ai_real( 1.0 ) );
- pcMat->AddProperty(&clr,1,AI_MATKEY_COLOR_DIFFUSE);
+ aiColor4D clr(ai_real(0.6), ai_real(0.6), ai_real(0.6), ai_real(1.0));
+ pcMat->AddProperty(&clr, 1, AI_MATKEY_COLOR_DIFFUSE);
pScene->mMaterials[0] = pcMat;
const int twosided = 1;
pcMat->AddProperty(&twosided, 1, AI_MATKEY_TWOSIDED);
}
+} // namespace Assimp
+
#endif // !! ASSIMP_BUILD_NO_OFF_IMPORTER
diff --git a/code/AssetLib/OFF/OFFLoader.h b/code/AssetLib/OFF/OFFLoader.h
index 04bb7f481..b8577e507 100644
--- a/code/AssetLib/OFF/OFFLoader.h
+++ b/code/AssetLib/OFF/OFFLoader.h
@@ -57,8 +57,8 @@ namespace Assimp {
*/
class OFFImporter : public BaseImporter {
public:
- OFFImporter();
- ~OFFImporter() override;
+ OFFImporter() = default;
+ ~OFFImporter() override = default;
// -------------------------------------------------------------------
/** Returns whether the class can handle the format of the given file.
diff --git a/code/AssetLib/Obj/ObjFileImporter.cpp b/code/AssetLib/Obj/ObjFileImporter.cpp
index 173ef2074..339e90b06 100644
--- a/code/AssetLib/Obj/ObjFileImporter.cpp
+++ b/code/AssetLib/Obj/ObjFileImporter.cpp
@@ -54,7 +54,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include
#include
-static const aiImporterDesc desc = {
+static constexpr aiImporterDesc desc = {
"Wavefront Object Importer",
"",
"",
@@ -78,7 +78,9 @@ using namespace std;
ObjFileImporter::ObjFileImporter() :
m_Buffer(),
m_pRootObject(nullptr),
- m_strAbsPath(std::string(1, DefaultIOSystem().getOsSeparator())) {}
+ m_strAbsPath(std::string(1, DefaultIOSystem().getOsSeparator())) {
+ // empty
+}
// ------------------------------------------------------------------------------------------------
// Destructor.
@@ -101,8 +103,13 @@ const aiImporterDesc *ObjFileImporter::GetInfo() const {
// ------------------------------------------------------------------------------------------------
// Obj-file import implementation
void ObjFileImporter::InternReadFile(const std::string &file, aiScene *pScene, IOSystem *pIOHandler) {
+ if (m_pRootObject != nullptr) {
+ delete m_pRootObject;
+ m_pRootObject = nullptr;
+ }
+
// Read file into memory
- static const std::string mode = "rb";
+ static constexpr char mode[] = "rb";
auto streamCloser = [&](IOStream *pStream) {
pIOHandler->Close(pStream);
};
diff --git a/code/AssetLib/Obj/ObjFileParser.cpp b/code/AssetLib/Obj/ObjFileParser.cpp
index 09602e882..acb3f074c 100644
--- a/code/AssetLib/Obj/ObjFileParser.cpp
+++ b/code/AssetLib/Obj/ObjFileParser.cpp
@@ -605,7 +605,8 @@ void ObjFileParser::getMaterialDesc() {
}
if (needsNewMesh(strName)) {
- createMesh(strName);
+ auto newMeshName = m_pModel->mActiveGroup.empty() ? strName : m_pModel->mActiveGroup;
+ createMesh(newMeshName);
}
m_pModel->mCurrentMesh->m_uiMaterialIndex = getMaterialIndex(strName);
diff --git a/code/AssetLib/Ogre/OgreImporter.cpp b/code/AssetLib/Ogre/OgreImporter.cpp
index 860aed727..5bf6901a0 100644
--- a/code/AssetLib/Ogre/OgreImporter.cpp
+++ b/code/AssetLib/Ogre/OgreImporter.cpp
@@ -48,7 +48,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include
#include
-static const aiImporterDesc desc = {
+static constexpr aiImporterDesc desc = {
"Ogre3D Mesh Importer",
"",
"",
diff --git a/code/AssetLib/OpenGEX/OpenGEXImporter.cpp b/code/AssetLib/OpenGEX/OpenGEXImporter.cpp
index 16268ead5..735f56755 100644
--- a/code/AssetLib/OpenGEX/OpenGEXImporter.cpp
+++ b/code/AssetLib/OpenGEX/OpenGEXImporter.cpp
@@ -52,7 +52,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include
#include
-static const aiImporterDesc desc = {
+static constexpr aiImporterDesc desc = {
"Open Game Engine Exchange",
"",
"",
@@ -66,42 +66,42 @@ static const aiImporterDesc desc = {
};
namespace Grammar {
- static const char* MetricType = "Metric";
- static const char *Metric_DistanceType = "distance";
- static const char *Metric_AngleType = "angle";
- static const char *Metric_TimeType = "time";
- static const char *Metric_UpType = "up";
- static const char *NameType = "Name";
- static const char *ObjectRefType = "ObjectRef";
- static const char *MaterialRefType = "MaterialRef";
- static const char *MetricKeyType = "key";
- static const char *GeometryNodeType = "GeometryNode";
- static const char *CameraNodeType = "CameraNode";
- static const char *LightNodeType = "LightNode";
- static const char *GeometryObjectType = "GeometryObject";
- static const char *CameraObjectType = "CameraObject";
- static const char *LightObjectType = "LightObject";
- static const char *TransformType = "Transform";
- static const char *MeshType = "Mesh";
- static const char *VertexArrayType = "VertexArray";
- static const char *IndexArrayType = "IndexArray";
- static const char *MaterialType = "Material";
- static const char *ColorType = "Color";
- static const char *ParamType = "Param";
- static const char *TextureType = "Texture";
- static const char *AttenType = "Atten";
+ static constexpr char MetricType[] = "Metric";
+ static constexpr char Metric_DistanceType[] = "distance";
+ static constexpr char Metric_AngleType[] = "angle";
+ static constexpr char Metric_TimeType[] = "time";
+ static constexpr char Metric_UpType[] = "up";
+ static constexpr char NameType[] = "Name";
+ static constexpr char ObjectRefType[] = "ObjectRef";
+ static constexpr char MaterialRefType[] = "MaterialRef";
+ static constexpr char MetricKeyType[] = "key";
+ static constexpr char GeometryNodeType[] = "GeometryNode";
+ static constexpr char CameraNodeType[] = "CameraNode";
+ static constexpr char LightNodeType[] = "LightNode";
+ static constexpr char GeometryObjectType[] = "GeometryObject";
+ static constexpr char CameraObjectType[] = "CameraObject";
+ static constexpr char LightObjectType[] = "LightObject";
+ static constexpr char TransformType[] = "Transform";
+ static constexpr char MeshType[] = "Mesh";
+ static constexpr char VertexArrayType[] = "VertexArray";
+ static constexpr char IndexArrayType[] = "IndexArray";
+ static constexpr char MaterialType[] = "Material";
+ static constexpr char ColorType[] = "Color";
+ static constexpr char ParamType[] = "Param";
+ static constexpr char TextureType[] = "Texture";
+ static constexpr char AttenType[] = "Atten";
- static const char *DiffuseColorToken = "diffuse";
- static const char *SpecularColorToken = "specular";
- static const char *EmissionColorToken = "emission";
+ static constexpr char DiffuseColorToken[] = "diffuse";
+ static constexpr char SpecularColorToken[] = "specular";
+ static constexpr char EmissionColorToken[] = "emission";
- static const char *DiffuseTextureToken = "diffuse";
- static const char *DiffuseSpecularTextureToken = "specular";
- static const char *SpecularPowerTextureToken = "specular_power";
- static const char *EmissionTextureToken = "emission";
- static const char *OpacyTextureToken = "opacity";
- static const char *TransparencyTextureToken = "transparency";
- static const char *NormalTextureToken = "normal";
+ static constexpr char DiffuseTextureToken[] = "diffuse";
+ static constexpr char DiffuseSpecularTextureToken[] = "specular";
+ static constexpr char SpecularPowerTextureToken[] = "specular_power";
+ static constexpr char EmissionTextureToken[] = "emission";
+ static constexpr char OpacyTextureToken[] = "opacity";
+ static constexpr char TransparencyTextureToken[] = "transparency";
+ static constexpr char NormalTextureToken[] = "normal";
enum TokenType {
NoneType = -1,
@@ -139,7 +139,7 @@ namespace Grammar {
return false;
}
- int idx(-1);
+ int idx = -1;
for (size_t i = 0; i < 4; i++) {
if (ValidMetricToken[i] == token) {
idx = (int)i;
diff --git a/code/AssetLib/Ply/PlyLoader.cpp b/code/AssetLib/Ply/PlyLoader.cpp
index 783c7f1c6..a747ba5cd 100644
--- a/code/AssetLib/Ply/PlyLoader.cpp
+++ b/code/AssetLib/Ply/PlyLoader.cpp
@@ -53,9 +53,9 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include
#include
-using namespace ::Assimp;
+namespace Assimp {
-static const aiImporterDesc desc = {
+static constexpr aiImporterDesc desc = {
"Stanford Polygon Library (PLY) Importer",
"",
"",
@@ -71,16 +71,16 @@ static const aiImporterDesc desc = {
// ------------------------------------------------------------------------------------------------
// Internal stuff
namespace {
-// ------------------------------------------------------------------------------------------------
-// Checks that property index is within range
-template
-inline const T &GetProperty(const std::vector &props, int idx) {
- if (static_cast(idx) >= props.size()) {
- throw DeadlyImportError("Invalid .ply file: Property index is out of range.");
- }
+ // ------------------------------------------------------------------------------------------------
+ // Checks that property index is within range
+ template
+ inline const T &GetProperty(const std::vector &props, int idx) {
+ if (static_cast(idx) >= props.size()) {
+ throw DeadlyImportError("Invalid .ply file: Property index is out of range.");
+ }
- return props[idx];
-}
+ return props[idx];
+ }
} // namespace
// ------------------------------------------------------------------------------------------------
@@ -92,10 +92,6 @@ PLYImporter::PLYImporter() :
// empty
}
-// ------------------------------------------------------------------------------------------------
-// Destructor, private as well
-PLYImporter::~PLYImporter() = default;
-
// ------------------------------------------------------------------------------------------------
// Returns whether the class can handle the format of the given file.
bool PLYImporter::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool /*checkSig*/) const {
@@ -215,7 +211,7 @@ void PLYImporter::InternReadFile(const std::string &pFile, aiScene *pScene, IOSy
throw DeadlyImportError("Invalid .ply file: Missing format specification");
}
- //free the file buffer
+ // free the file buffer
streamedBuffer.close();
if (mGeneratedMesh == nullptr) {
@@ -376,7 +372,7 @@ void PLYImporter::LoadVertex(const PLY::Element *pcElement, const PLY::ElementIn
haveNormal = true;
}
- //Colors
+ // Colors
aiColor4D cOut;
bool haveColor = false;
if (0xFFFFFFFF != aiColors[0]) {
@@ -415,7 +411,7 @@ void PLYImporter::LoadVertex(const PLY::Element *pcElement, const PLY::ElementIn
haveColor = true;
}
- //Texture coordinates
+ // Texture coordinates
aiVector3D tOut;
tOut.z = 0;
bool haveTextureCoords = false;
@@ -431,7 +427,7 @@ void PLYImporter::LoadVertex(const PLY::Element *pcElement, const PLY::ElementIn
haveTextureCoords = true;
}
- //create aiMesh if needed
+ // create aiMesh if needed
if (nullptr == mGeneratedMesh) {
mGeneratedMesh = new aiMesh();
mGeneratedMesh->mMaterialIndex = 0;
@@ -512,8 +508,8 @@ void PLYImporter::LoadFace(const PLY::Element *pcElement, const PLY::ElementInst
bool bIsTriStrip = false;
// index of the material index property
- //unsigned int iMaterialIndex = 0xFFFFFFFF;
- //PLY::EDataType eType2 = EDT_Char;
+ // unsigned int iMaterialIndex = 0xFFFFFFFF;
+ // PLY::EDataType eType2 = EDT_Char;
// texture coordinates
unsigned int iTextureCoord = 0xFFFFFFFF;
@@ -595,7 +591,7 @@ void PLYImporter::LoadFace(const PLY::Element *pcElement, const PLY::ElementInst
if (0xFFFFFFFF != iTextureCoord) {
const unsigned int iNum = (unsigned int)GetProperty(instElement->alProperties, iTextureCoord).avList.size();
- //should be 6 coords
+ // should be 6 coords
std::vector::const_iterator p =
GetProperty(instElement->alProperties, iTextureCoord).avList.begin();
@@ -625,7 +621,7 @@ void PLYImporter::LoadFace(const PLY::Element *pcElement, const PLY::ElementInst
// a value of -1 indicates a restart of the strip
bool flip = false;
const std::vector &quak = GetProperty(instElement->alProperties, iProperty).avList;
- //pvOut->reserve(pvOut->size() + quak.size() + (quak.size()>>2u)); //Limits memory consumption
+ // pvOut->reserve(pvOut->size() + quak.size() + (quak.size()>>2u)); //Limits memory consumption
int aiTable[2] = { -1, -1 };
for (std::vector::const_iterator a = quak.begin(); a != quak.end(); ++a) {
@@ -863,7 +859,7 @@ void PLYImporter::LoadMaterial(std::vector *pvOut, std::string &de
const int two_sided = 1;
pcHelper->AddProperty(&two_sided, 1, AI_MATKEY_TWOSIDED);
- //default texture
+ // default texture
if (!defaultTexture.empty()) {
const aiString name(defaultTexture.c_str());
pcHelper->AddProperty(&name, _AI_MATKEY_TEXTURE_BASE, aiTextureType_DIFFUSE, 0);
@@ -873,7 +869,7 @@ void PLYImporter::LoadMaterial(std::vector *pvOut, std::string &de
pcHelper->AddProperty(&two_sided, 1, AI_MATKEY_TWOSIDED);
}
- //set to wireframe, so when using this material info we can switch to points rendering
+ // set to wireframe, so when using this material info we can switch to points rendering
if (pointsOnly) {
const int wireframe = 1;
pcHelper->AddProperty(&wireframe, 1, AI_MATKEY_ENABLE_WIREFRAME);
@@ -890,7 +886,7 @@ void PLYImporter::LoadMaterial(std::vector *pvOut, std::string &de
int iMode = (int)aiShadingMode_Gouraud;
pcHelper->AddProperty(&iMode, 1, AI_MATKEY_SHADING_MODEL);
- //generate white material most 3D engine just multiply ambient / diffuse color with actual ambient / light color
+ // generate white material most 3D engine just multiply ambient / diffuse color with actual ambient / light color
aiColor3D clr;
clr.b = clr.g = clr.r = 1.0f;
pcHelper->AddProperty(&clr, 1, AI_MATKEY_COLOR_DIFFUSE);
@@ -906,13 +902,13 @@ void PLYImporter::LoadMaterial(std::vector *pvOut, std::string &de
pcHelper->AddProperty(&two_sided, 1, AI_MATKEY_TWOSIDED);
}
- //default texture
+ // default texture
if (!defaultTexture.empty()) {
const aiString name(defaultTexture.c_str());
pcHelper->AddProperty(&name, _AI_MATKEY_TEXTURE_BASE, aiTextureType_DIFFUSE, 0);
}
- //set to wireframe, so when using this material info we can switch to points rendering
+ // set to wireframe, so when using this material info we can switch to points rendering
if (pointsOnly) {
const int wireframe = 1;
pcHelper->AddProperty(&wireframe, 1, AI_MATKEY_ENABLE_WIREFRAME);
@@ -922,4 +918,6 @@ void PLYImporter::LoadMaterial(std::vector *pvOut, std::string &de
}
}
+} // namespace Assimp
+
#endif // !! ASSIMP_BUILD_NO_PLY_IMPORTER
diff --git a/code/AssetLib/Ply/PlyLoader.h b/code/AssetLib/Ply/PlyLoader.h
index e29da1db6..f85445f91 100644
--- a/code/AssetLib/Ply/PlyLoader.h
+++ b/code/AssetLib/Ply/PlyLoader.h
@@ -65,7 +65,7 @@ using namespace PLY;
class PLYImporter : public BaseImporter {
public:
PLYImporter();
- ~PLYImporter() override;
+ ~PLYImporter() override = default;
// -------------------------------------------------------------------
/** Returns whether the class can handle the format of the given file.
diff --git a/code/AssetLib/Ply/PlyParser.cpp b/code/AssetLib/Ply/PlyParser.cpp
index 6edba71fc..662da805e 100644
--- a/code/AssetLib/Ply/PlyParser.cpp
+++ b/code/AssetLib/Ply/PlyParser.cpp
@@ -425,7 +425,8 @@ bool PLY::DOM::ParseHeader(IOStreamBuffer &streamBuffer, std::vector
break;
} else {
// ignore unknown header elements
- streamBuffer.getNextLine(buffer);
+ if (!streamBuffer.getNextLine(buffer))
+ return false;
}
}
diff --git a/code/AssetLib/Q3BSP/Q3BSPFileImporter.cpp b/code/AssetLib/Q3BSP/Q3BSPFileImporter.cpp
index 924949eeb..a82f29cf1 100644
--- a/code/AssetLib/Q3BSP/Q3BSPFileImporter.cpp
+++ b/code/AssetLib/Q3BSP/Q3BSPFileImporter.cpp
@@ -48,11 +48,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include
-#ifdef ASSIMP_BUILD_NO_OWN_ZLIB
-#include
-#else
-#include "../contrib/zlib/zlib.h"
-#endif
+#include "zlib.h"
#include
#include
@@ -65,7 +61,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include
#include
-static const aiImporterDesc desc = {
+static constexpr aiImporterDesc desc = {
"Quake III BSP Importer",
"",
"",
@@ -146,7 +142,11 @@ Q3BSPFileImporter::Q3BSPFileImporter() :
// ------------------------------------------------------------------------------------------------
// Destructor.
Q3BSPFileImporter::~Q3BSPFileImporter() {
- // Clear face-to-material map
+ clear();
+}
+
+// ------------------------------------------------------------------------------------------------
+void Q3BSPFileImporter::clear() {
for (FaceMap::iterator it = m_MaterialLookupMap.begin(); it != m_MaterialLookupMap.end(); ++it) {
const std::string &matName = it->first;
if (!matName.empty()) {
@@ -173,6 +173,7 @@ const aiImporterDesc *Q3BSPFileImporter::GetInfo() const {
// ------------------------------------------------------------------------------------------------
// Import method.
void Q3BSPFileImporter::InternReadFile(const std::string &rFile, aiScene *scene, IOSystem *ioHandler) {
+ clear();
ZipArchiveIOSystem Archive(ioHandler, rFile);
if (!Archive.isOpen()) {
throw DeadlyImportError("Failed to open file ", rFile, ".");
@@ -394,7 +395,10 @@ void Q3BSPFileImporter::createTriangleTopology(const Q3BSP::Q3BSPModel *pModel,
m_pCurrentFace->mIndices = new unsigned int[3];
m_pCurrentFace->mIndices[idx] = vertIdx;
}
- }
+ } else {
+ m_pCurrentFace->mIndices[idx] = vertIdx;
+ }
+
pMesh->mVertices[vertIdx].Set(pVertex->vPosition.x, pVertex->vPosition.y, pVertex->vPosition.z);
pMesh->mNormals[vertIdx].Set(pVertex->vNormal.x, pVertex->vNormal.y, pVertex->vNormal.z);
diff --git a/code/AssetLib/Q3BSP/Q3BSPFileImporter.h b/code/AssetLib/Q3BSP/Q3BSPFileImporter.h
index fdcfff876..63d6edb21 100644
--- a/code/AssetLib/Q3BSP/Q3BSPFileImporter.h
+++ b/code/AssetLib/Q3BSP/Q3BSPFileImporter.h
@@ -81,6 +81,7 @@ protected:
using FaceMapIt = std::map* >::iterator;
using FaceMapConstIt = std::map*>::const_iterator;
+ void clear();
const aiImporterDesc* GetInfo () const override;
void InternReadFile(const std::string& pFile, aiScene* pScene, IOSystem* pIOHandler) override;
void separateMapName( const std::string &rImportName, std::string &rArchiveName, std::string &rMapName );
diff --git a/code/AssetLib/Q3D/Q3DLoader.cpp b/code/AssetLib/Q3D/Q3DLoader.cpp
index 22d1065de..b599ad8f2 100644
--- a/code/AssetLib/Q3D/Q3DLoader.cpp
+++ b/code/AssetLib/Q3D/Q3DLoader.cpp
@@ -55,9 +55,9 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include
#include
-using namespace Assimp;
+namespace Assimp {
-static const aiImporterDesc desc = {
+static constexpr aiImporterDesc desc = {
"Quick3D Importer",
"",
"",
@@ -127,7 +127,7 @@ void Q3DImporter::InternReadFile(const std::string &pFile,
std::vector materials;
try {
materials.reserve(numMats);
- } catch(const std::bad_alloc&) {
+ } catch (const std::bad_alloc &) {
ASSIMP_LOG_ERROR("Invalid alloc for materials.");
throw DeadlyImportError("Invalid Quick3D-file, material allocation failed.");
}
@@ -135,7 +135,7 @@ void Q3DImporter::InternReadFile(const std::string &pFile,
std::vector meshes;
try {
meshes.reserve(numMeshes);
- } catch(const std::bad_alloc&) {
+ } catch (const std::bad_alloc &) {
ASSIMP_LOG_ERROR("Invalid alloc for meshes.");
throw DeadlyImportError("Invalid Quick3D-file, mesh allocation failed.");
}
@@ -237,7 +237,6 @@ void Q3DImporter::InternReadFile(const std::string &pFile,
if (minor > '0' && major == '3')
stream.IncPtr(mesh.faces.size());
}
- // stream.IncPtr(4); // unknown value here
} break;
// materials chunk
@@ -275,8 +274,6 @@ void Q3DImporter::InternReadFile(const std::string &pFile,
// read the transparency
mat.transparency = stream.GetF4();
- // unknown value here
- // stream.IncPtr(4);
// FIX: it could be the texture index ...
mat.texIdx = (unsigned int)stream.GetI4();
}
@@ -425,7 +422,8 @@ outer:
pScene->mMeshes = new aiMesh *[pScene->mNumMaterials];
for (unsigned int i = 0, real = 0; i < (unsigned int)materials.size(); ++i) {
- if (fidx[i].empty()) continue;
+ if (fidx[i].empty())
+ continue;
// Allocate a mesh and a material
aiMesh *mesh = pScene->mMeshes[real] = new aiMesh();
@@ -548,14 +546,9 @@ outer:
// Now we need to attach the meshes to the root node of the scene
pScene->mRootNode->mNumMeshes = pScene->mNumMeshes;
pScene->mRootNode->mMeshes = new unsigned int[pScene->mNumMeshes];
- for (unsigned int i = 0; i < pScene->mNumMeshes; ++i)
+ for (unsigned int i = 0; i < pScene->mNumMeshes; ++i) {
pScene->mRootNode->mMeshes[i] = i;
-
- /*pScene->mRootNode->mTransformation *= aiMatrix4x4(
- 1.f, 0.f, 0.f, 0.f,
- 0.f, -1.f,0.f, 0.f,
- 0.f, 0.f, 1.f, 0.f,
- 0.f, 0.f, 0.f, 1.f);*/
+ }
// Add cameras and light sources to the scene root node
pScene->mRootNode->mNumChildren = pScene->mNumLights + pScene->mNumCameras;
@@ -577,4 +570,6 @@ outer:
}
}
+} // namespace Assimp
+
#endif // !! ASSIMP_BUILD_NO_Q3D_IMPORTER
diff --git a/code/AssetLib/Raw/RawLoader.cpp b/code/AssetLib/Raw/RawLoader.cpp
index 1791a5c52..4c5f852b0 100644
--- a/code/AssetLib/Raw/RawLoader.cpp
+++ b/code/AssetLib/Raw/RawLoader.cpp
@@ -55,9 +55,9 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include
#include
-using namespace Assimp;
+namespace Assimp {
-static const aiImporterDesc desc = {
+static constexpr aiImporterDesc desc = {
"Raw Importer",
"",
"",
@@ -70,14 +70,6 @@ static const aiImporterDesc desc = {
"raw"
};
-// ------------------------------------------------------------------------------------------------
-// Constructor to be privately used by Importer
-RAWImporter::RAWImporter() = default;
-
-// ------------------------------------------------------------------------------------------------
-// Destructor, private as well
-RAWImporter::~RAWImporter() = default;
-
// ------------------------------------------------------------------------------------------------
// Returns whether the class can handle the format of the given file.
bool RAWImporter::CanRead(const std::string &filename, IOSystem * /*pIOHandler*/, bool /*checkSig*/) const {
@@ -295,4 +287,6 @@ void RAWImporter::InternReadFile(const std::string &pFile,
}
}
+} // namespace Assimp
+
#endif // !! ASSIMP_BUILD_NO_RAW_IMPORTER
diff --git a/code/AssetLib/Raw/RawLoader.h b/code/AssetLib/Raw/RawLoader.h
index 54314f728..83e4a9f1f 100644
--- a/code/AssetLib/Raw/RawLoader.h
+++ b/code/AssetLib/Raw/RawLoader.h
@@ -57,8 +57,8 @@ namespace Assimp {
*/
class RAWImporter : public BaseImporter {
public:
- RAWImporter();
- ~RAWImporter() override;
+ RAWImporter() = default;
+ ~RAWImporter() override = default;
// -------------------------------------------------------------------
/** Returns whether the class can handle the format of the given file.
diff --git a/code/AssetLib/SIB/SIBImporter.cpp b/code/AssetLib/SIB/SIBImporter.cpp
index 9f299180b..840f74b7d 100644
--- a/code/AssetLib/SIB/SIBImporter.cpp
+++ b/code/AssetLib/SIB/SIBImporter.cpp
@@ -56,11 +56,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include
#include
#include
-#ifdef ASSIMP_USE_HUNTER
-#include
-#else
-#include "../contrib/utf8cpp/source/utf8.h"
-#endif
+#include "utf8.h"
#include
#include
#include
@@ -69,9 +65,9 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include
-using namespace Assimp;
+namespace Assimp {
-static const aiImporterDesc desc = {
+static constexpr aiImporterDesc desc = {
"Silo SIB Importer",
"Richard Mitton (http://www.codersnotes.com/about)",
"",
@@ -94,7 +90,7 @@ enum {
N
};
-typedef std::pair SIBPair;
+using SIBPair = std::pair;
struct SIBEdge {
uint32_t faceA, faceB;
@@ -199,15 +195,6 @@ static aiString ReadString(StreamReaderLE *stream, uint32_t numWChars) {
return result;
}
-
-// ------------------------------------------------------------------------------------------------
-// Constructor to be privately used by Importer
-SIBImporter::SIBImporter() = default;
-
-// ------------------------------------------------------------------------------------------------
-// Destructor, private as well
-SIBImporter::~SIBImporter() = default;
-
// ------------------------------------------------------------------------------------------------
// Returns whether the class can handle the format of the given file.
bool SIBImporter::CanRead(const std::string &filename, IOSystem * /*pIOHandler*/, bool /*checkSig*/) const {
@@ -882,4 +869,6 @@ void SIBImporter::InternReadFile(const std::string &pFile,
}
}
+} // namespace Assimp
+
#endif // !! ASSIMP_BUILD_NO_SIB_IMPORTER
diff --git a/code/AssetLib/SIB/SIBImporter.h b/code/AssetLib/SIB/SIBImporter.h
index 2b197ddca..903c36561 100644
--- a/code/AssetLib/SIB/SIBImporter.h
+++ b/code/AssetLib/SIB/SIBImporter.h
@@ -57,8 +57,8 @@ namespace Assimp {
*/
class ASSIMP_API SIBImporter : public BaseImporter {
public:
- SIBImporter();
- ~SIBImporter() override;
+ SIBImporter() = default;
+ ~SIBImporter() override = default;
// -------------------------------------------------------------------
/** Returns whether the class can handle the format of the given file.
diff --git a/code/AssetLib/SMD/SMDLoader.cpp b/code/AssetLib/SMD/SMDLoader.cpp
index 9af871cee..4b63dd9d0 100644
--- a/code/AssetLib/SMD/SMDLoader.cpp
+++ b/code/AssetLib/SMD/SMDLoader.cpp
@@ -64,9 +64,9 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#define strtok_s strtok_r
#endif
-using namespace Assimp;
+namespace Assimp {
-static const aiImporterDesc desc = {
+static constexpr aiImporterDesc desc = {
"Valve SMD Importer",
"",
"",
@@ -1077,4 +1077,6 @@ void SMDImporter::ParseVertex(const char* szCurrent,
SMDI_PARSE_RETURN;
}
+}
+
#endif // !! ASSIMP_BUILD_NO_SMD_IMPORTER
diff --git a/code/AssetLib/STEPParser/STEPFileEncoding.cpp b/code/AssetLib/STEPParser/STEPFileEncoding.cpp
index d4456e674..92eb4f284 100644
--- a/code/AssetLib/STEPParser/STEPFileEncoding.cpp
+++ b/code/AssetLib/STEPParser/STEPFileEncoding.cpp
@@ -45,11 +45,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "STEPFileEncoding.h"
#include
-#ifdef ASSIMP_USE_HUNTER
-# include
-#else
-# include
-#endif
+#include "utf8.h"
#include
diff --git a/code/AssetLib/STL/STLLoader.cpp b/code/AssetLib/STL/STLLoader.cpp
index 9c0fb4f59..269ee1467 100644
--- a/code/AssetLib/STL/STLLoader.cpp
+++ b/code/AssetLib/STL/STLLoader.cpp
@@ -52,11 +52,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include
#include
-using namespace Assimp;
+namespace Assimp {
namespace {
-static const aiImporterDesc desc = {
+static constexpr aiImporterDesc desc = {
"Stereolithography (STL) Importer",
"",
"",
@@ -129,7 +129,7 @@ STLImporter::STLImporter() :
mBuffer(),
mFileSize(0),
mScene() {
- // empty
+ // empty
}
// ------------------------------------------------------------------------------------------------
@@ -250,13 +250,13 @@ void STLImporter::LoadASCIIFile(aiNode *root) {
sz += 5; // skip the "solid"
SkipSpaces(&sz);
const char *szMe = sz;
- while (!::IsSpaceOrNewLine(*sz)) {
+ while (!IsSpaceOrNewLine(*sz)) {
sz++;
}
size_t temp = (size_t)(sz - szMe);
// setup the name of the node
- if ( temp ) {
+ if (temp) {
if (temp >= MAXLEN) {
throw DeadlyImportError("STL: Node name too long");
}
@@ -303,7 +303,7 @@ void STLImporter::LoadASCIIFile(aiNode *root) {
normalBuffer.emplace_back(vn);
normalBuffer.emplace_back(vn);
}
- } else if (!strncmp(sz, "vertex", 6) && ::IsSpaceOrNewLine(*(sz + 6))) { // vertex 1.50000 1.50000 0.00000
+ } else if (!strncmp(sz, "vertex", 6) && IsSpaceOrNewLine(*(sz + 6))) { // vertex 1.50000 1.50000 0.00000
if (faceVertexCounter >= 3) {
ASSIMP_LOG_ERROR("STL: a facet with more than 3 vertices has been found");
++sz;
@@ -325,14 +325,14 @@ void STLImporter::LoadASCIIFile(aiNode *root) {
} else if (!::strncmp(sz, "endsolid", 8)) {
do {
++sz;
- } while (!::IsLineEnd(*sz));
+ } while (!IsLineEnd(*sz));
SkipSpacesAndLineEnd(&sz);
// finished!
break;
} else { // else skip the whole identifier
do {
++sz;
- } while (!::IsSpaceOrNewLine(*sz));
+ } while (!IsSpaceOrNewLine(*sz));
}
}
@@ -349,14 +349,14 @@ void STLImporter::LoadASCIIFile(aiNode *root) {
throw DeadlyImportError("Normal buffer size does not match position buffer size");
}
- // only process positionbuffer when filled, else exception when accessing with index operator
+ // only process position buffer when filled, else exception when accessing with index operator
// see line 353: only warning is triggered
- // see line 373(now): access to empty positionbuffer with index operator forced exception
+ // see line 373(now): access to empty position buffer with index operator forced exception
if (!positionBuffer.empty()) {
pMesh->mNumFaces = static_cast(positionBuffer.size() / 3);
pMesh->mNumVertices = static_cast(positionBuffer.size());
pMesh->mVertices = new aiVector3D[pMesh->mNumVertices];
- for (size_t i=0; imNumVertices; ++i ) {
+ for (size_t i = 0; i < pMesh->mNumVertices; ++i) {
pMesh->mVertices[i].x = positionBuffer[i].x;
pMesh->mVertices[i].y = positionBuffer[i].y;
pMesh->mVertices[i].z = positionBuffer[i].z;
@@ -366,7 +366,7 @@ void STLImporter::LoadASCIIFile(aiNode *root) {
// also only process normalBuffer when filled, else exception when accessing with index operator
if (!normalBuffer.empty()) {
pMesh->mNormals = new aiVector3D[pMesh->mNumVertices];
- for (size_t i=0; imNumVertices; ++i ) {
+ for (size_t i = 0; i < pMesh->mNumVertices; ++i) {
pMesh->mNormals[i].x = normalBuffer[i].x;
pMesh->mNormals[i].y = normalBuffer[i].y;
pMesh->mNormals[i].z = normalBuffer[i].z;
@@ -450,9 +450,8 @@ bool STLImporter::LoadBinaryFile() {
aiVector3D *vp = pMesh->mVertices = new aiVector3D[pMesh->mNumVertices];
aiVector3D *vn = pMesh->mNormals = new aiVector3D[pMesh->mNumVertices];
- typedef aiVector3t aiVector3F;
- aiVector3F *theVec;
- aiVector3F theVec3F;
+ aiVector3f *theVec;
+ aiVector3f theVec3F;
for (unsigned int i = 0; i < pMesh->mNumFaces; ++i) {
// NOTE: Blender sometimes writes empty normals ... this is not
@@ -460,8 +459,8 @@ bool STLImporter::LoadBinaryFile() {
// There's one normal for the face in the STL; use it three times
// for vertex normals
- theVec = (aiVector3F *)sz;
- ::memcpy(&theVec3F, theVec, sizeof(aiVector3F));
+ theVec = (aiVector3f *)sz;
+ ::memcpy(&theVec3F, theVec, sizeof(aiVector3f));
vn->x = theVec3F.x;
vn->y = theVec3F.y;
vn->z = theVec3F.z;
@@ -471,7 +470,7 @@ bool STLImporter::LoadBinaryFile() {
vn += 3;
// vertex 1
- ::memcpy(&theVec3F, theVec, sizeof(aiVector3F));
+ ::memcpy(&theVec3F, theVec, sizeof(aiVector3f));
vp->x = theVec3F.x;
vp->y = theVec3F.y;
vp->z = theVec3F.z;
@@ -479,7 +478,7 @@ bool STLImporter::LoadBinaryFile() {
++vp;
// vertex 2
- ::memcpy(&theVec3F, theVec, sizeof(aiVector3F));
+ ::memcpy(&theVec3F, theVec, sizeof(aiVector3f));
vp->x = theVec3F.x;
vp->y = theVec3F.y;
vp->z = theVec3F.z;
@@ -487,7 +486,7 @@ bool STLImporter::LoadBinaryFile() {
++vp;
// vertex 3
- ::memcpy(&theVec3F, theVec, sizeof(aiVector3F));
+ ::memcpy(&theVec3F, theVec, sizeof(aiVector3f));
vp->x = theVec3F.x;
vp->y = theVec3F.y;
vp->z = theVec3F.z;
@@ -570,4 +569,6 @@ void STLImporter::pushMeshesToNode(std::vector &meshIndices, aiNod
meshIndices.clear();
}
+} // namespace Assimp
+
#endif // !! ASSIMP_BUILD_NO_STL_IMPORTER
diff --git a/code/AssetLib/Terragen/TerragenLoader.cpp b/code/AssetLib/Terragen/TerragenLoader.cpp
index 738ad8e27..b1870414c 100644
--- a/code/AssetLib/Terragen/TerragenLoader.cpp
+++ b/code/AssetLib/Terragen/TerragenLoader.cpp
@@ -51,9 +51,9 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include
#include
-using namespace Assimp;
+namespace Assimp {
-static const aiImporterDesc desc = {
+static constexpr aiImporterDesc desc = {
"Terragen Heightmap Importer",
"",
"",
@@ -73,10 +73,6 @@ TerragenImporter::TerragenImporter() :
// empty
}
-// ------------------------------------------------------------------------------------------------
-// Destructor, private as well
-TerragenImporter::~TerragenImporter() = default;
-
// ------------------------------------------------------------------------------------------------
// Returns whether the class can handle the format of the given file.
bool TerragenImporter::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool /*checkSig*/) const {
@@ -244,4 +240,6 @@ void TerragenImporter::InternReadFile(const std::string &pFile,
pScene->mFlags |= AI_SCENE_FLAGS_TERRAIN;
}
+} // namespace Assimp
+
#endif // !! ASSIMP_BUILD_NO_TERRAGEN_IMPORTER
diff --git a/code/AssetLib/Terragen/TerragenLoader.h b/code/AssetLib/Terragen/TerragenLoader.h
index cb9ff9166..0c7b686e9 100644
--- a/code/AssetLib/Terragen/TerragenLoader.h
+++ b/code/AssetLib/Terragen/TerragenLoader.h
@@ -73,7 +73,7 @@ namespace Assimp {
class TerragenImporter : public BaseImporter {
public:
TerragenImporter();
- ~TerragenImporter() override;
+ ~TerragenImporter() override = default;
// -------------------------------------------------------------------
bool CanRead(const std::string &pFile, IOSystem *pIOHandler,
diff --git a/code/AssetLib/Unreal/UnrealLoader.cpp b/code/AssetLib/Unreal/UnrealLoader.cpp
index f2b0ab118..5f622da42 100644
--- a/code/AssetLib/Unreal/UnrealLoader.cpp
+++ b/code/AssetLib/Unreal/UnrealLoader.cpp
@@ -63,7 +63,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include
#include
-using namespace Assimp;
+namespace Assimp {
namespace Unreal {
@@ -152,7 +152,7 @@ inline void DecompressVertex(aiVector3D &v, int32_t in) {
} // end namespace Unreal
-static const aiImporterDesc desc = {
+static constexpr aiImporterDesc desc = {
"Unreal Mesh Importer",
"",
"",
@@ -178,7 +178,7 @@ UnrealImporter::~UnrealImporter() = default;
// ------------------------------------------------------------------------------------------------
// Returns whether the class can handle the format of the given file.
-bool UnrealImporter::CanRead(const std::string & filename, IOSystem * /*pIOHandler*/, bool /*checkSig*/) const {
+bool UnrealImporter::CanRead(const std::string &filename, IOSystem * /*pIOHandler*/, bool /*checkSig*/) const {
return SimpleExtensionCheck(filename, "3d", "uc");
}
@@ -336,12 +336,12 @@ void UnrealImporter::InternReadFile(const std::string &pFile,
tempTextures.emplace_back();
std::pair &me = tempTextures.back();
for (; !IsLineEnd(*data); ++data) {
- if (!::ASSIMP_strincmp(data, "NAME=", 5)) {
+ if (!ASSIMP_strincmp(data, "NAME=", 5)) {
const char *d = data += 5;
for (; !IsSpaceOrNewLine(*data); ++data)
;
me.first = std::string(d, (size_t)(data - d));
- } else if (!::ASSIMP_strincmp(data, "FILE=", 5)) {
+ } else if (!ASSIMP_strincmp(data, "FILE=", 5)) {
const char *d = data += 5;
for (; !IsSpaceOrNewLine(*data); ++data)
;
@@ -363,10 +363,10 @@ void UnrealImporter::InternReadFile(const std::string &pFile,
std::pair &me = textures.back();
for (; !IsLineEnd(*data); ++data) {
- if (!::ASSIMP_strincmp(data, "NUM=", 4)) {
+ if (!ASSIMP_strincmp(data, "NUM=", 4)) {
data += 4;
me.first = strtoul10(data, &data);
- } else if (!::ASSIMP_strincmp(data, "TEXTURE=", 8)) {
+ } else if (!ASSIMP_strincmp(data, "TEXTURE=", 8)) {
data += 8;
const char *d = data;
for (; !IsSpaceOrNewLine(*data); ++data)
@@ -516,4 +516,6 @@ void UnrealImporter::InternReadFile(const std::string &pFile,
flipper.Execute(pScene);
}
+} // namespace Assimp
+
#endif // !! ASSIMP_BUILD_NO_3D_IMPORTER
diff --git a/code/AssetLib/X/XFileImporter.cpp b/code/AssetLib/X/XFileImporter.cpp
index 1474ad808..00f44b34b 100644
--- a/code/AssetLib/X/XFileImporter.cpp
+++ b/code/AssetLib/X/XFileImporter.cpp
@@ -57,10 +57,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include
#include
-using namespace Assimp;
+namespace Assimp {
+
using namespace Assimp::Formatter;
-static const aiImporterDesc desc = {
+static constexpr aiImporterDesc desc = {
"Direct3D XFile Importer",
"",
"",
@@ -73,142 +74,137 @@ static const aiImporterDesc desc = {
"x"
};
-// ------------------------------------------------------------------------------------------------
-// Constructor to be privately used by Importer
-XFileImporter::XFileImporter() = default;
-
// ------------------------------------------------------------------------------------------------
// Returns whether the class can handle the format of the given file.
-bool XFileImporter::CanRead( const std::string& pFile, IOSystem* pIOHandler, bool /*checkSig*/) const {
+bool XFileImporter::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool /*checkSig*/) const {
static const uint32_t token[] = { AI_MAKE_MAGIC("xof ") };
- return CheckMagicToken(pIOHandler,pFile,token,AI_COUNT_OF(token));
+ return CheckMagicToken(pIOHandler, pFile, token, AI_COUNT_OF(token));
}
// ------------------------------------------------------------------------------------------------
// Get file extension list
-const aiImporterDesc* XFileImporter::GetInfo () const {
+const aiImporterDesc *XFileImporter::GetInfo() const {
return &desc;
}
// ------------------------------------------------------------------------------------------------
// Imports the given file into the given scene structure.
-void XFileImporter::InternReadFile( const std::string& pFile, aiScene* pScene, IOSystem* pIOHandler) {
+void XFileImporter::InternReadFile(const std::string &pFile, aiScene *pScene, IOSystem *pIOHandler) {
// read file into memory
- std::unique_ptr file( pIOHandler->Open( pFile));
+ std::unique_ptr file(pIOHandler->Open(pFile));
if (file == nullptr) {
- throw DeadlyImportError( "Failed to open file ", pFile, "." );
+ throw DeadlyImportError("Failed to open file ", pFile, ".");
}
static const size_t MinSize = 16;
size_t fileSize = file->FileSize();
- if ( fileSize < MinSize ) {
- throw DeadlyImportError( "XFile is too small." );
+ if (fileSize < MinSize) {
+ throw DeadlyImportError("XFile is too small.");
}
// in the hope that binary files will never start with a BOM ...
- mBuffer.resize( fileSize + 1);
- file->Read( &mBuffer.front(), 1, fileSize);
+ mBuffer.resize(fileSize + 1);
+ file->Read(&mBuffer.front(), 1, fileSize);
ConvertToUTF8(mBuffer);
// parse the file into a temporary representation
- XFileParser parser( mBuffer);
+ XFileParser parser(mBuffer);
// and create the proper return structures out of it
- CreateDataRepresentationFromImport( pScene, parser.GetImportedData());
+ CreateDataRepresentationFromImport(pScene, parser.GetImportedData());
// if nothing came from it, report it as error
- if ( !pScene->mRootNode ) {
- throw DeadlyImportError( "XFile is ill-formatted - no content imported." );
+ if (!pScene->mRootNode) {
+ throw DeadlyImportError("XFile is ill-formatted - no content imported.");
}
}
// ------------------------------------------------------------------------------------------------
// Constructs the return data structure out of the imported data.
-void XFileImporter::CreateDataRepresentationFromImport( aiScene* pScene, XFile::Scene* pData)
-{
+void XFileImporter::CreateDataRepresentationFromImport(aiScene *pScene, XFile::Scene *pData) {
// Read the global materials first so that meshes referring to them can find them later
- ConvertMaterials( pScene, pData->mGlobalMaterials);
+ ConvertMaterials(pScene, pData->mGlobalMaterials);
// copy nodes, extracting meshes and materials on the way
- pScene->mRootNode = CreateNodes( pScene, nullptr, pData->mRootNode);
+ pScene->mRootNode = CreateNodes(pScene, nullptr, pData->mRootNode);
// extract animations
- CreateAnimations( pScene, pData);
+ CreateAnimations(pScene, pData);
// read the global meshes that were stored outside of any node
- if( !pData->mGlobalMeshes.empty() ) {
+ if (!pData->mGlobalMeshes.empty()) {
// create a root node to hold them if there isn't any, yet
- if( pScene->mRootNode == nullptr ) {
+ if (pScene->mRootNode == nullptr) {
pScene->mRootNode = new aiNode;
- pScene->mRootNode->mName.Set( "$dummy_node");
+ pScene->mRootNode->mName.Set("$dummy_node");
}
// convert all global meshes and store them in the root node.
// If there was one before, the global meshes now suddenly have its transformation matrix...
// Don't know what to do there, I don't want to insert another node under the present root node
// just to avoid this.
- CreateMeshes( pScene, pScene->mRootNode, pData->mGlobalMeshes);
+ CreateMeshes(pScene, pScene->mRootNode, pData->mGlobalMeshes);
}
if (!pScene->mRootNode) {
- throw DeadlyImportError( "No root node" );
+ throw DeadlyImportError("No root node");
}
// Convert everything to OpenGL space... it's the same operation as the conversion back, so we can reuse the step directly
MakeLeftHandedProcess convertProcess;
- convertProcess.Execute( pScene);
+ convertProcess.Execute(pScene);
FlipWindingOrderProcess flipper;
flipper.Execute(pScene);
// finally: create a dummy material if not material was imported
- if( pScene->mNumMaterials == 0) {
+ if (pScene->mNumMaterials == 0) {
pScene->mNumMaterials = 1;
// create the Material
- aiMaterial* mat = new aiMaterial;
- int shadeMode = (int) aiShadingMode_Gouraud;
- mat->AddProperty( &shadeMode, 1, AI_MATKEY_SHADING_MODEL);
+ aiMaterial *mat = new aiMaterial;
+ int shadeMode = (int)aiShadingMode_Gouraud;
+ mat->AddProperty(&shadeMode, 1, AI_MATKEY_SHADING_MODEL);
// material colours
int specExp = 1;
- aiColor3D clr = aiColor3D( 0, 0, 0);
- mat->AddProperty( &clr, 1, AI_MATKEY_COLOR_EMISSIVE);
- mat->AddProperty( &clr, 1, AI_MATKEY_COLOR_SPECULAR);
+ aiColor3D clr = aiColor3D(0, 0, 0);
+ mat->AddProperty(&clr, 1, AI_MATKEY_COLOR_EMISSIVE);
+ mat->AddProperty(&clr, 1, AI_MATKEY_COLOR_SPECULAR);
- clr = aiColor3D( 0.5f, 0.5f, 0.5f);
- mat->AddProperty( &clr, 1, AI_MATKEY_COLOR_DIFFUSE);
- mat->AddProperty( &specExp, 1, AI_MATKEY_SHININESS);
+ clr = aiColor3D(0.5f, 0.5f, 0.5f);
+ mat->AddProperty(&clr, 1, AI_MATKEY_COLOR_DIFFUSE);
+ mat->AddProperty(&specExp, 1, AI_MATKEY_SHININESS);
- pScene->mMaterials = new aiMaterial*[1];
+ pScene->mMaterials = new aiMaterial *[1];
pScene->mMaterials[0] = mat;
}
}
// ------------------------------------------------------------------------------------------------
// Recursively creates scene nodes from the imported hierarchy.
-aiNode* XFileImporter::CreateNodes( aiScene* pScene, aiNode* pParent, const XFile::Node* pNode) {
- if ( !pNode ) {
+aiNode *XFileImporter::CreateNodes(aiScene *pScene, aiNode *pParent, const XFile::Node *pNode) {
+ if (!pNode) {
return nullptr;
}
// create node
- aiNode* node = new aiNode;
+ aiNode *node = new aiNode;
node->mName.length = (ai_uint32)pNode->mName.length();
node->mParent = pParent;
- memcpy( node->mName.data, pNode->mName.c_str(), pNode->mName.length());
+ memcpy(node->mName.data, pNode->mName.c_str(), pNode->mName.length());
node->mName.data[node->mName.length] = 0;
node->mTransformation = pNode->mTrafoMatrix;
// convert meshes from the source node
- CreateMeshes( pScene, node, pNode->mMeshes);
+ CreateMeshes(pScene, node, pNode->mMeshes);
// handle children
- if( !pNode->mChildren.empty() ) {
+ if (!pNode->mChildren.empty()) {
node->mNumChildren = (unsigned int)pNode->mChildren.size();
- node->mChildren = new aiNode* [node->mNumChildren];
+ node->mChildren = new aiNode *[node->mNumChildren];
- for ( unsigned int a = 0; a < pNode->mChildren.size(); ++a ) {
- node->mChildren[ a ] = CreateNodes( pScene, node, pNode->mChildren[ a ] );
+ for (unsigned int a = 0; a < pNode->mChildren.size(); ++a) {
+ node->mChildren[a] = CreateNodes(pScene, node, pNode->mChildren[a]);
}
}
@@ -217,55 +213,55 @@ aiNode* XFileImporter::CreateNodes( aiScene* pScene, aiNode* pParent, const XFil
// ------------------------------------------------------------------------------------------------
// Creates the meshes for the given node.
-void XFileImporter::CreateMeshes( aiScene* pScene, aiNode* pNode, const std::vector& pMeshes) {
+void XFileImporter::CreateMeshes(aiScene *pScene, aiNode *pNode, const std::vector &pMeshes) {
if (pMeshes.empty()) {
return;
}
// create a mesh for each mesh-material combination in the source node
- std::vector meshes;
- for( unsigned int a = 0; a < pMeshes.size(); ++a ) {
- XFile::Mesh* sourceMesh = pMeshes[a];
- if ( nullptr == sourceMesh ) {
+ std::vector meshes;
+ for (unsigned int a = 0; a < pMeshes.size(); ++a) {
+ XFile::Mesh *sourceMesh = pMeshes[a];
+ if (nullptr == sourceMesh) {
continue;
}
// first convert its materials so that we can find them with their index afterwards
- ConvertMaterials( pScene, sourceMesh->mMaterials);
+ ConvertMaterials(pScene, sourceMesh->mMaterials);
- unsigned int numMaterials = std::max( (unsigned int)sourceMesh->mMaterials.size(), 1u);
- for( unsigned int b = 0; b < numMaterials; ++b ) {
+ unsigned int numMaterials = std::max((unsigned int)sourceMesh->mMaterials.size(), 1u);
+ for (unsigned int b = 0; b < numMaterials; ++b) {
// collect the faces belonging to this material
std::vector faces;
unsigned int numVertices = 0;
- if( !sourceMesh->mFaceMaterials.empty() ) {
+ if (!sourceMesh->mFaceMaterials.empty()) {
// if there is a per-face material defined, select the faces with the corresponding material
- for( unsigned int c = 0; c < sourceMesh->mFaceMaterials.size(); ++c ) {
- if( sourceMesh->mFaceMaterials[c] == b) {
- faces.push_back( c);
+ for (unsigned int c = 0; c < sourceMesh->mFaceMaterials.size(); ++c) {
+ if (sourceMesh->mFaceMaterials[c] == b) {
+ faces.push_back(c);
numVertices += (unsigned int)sourceMesh->mPosFaces[c].mIndices.size();
}
}
} else {
// if there is no per-face material, place everything into one mesh
- for( unsigned int c = 0; c < sourceMesh->mPosFaces.size(); ++c ) {
- faces.push_back( c);
+ for (unsigned int c = 0; c < sourceMesh->mPosFaces.size(); ++c) {
+ faces.push_back(c);
numVertices += (unsigned int)sourceMesh->mPosFaces[c].mIndices.size();
}
}
// no faces/vertices using this material? strange...
- if ( numVertices == 0 ) {
+ if (numVertices == 0) {
continue;
}
// create a submesh using this material
- aiMesh* mesh = new aiMesh;
- meshes.push_back( mesh);
+ aiMesh *mesh = new aiMesh;
+ meshes.push_back(mesh);
// find the material in the scene's material list. Either own material
// or referenced material, it should already have a valid index
- if( !sourceMesh->mFaceMaterials.empty() ) {
+ if (!sourceMesh->mFaceMaterials.empty()) {
mesh->mMaterialIndex = static_cast(sourceMesh->mMaterials[b].sceneIndex);
} else {
mesh->mMaterialIndex = 0;
@@ -282,41 +278,41 @@ void XFileImporter::CreateMeshes( aiScene* pScene, aiNode* pNode, const std::vec
mesh->mName.Set(sourceMesh->mName);
// normals?
- if ( sourceMesh->mNormals.size() > 0 ) {
- mesh->mNormals = new aiVector3D[ numVertices ];
+ if (sourceMesh->mNormals.size() > 0) {
+ mesh->mNormals = new aiVector3D[numVertices];
}
// texture coords
- for( unsigned int c = 0; c < AI_MAX_NUMBER_OF_TEXTURECOORDS; ++c ) {
- if ( !sourceMesh->mTexCoords[ c ].empty() ) {
- mesh->mTextureCoords[ c ] = new aiVector3D[ numVertices ];
+ for (unsigned int c = 0; c < AI_MAX_NUMBER_OF_TEXTURECOORDS; ++c) {
+ if (!sourceMesh->mTexCoords[c].empty()) {
+ mesh->mTextureCoords[c] = new aiVector3D[numVertices];
}
}
// vertex colors
- for( unsigned int c = 0; c < AI_MAX_NUMBER_OF_COLOR_SETS; ++c ) {
- if ( !sourceMesh->mColors[ c ].empty() ) {
- mesh->mColors[ c ] = new aiColor4D[ numVertices ];
+ for (unsigned int c = 0; c < AI_MAX_NUMBER_OF_COLOR_SETS; ++c) {
+ if (!sourceMesh->mColors[c].empty()) {
+ mesh->mColors[c] = new aiColor4D[numVertices];
}
}
// now collect the vertex data of all data streams present in the imported mesh
- unsigned int newIndex( 0 );
+ unsigned int newIndex(0);
std::vector orgPoints; // from which original point each new vertex stems
- orgPoints.resize( numVertices, 0);
+ orgPoints.resize(numVertices, 0);
- for( unsigned int c = 0; c < faces.size(); ++c ) {
+ for (unsigned int c = 0; c < faces.size(); ++c) {
unsigned int f = faces[c]; // index of the source face
- const XFile::Face& pf = sourceMesh->mPosFaces[f]; // position source face
+ const XFile::Face &pf = sourceMesh->mPosFaces[f]; // position source face
// create face. either triangle or triangle fan depending on the index count
- aiFace& df = mesh->mFaces[c]; // destination face
+ aiFace &df = mesh->mFaces[c]; // destination face
df.mNumIndices = (unsigned int)pf.mIndices.size();
- df.mIndices = new unsigned int[ df.mNumIndices];
+ df.mIndices = new unsigned int[df.mNumIndices];
// collect vertex data for indices of this face
- for( unsigned int d = 0; d < df.mNumIndices; ++d ) {
- df.mIndices[ d ] = newIndex;
- const unsigned int newIdx( pf.mIndices[ d ] );
- if ( newIdx > sourceMesh->mPositions.size() ) {
+ for (unsigned int d = 0; d < df.mNumIndices; ++d) {
+ df.mIndices[d] = newIndex;
+ const unsigned int newIdx = pf.mIndices[d];
+ if (newIdx >= sourceMesh->mPositions.size()) {
continue;
}
@@ -325,24 +321,26 @@ void XFileImporter::CreateMeshes( aiScene* pScene, aiNode* pNode, const std::vec
// Position
mesh->mVertices[newIndex] = sourceMesh->mPositions[pf.mIndices[d]];
// Normal, if present
- if ( mesh->HasNormals() ) {
- if ( sourceMesh->mNormFaces[ f ].mIndices.size() > d ) {
- const size_t idx( sourceMesh->mNormFaces[ f ].mIndices[ d ] );
- mesh->mNormals[ newIndex ] = sourceMesh->mNormals[ idx ];
+ if (mesh->HasNormals()) {
+ if (sourceMesh->mNormFaces[f].mIndices.size() > d) {
+ const size_t idx(sourceMesh->mNormFaces[f].mIndices[d]);
+ if (idx < sourceMesh->mNormals.size()) {
+ mesh->mNormals[newIndex] = sourceMesh->mNormals[idx];
+ }
}
}
// texture coord sets
- for( unsigned int e = 0; e < AI_MAX_NUMBER_OF_TEXTURECOORDS; ++e ) {
- if( mesh->HasTextureCoords( e)) {
+ for (unsigned int e = 0; e < AI_MAX_NUMBER_OF_TEXTURECOORDS; ++e) {
+ if (mesh->HasTextureCoords(e)) {
aiVector2D tex = sourceMesh->mTexCoords[e][pf.mIndices[d]];
- mesh->mTextureCoords[e][newIndex] = aiVector3D( tex.x, 1.0f - tex.y, 0.0f);
+ mesh->mTextureCoords[e][newIndex] = aiVector3D(tex.x, 1.0f - tex.y, 0.0f);
}
}
// vertex color sets
- for ( unsigned int e = 0; e < AI_MAX_NUMBER_OF_COLOR_SETS; ++e ) {
- if ( mesh->HasVertexColors( e ) ) {
- mesh->mColors[ e ][ newIndex ] = sourceMesh->mColors[ e ][ pf.mIndices[ d ] ];
+ for (unsigned int e = 0; e < AI_MAX_NUMBER_OF_COLOR_SETS; ++e) {
+ if (mesh->HasVertexColors(e)) {
+ mesh->mColors[e][newIndex] = sourceMesh->mColors[e][pf.mIndices[d]];
}
}
@@ -351,63 +349,66 @@ void XFileImporter::CreateMeshes( aiScene* pScene, aiNode* pNode, const std::vec
}
// there should be as much new vertices as we calculated before
- ai_assert( newIndex == numVertices);
+ ai_assert(newIndex == numVertices);
// convert all bones of the source mesh which influence vertices in this newly created mesh
- const std::vector& bones = sourceMesh->mBones;
- std::vector