# Collada: allow empty meshes. Thanks to Mark Page for the patch (https://sourceforge.net/projects/assimp/forums/forum/817653/topic/4628297).

git-svn-id: https://assimp.svn.sourceforge.net/svnroot/assimp/trunk@1071 67173fc5-114c-0410-ac8e-9d2fd5bffc1f
pull/2/head
aramis_acg 2011-08-23 16:27:07 +00:00
parent df63b4b3ed
commit ff705e6fa4
1 changed files with 24 additions and 18 deletions

View File

@ -1879,17 +1879,20 @@ void ColladaParser::ReadIndexData( Mesh* pMesh)
{ {
if( !mReader->isEmptyElement()) if( !mReader->isEmptyElement())
{ {
// case <polylist> - specifies the number of indices for each polygon if (numPrimitives) // It is possible to define a mesh without any primitives
const char* content = GetTextContent();
vcount.reserve( numPrimitives);
for( unsigned int a = 0; a < numPrimitives; a++)
{ {
if( *content == 0) // case <polylist> - specifies the number of indices for each polygon
ThrowException( "Expected more values while reading vcount contents."); const char* content = GetTextContent();
// read a number vcount.reserve( numPrimitives);
vcount.push_back( (size_t) strtoul10( content, &content)); for( unsigned int a = 0; a < numPrimitives; a++)
// skip whitespace after it {
SkipSpacesAndLineEnd( &content); if( *content == 0)
ThrowException( "Expected more values while reading vcount contents.");
// read a number
vcount.push_back( (size_t) strtoul10( content, &content));
// skip whitespace after it
SkipSpacesAndLineEnd( &content);
}
} }
TestClosing( "vcount"); TestClosing( "vcount");
@ -2002,15 +2005,18 @@ void ColladaParser::ReadPrimitives( Mesh* pMesh, std::vector<InputChannel>& pPer
if( expectedPointCount > 0) if( expectedPointCount > 0)
indices.reserve( expectedPointCount * numOffsets); indices.reserve( expectedPointCount * numOffsets);
const char* content = GetTextContent(); if (pNumPrimitives > 0) // It is possible to not contain any indicies
while( *content != 0)
{ {
// read a value. const char* content = GetTextContent();
// Hack: (thom) Some exporters put negative indices sometimes. We just try to carry on anyways. while( *content != 0)
int value = std::max( 0, strtol10( content, &content)); {
indices.push_back( size_t( value)); // read a value.
// skip whitespace after it // Hack: (thom) Some exporters put negative indices sometimes. We just try to carry on anyways.
SkipSpacesAndLineEnd( &content); int value = std::max( 0, strtol10( content, &content));
indices.push_back( size_t( value));
// skip whitespace after it
SkipSpacesAndLineEnd( &content);
}
} }
// complain if the index count doesn't fit // complain if the index count doesn't fit