Kaynağa Gözat

Changed "KillNormals"-Step to "RemoveVertexComponentXYZ". See ML for more details on this.

git-svn-id: https://assimp.svn.sourceforge.net/svnroot/assimp/trunk@168 67173fc5-114c-0410-ac8e-9d2fd5bffc1f
aramis_acg 17 yıl önce
ebeveyn
işleme
9eee308c4a

+ 3 - 3
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());

+ 0 - 94
code/KillNormalsProcess.cpp

@@ -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;
-}

+ 169 - 0
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;
+}

+ 16 - 5
code/KillNormalsProcess.h → 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

+ 1 - 1
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 \

+ 36 - 0
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

+ 14 - 4
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

+ 0 - 0
include/aiSceneEntities.h


+ 12 - 8
workspaces/vc8/assimp.vcproj

@@ -637,6 +637,10 @@
 				RelativePath="..\..\include\aiScene.h"
 				>
 			</File>
+			<File
+				RelativePath="..\..\include\aiSceneEntities.h"
+				>
+			</File>
 			<File
 				RelativePath="..\..\include\aiTexture.h"
 				>
@@ -1292,14 +1296,6 @@
 					RelativePath="..\..\code\JoinVerticesProcess.h"
 					>
 				</File>
-				<File
-					RelativePath="..\..\code\KillNormalsProcess.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\code\KillNormalsProcess.h"
-					>
-				</File>
 				<File
 					RelativePath="..\..\code\LimitBoneWeightsProcess.cpp"
 					>
@@ -1332,6 +1328,14 @@
 					RelativePath="..\..\code\RemoveRedundantMaterials.h"
 					>
 				</File>
+				<File
+					RelativePath="..\..\code\RemoveVCProcess.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\..\code\RemoveVCProcess.h"
+					>
+				</File>
 				<File
 					RelativePath="..\..\code\SortByPTypeProcess.cpp"
 					>