Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErwin Coumans <blender@erwincoumans.com>2006-06-02 22:17:40 +0400
committerErwin Coumans <blender@erwincoumans.com>2006-06-02 22:17:40 +0400
commitabd8fba47ff297574e9418bb1d951cc483751fba (patch)
tree4ee61489016983ea3b2c0a695b372474fc2ba0f6
parentd40c1fc2030142b07990f01bbcf2c0dfa770075f (diff)
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
-rwxr-xr-xintern/bsp/intern/BSP_CSGMesh_CFIterator.h10
-rw-r--r--intern/decimation/intern/LOD_EdgeCollapser.cpp9
-rw-r--r--intern/decimation/intern/LOD_MeshPrimitives.cpp6
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<LOD_EdgeInd>::iterator edge_it = degenerate_edges.begin();
vector<LOD_EdgeInd>::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;
};