forked from bartvdbraak/blender
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
This commit is contained in:
parent
d40c1fc203
commit
abd8fba47f
@ -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)++;
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user