FEATURE: Adding format auto-detection to OBJ loader basing on some distinct keywords.

FEATURE: PretransformVertices step is now optionally able to normalize meshes (-1...1 range).

git-svn-id: https://assimp.svn.sourceforge.net/svnroot/assimp/trunk@488 67173fc5-114c-0410-ac8e-9d2fd5bffc1f
pull/1/head
aramis_acg 2009-09-30 17:55:21 +00:00
parent 8b19981ce9
commit cc1ff304df
5 changed files with 63 additions and 16 deletions

View File

@ -77,10 +77,17 @@ ObjFileImporter::~ObjFileImporter()
// ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------
// Returns true, fi file is an obj file // Returns true, fi file is an obj file
bool ObjFileImporter::CanRead( const std::string& pFile, IOSystem* /* pIOHandler */, bool /*checkSig */) const bool ObjFileImporter::CanRead( const std::string& pFile, IOSystem* pIOHandler , bool checkSig ) const
{ {
// fixme: auto detection if(!checkSig) //Check File Extension
return SimpleExtensionCheck( pFile,"obj" ); {
return SimpleExtensionCheck(pFile,"obj");
}
else //Check file Header
{
const char* tokens[] = {"mtllib","usemtl","vt ","vn ","o "};
return BaseImporter::SearchFileHeaderForToken(pIOHandler, pFile, tokens, 5);
}
} }
// ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------

View File

@ -79,8 +79,9 @@ bool PretransformVertices::IsActive( unsigned int pFlags) const
// Setup import configuration // Setup import configuration
void PretransformVertices::SetupProperties(const Importer* pImp) void PretransformVertices::SetupProperties(const Importer* pImp)
{ {
// Get the current value of AI_CONFIG_PP_PTV_KEEP_HIERARCHY // Get the current value of AI_CONFIG_PP_PTV_KEEP_HIERARCHY and AI_CONFIG_PP_PTV_NORMALIZE
configKeepHierarchy = (0 != pImp->GetPropertyInteger(AI_CONFIG_PP_PTV_KEEP_HIERARCHY,0)); configKeepHierarchy = (0 != pImp->GetPropertyInteger(AI_CONFIG_PP_PTV_KEEP_HIERARCHY,0));
configNormalize = (0 != pImp->GetPropertyInteger(AI_CONFIG_PP_PTV_NORMALIZE,0));
} }
// ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------
@ -468,8 +469,8 @@ void PretransformVertices::Execute( aiScene* pScene)
if (apcOutMeshes.size() > 0) { if (apcOutMeshes.size() > 0) {
aiMesh** npp = new aiMesh*[pScene->mNumMeshes + apcOutMeshes.size()]; aiMesh** npp = new aiMesh*[pScene->mNumMeshes + apcOutMeshes.size()];
::memcpy(npp,pScene->mMeshes,sizeof(aiMesh*)*pScene->mNumMeshes); memcpy(npp,pScene->mMeshes,sizeof(aiMesh*)*pScene->mNumMeshes);
::memcpy(npp+pScene->mNumMeshes,&apcOutMeshes[0],sizeof(aiMesh*)*apcOutMeshes.size()); memcpy(npp+pScene->mNumMeshes,&apcOutMeshes[0],sizeof(aiMesh*)*apcOutMeshes.size());
pScene->mNumMeshes += apcOutMeshes.size(); pScene->mNumMeshes += apcOutMeshes.size();
delete[] pScene->mMeshes; pScene->mMeshes = npp; delete[] pScene->mMeshes; pScene->mMeshes = npp;
@ -661,6 +662,32 @@ void PretransformVertices::Execute( aiScene* pScene)
MakeIdentityTransform(pScene->mRootNode); MakeIdentityTransform(pScene->mRootNode);
} }
if (configNormalize) {
// compute the boundary of all meshes
aiVector3D min,max;
MinMaxChooser<aiVector3D> ()(min,max);
for (unsigned int a = 0; a < pScene->mNumMeshes; ++a) {
aiMesh* m = pScene->mMeshes[a];
for (unsigned int i = 0; i < m->mNumVertices;++i) {
min = std::min(m->mVertices[i],min);
max = std::max(m->mVertices[i],max);
}
}
// find the dominant axis
aiVector3D d = max-min;
const float div = std::max(d.x,std::max(d.y,d.z))*0.5f;
d = min+d*0.5f;
for (unsigned int a = 0; a < pScene->mNumMeshes; ++a) {
aiMesh* m = pScene->mMeshes[a];
for (unsigned int i = 0; i < m->mNumVertices;++i) {
m->mVertices[i] = (m->mVertices[i]-d)/div;
}
}
}
// print statistics // print statistics
if (!DefaultLogger::isNullLogger()) if (!DefaultLogger::isNullLogger())
{ {
@ -668,15 +695,15 @@ void PretransformVertices::Execute( aiScene* pScene)
DefaultLogger::get()->debug("PretransformVerticesProcess finished"); DefaultLogger::get()->debug("PretransformVerticesProcess finished");
::sprintf(buffer,"Removed %i nodes and %i animation channels (%i output nodes)", sprintf(buffer,"Removed %i nodes and %i animation channels (%i output nodes)",
iOldNodes,iOldAnimationChannels,CountNodes(pScene->mRootNode)); iOldNodes,iOldAnimationChannels,CountNodes(pScene->mRootNode));
DefaultLogger::get()->info(buffer); DefaultLogger::get()->info(buffer);
::sprintf(buffer,"Kept %i lights and %i cameras", sprintf(buffer,"Kept %i lights and %i cameras",
pScene->mNumLights,pScene->mNumCameras); pScene->mNumLights,pScene->mNumCameras);
DefaultLogger::get()->info(buffer); DefaultLogger::get()->info(buffer);
::sprintf(buffer,"Moved %i meshes to WCS (number of output meshes: %i)", sprintf(buffer,"Moved %i meshes to WCS (number of output meshes: %i)",
iOldMeshes,pScene->mNumMeshes); iOldMeshes,pScene->mNumMeshes);
DefaultLogger::get()->info(buffer); DefaultLogger::get()->info(buffer);
} }

