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
pull/1/head
aramis_acg 2008-10-02 15:22:38 +00:00
parent 927cd1cd46
commit 9eee308c4a
9 changed files with 251 additions and 115 deletions

View File

@ -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());

View File

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

View File

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

View File

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

View File

@ -21,7 +21,7 @@ SOURCES = 3DSConverter.cpp \
Importer.cpp \
ImproveCacheLocality.cpp \
JoinVerticesProcess.cpp \
KillNormalsProcess.cpp \
RemoveVCProcess.cpp \
LimitBoneWeightsProcess.cpp \
LWOBLoader.cpp \
LWOLoader.cpp \

View File

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

View File

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

View File

View File

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