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-9d2fd5bffc1fpull/1/head
parent
8b19981ce9
commit
cc1ff304df
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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,
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue