diff --git a/code/Importer.cpp b/code/Importer.cpp index b84c5984b..d18d7652b 100644 --- a/code/Importer.cpp +++ b/code/Importer.cpp @@ -140,7 +140,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # include "GenVertexNormalsProcess.h" #endif #if (!defined AI_BUILD_NO_KILLNORMALS_PROCESS) -# include "KillNormalsProcess.h" +# include "RemoveVCProcess.h" #endif #if (!defined AI_BUILD_NO_SPLITLARGEMESHES_PROCESS) # include "SplitLargeMeshes.h" @@ -283,8 +283,8 @@ Importer::Importer() : #if (!defined AI_BUILD_NO_SPLITLARGEMESHES_PROCESS) mPostProcessingSteps.push_back( new SplitLargeMeshesProcess_Triangle()); #endif -#if (!defined AI_BUILD_NO_KILLNORMALS_PROCESS) - mPostProcessingSteps.push_back( new KillNormalsProcess()); +#if (!defined AI_BUILD_NO_REMOVEVC_PROCESS) + mPostProcessingSteps.push_back( new RemoveVCProcess()); #endif #if (!defined AI_BUILD_NO_GENFACENORMALS_PROCESS) mPostProcessingSteps.push_back( new GenFaceNormalsProcess()); diff --git a/code/KillNormalsProcess.cpp b/code/KillNormalsProcess.cpp deleted file mode 100644 index e5df21939..000000000 --- a/code/KillNormalsProcess.cpp +++ /dev/null @@ -1,94 +0,0 @@ -/* ---------------------------------------------------------------------------- -Open Asset Import Library (ASSIMP) ---------------------------------------------------------------------------- - -Copyright (c) 2006-2008, ASSIMP Development 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 Development 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 tokill mesh normals -*/ -#include "KillNormalsProcess.h" -#include "../include/DefaultLogger.h" -#include "../include/aiPostProcess.h" -#include "../include/aiMesh.h" -#include "../include/aiScene.h" - -using namespace Assimp; - -// Constructor to be privately used by Importer -KillNormalsProcess::KillNormalsProcess() -{ -} - -// Destructor, private as well -KillNormalsProcess::~KillNormalsProcess() -{ - // nothing to do here -} - -// ------------------------------------------------------------------- -// Returns whether the processing step is present in the given flag field. -bool KillNormalsProcess::IsActive( unsigned int pFlags) const -{ - return (pFlags & aiProcess_KillNormals) != 0; -} - -// ------------------------------------------------------------------- -// Executes the post processing step on the given imported data. -void KillNormalsProcess::Execute( aiScene* pScene) -{ - DefaultLogger::get()->debug("KillNormalsProcess begin"); - - bool bHas = false; - for( unsigned int a = 0; a < pScene->mNumMeshes; a++) - { - if( this->KillMeshNormals( pScene->mMeshes[a])) - bHas = true; - } - if (bHas)DefaultLogger::get()->info("KillNormalsProcess finished. Found normals to kill"); - else DefaultLogger::get()->debug("KillNormalsProcess finished. There was nothing to do."); - -} - -// ------------------------------------------------------------------- -// Executes the post processing step on the given imported data. -bool KillNormalsProcess::KillMeshNormals(aiMesh* pMesh) -{ - if (!pMesh->mNormals)return false; - delete[] pMesh->mNormals; - pMesh->mNormals = NULL; - return true; -} diff --git a/code/RemoveVCProcess.cpp b/code/RemoveVCProcess.cpp new file mode 100644 index 000000000..105fa7326 --- /dev/null +++ b/code/RemoveVCProcess.cpp @@ -0,0 +1,169 @@ +/* +--------------------------------------------------------------------------- +Open Asset Import Library (ASSIMP) +--------------------------------------------------------------------------- + +Copyright (c) 2006-2008, ASSIMP Development 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 Development 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 remove + * any parts of the mesh structure from the imported data. +*/ +#include "RemoveVCProcess.h" +#include "../include/DefaultLogger.h" +#include "../include/aiPostProcess.h" +#include "../include/aiScene.h" +#include "../include/aiConfig.h" + +using namespace Assimp; + +// ------------------------------------------------------------------------------------------------ +// Constructor to be privately used by Importer +RemoveVCProcess::RemoveVCProcess() +{ +} + +// ------------------------------------------------------------------------------------------------ +// Destructor, private as well +RemoveVCProcess::~RemoveVCProcess() +{ + // nothing to do here +} + +// ------------------------------------------------------------------------------------------------ +// Returns whether the processing step is present in the given flag field. +bool RemoveVCProcess::IsActive( unsigned int pFlags) const +{ + return (pFlags & aiProcess_RemVertexComponentXYZ) != 0; +} + +// ------------------------------------------------------------------------------------------------ +// Executes the post processing step on the given imported data. +void RemoveVCProcess::Execute( aiScene* pScene) +{ + DefaultLogger::get()->debug("RemoveVCProcess begin"); + + bool bHas = false; + for( unsigned int a = 0; a < pScene->mNumMeshes; a++) + { + if( this->ProcessMesh( pScene->mMeshes[a])) + bHas = true; + } + if (bHas)DefaultLogger::get()->info("RemoveVCProcess finished. The specified vertex components have been removed"); + else DefaultLogger::get()->debug("RemoveVCProcess finished. There was nothing to do .."); + +} + +// ------------------------------------------------------------------------------------------------ +// Setup configuration properties for the step +void RemoveVCProcess::SetupProperties(const Importer* pImp) +{ + configDeleteFlags = pImp->GetPropertyInteger(AI_CONFIG_PP_RVC_FLAGS,0x0); + if (!configDeleteFlags) + { + DefaultLogger::get()->warn("RemoveVCProcess: AI_CONFIG_PP_RVC_FLAGS is zero, no streams selected"); + } +} + +// ------------------------------------------------------------------------------------------------ +// Executes the post processing step on the given imported data. +bool RemoveVCProcess::ProcessMesh(aiMesh* pMesh) +{ + + // handle normals + if (configDeleteFlags & aiVertexComponent_NORMALS && pMesh->mNormals) + { + delete[] pMesh->mNormals; + pMesh->mNormals = NULL; + } + + // handle tangents and bitangents + if (configDeleteFlags & aiVertexComponent_TANGENTS_AND_BITANGENTS && pMesh->mTangents) + { + delete[] pMesh->mTangents; + pMesh->mTangents = NULL; + + delete[] pMesh->mBitangents; + pMesh->mBitangents = NULL; + } + + // handle texture coordinates + register bool b = (0 != (configDeleteFlags & aiVertexComponent_TEXCOORDS)); + for (unsigned int i = 0; i < AI_MAX_NUMBER_OF_TEXTURECOORDS; ++i) + { + if (!pMesh->mTextureCoords[i])break; + if (configDeleteFlags & aiVertexComponent_TEXCOORDSn(i) || b) + { + delete pMesh->mTextureCoords[i]; + pMesh->mTextureCoords[i] = NULL; + + if (!b) + { + // collapse the rest of the array + unsigned int a; + for (a = i+1; a < AI_MAX_NUMBER_OF_TEXTURECOORDS;++a) + { + pMesh->mTextureCoords[a-1] = pMesh->mTextureCoords[a]; + } + pMesh->mTextureCoords[AI_MAX_NUMBER_OF_TEXTURECOORDS-1] = NULL; + } + } + } + + // handle vertex colors + b = (0 != (configDeleteFlags & aiVertexComponent_COLORS)); + for (unsigned int i = 0; i < AI_MAX_NUMBER_OF_COLOR_SETS; ++i) + { + if (!pMesh->mColors[i])break; + if (configDeleteFlags & aiVertexComponent_COLORSn(i) || b) + { + delete pMesh->mColors[i]; + pMesh->mColors[i] = NULL; + + if (!b) + { + // collapse the rest of the array + unsigned int a; + for (a = i+1; a < AI_MAX_NUMBER_OF_COLOR_SETS;++a) + { + pMesh->mColors[a-1] = pMesh->mColors[a]; + } + pMesh->mColors[AI_MAX_NUMBER_OF_COLOR_SETS-1] = NULL; + } + } + } + + return true; +} diff --git a/code/KillNormalsProcess.h b/code/RemoveVCProcess.h similarity index 82% rename from code/KillNormalsProcess.h rename to code/RemoveVCProcess.h index ab6710b22..94b1b4ccf 100644 --- a/code/KillNormalsProcess.h +++ b/code/RemoveVCProcess.h @@ -48,18 +48,18 @@ namespace Assimp { // --------------------------------------------------------------------------- -/** KillNormalsProcess: Class to kill all normals loaded +/** RemoveVCProcess: Class to kill all normals loaded */ -class ASSIMP_API KillNormalsProcess : public BaseProcess +class ASSIMP_API RemoveVCProcess : public BaseProcess { friend class Importer; protected: /** Constructor to be privately used by Importer */ - KillNormalsProcess(); + RemoveVCProcess(); /** Destructor, private as well */ - ~KillNormalsProcess(); + ~RemoveVCProcess(); public: // ------------------------------------------------------------------- @@ -78,8 +78,19 @@ public: void Execute( aiScene* pScene); + // ------------------------------------------------------------------- + /** Called prior to ExecuteOnScene(). + * The function is a request to the process to update its configuration + * basing on the Importer's configuration property list. + */ + virtual void SetupProperties(const Importer* pImp); + + private: - bool KillMeshNormals (aiMesh* pcMesh); + + bool ProcessMesh (aiMesh* pcMesh); + + unsigned int configDeleteFlags; }; } // end of namespace Assimp diff --git a/code/makefile b/code/makefile index a1a13589d..2e2a5e787 100644 --- a/code/makefile +++ b/code/makefile @@ -21,7 +21,7 @@ SOURCES = 3DSConverter.cpp \ Importer.cpp \ ImproveCacheLocality.cpp \ JoinVerticesProcess.cpp \ - KillNormalsProcess.cpp \ + RemoveVCProcess.cpp \ LimitBoneWeightsProcess.cpp \ LWOBLoader.cpp \ LWOLoader.cpp \ diff --git a/include/aiConfig.h b/include/aiConfig.h index e8dae7b5c..61f738766 100644 --- a/include/aiConfig.h +++ b/include/aiConfig.h @@ -182,4 +182,40 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #define AI_CONFIG_IMPORT_MDL_COLORMAP "imp.mdl.color_map" + + + +// --------------------------------------------------------------------------- +enum aiVertexComponent +{ + //! Normal vectors + aiVertexComponent_NORMALS = 0x2u, + + //! Tangents and bitangents go always together ... + aiVertexComponent_TANGENTS_AND_BITANGENTS = 0x4u, + + //! ALL color sets + //! Use aiVertexComponent_COLORn(N) to specifiy the N'th set + aiVertexComponent_COLORS = 0x8, + + //! ALL texture UV sets + //! aiVertexComponent_TEXCOORDn(N) to specifiy the N'th set + aiVertexComponent_TEXCOORDS = 0x10, +}; + +#define aiVertexComponent_COLORSn(n) (1u << (n+10u)) +#define aiVertexComponent_TEXCOORDSn(n) (1u << (n+20u)) + + +// --------------------------------------------------------------------------- +/** \brief Input parameter to the #aiProcess_RemVertexComponentXYZ step: + * Specifies the vertex components to be removed. + * + * See the documentation to this step for further details. The property + * is expected to be an integer, a bitwise combination of the + * #aiVertexComponent flags defined above in this header. The default + * value is 0. + */ +#define AI_CONFIG_PP_RVC_FLAGS "pp.rvc.flags" + #endif // !! AI_CONFIG_H_INC diff --git a/include/aiPostProcess.h b/include/aiPostProcess.h index f269ba31e..a9837cdd6 100644 --- a/include/aiPostProcess.h +++ b/include/aiPostProcess.h @@ -80,11 +80,21 @@ enum aiPostProcessSteps */ aiProcess_Triangulate = 8, - /** Omits all normals found in the file. This can be used together - * with either the aiProcess_GenNormals or the aiProcess_GenSmoothNormals - * flag to force the recomputation of the normals. + /** Removes some parts of the mesh data structure (vertex components). + * + * The vertex components to be removed are specified in a separate + * configuration option, AI_CONFIG_PP_RVC_FLAGS. This is quite useful + * if you don't need all vertex components. Especially vertex colors + * are rarely used today ... . Calling this step to exclude unrequired + * vertex components from the pipeline as early as possible results + * in an increased performance and a more optimized output data structure. + * Note that vertex positions can't be removed. This step is also useful + * if you want to force Assimp to recompute normals or tangents. The + * corresponding steps don't recompute them if they're already there ( + * loaded from the source asset). By using this step you can make sure + * they are NOT there. */ - aiProcess_KillNormals = 0x10, + aiProcess_RemVertexComponentXYZ = 0x10, /** Generates normals for all faces of all meshes. The normals are shared * between the three vertices of a face. This is ignored diff --git a/include/aiSceneEntities.h b/include/aiSceneEntities.h new file mode 100644 index 000000000..e69de29bb diff --git a/workspaces/vc8/assimp.vcproj b/workspaces/vc8/assimp.vcproj index 31555549c..1bf59a99c 100644 --- a/workspaces/vc8/assimp.vcproj +++ b/workspaces/vc8/assimp.vcproj @@ -637,6 +637,10 @@ RelativePath="..\..\include\aiScene.h" > + + @@ -1292,14 +1296,6 @@ RelativePath="..\..\code\JoinVerticesProcess.h" > - - - - @@ -1332,6 +1328,14 @@ RelativePath="..\..\code\RemoveRedundantMaterials.h" > + + + +