[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [51760] trunk/blender/source/blender: minor changes to select similar,

Campbell Barton ideasman42 at gmail.com
Tue Oct 30 12:40:38 CET 2012


Revision: 51760
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=51760
Author:   campbellbarton
Date:     2012-10-30 11:40:36 +0000 (Tue, 30 Oct 2012)
Log Message:
-----------
minor changes to select similar,
- replace ngon_fake_area() with generic call to BM_face_calc_area().
- add defvert_find_shared() utility function.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_deform.h
    trunk/blender/source/blender/blenkernel/intern/deform.c
    trunk/blender/source/blender/bmesh/operators/bmo_similar.c

Modified: trunk/blender/source/blender/blenkernel/BKE_deform.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_deform.h	2012-10-30 11:00:06 UTC (rev 51759)
+++ trunk/blender/source/blender/blenkernel/BKE_deform.h	2012-10-30 11:40:36 UTC (rev 51760)
@@ -54,6 +54,7 @@
 void                     defvert_add_index_notest(struct MDeformVert *dv, int defgroup, const float weight);
 void                     defvert_remove_group(struct MDeformVert *dvert, struct MDeformWeight *dw);
 void                     defvert_clear(struct MDeformVert *dvert);
+int                      defvert_find_shared(const struct MDeformVert *dvert_a, const struct MDeformVert *dvert_b);
 
 float  defvert_find_weight(const struct MDeformVert *dvert, const int defgroup);
 float  defvert_array_find_weight_safe(const struct MDeformVert *dvert, const int index, const int defgroup);

Modified: trunk/blender/source/blender/blenkernel/intern/deform.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/deform.c	2012-10-30 11:00:06 UTC (rev 51759)
+++ trunk/blender/source/blender/blenkernel/intern/deform.c	2012-10-30 11:40:36 UTC (rev 51760)
@@ -790,3 +790,23 @@
 
 	dvert->totweight = 0;
 }
+
+/**
+ * \return The first group index shared by both deform verts
+ * or -1 if none are found.
+ */
+int defvert_find_shared(const MDeformVert *dvert_a, const MDeformVert *dvert_b)
+{
+	if (dvert_a->totweight && dvert_b->totweight) {
+		MDeformWeight *dw = dvert_a->dw;
+		unsigned int i;
+
+		for (i = dvert_a->totweight; i != 0; i--, dw++) {
+			if (dw->weight > 0.0f && defvert_find_weight(dvert_b, dw->def_nr) > 0.0f) {
+				return dw->def_nr;
+			}
+		}
+	}
+
+	return -1;
+}

Modified: trunk/blender/source/blender/bmesh/operators/bmo_similar.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_similar.c	2012-10-30 11:00:06 UTC (rev 51759)
+++ trunk/blender/source/blender/bmesh/operators/bmo_similar.c	2012-10-30 11:40:36 UTC (rev 51760)
@@ -29,51 +29,20 @@
 
 #include "MEM_guardedalloc.h"
 
+#include "DNA_object_types.h"
 #include "DNA_meshdata_types.h"
 
 #include "BLI_math.h"
 
 #include "BKE_customdata.h"
+#include "BKE_deform.h"
 
 #include "bmesh.h"
 
 #include "intern/bmesh_operators_private.h"  /* own include */
 
-/*
- * compute the fake surface of an ngon
- * This is done by decomposing the ngon into triangles who share the centroid of the ngon
- * while this method is far from being exact, it should guarantee an invariance.
- *
- * NOTE: This should probably go to bmesh_polygon.c
- */
-static float ngon_fake_area(BMFace *f)
-{
-	BMIter  liter;
-	BMLoop *l;
-	int     num_verts = 0;
-	float   v[3], sv[3], c[3];
-	float   area = 0.0f;
+/* in fact these could all be the same */
 
-	BM_face_calc_center_mean(f, c);
-
-	BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
-		if (num_verts == 0) {
-			copy_v3_v3(v, l->v->co);
-			copy_v3_v3(sv, l->v->co);
-			num_verts++;
-		}
-		else {
-			area += area_tri_v3(v, c, l->v->co);
-			copy_v3_v3(v, l->v->co);
-			num_verts++;
-		}
-	}
-
-	area += area_tri_v3(v, c, sv);
-
-	return area;
-}
-
 /*
  * extra face data (computed data)
  */
