summaryrefslogtreecommitdiffstats
path: root/code/PostProcessing/OptimizeGraph.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'code/PostProcessing/OptimizeGraph.cpp')
-rw-r--r--code/PostProcessing/OptimizeGraph.cpp32
1 files changed, 21 insertions, 11 deletions
diff --git a/code/PostProcessing/OptimizeGraph.cpp b/code/PostProcessing/OptimizeGraph.cpp
index 709f465e2..43bd7a3ee 100644
--- a/code/PostProcessing/OptimizeGraph.cpp
+++ b/code/PostProcessing/OptimizeGraph.cpp
@@ -47,6 +47,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "OptimizeGraph.h"
#include "ProcessHelper.h"
+#include "ConvertToLHProcess.h"
#include <assimp/Exceptional.h>
#include <assimp/SceneCombiner.h>
#include <stdio.h>
@@ -135,7 +136,7 @@ void OptimizeGraphProcess::CollectNewChildren(aiNode *nd, std::list<aiNode *> &n
nodes.push_back(nd);
// Now check for possible optimizations in our list of child nodes. join as many as possible
- aiNode *join_master = NULL;
+ aiNode *join_master = nullptr;
aiMatrix4x4 inv;
const LockedSetType::const_iterator end = locked.end();
@@ -172,7 +173,7 @@ void OptimizeGraphProcess::CollectNewChildren(aiNode *nd, std::list<aiNode *> &n
join_master->mName.length = ::ai_snprintf(join_master->mName.data, MAXLEN, "$MergedNode_%i", count_merged++);
unsigned int out_meshes = 0;
- for (std::list<aiNode *>::iterator it = join.begin(); it != join.end(); ++it) {
+ for (std::list<aiNode *>::const_iterator it = join.cbegin(); it != join.cend(); ++it) {
out_meshes += (*it)->mNumMeshes;
}
@@ -183,17 +184,26 @@ void OptimizeGraphProcess::CollectNewChildren(aiNode *nd, std::list<aiNode *> &n
*tmp++ = join_master->mMeshes[n];
}
- for (std::list<aiNode *>::iterator it = join.begin(); it != join.end(); ++it) {
- for (unsigned int n = 0; n < (*it)->mNumMeshes; ++n) {
+ for (const aiNode *join_node : join) {
+ for (unsigned int n = 0; n < join_node->mNumMeshes; ++n) {
- *tmp = (*it)->mMeshes[n];
+ *tmp = join_node->mMeshes[n];
aiMesh *mesh = mScene->mMeshes[*tmp++];
+ // Assume the transformation is affine
// manually move the mesh into the right coordinate system
- const aiMatrix3x3 IT = aiMatrix3x3((*it)->mTransformation).Inverse().Transpose();
+
+ // Check for odd negative scale (mirror)
+ if (join_node->mTransformation.Determinant() < 0) {
+ // Reverse the mesh face winding order
+ FlipWindingOrderProcess::ProcessMesh(mesh);
+ }
+
+ // Update positions, normals and tangents
+ const aiMatrix3x3 IT = aiMatrix3x3(join_node->mTransformation).Inverse().Transpose();
for (unsigned int a = 0; a < mesh->mNumVertices; ++a) {
- mesh->mVertices[a] *= (*it)->mTransformation;
+ mesh->mVertices[a] *= join_node->mTransformation;
if (mesh->HasNormals())
mesh->mNormals[a] *= IT;
@@ -204,7 +214,7 @@ void OptimizeGraphProcess::CollectNewChildren(aiNode *nd, std::list<aiNode *> &n
}
}
}
- delete *it; // bye, node
+ delete join_node; // bye, node
}
delete[] join_master->mMeshes;
join_master->mMeshes = meshes;
@@ -304,7 +314,7 @@ void OptimizeGraphProcess::Execute(aiScene *pScene) {
ai_assert(nodes.size() == 1);
if (dummy_root->mNumChildren == 0) {
- pScene->mRootNode = NULL;
+ pScene->mRootNode = nullptr;
throw DeadlyImportError("After optimizing the scene graph, no data remains");
}
@@ -318,11 +328,11 @@ void OptimizeGraphProcess::Execute(aiScene *pScene) {
// Remove the dummy root node again.
pScene->mRootNode = dummy_root->mChildren[0];
- dummy_root->mChildren[0] = NULL;
+ dummy_root->mChildren[0] = nullptr;
delete dummy_root;
}
- pScene->mRootNode->mParent = NULL;
+ pScene->mRootNode->mParent = nullptr;
if (!DefaultLogger::isNullLogger()) {
if (nodes_in != nodes_out) {
ASSIMP_LOG_INFO_F("OptimizeGraphProcess finished; Input nodes: ", nodes_in, ", Output nodes: ", nodes_out);