Fixed a severe performance penalty in .x loader.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@941 dfc29bdd-3216-0410-991c-e03cc46cb475
This commit is contained in:
hybrid 2007-09-10 13:24:18 +00:00
parent bd88f744f5
commit 658ca725f6

View File

@ -234,6 +234,14 @@ bool CXMeshFileLoader::load(io::IReadFile* file)
}
// store vertices in buffers and remember relation in verticesLink
u32* vCountArray = new u32[mesh->Buffers.size()];
memset(vCountArray, 0, mesh->Buffers.size()*sizeof(u32));
// count vertices in each buffer and reallocate
for (i=0;i<mesh->Vertices.size();++i)
++vCountArray[verticesLinkBuffer[i]];
for (i=0; i!=mesh->Buffers.size(); ++i)
mesh->Buffers[i]->Vertices_Standard.reallocate(vCountArray[i]);
// actually store vertices
for (i=0;i<mesh->Vertices.size();++i)
{
scene::SSkinMeshBuffer *buffer = mesh->Buffers[ verticesLinkBuffer[i] ];
@ -242,16 +250,19 @@ bool CXMeshFileLoader::load(io::IReadFile* file)
buffer->Vertices_Standard.push_back( mesh->Vertices[i] );
}
// count indices per buffer and reallocate
memset(vCountArray, 0, mesh->Buffers.size()*sizeof(u32));
for (i=0;i<mesh->FaceMaterialIndices.size();++i)
++vCountArray[ mesh->FaceMaterialIndices[i] ];
for (i=0; i!=mesh->Buffers.size(); ++i)
mesh->Buffers[i]->Indices.reallocate(vCountArray[i]);
delete [] vCountArray;
// create indices per buffer
for (i=0;i<mesh->FaceMaterialIndices.size();++i)
{
scene::SSkinMeshBuffer *buffer = mesh->Buffers[ mesh->FaceMaterialIndices[i] ];
buffer->Indices.reallocate(buffer->Indices.size()+3);
for (u32 id=i*3+0;id!=i*3+3;++id)
{
buffer->Indices.push_back( verticesLink[ mesh->Indices[id] ] );
}
}
for (i=0; i<AnimatedMesh->getAllJoints().size(); ++i)