[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [58498] trunk/blender/source: transform was flushing the selection (inline), now skip this and use the selection as-is.

Campbell Barton ideasman42 at gmail.com
Mon Jul 22 12:44:25 CEST 2013


Revision: 58498
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=58498
Author:   campbellbarton
Date:     2013-07-22 10:44:24 +0000 (Mon, 22 Jul 2013)
Log Message:
-----------
transform was flushing the selection (inline), now skip this and use the selection as-is.
flush the selection on entering editmode instead (since the selection mode can be changed with another mesh).
is other tools leave the selection incorrectly flushed, those will need to be fixed so transform works as expected.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/include/ED_mesh.h
    trunk/blender/source/blender/editors/mesh/editmesh_utils.c
    trunk/blender/source/blender/editors/mesh/mesh_data.c
    trunk/blender/source/blender/editors/mesh/meshtools.c
    trunk/blender/source/blender/editors/object/object_edit.c
    trunk/blender/source/blender/editors/object/object_hook.c
    trunk/blender/source/blender/editors/object/object_relations.c
    trunk/blender/source/blender/editors/transform/transform_conversions.c
    trunk/blender/source/blender/makesrna/intern/rna_object.c
    trunk/blender/source/blenderplayer/bad_level_call_stubs/stubs.c

Modified: trunk/blender/source/blender/editors/include/ED_mesh.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_mesh.h	2013-07-22 09:32:07 UTC (rev 58497)
+++ trunk/blender/source/blender/editors/include/ED_mesh.h	2013-07-22 10:44:24 UTC (rev 58498)
@@ -92,7 +92,7 @@
 void EDBM_mesh_clear(struct BMEditMesh *em);
 
 void EDBM_selectmode_to_scene(struct bContext *C);
-void EDBM_mesh_make(struct ToolSettings *ts, struct Scene *scene, struct Object *ob);
+void EDBM_mesh_make(struct ToolSettings *ts, struct Object *ob);
 void EDBM_mesh_free(struct BMEditMesh *em);
 void EDBM_mesh_load(struct Object *ob);
 struct DerivedMesh *EDBM_mesh_deform_dm_get(struct BMEditMesh *em);

Modified: trunk/blender/source/blender/editors/mesh/editmesh_utils.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/editmesh_utils.c	2013-07-22 09:32:07 UTC (rev 58497)
+++ trunk/blender/source/blender/editors/mesh/editmesh_utils.c	2013-07-22 10:44:24 UTC (rev 58498)
@@ -341,7 +341,7 @@
 	WM_event_add_notifier(C, NC_SCENE | ND_TOOLSETTINGS, scene);
 }
 
-void EDBM_mesh_make(ToolSettings *ts, Scene *UNUSED(scene), Object *ob)
+void EDBM_mesh_make(ToolSettings *ts, Object *ob)
 {
 	Mesh *me = ob->data;
 	BMesh *bm;
@@ -368,8 +368,10 @@
 
 	me->edit_btmesh->selectmode = me->edit_btmesh->bm->selectmode = ts->selectmode;
 	me->edit_btmesh->mat_nr = (ob->actcol > 0) ? ob->actcol - 1 : 0;
+	me->edit_btmesh->ob = ob;
 
-	me->edit_btmesh->ob = ob;
+	/* we need to flush selection because the mode may have changed from when last in editmode */
+	EDBM_selectmode_flush(me->edit_btmesh);
 }
 
 void EDBM_mesh_load(Object *ob)

Modified: trunk/blender/source/blender/editors/mesh/mesh_data.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/mesh_data.c	2013-07-22 09:32:07 UTC (rev 58497)
+++ trunk/blender/source/blender/editors/mesh/mesh_data.c	2013-07-22 10:44:24 UTC (rev 58498)
@@ -567,7 +567,7 @@
 	obedit = base->object;
 	me = obedit->data;
 	if (me->edit_btmesh == NULL) {
-		EDBM_mesh_make(scene->toolsettings, scene, obedit);
+		EDBM_mesh_make(scene->toolsettings, obedit);
 		exitmode = 1;
 	}
 	if (me->edit_btmesh == NULL)

Modified: trunk/blender/source/blender/editors/mesh/meshtools.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/meshtools.c	2013-07-22 09:32:07 UTC (rev 58497)
+++ trunk/blender/source/blender/editors/mesh/meshtools.c	2013-07-22 10:44:24 UTC (rev 58498)
@@ -570,7 +570,7 @@
 	ED_object_editmode_exit(C, EM_FREEDATA | EM_WAITCURSOR | EM_DO_UNDO);
 #else
 	/* toggle editmode using lower level functions so this can be called from python */
-	EDBM_mesh_make(scene->toolsettings, scene, ob);
+	EDBM_mesh_make(scene->toolsettings, ob);
 	EDBM_mesh_load(ob);
 	EDBM_mesh_free(me->edit_btmesh);
 	MEM_freeN(me->edit_btmesh);

