From abd8fba47ff297574e9418bb1d951cc483751fba Mon Sep 17 00:00:00 2001 From: Erwin Coumans Date: Fri, 2 Jun 2006 18:17:40 +0000 Subject: applied patch [ #4207 ] Boolean operations fix Also fixed other problems with STL iterators/vectors, that only show up under Visual Studio 2005. See also http://projects.blender.org/pipermail/bf-committers/2006-May/014608.html --- intern/bsp/intern/BSP_CSGMesh_CFIterator.h | 10 ++++++---- intern/decimation/intern/LOD_EdgeCollapser.cpp | 9 +++++---- intern/decimation/intern/LOD_MeshPrimitives.cpp | 6 ++---- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/intern/bsp/intern/BSP_CSGMesh_CFIterator.h b/intern/bsp/intern/BSP_CSGMesh_CFIterator.h index 77ba076885f..9cd237873c7 100755 --- a/intern/bsp/intern/BSP_CSGMesh_CFIterator.h +++ b/intern/bsp/intern/BSP_CSGMesh_CFIterator.h @@ -69,7 +69,8 @@ BSP_CSGMesh_VertexIt_Done( // assume CSG_IteratorPtr is of the correct type. BSP_CSGMesh_VertexIt * vertex_it = (BSP_CSGMesh_VertexIt *)it; - if (vertex_it->pos < &(*vertex_it->mesh->VertexSet().end())) return 0; + /* dereferencing iterator::end() is illegal, so we dereference 1 before it */ + if (vertex_it->pos <= &(*(vertex_it->mesh->VertexSet().end() -1) )) return 0; return 1; }; @@ -161,7 +162,8 @@ BSP_CSGMesh_FaceIt_Done( // assume CSG_IteratorPtr is of the correct type. BSP_CSGMesh_FaceIt * face_it = (BSP_CSGMesh_FaceIt *)it; - if (face_it->pos < &(*face_it->mesh->FaceSet().end())) { + /* dereferencing iterator::end() is illegal, so we dereference 1 before it */ + if (face_it->pos <= &(*(face_it->mesh->FaceSet().end() -1))) { if (face_it->face_triangle + 3 <= face_it->pos->m_verts.size()) { return 0; } @@ -253,8 +255,8 @@ BSP_CSGMesh_FaceIt_Step( // assume CSG_IteratorPtr is of the correct type. BSP_CSGMesh_FaceIt * face_it = (BSP_CSGMesh_FaceIt *)it; - // safety guard - if (face_it->pos < &(*face_it->mesh->FaceSet().end())) { + /* dereferencing iterator::end() is illegal, so we dereference 1 before it */ + if (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)++; diff --git a/intern/decimation/intern/LOD_EdgeCollapser.cpp b/intern/decimation/intern/LOD_EdgeCollapser.cpp index 07bcbf2b9d2..86b2fbaf423 100644 --- a/intern/decimation/intern/LOD_EdgeCollapser.cpp +++ b/intern/decimation/intern/LOD_EdgeCollapser.cpp @@ -273,12 +273,13 @@ CollapseEdge( vector::iterator edge_it = degenerate_edges.begin(); vector::const_iterator edge_end = degenerate_edges.end(); - for (; edge_it != edge_end; ++edge_it) { + for (; !(edge_it == edge_end); ++edge_it) { - LOD_Edge & edge = edges[*edge_it]; + LOD_EdgeInd ed = (*edge_it); + LOD_Edge & edge = edges[ed];//*edge_it]; - verts[edge.m_verts[0]].RemoveEdge(*edge_it); - verts[edge.m_verts[1]].RemoveEdge(*edge_it); + verts[edge.m_verts[0]].RemoveEdge(ed); + verts[edge.m_verts[1]].RemoveEdge(ed); } // we postpone deletion of the internal edges untill the end diff --git a/intern/decimation/intern/LOD_MeshPrimitives.cpp b/intern/decimation/intern/LOD_MeshPrimitives.cpp index 16b80cdeea8..a8328a9adbe 100644 --- a/intern/decimation/intern/LOD_MeshPrimitives.cpp +++ b/intern/decimation/intern/LOD_MeshPrimitives.cpp @@ -62,11 +62,9 @@ RemoveEdge( if (result == m_edges.end()) { return false; } - LOD_EdgeInd last = m_edges.back(); - m_edges.pop_back(); - if (m_edges.empty()) return true; - *result = last; + std::swap(*result, m_edges.back()); + m_edges.pop_back(); return true; }; -- cgit v1.2.3