[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [57493] trunk/blender/source/blender/ editors: fix automerge + mirror, previously only the selected verts would auto-merge.

Campbell Barton ideasman42 at gmail.com
Sun Jun 16 07:13:12 CEST 2013


Revision: 57493
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=57493
Author:   campbellbarton
Date:     2013-06-16 05:13:12 +0000 (Sun, 16 Jun 2013)
Log Message:
-----------
fix automerge + mirror, previously only the selected verts would auto-merge.

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/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-16 04:37:39 UTC (rev 57492)
+++ trunk/blender/source/blender/editors/include/ED_mesh.h	2013-06-16 05:13:12 UTC (rev 57493)
@@ -143,7 +143,7 @@
 /* editmesh_select.c */
 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);
+void EDBM_automerge(struct Scene *scene, struct Object *ob, bool update, const char hflag);
 
 bool EDBM_backbuf_border_init(struct ViewContext *vc, short xmin, short ymin, short xmax, short ymax);
 int  EDBM_backbuf_check(unsigned int index);

Modified: trunk/blender/source/blender/editors/mesh/editmesh_select.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/editmesh_select.c	2013-06-16 04:37:39 UTC (rev 57492)
+++ trunk/blender/source/blender/editors/mesh/editmesh_select.c	2013-06-16 05:13:12 UTC (rev 57493)
@@ -119,26 +119,17 @@
 	*r_totfail = totfail;
 }
 
-void EDBM_automerge(Scene *scene, Object *obedit, bool update)
+void EDBM_automerge(Scene *scene, Object *obedit, bool update, const char hflag)
 {
-	
-	if ((scene->toolsettings->automerge) &&
-	    (obedit && obedit->type == OB_MESH))
-	{
-		int ok;
-		BMEditMesh *em = BKE_editmesh_from_object(obedit);
+	int ok;
+	BMEditMesh *em = BKE_editmesh_from_object(obedit);
 
-		if (!em) {
-			return;
-		}
+	ok = BMO_op_callf(em->bm, BMO_FLAG_DEFAULTS,
+	                  "automerge verts=%hv dist=%f",
+	                  hflag, scene->toolsettings->doublimit);
 
-		ok = BMO_op_callf(em->bm, BMO_FLAG_DEFAULTS,
-		                  "automerge verts=%hv dist=%f",
-		                  BM_ELEM_SELECT, scene->toolsettings->doublimit);
-
-		if (LIKELY(ok) && update) {
-			EDBM_update_generic(em, true, true);
-		}
+	if (LIKELY(ok) && update) {
+		EDBM_update_generic(em, true, true);
 	}
 }
 

Modified: trunk/blender/source/blender/editors/transform/transform_conversions.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform_conversions.c	2013-06-16 04:37:39 UTC (rev 57492)
+++ trunk/blender/source/blender/editors/transform/transform_conversions.c	2013-06-16 05:13:12 UTC (rev 57493)
@@ -5161,6 +5161,40 @@
 	}
 }
 
+static void special_aftertrans_update__mesh(bContext *UNUSED(C), TransInfo *t)
+{
+	/* so automerge supports mirror */
+	if ((t->scene->toolsettings->automerge) &&
+	    (t->obedit && t->obedit->type == OB_MESH))
+	{
+		BMEditMesh *em = BKE_editmesh_from_object(t->obedit);
+		BMesh *bm = em->bm;
+		char hflag;
+
+		if (t->flag & T_MIRROR) {
+			TransData *td;
+			int i;
+
+			/* rather then adjusting the selection (which the user would notice)
+			 * tag all mirrored verts, then automerge those */
+			BM_mesh_elem_hflag_disable_all(bm, BM_VERT, BM_ELEM_TAG, false);
+
+			for (i = 0, td = t->data; i < t->total; i++, td++) {
+				if (td->extra) {
+					BM_elem_flag_enable((BMVert *)td->extra, BM_ELEM_TAG);
+				}
+			}
+
+			hflag = BM_ELEM_SELECT | BM_ELEM_TAG;
+		}
+		else {
+			hflag = BM_ELEM_SELECT;
+		}
+
+		EDBM_automerge(t->scene, t->obedit, true, hflag);
+	}
+}
+
 /* inserting keys, pointcache, redraw events... */
 /* 
  * note: sequencer freeing has its own function now because of a conflict with transform's order of freeing (campbell)
@@ -5193,7 +5227,10 @@
 					 * during cleanup - psy-fi */
 					freeEdgeSlideTempFaces(sld);
 				}
-				EDBM_automerge(t->scene, t->obedit, true);
+
+				if (t->obedit->type == OB_MESH) {
+					special_aftertrans_update__mesh(C, t);
+				}
 			}
 			else {
 				if (t->mode == TFM_EDGE_SLIDE) {




More information about the Bf-blender-cvs mailing list