View File

@ -157,7 +157,7 @@ private:
//! Configuration option: keep scene hierarchy as long as possible //! Configuration option: keep scene hierarchy as long as possible
bool configKeepHierarchy; bool configKeepHierarchy, configNormalize;
}; };

View File

@ -129,11 +129,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
/** @brief Configures the #aiProcess_PretransformVertices step to /** @brief Configures the #aiProcess_PretransformVertices step to
* keep the scene hierarchy. Meshes are moved to worldspace, but * keep the scene hierarchy. Meshes are moved to worldspace, but
* no optimization is performed (means: meshes are not joined. The total * no optimization is performed (read: meshes with equal materials are not
* number of meshes won't change). * joined. The total number of meshes won't change).
* *
* This option could be of use for you if the scene hierarchy contains * This option could be of use for you if the scene hierarchy contains
* important additional information which you want to interpret. * important additional information which you intend to parse.
* For rendering, you can still render all meshes in the scene without * For rendering, you can still render all meshes in the scene without
* any transformations. * any transformations.
* Property type: integer (0: false; !0: true). Default value: false. * Property type: integer (0: false; !0: true). Default value: false.
@ -141,6 +141,16 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#define AI_CONFIG_PP_PTV_KEEP_HIERARCHY \ #define AI_CONFIG_PP_PTV_KEEP_HIERARCHY \
"PP_PTV_KEEP_HIERARCHY" "PP_PTV_KEEP_HIERARCHY"
// ---------------------------------------------------------------------------
/** @brief Configures the #aiProcess_PretransformVertices step to normalize
* all vertex components into the -1...1 range. That is, a bounding box
* for the whole scene is computed, the maximum component is taken and all
* meshes are scaled appropriately (uniformly of course!).
* This might be useful if you don't know the spatial dimension of the input
* data*/
#define AI_CONFIG_PP_PTV_NORMALIZE \
"PP_PTV_NORMALIZE"
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
/** @brief Configures the #aiProcess_FindDegenerates step to /** @brief Configures the #aiProcess_FindDegenerates step to
* remove degenerated primitives from the import - immediately. * remove degenerated primitives from the import - immediately.

View File

@ -204,11 +204,14 @@ enum aiPostProcessSteps
* simply render all meshes in order, you don't need to pay * simply render all meshes in order, you don't need to pay
* attention to local transformations and the node hierarchy. * attention to local transformations and the node hierarchy.
* Animations are removed during this step. * Animations are removed during this step.
* This step is intended for applications that have no scenegraph. * This step is intended for applications without a scenegraph.
* The step CAN cause some problems: if e.g. a mesh of the asset * The step CAN cause some problems: if e.g. a mesh of the asset
* contains normals and another, using the same material index, does not, * contains normals and another, using the same material index, does not,
* they will be brought together, but the first meshes's part of * they will be brought together, but the first meshes's part of
* the normal list will be zeroed. * the normal list is zeroed. However, these artifacts are rare.
* @note The <tt>#AI_CONFIG_PP_PTV_NORMALIZE</tt> configuration property
* can be set to normalize the scene's spatial dimension to the -1...1
* range.
*/ */
aiProcess_PreTransformVertices = 0x100, aiProcess_PreTransformVertices = 0x100,