3ds loader now sets aiMesh::mName according to the original mesh groups found in the file.

git-svn-id: https://assimp.svn.sourceforge.net/svnroot/assimp/trunk@727 67173fc5-114c-0410-ac8e-9d2fd5bffc1f
pull/1/head
aramis_acg 2010-05-20 12:07:04 +00:00
parent 6e133a6cd9
commit f9b06f8d89
2 changed files with 56 additions and 53 deletions

View File

@ -348,14 +348,14 @@ void Discreet3DSImporter::ConvertMeshes(aiScene* pcOut)
std::vector<aiMesh*> avOutMeshes; std::vector<aiMesh*> avOutMeshes;
avOutMeshes.reserve(mScene->mMeshes.size() * 2); avOutMeshes.reserve(mScene->mMeshes.size() * 2);
unsigned int iFaceCnt = 0; unsigned int iFaceCnt = 0,num = 0;
aiString name;
// we need to split all meshes by their materials // we need to split all meshes by their materials
for (std::vector<D3DS::Mesh>::iterator i = mScene->mMeshes.begin(); for (std::vector<D3DS::Mesh>::iterator i = mScene->mMeshes.begin(); i != mScene->mMeshes.end();++i) {
i != mScene->mMeshes.end();++i) boost::scoped_array< std::vector<unsigned int> > aiSplit(new std::vector<unsigned int>[mScene->mMaterials.size()]);
{
std::vector<unsigned int>* aiSplit = new std::vector<unsigned int>[ name.length = ASSIMP_itoa10(name.data,num++);
mScene->mMaterials.size()];
unsigned int iNum = 0; unsigned int iNum = 0;
for (std::vector<unsigned int>::const_iterator a = (*i).mFaceMaterials.begin(); for (std::vector<unsigned int>::const_iterator a = (*i).mFaceMaterials.begin();
@ -366,66 +366,68 @@ void Discreet3DSImporter::ConvertMeshes(aiScene* pcOut)
// now generate submeshes // now generate submeshes
for (unsigned int p = 0; p < mScene->mMaterials.size();++p) for (unsigned int p = 0; p < mScene->mMaterials.size();++p)
{ {
if (aiSplit[p].size()) if (aiSplit[p].empty()) {
continue;
}
aiMesh* meshOut = new aiMesh();
meshOut->mName = name;
meshOut->mPrimitiveTypes = aiPrimitiveType_TRIANGLE;
// be sure to setup the correct material index
meshOut->mMaterialIndex = p;
// use the color data as temporary storage
meshOut->mColors[0] = (aiColor4D*)(&*i);
avOutMeshes.push_back(meshOut);
// convert vertices
meshOut->mNumFaces = (unsigned int)aiSplit[p].size();
meshOut->mNumVertices = meshOut->mNumFaces*3;
// allocate enough storage for faces
meshOut->mFaces = new aiFace[meshOut->mNumFaces];
iFaceCnt += meshOut->mNumFaces;
meshOut->mVertices = new aiVector3D[meshOut->mNumVertices];
meshOut->mNormals = new aiVector3D[meshOut->mNumVertices];
if ((*i).mTexCoords.size())
{ {
aiMesh* meshOut = new aiMesh(); meshOut->mTextureCoords[0] = new aiVector3D[meshOut->mNumVertices];
meshOut->mPrimitiveTypes = aiPrimitiveType_TRIANGLE; }
for (unsigned int q = 0, base = 0; q < aiSplit[p].size();++q)
{
register unsigned int index = aiSplit[p][q];
aiFace& face = meshOut->mFaces[q];
// be sure to setup the correct material index face.mIndices = new unsigned int[3];
meshOut->mMaterialIndex = p; face.mNumIndices = 3;
// use the color data as temporary storage for (unsigned int a = 0; a < 3;++a,++base)
meshOut->mColors[0] = (aiColor4D*)(&*i);
avOutMeshes.push_back(meshOut);
// convert vertices
meshOut->mNumFaces = (unsigned int)aiSplit[p].size();
meshOut->mNumVertices = meshOut->mNumFaces*3;
// allocate enough storage for faces
meshOut->mFaces = new aiFace[meshOut->mNumFaces];
iFaceCnt += meshOut->mNumFaces;
meshOut->mVertices = new aiVector3D[meshOut->mNumVertices];
meshOut->mNormals = new aiVector3D[meshOut->mNumVertices];
if ((*i).mTexCoords.size())
{ {
meshOut->mTextureCoords[0] = new aiVector3D[meshOut->mNumVertices]; unsigned int idx = (*i).mFaces[index].mIndices[a];
} meshOut->mVertices[base] = (*i).mPositions[idx];
for (unsigned int q = 0, base = 0; q < aiSplit[p].size();++q) meshOut->mNormals [base] = (*i).mNormals[idx];
{
register unsigned int index = aiSplit[p][q];
aiFace& face = meshOut->mFaces[q];
face.mIndices = new unsigned int[3]; if ((*i).mTexCoords.size())
face.mNumIndices = 3; meshOut->mTextureCoords[0][base] = (*i).mTexCoords[idx];
for (unsigned int a = 0; a < 3;++a,++base) face.mIndices[a] = base;
{
unsigned int idx = (*i).mFaces[index].mIndices[a];
meshOut->mVertices[base] = (*i).mPositions[idx];
meshOut->mNormals [base] = (*i).mNormals[idx];
if ((*i).mTexCoords.size())
meshOut->mTextureCoords[0][base] = (*i).mTexCoords[idx];
face.mIndices[a] = base;
}
} }
} }
} }
delete[] aiSplit;
} }
// Copy them to the output array // Copy them to the output array
pcOut->mNumMeshes = (unsigned int)avOutMeshes.size(); pcOut->mNumMeshes = (unsigned int)avOutMeshes.size();
pcOut->mMeshes = new aiMesh*[pcOut->mNumMeshes](); pcOut->mMeshes = new aiMesh*[pcOut->mNumMeshes]();
for (unsigned int a = 0; a < pcOut->mNumMeshes;++a) for (unsigned int a = 0; a < pcOut->mNumMeshes;++a) {
pcOut->mMeshes[a] = avOutMeshes[a]; pcOut->mMeshes[a] = avOutMeshes[a];
}
// We should have at least one face here // We should have at least one face here
if (!iFaceCnt) if (!iFaceCnt) {
throw DeadlyImportError("No faces loaded. The mesh is empty"); throw DeadlyImportError("No faces loaded. The mesh is empty");
}
} }
// ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------

