diff options
author | Lukas Tönne <lukas.toenne@gmail.com> | 2014-11-28 16:02:06 +0300 |
---|---|---|
committer | Lukas Tönne <lukas.toenne@gmail.com> | 2015-04-20 13:15:17 +0300 |
commit | fd34e3efbc1587de14718a0d7706cfa3fb6bc870 (patch) | |
tree | 4b8242bb539bf2b2ba264ab742ac5845df1fbeb4 /source/blender/bmesh/intern/bmesh_strands.c | |
parent | dc43df89cd0514adad2e66e155d0894b7cdfc3b0 (diff) |
Fix for verts-of-strand iterator: This requires a second pointer in
addition to the edge, otherwise the last point is omitted.
Diffstat (limited to 'source/blender/bmesh/intern/bmesh_strands.c')
-rw-r--r-- | source/blender/bmesh/intern/bmesh_strands.c | 34 |
1 files changed, 20 insertions, 14 deletions
diff --git a/source/blender/bmesh/intern/bmesh_strands.c b/source/blender/bmesh/intern/bmesh_strands.c index 1fdd8809fb5..09bc574c712 100644 --- a/source/blender/bmesh/intern/bmesh_strands.c +++ b/source/blender/bmesh/intern/bmesh_strands.c @@ -56,27 +56,33 @@ void *bmstranditer__strands_of_mesh_step(struct BMIter__elem_of_mesh *iter) * VERTS OF STRAND CALLBACKS */ -void bmstranditer__verts_of_strand_begin(struct BMIter__vert_of_edge *UNUSED(iter)) +/* BMIter__vert_of_strand is not included in the union in BMIter, just make sure it is big enough */ +BLI_STATIC_ASSERT(sizeof(BMIter__vert_of_strand) <= sizeof(BMIter), "BMIter must be at least as large as BMIter__vert_of_strand") + +void bmstranditer__verts_of_strand_begin(struct BMIter__vert_of_strand *iter) { + iter->e_next = iter->v_next->e; } -void *bmstranditer__verts_of_strand_step(struct BMIter__vert_of_edge *iter) +void *bmstranditer__verts_of_strand_step(struct BMIter__vert_of_strand *iter) { - if (iter->edata) { - /* by definition the all strand edges run in the same direction, - * with the root being v1 of the first edge. - */ - BMVert *v_curr = iter->edata->v1; - BMEdge *e_first = iter->edata; + BMVert *v_curr = iter->v_next; + + if (iter->e_next) { + BMEdge *e_first = iter->e_next; + + /* select the other vertex of the current edge */ + iter->v_next = (iter->v_next == iter->e_next->v1 ? iter->e_next->v2 : iter->e_next->v1); - iter->edata = bmesh_disk_edge_next(iter->edata, iter->edata->v2); - if (iter->edata == e_first) { + /* select the next edge of the current vertex */ + iter->e_next = bmesh_disk_edge_next(iter->e_next, iter->v_next); + if (iter->e_next == e_first) { /* only one edge means the last segment, terminate */ - iter->edata = NULL; + iter->e_next = NULL; } - - return v_curr; } else - return NULL; + iter->v_next = NULL; /* last vertex, terminate */ + + return v_curr; } |