Modified: trunk/blender/source/blender/editors/object/object_edit.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_edit.c	2013-07-22 09:32:07 UTC (rev 58497)
+++ trunk/blender/source/blender/editors/object/object_edit.c	2013-07-22 10:44:24 UTC (rev 58498)
@@ -478,7 +478,7 @@
 		ok = 1;
 		scene->obedit = ob;  /* context sees this */
 
-		EDBM_mesh_make(CTX_data_tool_settings(C), scene, ob);
+		EDBM_mesh_make(scene->toolsettings, ob);
 
 		em = BKE_editmesh_from_object(ob);
 		if (LIKELY(em)) {

Modified: trunk/blender/source/blender/editors/object/object_hook.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_hook.c	2013-07-22 09:32:07 UTC (rev 58497)
+++ trunk/blender/source/blender/editors/object/object_hook.c	2013-07-22 10:44:24 UTC (rev 58498)
@@ -310,7 +310,7 @@
 			BMEditMesh *em;
 
 			EDBM_mesh_load(obedit);
-			EDBM_mesh_make(scene->toolsettings, scene, obedit);
+			EDBM_mesh_make(scene->toolsettings, obedit);
 
 			em = me->edit_btmesh;
 

Modified: trunk/blender/source/blender/editors/object/object_relations.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_relations.c	2013-07-22 09:32:07 UTC (rev 58497)
+++ trunk/blender/source/blender/editors/object/object_relations.c	2013-07-22 10:44:24 UTC (rev 58498)
@@ -136,7 +136,7 @@
 		BMEditMesh *em;
 
 		EDBM_mesh_load(obedit);
-		EDBM_mesh_make(scene->toolsettings, scene, obedit);
+		EDBM_mesh_make(scene->toolsettings, obedit);
 
 		em = me->edit_btmesh;
 

Modified: trunk/blender/source/blender/editors/transform/transform_conversions.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform_conversions.c	2013-07-22 09:32:07 UTC (rev 58497)
+++ trunk/blender/source/blender/editors/transform/transform_conversions.c	2013-07-22 10:44:24 UTC (rev 58498)
@@ -1943,6 +1943,8 @@
 static void VertsToTransData(TransInfo *t, TransData *td, TransDataExtension *tx,
                              BMEditMesh *em, BMVert *eve, float *bweight)
 {
+	BLI_assert(BM_elem_flag_test(eve, BM_ELEM_HIDDEN) == 0);
+
 	td->flag = 0;
 	//if (key)
 	//	td->loc = key->co;
@@ -2034,81 +2036,42 @@
 	int count = 0, countsel = 0, a, totleft;
 	int propmode = (t->flag & T_PROP_EDIT) ? (t->flag & T_PROP_EDIT_ALL) : 0;
 	int mirror = 0;
-	char *selstate = NULL;
 	short selectmode = ts->selectmode;
 	int cd_vert_bweight_offset = -1;
 	bool use_topology = (me->editflag & ME_EDIT_MIRROR_TOPO) != 0;
 
+	/* BMESH_TODO, writing into the index values is BAD!, means we cant
+	 * use the values for vertex mirror - campbell */
+
 	if (t->flag & T_MIRROR) {
 		EDBM_verts_mirror_cache_begin(em, 0, false, (t->flag & T_PROP_EDIT) == 0, use_topology);
 		mirror = 1;
 	}
 
-	/* edge slide forces edge select */
-	if (t->mode == TFM_EDGE_SLIDE) {
-		selectmode = SCE_SELECT_EDGE;
-	}
-
-	/* BMESH_TODO, writing into the index values is BAD!, means we cant
-	 * use the values for vertex mirror - campbell */
-
-	// transform now requires awareness for select mode, so we tag the f1 flags in verts
+	/* quick check if we can transform */
+	/* note: in prop mode we need at least 1 selected */
 	if (selectmode & SCE_SELECT_VERTEX) {
-		BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
-			BM_elem_flag_set(eve, BM_ELEM_TAG, BM_elem_flag_test(eve, BM_ELEM_SELECT));
+		if (bm->totvertsel == 0) {
+			goto cleanup;
 		}
 	}
 	else if (selectmode & SCE_SELECT_EDGE) {
-		BMEdge *eed;
-
-		eve = BM_iter_new(&iter, bm, BM_VERTS_OF_MESH, NULL);
-		for (; eve; eve = BM_iter_step(&iter)) BM_elem_flag_disable(eve, BM_ELEM_TAG);
-
-		eed = BM_iter_new(&iter, bm, BM_EDGES_OF_MESH, NULL);
-		for (; eed; eed = BM_iter_step(&iter)) {
-			if (BM_elem_flag_test(eed, BM_ELEM_SELECT)) {
-				BM_elem_flag_enable(eed->v1, BM_ELEM_TAG);
-				BM_elem_flag_enable(eed->v2, BM_ELEM_TAG);
-			}
+		if (bm->totvertsel == 0 || bm->totedgesel == 0) {
+			goto cleanup;
 		}
 	}
-	else {
-		BMFace *efa;
-		eve = BM_iter_new(&iter, bm, BM_VERTS_OF_MESH, NULL);
-		for (; eve; eve = BM_iter_step(&iter)) BM_elem_flag_disable(eve, BM_ELEM_TAG);
-
-		efa = BM_iter_new(&iter, bm, BM_FACES_OF_MESH, NULL);
-		for (; efa; efa = BM_iter_step(&iter)) {
-			if (BM_elem_flag_test(efa, BM_ELEM_SELECT)) {
-				BMIter liter;
-				BMLoop *l;
-
-				l = BM_iter_new(&liter, bm, BM_LOOPS_OF_FACE, efa);
-				for (; l; l = BM_iter_step(&liter)) {
-					BM_elem_flag_enable(l->v, BM_ELEM_TAG);
-				}
-			}
+	else if (selectmode & SCE_SELECT_FACE) {
+		if (bm->totvertsel == 0 || bm->totfacesel == 0) {
+			goto cleanup;
 		}
 	}
-
-	/* now we can count. we store selection state in selstate, since
-	 * get_crazy_mapped_editverts messes up the index state of the
-	 * verts*/
-	selstate = MEM_callocN(sizeof(*selstate) * bm->totvert, __func__);
-	eve = BM_iter_new(&iter, bm, BM_VERTS_OF_MESH, NULL);
-	for (a = 0; eve; eve = BM_iter_step(&iter), a++) {
-		if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) {
-			if (BM_elem_flag_test(eve, BM_ELEM_TAG)) {
-				selstate[a] = 1;
-				countsel++;
-			}
-			if (propmode) count++;
-		}
+	else {
+		BLI_assert(0);
 	}
 
-	/* note: in prop mode we need at least 1 selected */
-	if (countsel == 0) {
-		goto cleanup;
+	countsel = bm->totvertsel;
+	if (propmode) {
+		count = bm->totvert;
 	}
 
 	/* check active */
@@ -2174,9 +2137,8 @@
 
 	/* find out which half we do */
 	if (mirror) {
-		eve = BM_iter_new(&iter, bm, BM_VERTS_OF_MESH, NULL);
-		for (a = 0; eve; eve = BM_iter_step(&iter), a++) {
-			if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN) && selstate[a] && eve->co[0] != 0.0f) {
+		BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
+			if (BM_elem_flag_test(eve, BM_ELEM_SELECT) && eve->co[0] != 0.0f) {
 				if (eve->co[0] < 0.0f) {
 					t->mirror = -1;
 					mirror = -1;
@@ -2188,7 +2150,7 @@
 
 	BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, a) {
 		if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) {
-			if (propmode || selstate[a]) {
+			if (propmode || BM_elem_flag_test(eve, BM_ELEM_SELECT)) {
 				float *bweight = (cd_vert_bweight_offset != -1) ? BM_ELEM_CD_GET_VOID_P(eve, cd_vert_bweight_offset) : NULL;
 				
 				VertsToTransData(t, tob, tx, em, eve, bweight);
@@ -2196,7 +2158,8 @@
 					tx++;
 
 				/* selected */
-				if (selstate[a]) tob->flag |= TD_SELECTED;
+				if (BM_elem_flag_test(eve, BM_ELEM_SELECT))
+					tob->flag |= TD_SELECTED;
 
 				/* active */
 				if (eve == eve_act) tob->flag |= TD_ACTIVE;
@@ -2267,8 +2230,6 @@
 		MEM_freeN(defmats);
 	if (dists)
 		MEM_freeN(dists);
-	
-	MEM_freeN(selstate);
 
 	if (t->flag & T_MIRROR) {
 		EDBM_verts_mirror_cache_end(em);

Modified: trunk/blender/source/blender/makesrna/intern/rna_object.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_object.c	2013-07-22 09:32:07 UTC (rev 58497)
+++ trunk/blender/source/blender/makesrna/intern/rna_object.c	2013-07-22 10:44:24 UTC (rev 58498)
@@ -266,7 +266,7 @@
 		switch (ob->type) {
 			case OB_MESH:
 				EDBM_mesh_load(ob);
-				EDBM_mesh_make(scene->toolsettings, scene, ob);
+				EDBM_mesh_make(scene->toolsettings, ob);
 				EDBM_mesh_normals_update(((Mesh *)ob->data)->edit_btmesh);
 				BKE_editmesh_tessface_calc(((Mesh *)ob->data)->edit_btmesh);
 				break;

Modified: trunk/blender/source/blenderplayer/bad_level_call_stubs/stubs.c

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list