PLYLoader: improve readability by refactorings.

pull/837/head
Kim Kulling 2016-03-24 19:53:15 +01:00
parent 23892a6ded
commit 7c71f0b7a9
1 changed files with 46 additions and 32 deletions

View File

@ -122,6 +122,24 @@ const aiImporterDesc* PLYImporter::GetInfo () const
return &desc;
}
// ------------------------------------------------------------------------------------------------
static bool isBigEndian( char* szMe ) {
// binary_little_endian
// binary_big_endian
bool isBigEndian( false );
#if (defined AI_BUILD_BIG_ENDIAN)
if ( 'l' == *szMe || 'L' == *szMe ) {
isBigEndian = true;
}
#else
if ( 'b' == *szMe || 'B' == *szMe ) {
isBigEndian = true;
}
#endif // ! AI_BUILD_BIG_ENDIAN
return isBigEndian;
}
// ------------------------------------------------------------------------------------------------
// Imports the given file into the given scene structure.
void PLYImporter::InternReadFile( const std::string& pFile,
@ -151,33 +169,24 @@ void PLYImporter::InternReadFile( const std::string& pFile,
// determine the format of the file data
PLY::DOM sPlyDom;
if (TokenMatch(szMe,"format",6))
{
if (TokenMatch(szMe,"ascii",5))
{
if (TokenMatch(szMe,"format",6)) {
if (TokenMatch(szMe,"ascii",5)) {
SkipLine(szMe,(const char**)&szMe);
if(!PLY::DOM::ParseInstance(szMe,&sPlyDom))
throw DeadlyImportError( "Invalid .ply file: Unable to build DOM (#1)");
}
else if (!::strncmp(szMe,"binary_",7))
} else if (!::strncmp(szMe,"binary_",7))
{
bool bIsBE = false;
szMe+=7;
// binary_little_endian
// binary_big_endian
#if (defined AI_BUILD_BIG_ENDIAN)
if ('l' == *szMe || 'L' == *szMe)bIsBE = true;
#else
if ('b' == *szMe || 'B' == *szMe)bIsBE = true;
#endif // ! AI_BUILD_BIG_ENDIAN
szMe += 7;
const bool bIsBE( isBigEndian( szMe ) );
// skip the line, parse the rest of the header and build the DOM
SkipLine(szMe,(const char**)&szMe);
if(!PLY::DOM::ParseInstanceBinary(szMe,&sPlyDom,bIsBE))
throw DeadlyImportError( "Invalid .ply file: Unable to build DOM (#2)");
if ( !PLY::DOM::ParseInstanceBinary( szMe, &sPlyDom, bIsBE ) ) {
throw DeadlyImportError( "Invalid .ply file: Unable to build DOM (#2)" );
}
} else {
throw DeadlyImportError( "Invalid .ply file: Unknown file format" );
}
else throw DeadlyImportError( "Invalid .ply file: Unknown file format");
}
else
{
@ -186,13 +195,14 @@ void PLYImporter::InternReadFile( const std::string& pFile,
}
this->pcDOM = &sPlyDom;
// now load a list of vertices. This must be sucessfull in order to procede
// now load a list of vertices. This must be successfully in order to procedure
std::vector<aiVector3D> avPositions;
this->LoadVertices(&avPositions,false);
if (avPositions.empty())
if ( avPositions.empty() ) {
throw DeadlyImportError( "Invalid .ply file: No vertices found. "
"Unable to parse the data format of the PLY file.");
"Unable to parse the data format of the PLY file." );
}
// now load a list of normals.
std::vector<aiVector3D> avNormals;
@ -246,28 +256,32 @@ void PLYImporter::InternReadFile( const std::string& pFile,
ConvertMeshes(&avFaces,&avPositions,&avNormals,
&avColors,&avTexCoords,&avMaterials,&avMeshes);
if (avMeshes.empty())
throw DeadlyImportError( "Invalid .ply file: Unable to extract mesh data ");
if ( avMeshes.empty() ) {
throw DeadlyImportError( "Invalid .ply file: Unable to extract mesh data " );
}
// now generate the output scene object. Fill the material list
pScene->mNumMaterials = (unsigned int)avMaterials.size();
pScene->mMaterials = new aiMaterial*[pScene->mNumMaterials];
for (unsigned int i = 0; i < pScene->mNumMaterials;++i)
pScene->mMaterials[i] = avMaterials[i];
for ( unsigned int i = 0; i < pScene->mNumMaterials; ++i ) {
pScene->mMaterials[ i ] = avMaterials[ i ];
}
// fill the mesh list
pScene->mNumMeshes = (unsigned int)avMeshes.size();
pScene->mMeshes = new aiMesh*[pScene->mNumMeshes];
for (unsigned int i = 0; i < pScene->mNumMeshes;++i)
pScene->mMeshes[i] = avMeshes[i];
for ( unsigned int i = 0; i < pScene->mNumMeshes; ++i ) {
pScene->mMeshes[ i ] = avMeshes[ i ];
}
// generate a simple node structure
pScene->mRootNode = new aiNode();
pScene->mRootNode->mNumMeshes = pScene->mNumMeshes;
pScene->mRootNode->mMeshes = new unsigned int[pScene->mNumMeshes];
for (unsigned int i = 0; i < pScene->mRootNode->mNumMeshes;++i)
pScene->mRootNode->mMeshes[i] = i;
for ( unsigned int i = 0; i < pScene->mRootNode->mNumMeshes; ++i ) {
pScene->mRootNode->mMeshes[ i ] = i;
}
}
// ------------------------------------------------------------------------------------------------
@ -291,7 +305,7 @@ void PLYImporter::ConvertMeshes(std::vector<PLY::Face>* avFaces,
for (std::vector<PLY::Face>::const_iterator i = avFaces->begin();i != avFaces->end();++i,++iNum)
aiSplit[(*i).iMaterialIndex].push_back(iNum);
// now generate submeshes
// now generate sub-meshes
for (unsigned int p = 0; p < avMaterials->size();++p)
{
if (aiSplit[p].size() != 0)
@ -491,7 +505,7 @@ void PLYImporter::LoadVertices(std::vector<aiVector3D>* pvOut, bool p_bNormals)
PLY::ElementInstanceList* pcList = NULL;
unsigned int cnt = 0;
// serach in the DOM for a vertex entry
// search in the DOM for a vertex entry
unsigned int _i = 0;
for (std::vector<PLY::Element>::const_iterator i = pcDOM->alElements.begin();
i != pcDOM->alElements.end();++i,++_i)