From ff705e6fa48e545cfa5e924dae8c9706fee945d8 Mon Sep 17 00:00:00 2001 From: aramis_acg Date: Tue, 23 Aug 2011 16:27:07 +0000 Subject: [PATCH] # 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 --- code/ColladaParser.cpp | 42 ++++++++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/code/ColladaParser.cpp b/code/ColladaParser.cpp index 97ddd63be..ae862a423 100644 --- a/code/ColladaParser.cpp +++ b/code/ColladaParser.cpp @@ -1879,17 +1879,20 @@ void ColladaParser::ReadIndexData( Mesh* pMesh) { if( !mReader->isEmptyElement()) { - // case - specifies the number of indices for each polygon - const char* content = GetTextContent(); - vcount.reserve( numPrimitives); - for( unsigned int a = 0; a < numPrimitives; a++) + if (numPrimitives) // It is possible to define a mesh without any primitives { - 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); + // case - specifies the number of indices for each polygon + const char* content = GetTextContent(); + vcount.reserve( numPrimitives); + for( unsigned int a = 0; a < numPrimitives; a++) + { + 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"); @@ -2002,15 +2005,18 @@ void ColladaParser::ReadPrimitives( Mesh* pMesh, std::vector& pPer if( expectedPointCount > 0) indices.reserve( expectedPointCount * numOffsets); - const char* content = GetTextContent(); - while( *content != 0) + if (pNumPrimitives > 0) // It is possible to not contain any indicies { - // read a value. - // Hack: (thom) Some exporters put negative indices sometimes. We just try to carry on anyways. - int value = std::max( 0, strtol10( content, &content)); - indices.push_back( size_t( value)); - // skip whitespace after it - SkipSpacesAndLineEnd( &content); + const char* content = GetTextContent(); + while( *content != 0) + { + // read a value. + // Hack: (thom) Some exporters put negative indices sometimes. We just try to carry on anyways. + 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