Commit: fd34e3efbc1587de14718a0d7706cfa3fb6bc870
Author: Lukas Tönne
Date:   Fri Nov 28 14:02:06 2014 +0100
Branches: strand_editmode
https://developer.blender.org/rBfd34e3efbc1587de14718a0d7706cfa3fb6bc870

Fix for verts-of-strand iterator: This requires a second pointer in
addition to the edge, otherwise the last point is omitted.

===================================================================

M       source/blender/bmesh/intern/bmesh_strands.c
M       source/blender/bmesh/intern/bmesh_strands.h

===================================================================

diff --git a/source/blender/bmesh/intern/bmesh_strands.c 
b/source/blender/bmesh/intern/bmesh_strands.c
index 1fdd880..09bc574 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;
 }
diff --git a/source/blender/bmesh/intern/bmesh_strands.h 
b/source/blender/bmesh/intern/bmesh_strands.h
index a912c4f..f2c8bf5 100644
--- a/source/blender/bmesh/intern/bmesh_strands.h
+++ b/source/blender/bmesh/intern/bmesh_strands.h
@@ -64,11 +64,16 @@ typedef enum BMStrandsIterType {
 #define BM_ITER_STRANDS_ELEM(ele, iter, data, itype) \
        for (ele = BM_strand_iter_new(iter, NULL, itype, data); ele; ele = 
BM_iter_step(iter))
 
+typedef struct BMIter__vert_of_strand {
+       BMVert *v_next;
+       BMEdge *e_next;
+} BMIter__vert_of_strand;
+
 void  bmstranditer__strands_of_mesh_begin(struct BMIter__elem_of_mesh *iter);
 void *bmstranditer__strands_of_mesh_step(struct BMIter__elem_of_mesh *iter);
 
-void  bmstranditer__verts_of_strand_begin(struct BMIter__vert_of_edge *iter);
-void *bmstranditer__verts_of_strand_step(struct BMIter__vert_of_edge *iter);
+void  bmstranditer__verts_of_strand_begin(struct BMIter__vert_of_strand *iter);
+void *bmstranditer__verts_of_strand_step(struct BMIter__vert_of_strand *iter);
 
 BLI_INLINE bool BM_strand_iter_init(BMIter *iter, BMesh *bm, const char itype, 
void *data)
 {
@@ -93,10 +98,7 @@ BLI_INLINE bool BM_strand_iter_init(BMIter *iter, BMesh *bm, 
const char itype, v
                        BLI_assert(BM_strands_vert_is_root(root));
                        iter->begin = 
(BMIter__begin_cb)bmstranditer__verts_of_strand_begin;
                        iter->step  = 
(BMIter__step_cb)bmstranditer__verts_of_strand_step;
-                       /* Note: Iterating over a strand is in fact more like a 
vertices-of-vertex iterator,
-                        * but due to strand topology we can start with the 
first edge as well.
-                        */
-                       iter->data.vert_of_edge.edata = root->e;
+                       ((BMIter__vert_of_strand *)(&iter->data))->v_next = 
root;
                        break;
                }
                default:

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to