===Tools===
authorKen Hughes <khughes@pacific.edu>
Thu, 8 Jun 2006 03:10:26 +0000 (03:10 +0000)
committerKen Hughes <khughes@pacific.edu>
Thu, 8 Jun 2006 03:10:26 +0000 (03:10 +0000)
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

index 9cd237873c798bf931c46fa18c8e8edfdc4a23d4..f10458655d911503f57c10a52ccecb66f77c063a 100755 (executable)
@@ -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)++;