@@ -118,14 +87,14 @@
 	}
 }
 
-#define FACE_MARK	4
-
 /*
  * Select similar faces, the choices are in the enum in source/blender/bmesh/bmesh_operators.h
  * We select either similar faces based on material, image, area, perimeter, normal, or the coplanar faces
  */
 void bmo_similar_faces_exec(BMesh *bm, BMOperator *op)
 {
+#define FACE_MARK	1
+
 	BMIter fm_iter;
 	BMFace *fs, *fm;
 	BMOIter fs_iter;
@@ -198,7 +167,7 @@
 					break;
 
 				case SIMFACE_AREA:
-					f_ext[i].area = ngon_fake_area(f_ext[i].f);
+					f_ext[i].area = BM_face_calc_area(f_ext[i].f);
 					break;
 
 				case SIMFACE_IMAGE:
@@ -288,12 +257,12 @@
 
 	/* transfer all marked faces to the output slot */
 	BMO_slot_buffer_from_enabled_flag(bm, op, "faceout", BM_FACE, FACE_MARK);
+#undef FACE_MARK
 }
 
 /**************************************************************************** *
  * Similar Edges
  **************************************************************************** */
-#define EDGE_MARK 1
 
 /*
  * extra edge information
@@ -317,6 +286,8 @@
  */
 void bmo_similar_edges_exec(BMesh *bm, BMOperator *op)
 {
+#define EDGE_MARK	1
+
 	BMOIter es_iter;	/* selected edges iterator */
 	BMIter e_iter;		/* mesh edges iterator */
 	BMEdge *es;		/* selected edge */
@@ -504,12 +475,13 @@
 
 	/* transfer all marked edges to the output slot */
 	BMO_slot_buffer_from_enabled_flag(bm, op, "edgeout", BM_EDGE, EDGE_MARK);
+
+#undef EDGE_MARK
 }
 
 /**************************************************************************** *
  * Similar Vertices
  **************************************************************************** */
-#define VERT_MARK	1
 
 typedef struct SimSel_VertExt {
 	BMVert *v;
@@ -526,6 +498,8 @@
  */
 void bmo_similar_verts_exec(BMesh *bm, BMOperator *op)
 {
+#define VERT_MARK	1
+
 	BMOIter vs_iter;	/* selected verts iterator */
 	BMIter v_iter;		/* mesh verts iterator */
 	BMVert *vs;		/* selected vertex */
@@ -610,16 +584,9 @@
 
 					case SIMVERT_VGROUP:
 						if (v_ext[i].dvert != NULL && v_ext[indices[idx]].dvert != NULL) {
-							/* XXX, todo, make static function for this */
-							int v1, v2;
-							for (v1 = 0; v1 < v_ext[i].dvert->totweight && cont == 1; v1++) {
-								for (v2 = 0; v2 < v_ext[indices[idx]].dvert->totweight; v2++) {
-									if (v_ext[i].dvert->dw[v1].def_nr == v_ext[indices[idx]].dvert->dw[v2].def_nr) {
-										BMO_elem_flag_enable(bm, v, VERT_MARK);
-										cont = FALSE;
-										break;
-									}
-								}
+							if (defvert_find_shared(v_ext[i].dvert, v_ext[indices[idx]].dvert) != -1) {
+								BMO_elem_flag_enable(bm, v, VERT_MARK);
+								cont = FALSE;
 							}
 						}
 						break;
@@ -642,4 +609,6 @@
 	MEM_freeN(v_ext);
 
 	BMO_slot_buffer_from_enabled_flag(bm, op, "vertout", BM_VERT, VERT_MARK);
+
+#undef VERT_MARK
 }




More information about the Bf-blender-cvs mailing list