From 05b5930b292041720a277c6c0184eb7401de7218 Mon Sep 17 00:00:00 2001 From: ihmc3jn09hk Date: Tue, 16 Oct 2018 00:25:44 +0800 Subject: [PATCH 1/4] Amended the "Key" for the database ReadField Amended the key "flags" -> "flag". The field key("flags") was not matching the key("flag") in the BlendDNA. It was annoying during debug mode since the exception prompt for the mismatching and. --- code/BlenderScene.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/BlenderScene.cpp b/code/BlenderScene.cpp index ad2d6fbba..4fc353b15 100644 --- a/code/BlenderScene.cpp +++ b/code/BlenderScene.cpp @@ -203,7 +203,7 @@ template <> void Structure :: Convert ( int temp = 0; ReadField(temp,"type",db); dest.type = static_cast(temp); - ReadField(dest.flags,"flags",db); + ReadField(dest.flags,"flag",db); ReadField(dest.colormodel,"colormodel",db); ReadField(dest.totex,"totex",db); ReadField(dest.r,"r",db); From 95c0deaaff0954f2f9b290a1b4602d9c62ad8c18 Mon Sep 17 00:00:00 2001 From: d Date: Mon, 29 Oct 2018 16:23:11 +0100 Subject: [PATCH 2/4] added DropFaceNormals process --- code/DropFaceNormalsProcess.cpp | 108 ++++++++++++++++++++++++++++++++ code/DropFaceNormalsProcess.h | 86 +++++++++++++++++++++++++ include/assimp/postprocess.h | 12 ++++ tools/assimp_cmd/Main.cpp | 3 + 4 files changed, 209 insertions(+) create mode 100644 code/DropFaceNormalsProcess.cpp create mode 100644 code/DropFaceNormalsProcess.h diff --git a/code/DropFaceNormalsProcess.cpp b/code/DropFaceNormalsProcess.cpp new file mode 100644 index 000000000..3b1393505 --- /dev/null +++ b/code/DropFaceNormalsProcess.cpp @@ -0,0 +1,108 @@ +/* +--------------------------------------------------------------------------- +Open Asset Import Library (assimp) +--------------------------------------------------------------------------- + +Copyright (c) 2006-2018, assimp team + + + +All rights reserved. + +Redistribution and use of this software in source and binary forms, +with or without modification, are permitted provided that the following +conditions are met: + +* Redistributions of source code must retain the above + copyright notice, this list of conditions and the + following disclaimer. + +* Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the + following disclaimer in the documentation and/or other + materials provided with the distribution. + +* Neither the name of the assimp team, nor the names of its + contributors may be used to endorse or promote products + derived from this software without specific prior + written permission of the assimp team. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +--------------------------------------------------------------------------- +*/ + +/** @file Implementation of the post processing step to drop face +* normals for all imported faces. +*/ + + +#include "DropFaceNormalsProcess.h" +#include +#include +#include +#include + +using namespace Assimp; + +// ------------------------------------------------------------------------------------------------ +// Constructor to be privately used by Importer +DropFaceNormalsProcess::DropFaceNormalsProcess() +{ + // nothing to do here +} + +// ------------------------------------------------------------------------------------------------ +// Destructor, private as well +DropFaceNormalsProcess::~DropFaceNormalsProcess() +{ + // nothing to do here +} + +// ------------------------------------------------------------------------------------------------ +// Returns whether the processing step is present in the given flag field. +bool DropFaceNormalsProcess::IsActive( unsigned int pFlags) const { + return (pFlags & aiProcess_DropNormals) != 0; +} + +// ------------------------------------------------------------------------------------------------ +// Executes the post processing step on the given imported data. +void DropFaceNormalsProcess::Execute( aiScene* pScene) { + ASSIMP_LOG_DEBUG("DropFaceNormalsProcess begin"); + + if (pScene->mFlags & AI_SCENE_FLAGS_NON_VERBOSE_FORMAT) { + throw DeadlyImportError("Post-processing order mismatch: expecting pseudo-indexed (\"verbose\") vertices here"); + } + + bool bHas = false; + for( unsigned int a = 0; a < pScene->mNumMeshes; a++) { + bHas |= this->DropMeshFaceNormals( pScene->mMeshes[a]); + } + if (bHas) { + ASSIMP_LOG_INFO("DropFaceNormalsProcess finished. " + "Face normals have been removed"); + } else { + ASSIMP_LOG_DEBUG("DropFaceNormalsProcess finished. " + "No normals were present"); + } +} + +// ------------------------------------------------------------------------------------------------ +// Executes the post processing step on the given imported data. +bool DropFaceNormalsProcess::GenMeshFaceNormals (aiMesh* pMesh) { + if (NULL == pMesh->mNormals) { + return false; + } + + delete[] pMesh->mNormals; + return true; +} diff --git a/code/DropFaceNormalsProcess.h b/code/DropFaceNormalsProcess.h new file mode 100644 index 000000000..6dbfe0397 --- /dev/null +++ b/code/DropFaceNormalsProcess.h @@ -0,0 +1,86 @@ +/* +Open Asset Import Library (assimp) +---------------------------------------------------------------------- + +Copyright (c) 2006-2018, assimp team + + +All rights reserved. + +Redistribution and use of this software in source and binary forms, +with or without modification, are permitted provided that the +following conditions are met: + +* Redistributions of source code must retain the above + copyright notice, this list of conditions and the + following disclaimer. + +* Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the + following disclaimer in the documentation and/or other + materials provided with the distribution. + +* Neither the name of the assimp team, nor the names of its + contributors may be used to endorse or promote products + derived from this software without specific prior + written permission of the assimp team. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +---------------------------------------------------------------------- +*/ + +/** @file Defines a post processing step to compute face normals for all loaded faces*/ +#ifndef AI_DROPFACENORMALPROCESS_H_INC +#define AI_DROPFACENORMALPROCESS_H_INC + +#include "BaseProcess.h" +#include + +namespace Assimp +{ + +// --------------------------------------------------------------------------- +/** The DropFaceNormalsProcess computes face normals for all faces of all meshes +*/ +class ASSIMP_API_WINONLY DropFaceNormalsProcess : public BaseProcess +{ +public: + + DropFaceNormalsProcess(); + ~DropFaceNormalsProcess(); + +public: + // ------------------------------------------------------------------- + /** Returns whether the processing step is present in the given flag field. + * @param pFlags The processing flags the importer was called with. A bitwise + * combination of #aiPostProcessSteps. + * @return true if the process is present in this flag fields, false if not. + */ + bool IsActive( unsigned int pFlags) const; + + // ------------------------------------------------------------------- + /** Executes the post processing step on the given imported data. + * At the moment a process is not supposed to fail. + * @param pScene The imported data to work at. + */ + void Execute( aiScene* pScene); + + +private: + bool DropMeshFaceNormals(aiMesh* pcMesh); +}; + +} // end of namespace Assimp + +#endif // !!AI_DROPFACENORMALPROCESS_H_INC diff --git a/include/assimp/postprocess.h b/include/assimp/postprocess.h index 1cb9c72f8..a0ae0a1bc 100644 --- a/include/assimp/postprocess.h +++ b/include/assimp/postprocess.h @@ -562,6 +562,18 @@ enum aiPostProcessSteps aiProcess_ForceGenNormals = 0x20000000, + + // ------------------------------------------------------------------------- + /**
Drops normals for all faces of all meshes. + * + * This is ignored if no normals are present. + * Face normals are shared between all points of a single face, + * so a single point can have multiple normals, which + * forces the library to duplicate vertices in some cases. + * #aiProcess_JoinIdenticalVertices is *senseless* then. + * This process gives sense back to aiProcess_JoinIdenticalVertices + */ + aiProcess_DropNormals = 0x40000000, }; diff --git a/tools/assimp_cmd/Main.cpp b/tools/assimp_cmd/Main.cpp index 8a39540d1..2a18bf33a 100644 --- a/tools/assimp_cmd/Main.cpp +++ b/tools/assimp_cmd/Main.cpp @@ -397,6 +397,9 @@ int ProcessStandardArguments( else if (! strcmp( param, "-gsn") || ! strcmp( param, "--gen-smooth-normals")) { fill.ppFlags |= aiProcess_GenSmoothNormals; } + else if (! strcmp( param, "-dn") || ! strcmp( param, "--drop-normals")) { + fill.ppFlags |= aiProcess_DropNormals; + } else if (! strcmp( param, "-gn") || ! strcmp( param, "--gen-normals")) { fill.ppFlags |= aiProcess_GenNormals; } From 6d1dee606a70e8304223d4c67540cbc20651b040 Mon Sep 17 00:00:00 2001 From: d Date: Mon, 29 Oct 2018 16:26:50 +0100 Subject: [PATCH 3/4] integrated DropFaceNormals process (cmake, poststepregistry) --- code/CMakeLists.txt | 2 ++ code/PostStepRegistry.cpp | 3 +++ include/assimp/defs.h | 1 + 3 files changed, 6 insertions(+) diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index 780b28a71..7ad49ad33 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -557,6 +557,8 @@ SET( PostProcessing_SRCS FindInvalidDataProcess.h FixNormalsStep.cpp FixNormalsStep.h + DropFaceNormalsProcess.cpp + DropFaceNormalsProcess.h GenFaceNormalsProcess.cpp GenFaceNormalsProcess.h GenVertexNormalsProcess.cpp diff --git a/code/PostStepRegistry.cpp b/code/PostStepRegistry.cpp index 6c25b9361..a04092d3a 100644 --- a/code/PostStepRegistry.cpp +++ b/code/PostStepRegistry.cpp @@ -62,6 +62,9 @@ corresponding preprocessor flag to selectively disable steps. #ifndef ASSIMP_BUILD_NO_TRIANGULATE_PROCESS # include "TriangulateProcess.h" #endif +#ifndef ASSIMP_BUILD_NO_DROPFACENORMALS_PROCESS +# include "DropFaceNormalsProcess.h" +#endif #ifndef ASSIMP_BUILD_NO_GENFACENORMALS_PROCESS # include "GenFaceNormalsProcess.h" #endif diff --git a/include/assimp/defs.h b/include/assimp/defs.h index e2ce6953d..e651a1f7b 100644 --- a/include/assimp/defs.h +++ b/include/assimp/defs.h @@ -97,6 +97,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * CALCTANGENTS * JOINVERTICES * TRIANGULATE + * DROPFACENORMALS * GENFACENORMALS * GENVERTEXNORMALS * REMOVEVC From c46504073874c20bcf83b6ab62fdf3ccd0ca7958 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Mon, 29 Oct 2018 16:58:02 +0100 Subject: [PATCH 4/4] Update DropFaceNormalsProcess.cpp Fix typo. --- code/DropFaceNormalsProcess.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/DropFaceNormalsProcess.cpp b/code/DropFaceNormalsProcess.cpp index 3b1393505..3800fee0b 100644 --- a/code/DropFaceNormalsProcess.cpp +++ b/code/DropFaceNormalsProcess.cpp @@ -98,7 +98,7 @@ void DropFaceNormalsProcess::Execute( aiScene* pScene) { // ------------------------------------------------------------------------------------------------ // Executes the post processing step on the given imported data. -bool DropFaceNormalsProcess::GenMeshFaceNormals (aiMesh* pMesh) { +bool DropFaceNormalsProcess::DropMeshFaceNormals (aiMesh* pMesh) { if (NULL == pMesh->mNormals) { return false; }