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-9d2fd5bffc1fpull/1/head
parent
6e133a6cd9
commit
f9b06f8d89
|
@ -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");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue