From 5c9530204334fc5a83bd80770755b4764fae22e7 Mon Sep 17 00:00:00 2001 From: Ken Hughes Date: Thu, 8 Jun 2006 03:10:26 +0000 Subject: ===Tools=== Previous patch for "problems with STL iterators/vectors that only show up under Visual Studio 2005" could cause a crash when object used as a boolean modifier was changed (for example, flipping all the normals). The problem is that result of boolean operations (apparently) can result in empty meshes. Patched to use the vector::size operator to check for empty vectors before trying to check the iterator. --- intern/bsp/intern/BSP_CSGMesh_CFIterator.h | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) (limited to 'intern/bsp') diff --git a/intern/bsp/intern/BSP_CSGMesh_CFIterator.h b/intern/bsp/intern/BSP_CSGMesh_CFIterator.h index 9cd237873c7..f10458655d9 100755 --- a/intern/bsp/intern/BSP_CSGMesh_CFIterator.h +++ b/intern/bsp/intern/BSP_CSGMesh_CFIterator.h @@ -70,7 +70,9 @@ BSP_CSGMesh_VertexIt_Done( BSP_CSGMesh_VertexIt * vertex_it = (BSP_CSGMesh_VertexIt *)it; /* dereferencing iterator::end() is illegal, so we dereference 1 before it */ - if (vertex_it->pos <= &(*(vertex_it->mesh->VertexSet().end() -1) )) return 0; + /* also check that vector is not empty */ + if (vertex_it->mesh->VertexSet().size() && + vertex_it->pos <= &(*(vertex_it->mesh->VertexSet().end() -1) )) return 0; return 1; }; @@ -163,8 +165,11 @@ BSP_CSGMesh_FaceIt_Done( BSP_CSGMesh_FaceIt * face_it = (BSP_CSGMesh_FaceIt *)it; /* dereferencing iterator::end() is illegal, so we dereference 1 before it */ - if (face_it->pos <= &(*(face_it->mesh->FaceSet().end() -1))) { + /* also check that vector is not empty */ + if (face_it->mesh->FaceSet().size() && + face_it->pos <= &(*(face_it->mesh->FaceSet().end() -1))) { if (face_it->face_triangle + 3 <= face_it->pos->m_verts.size()) { + return 0; } } @@ -256,7 +261,9 @@ BSP_CSGMesh_FaceIt_Step( BSP_CSGMesh_FaceIt * face_it = (BSP_CSGMesh_FaceIt *)it; /* dereferencing iterator::end() is illegal, so we dereference 1 before it */ - if (face_it->pos <= &(*(face_it->mesh->FaceSet().end() -1))) { + /* also check that vector is not empty */ + if (face_it->mesh->FaceSet().size() && + face_it->pos <= &(*(face_it->mesh->FaceSet().end() -1))) { //if (face_it->face_triangle + 3 < face_it->pos->m_verts.size()) { // (face_it->face_triangle)++; -- cgit v1.2.3