[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [57245] trunk/blender/source/blender/ editors: changes to mirror tools

Campbell Barton ideasman42 at gmail.com
Wed Jun 5 07:58:52 CEST 2013


Revision: 57245
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=57245
Author:   campbellbarton
Date:     2013-06-05 05:58:51 +0000 (Wed, 05 Jun 2013)
Log Message:
-----------
changes to mirror tools

- give feedback on how many mirror verts succeed/fail (for select mirror, shape key mirror, weight mirror)
... when a mirror failed it was confusing and not obvious what was going on.

- slight change to select mirror, now center vertices will remain selected.

- speedup to EDBM_verts_mirror_cache_begin, cache customdata layer offset.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/include/ED_mesh.h
    trunk/blender/source/blender/editors/mesh/editmesh_select.c
    trunk/blender/source/blender/editors/mesh/editmesh_tools.c
    trunk/blender/source/blender/editors/mesh/editmesh_utils.c
    trunk/blender/source/blender/editors/mesh/mesh_data.c
    trunk/blender/source/blender/editors/object/object_shapekey.c
    trunk/blender/source/blender/editors/object/object_vgroup.c
    trunk/blender/source/blender/editors/transform/transform_conversions.c

Modified: trunk/blender/source/blender/editors/include/ED_mesh.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_mesh.h	2013-06-05 03:10:29 UTC (rev 57244)
+++ trunk/blender/source/blender/editors/include/ED_mesh.h	2013-06-05 05:58:51 UTC (rev 57245)
@@ -76,7 +76,7 @@
 
 
 /* editmesh_utils.c */
-void           EDBM_verts_mirror_cache_begin(struct BMEditMesh *em, const bool use_select); /* note, replaces EM_cache_x_mirror_vert in trunk */
+void           EDBM_verts_mirror_cache_begin(struct BMEditMesh *em, const bool use_self, const bool use_select);
 void           EDBM_verts_mirror_apply(struct BMEditMesh *em, const int sel_from, const int sel_to);
 struct BMVert *EDBM_verts_mirror_get(struct BMEditMesh *em, struct BMVert *v);
 void           EDBM_verts_mirror_cache_clear(struct BMEditMesh *em, struct BMVert *v);
@@ -141,7 +141,8 @@
                        struct ARegion *ar, struct View3D *v3d, struct Object *obedit);
 
 /* editmesh_select.c */
-void EDBM_select_mirrored(struct Object *obedit, struct BMEditMesh *em, bool extend);
+void EDBM_select_mirrored(struct BMEditMesh *em, bool extend,
+                          int *r_totmirr, int *r_totfail);
 void EDBM_automerge(struct Scene *scene, struct Object *ob, bool update);
 
 bool EDBM_backbuf_border_init(struct ViewContext *vc, short xmin, short ymin, short xmax, short ymax);
@@ -237,7 +238,8 @@
 bool                 ED_vgroup_give_array(struct ID *id, struct MDeformVert **dvert_arr, int *dvert_tot);
 bool                 ED_vgroup_copy_array(struct Object *ob, struct Object *ob_from);
 void                 ED_vgroup_mirror(struct Object *ob,
-                                      const bool mirror_weights, const bool flip_vgroups, const bool all_vgroups);
+                                      const bool mirror_weights, const bool flip_vgroups, const bool all_vgroups,
+                                      int *r_totmirr, int *r_totfail);
 
 bool                 ED_vgroup_object_is_edit_mode(struct Object *ob);
 
@@ -273,6 +275,8 @@
 bool ED_mesh_color_remove_active(struct Mesh *me);
 bool ED_mesh_color_remove_named(struct Mesh *me, const char *name);
 
