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:
authorLukas Tönne <lukas.toenne@gmail.com>2014-11-28 16:02:06 +0300
committerLukas Tönne <lukas.toenne@gmail.com>2015-04-20 13:15:17 +0300
commitfd34e3efbc1587de14718a0d7706cfa3fb6bc870 (patch)
tree4b8242bb539bf2b2ba264ab742ac5845df1fbeb4 /source/blender/bmesh/intern/bmesh_strands.c
parentdc43df89cd0514adad2e66e155d0894b7cdfc3b0 (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.c34
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;
}