View File

@ -58,9 +58,10 @@ namespace Assimp {
* to have a small replacement function here. No need to use a full sprintf() * to have a small replacement function here. No need to use a full sprintf()
* if we just want to print a number ... * if we just want to print a number ...
* @param out Output buffer * @param out Output buffer
* @param max Maximum number of characters to be written, including '\0' * @param max Maximum number of characters to be written, including '\0'.
* This parameter may not be 0.
* @param number Number to be written * @param number Number to be written
* @return Number of bytes written. * @return Length of the output string, excluding the '\0'
*/ */
inline unsigned int ASSIMP_itoa10( char* out, unsigned int max, int32_t number) inline unsigned int ASSIMP_itoa10( char* out, unsigned int max, int32_t number)
{ {
@ -97,15 +98,15 @@ inline unsigned int ASSIMP_itoa10( char* out, unsigned int max, int32_t number)
// append a terminal zero // append a terminal zero
*out++ = '\0'; *out++ = '\0';
return written; return written-1;
} }
// ------------------------------------------------------------------------------- // -------------------------------------------------------------------------------
/** @brief itoa with a fixed base 10 (Secure template overload) /** @brief itoa with a fixed base 10 (Secure template overload)
* The compiler should choose this function if he is able to determine the * The compiler should choose this function if he or she is able to determine the
* size of the array automatically. * size of the array automatically.
*/ */
template <unsigned int length> template <size_t length>
inline unsigned int ASSIMP_itoa10( char(& out)[length], int32_t number) inline unsigned int ASSIMP_itoa10( char(& out)[length], int32_t number)
{ {
return ASSIMP_itoa10(out,length,number); return ASSIMP_itoa10(out,length,number);