Commit 658ca725 authored by hybrid's avatar hybrid

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
parent bd88f744
...@@ -234,6 +234,14 @@ bool CXMeshFileLoader::load(io::IReadFile* file) ...@@ -234,6 +234,14 @@ bool CXMeshFileLoader::load(io::IReadFile* file)
} }
// store vertices in buffers and remember relation in verticesLink // 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) for (i=0;i<mesh->Vertices.size();++i)
{ {
scene::SSkinMeshBuffer *buffer = mesh->Buffers[ verticesLinkBuffer[i] ]; scene::SSkinMeshBuffer *buffer = mesh->Buffers[ verticesLinkBuffer[i] ];
...@@ -242,16 +250,19 @@ bool CXMeshFileLoader::load(io::IReadFile* file) ...@@ -242,16 +250,19 @@ bool CXMeshFileLoader::load(io::IReadFile* file)
buffer->Vertices_Standard.push_back( mesh->Vertices[i] ); 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 // create indices per buffer
for (i=0;i<mesh->FaceMaterialIndices.size();++i) for (i=0;i<mesh->FaceMaterialIndices.size();++i)
{ {
scene::SSkinMeshBuffer *buffer = mesh->Buffers[ mesh->FaceMaterialIndices[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) for (u32 id=i*3+0;id!=i*3+3;++id)
{
buffer->Indices.push_back( verticesLink[ mesh->Indices[id] ] ); buffer->Indices.push_back( verticesLink[ mesh->Indices[id] ] );
}
} }
for (i=0; i<AnimatedMesh->getAllJoints().size(); ++i) for (i=0; i<AnimatedMesh->getAllJoints().size(); ++i)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment