Revision: 58495
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=58495
Author:   campbellbarton
Date:     2013-07-22 08:12:50 +0000 (Mon, 22 Jul 2013)
Log Message:
-----------
add support for BM_mesh_calc_face_groups to use vertex connectivity (not 
currently used yet)

Modified Paths:
--------------
    trunk/blender/source/blender/bmesh/intern/bmesh_queries.c
    trunk/blender/source/blender/bmesh/intern/bmesh_queries.h
    trunk/blender/source/blender/bmesh/operators/bmo_normals.c

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_queries.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_queries.c   2013-07-22 
07:20:37 UTC (rev 58494)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_queries.c   2013-07-22 
08:12:50 UTC (rev 58495)
@@ -1771,7 +1771,7 @@
  * \return The number of groups found.
  */
 int BM_mesh_calc_face_groups(BMesh *bm, int *r_groups_array, int 
(**r_group_index)[2],
-                             void *user_data, bool (*filter_fn)(BMEdge *, void 
*user_data))
+                             bool (*filter_fn)(BMElem *, void *user_data), 
void *user_data, const char htype)
 {
 #ifdef DEBUG
        int group_index_len = 1;
@@ -1798,6 +1798,8 @@
 
        STACK_INIT(group_array);
 
+       BLI_assert(((htype & ~(BM_VERT | BM_EDGE)) == 0) && (htype != 0));
+
        /* init the array */
        BM_ITER_MESH_INDEX (f, &iter, bm, BM_FACES_OF_MESH, i) {
                BM_elem_index_set(f, i); /* set_inline */
@@ -1846,17 +1848,40 @@
                        fg[1]++;
                        /* done */
 
-                       /* search for other faces */
-                       l_iter = l_first = BM_FACE_FIRST_LOOP(f);
-                       do {
-                               BMLoop *l_other = l_iter->radial_next;
-                               if ((l_other != l_iter) && filter_fn(l_iter->e, 
user_data)) {
-                                       if (BM_elem_flag_test(l_other->f, 
BM_ELEM_TAG) == false) {
-                                               BM_elem_flag_enable(l_other->f, 
BM_ELEM_TAG);
-                                               STACK_PUSH(fstack, l_other->f);
+                       if (htype & BM_EDGE) {
+                               /* search for other faces */
+                               l_iter = l_first = BM_FACE_FIRST_LOOP(f);
+                               do {
+                                       BMLoop *l_radial_iter = 
l_iter->radial_next;
+                                       if ((l_radial_iter != l_iter) && 
filter_fn((BMElem *)l_iter->e, user_data)) {
+                                               do {
+                                                       BMFace *f_other = 
l_radial_iter->f;
+                                                       if 
(BM_elem_flag_test(f_other, BM_ELEM_TAG) == false) {
+                                                               
BM_elem_flag_enable(f_other, BM_ELEM_TAG);
+                                                               
STACK_PUSH(fstack, f_other);
+                                                       }
+                                               } while ((l_radial_iter = 
l_radial_iter->radial_next) != l_iter);
                                        }
-                               }
-                       } while ((l_iter = l_iter->next) != l_first);
+                               } while ((l_iter = l_iter->next) != l_first);
+                       }
+
+                       if (htype & BM_VERT) {
+                               BMIter liter;
+                               /* search for other faces */
+                               l_iter = l_first = BM_FACE_FIRST_LOOP(f);
+                               do {
+                                       if (filter_fn((BMElem *)l_iter->v, 
user_data)) {
+                                               BMLoop *l_other;
+                                               BM_ITER_ELEM (l_other, &liter, 
l_iter, BM_LOOPS_OF_LOOP) {
+                                                       BMFace *f_other = 
l_other->f;
+                                                       if 
(BM_elem_flag_test(f_other, BM_ELEM_TAG) == false) {
+                                                               
BM_elem_flag_enable(f_other, BM_ELEM_TAG);
+                                                               
STACK_PUSH(fstack, f_other);
+                                                       }
+                                               }
+                                       }
+                               } while ((l_iter = l_iter->next) != l_first);
+                       }
                }
 
                group_curr++;

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_queries.h
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_queries.h   2013-07-22 
07:20:37 UTC (rev 58494)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_queries.h   2013-07-22 
08:12:50 UTC (rev 58495)
@@ -116,7 +116,7 @@
 
 float BM_mesh_calc_volume(BMesh *bm, bool is_signed);
 int   BM_mesh_calc_face_groups(BMesh *bm, int *r_groups_array, int 
(**r_group_index)[2],
-                               void *user_data, bool (*filter_fn)(BMEdge *, 
void *user_data));
+                               bool (*filter_fn)(BMElem *, void *user_data), 
void *user_data, const char htype);
 
 /* not really any good place  to put this */
 float bmesh_subd_falloff_calc(const int falloff, float val);

Modified: trunk/blender/source/blender/bmesh/operators/bmo_normals.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_normals.c  2013-07-22 
07:20:37 UTC (rev 58494)
+++ trunk/blender/source/blender/bmesh/operators/bmo_normals.c  2013-07-22 
08:12:50 UTC (rev 58495)
@@ -40,9 +40,9 @@
 #define FACE_FLIP      (1 << 1)
 #define FACE_TEMP      (1 << 2)
 
-static bool bmo_recalc_normal_edge_filter_cb(BMEdge *e, void 
*UNUSED(user_data))
+static bool bmo_recalc_normal_edge_filter_cb(BMElem *ele, void 
*UNUSED(user_data))
 {
-       return BM_edge_is_manifold(e);
+       return BM_edge_is_manifold((BMEdge *)ele);
 }
 
 /**
@@ -115,7 +115,7 @@
                do {
                        BMLoop *l_other = l_iter->radial_next;
 
-                       if ((l_other != l_iter) && 
bmo_recalc_normal_edge_filter_cb(l_iter->e, NULL)) {
+                       if ((l_other != l_iter) && 
bmo_recalc_normal_edge_filter_cb((BMElem *)l_iter->e, NULL)) {
                                if (!BMO_elem_flag_test(bm, l_other->f, 
FACE_TEMP)) {
                                        BMO_elem_flag_enable(bm, l_other->f, 
FACE_TEMP);
                                        BMO_elem_flag_set(bm, l_other->f, 
FACE_FLIP, (l_other->v == l_iter->v) != flip_state);
@@ -153,7 +153,7 @@
 
        int (*group_index)[2];
        const int group_tot = BM_mesh_calc_face_groups(bm, groups_array, 
&group_index,
-                                                      NULL, 
bmo_recalc_normal_edge_filter_cb);
+                                                      
bmo_recalc_normal_edge_filter_cb, NULL, BM_EDGE);
        int i;
 
 

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

Reply via email to