[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [58495] trunk/blender/source/blender/bmesh : add support for BM_mesh_calc_face_groups to use vertex connectivity ( not currently used yet)

Campbell Barton ideasman42 at gmail.com
Mon Jul 22 10:12:50 CEST 2013


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;
 
 




More information about the Bf-blender-cvs mailing list