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"
>
+
+
+
+