+void ED_mesh_report_mirror(struct wmOperator *op, int totmirr, int totfail);
+
 /* mesh backup */
 typedef struct BMBackup {
 	struct BMesh *bmcopy;

Modified: trunk/blender/source/blender/editors/mesh/editmesh_select.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/editmesh_select.c	2013-06-05 03:10:29 UTC (rev 57244)
+++ trunk/blender/source/blender/editors/mesh/editmesh_select.c	2013-06-05 05:58:51 UTC (rev 57245)
@@ -73,11 +73,16 @@
 
 /* ****************************** MIRROR **************** */
 
-void EDBM_select_mirrored(Object *UNUSED(obedit), BMEditMesh *em, bool extend)
+void EDBM_select_mirrored(BMEditMesh *em, bool extend,
+                          int *r_totmirr, int *r_totfail)
 {
 	BMVert *v1, *v2;
 	BMIter iter;
+	int totmirr = 0;
+	int totfail = 0;
 
+	*r_totmirr = *r_totfail = 0;
+
 	BM_ITER_MESH (v1, &iter, em->bm, BM_VERTS_OF_MESH) {
 		if (!BM_elem_flag_test(v1, BM_ELEM_SELECT) || BM_elem_flag_test(v1, BM_ELEM_HIDDEN)) {
 			BM_elem_flag_disable(v1, BM_ELEM_TAG);
@@ -87,7 +92,7 @@
 		}
 	}
 
-	EDBM_verts_mirror_cache_begin(em, true);
+	EDBM_verts_mirror_cache_begin(em, true, true);
 
 	if (!extend)
 		EDBM_flag_disable_all(em, BM_ELEM_SELECT);
@@ -97,12 +102,21 @@
 			continue;
 
 		v2 = EDBM_verts_mirror_get(em, v1);
-		if (v2 && !BM_elem_flag_test(v2, BM_ELEM_HIDDEN)) {
-			BM_vert_select_set(em->bm, v2, true);
+		if (v2) {
+			if (!BM_elem_flag_test(v2, BM_ELEM_HIDDEN)) {
+				BM_vert_select_set(em->bm, v2, true);
+				totmirr++;
+			}
 		}
+		else {
+			totfail++;
+		}
 	}
 
 	EDBM_verts_mirror_cache_end(em);
+
+	*r_totmirr = totmirr;
+	*r_totfail = totfail;
 }
 
 void EDBM_automerge(Scene *scene, Object *obedit, bool update)
@@ -2206,9 +2220,14 @@
 	bool extend = RNA_boolean_get(op->ptr, "extend");
 
 	if (em->bm->totvert && em->bm->totvertsel) {
-		EDBM_select_mirrored(obedit, em, extend);
-		EDBM_selectmode_flush(em);
-		WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
+		int totmirr, totfail;
+		EDBM_select_mirrored(em, extend, &totmirr, &totfail);
+		if (totmirr) {
+			EDBM_selectmode_flush(em);
+			WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
+		}
+
+		ED_mesh_report_mirror(op, totmirr, totfail);
 	}
 
 	return OPERATOR_FINISHED;

Modified: trunk/blender/source/blender/editors/mesh/editmesh_tools.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/editmesh_tools.c	2013-06-05 03:10:29 UTC (rev 57244)
+++ trunk/blender/source/blender/editors/mesh/editmesh_tools.c	2013-06-05 05:58:51 UTC (rev 57245)
@@ -1121,7 +1121,7 @@
 
 	/* mirror before smooth */
 	if (((Mesh *)obedit->data)->editflag & ME_EDIT_MIRROR_X) {
-		EDBM_verts_mirror_cache_begin(em, true);
+		EDBM_verts_mirror_cache_begin(em, false, true);
 	}
 
 	/* if there is a mirror modifier with clipping, flag the verts that
@@ -1212,7 +1212,7 @@
 
 	/* mirror before smooth */
 	if (((Mesh *)obedit->data)->editflag & ME_EDIT_MIRROR_X) {
-		EDBM_verts_mirror_cache_begin(em, true);
+		EDBM_verts_mirror_cache_begin(em, false, true);
 	}
 
 	repeat = RNA_int_get(op->ptr, "repeat");

Modified: trunk/blender/source/blender/editors/mesh/editmesh_utils.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/editmesh_utils.c	2013-06-05 03:10:29 UTC (rev 57244)
+++ trunk/blender/source/blender/editors/mesh/editmesh_utils.c	2013-06-05 05:58:51 UTC (rev 57245)
@@ -1134,6 +1134,9 @@
  *  ...
  *  EDBM_verts_mirror_cache_end(em);
  *
+ * \param use_self  Allow a vertex to reference its self.
+ * \param use_select  Only cache selected verts.
+ *
  * \note why do we only allow x axis mirror editing?
  */
 
@@ -1141,13 +1144,14 @@
  * preference */
 #define BM_SEARCH_MAXDIST_MIRR 0.00002f
 #define BM_CD_LAYER_ID "__mirror_index"
-void EDBM_verts_mirror_cache_begin(BMEditMesh *em, const bool use_select)
+void EDBM_verts_mirror_cache_begin(BMEditMesh *em, const bool use_self, const bool use_select)
 {
 	Mesh *me = (Mesh *)em->ob->data;
 	BMesh *bm = em->bm;
 	BMIter iter;
 	BMVert *v;
-	int li, topo = 0;
+	bool topo = false;
+	int cd_vmirr_offset;
 
 	/* one or the other is used depending if topo is enabled */
 	struct BMBVHTree *tree = NULL;
@@ -1159,13 +1163,16 @@
 
 	EDBM_index_arrays_ensure(em, BM_VERT);
 
-	if (!CustomData_get_layer_named(&bm->vdata, CD_PROP_INT, BM_CD_LAYER_ID)) {
+	em->mirror_cdlayer = CustomData_get_named_layer_index(&bm->vdata, CD_PROP_INT, BM_CD_LAYER_ID);
+	if (em->mirror_cdlayer == -1) {
 		BM_data_layer_add_named(bm, &bm->vdata, CD_PROP_INT, BM_CD_LAYER_ID);
+		em->mirror_cdlayer = CustomData_get_named_layer_index(&bm->vdata, CD_PROP_INT, BM_CD_LAYER_ID);
 	}
 
-	li = CustomData_get_named_layer_index(&bm->vdata, CD_PROP_INT, BM_CD_LAYER_ID);
+	cd_vmirr_offset = CustomData_get_n_offset(&bm->vdata, CD_PROP_INT,
+	                                          em->mirror_cdlayer - CustomData_get_layer_index(&bm->vdata, CD_PROP_INT));
 
-	bm->vdata.layers[li].flag |= CD_FLAG_TEMPORARY;
+	bm->vdata.layers[em->mirror_cdlayer].flag |= CD_FLAG_TEMPORARY;
 
 	BM_mesh_elem_index_ensure(bm, BM_VERT);
 
@@ -1183,20 +1190,20 @@
 			/* do nothing */
 		}
 		else {
-			BMVert *mirr;
-			int *idx = CustomData_bmesh_get_layer_n(&bm->vdata, v->head.data, li);
+			BMVert *v_mirr;
+			int *idx = BM_ELEM_CD_GET_VOID_P(v, cd_vmirr_offset);
 
 			if (topo) {
-				mirr = cache_mirr_intptr_as_bmvert(mesh_topo_store.index_lookup, BM_elem_index_get(v));
+				v_mirr = cache_mirr_intptr_as_bmvert(mesh_topo_store.index_lookup, BM_elem_index_get(v));
 			}
 			else {
 				float co[3] = {-v->co[0], v->co[1], v->co[2]};
-				mirr = BKE_bmbvh_find_vert_closest(tree, co, BM_SEARCH_MAXDIST_MIRR);
+				v_mirr = BKE_bmbvh_find_vert_closest(tree, co, BM_SEARCH_MAXDIST_MIRR);
 			}
 
-			if (mirr && mirr != v) {
-				*idx = BM_elem_index_get(mirr);
-				idx = CustomData_bmesh_get_layer_n(&bm->vdata, mirr->head.data, li);
+			if (v_mirr && (use_self || (v_mirr != v))) {
+				*idx = BM_elem_index_get(v_mirr);
+				idx = BM_ELEM_CD_GET_VOID_P(v_mirr, cd_vmirr_offset);
 				*idx = BM_elem_index_get(v);
 			}
 			else {
@@ -1213,8 +1220,6 @@
 	else {
 		BKE_bmbvh_free(tree);
 	}
-
-	em->mirror_cdlayer = li;
 }
 
 BMVert *EDBM_verts_mirror_get(BMEditMesh *em, BMVert *v)

Modified: trunk/blender/source/blender/editors/mesh/mesh_data.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/mesh_data.c	2013-06-05 03:10:29 UTC (rev 57244)
+++ trunk/blender/source/blender/editors/mesh/mesh_data.c	2013-06-05 05:58:51 UTC (rev 57245)
@@ -1243,3 +1243,13 @@
 		BKE_mesh_tessface_calc(mesh);
 	}
 }
+
+void ED_mesh_report_mirror(wmOperator *op, int totmirr, int totfail)
+{
+	if (totfail) {
+		BKE_reportf(op->reports, RPT_WARNING, "%d vertices mirrored, %d failed", totmirr, totfail);
+	}
+	else {
+		BKE_reportf(op->reports, RPT_INFO, "%d vertices mirrored", totmirr);
+	}
+}

Modified: trunk/blender/source/blender/editors/object/object_shapekey.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_shapekey.c	2013-06-05 03:10:29 UTC (rev 57244)
+++ trunk/blender/source/blender/editors/object/object_shapekey.c	2013-06-05 05:58:51 UTC (rev 57245)
@@ -152,11 +152,15 @@
 	return 1;
 }
 
-static int object_shape_key_mirror(bContext *C, Object *ob)
+static bool object_shape_key_mirror(bContext *C, Object *ob,
+                                    int *r_totmirr, int *r_totfail)
 {
 	KeyBlock *kb;
 	Key *key;
+	int totmirr = 0, totfail = 0;
 
+	*r_totmirr = *r_totfail = 0;
+
 	key = BKE_key_from_object(ob);
 	if (key == NULL)
 		return 0;
@@ -182,6 +186,7 @@
 					fp1 = ((float *)kb->data) + i1 * 3;
 					fp1[0] = -fp1[0];
 					tag_elem[i1] = 1;
+					totmirr++;
 				}
 				else if (i2 != -1) {
 					if (tag_elem[i1] == 0 && tag_elem[i2] == 0) {
@@ -195,9 +200,13 @@
 						/* flip x axis */
 						fp1[0] = -fp1[0];
 						fp2[0] = -fp2[0];
+						totmirr++;
 					}
 					tag_elem[i1] = tag_elem[i2] = 1;
 				}
+				else {
+					totfail++;
+				}
 			}
 
 			mesh_octree_table(ob, NULL, NULL, 'e');
@@ -224,6 +233,7 @@
 							i1 = LT_INDEX(lt, u, v, w);

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list