From 2ecbf3f244519e369b460796b9033d58fe9a7639 Mon Sep 17 00:00:00 2001 From: aramis_acg Date: Fri, 22 Apr 2011 15:55:34 +0000 Subject: [PATCH] # PretransformVertices: fix crash during scene destruction if the resulting scene is empty git-svn-id: https://assimp.svn.sourceforge.net/svnroot/assimp/trunk@960 67173fc5-114c-0410-ac8e-9d2fd5bffc1f --- code/PretransformVertices.cpp | 51 ++++++++++++++++++----------------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/code/PretransformVertices.cpp b/code/PretransformVertices.cpp index ccd148677..9a6a25e0c 100644 --- a/code/PretransformVertices.cpp +++ b/code/PretransformVertices.cpp @@ -537,40 +537,41 @@ void PretransformVertices::Execute( aiScene* pScene) } } - // now delete all meshes in the scene and build a new mesh list - for (unsigned int i = 0; i < pScene->mNumMeshes;++i) - { - aiMesh* mesh = pScene->mMeshes[i]; - mesh->mNumBones = 0; - mesh->mBones = NULL; - - // we're reusing the face index arrays. avoid destruction - for (unsigned int a = 0; a < mesh->mNumFaces; ++a) { - mesh->mFaces[a].mNumIndices = 0; - mesh->mFaces[a].mIndices = NULL; - } - - delete mesh; - - // Invalidate the contents of the old mesh array. We will most - // likely have less output meshes now, so the last entries of - // the mesh array are not overridden. We set them to NULL to - // make sure the developer gets notified when his application - // attempts to access these fields ... - mesh = NULL; - } - // If no meshes are referenced in the node graph it is possible that we get no output meshes. if (apcOutMeshes.empty()) { - throw DeadlyImportError("No output meshes: all meshes are orphaned and are not referenced by nodes"); + throw DeadlyImportError("No output meshes: all meshes are orphaned and are not referenced by any nodes"); } else { + // now delete all meshes in the scene and build a new mesh list + for (unsigned int i = 0; i < pScene->mNumMeshes;++i) + { + aiMesh* mesh = pScene->mMeshes[i]; + mesh->mNumBones = 0; + mesh->mBones = NULL; + + // we're reusing the face index arrays. avoid destruction + for (unsigned int a = 0; a < mesh->mNumFaces; ++a) { + mesh->mFaces[a].mNumIndices = 0; + mesh->mFaces[a].mIndices = NULL; + } + + delete mesh; + + // Invalidate the contents of the old mesh array. We will most + // likely have less output meshes now, so the last entries of + // the mesh array are not overridden. We set them to NULL to + // make sure the developer gets notified when his application + // attempts to access these fields ... + mesh = NULL; + } + // It is impossible that we have more output meshes than // input meshes, so we can easily reuse the old mesh array pScene->mNumMeshes = (unsigned int)apcOutMeshes.size(); - for (unsigned int i = 0; i < pScene->mNumMeshes;++i) + for (unsigned int i = 0; i < pScene->mNumMeshes;++i) { pScene->mMeshes[i] = apcOutMeshes[i]; + } } }