[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [45695] trunk/blender: fix [#30972] Editmesh split by materials not working.

Campbell Barton ideasman42 at gmail.com
Mon Apr 16 15:49:05 CEST 2012


Revision: 45695
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=45695
Author:   campbellbarton
Date:     2012-04-16 13:49:04 +0000 (Mon, 16 Apr 2012)
Log Message:
-----------
fix [#30972] Editmesh split by materials not working.

Modified Paths:
--------------
    trunk/blender/release/scripts/startup/bl_ui/space_view3d.py
    trunk/blender/source/blender/editors/mesh/editmesh_tools.c

Modified: trunk/blender/release/scripts/startup/bl_ui/space_view3d.py
===================================================================
--- trunk/blender/release/scripts/startup/bl_ui/space_view3d.py	2012-04-16 12:57:11 UTC (rev 45694)
+++ trunk/blender/release/scripts/startup/bl_ui/space_view3d.py	2012-04-16 13:49:04 UTC (rev 45695)
@@ -1680,7 +1680,7 @@
         layout.operator("mesh.merge")
         layout.operator("mesh.rip_move")
         layout.operator("mesh.split")
-        layout.operator("mesh.separate")
+        layout.operator_menu_enum("mesh.separate", "type")
         layout.operator("mesh.vert_connect")
         layout.operator("mesh.vert_slide")
 

Modified: trunk/blender/source/blender/editors/mesh/editmesh_tools.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/editmesh_tools.c	2012-04-16 12:57:11 UTC (rev 45694)
+++ trunk/blender/source/blender/editors/mesh/editmesh_tools.c	2012-04-16 13:49:04 UTC (rev 45695)
@@ -3131,7 +3131,7 @@
 	BMesh *bm_new;
 	
 	if (!em)
-		return OPERATOR_CANCELLED;
+		return FALSE;
 		
 	bm_new = BM_mesh_create(&bm_mesh_allocsize_default);
 	CustomData_copy(&em->bm->vdata, &bm_new->vdata, CD_MASK_BMESH, CD_CALLOC, 0);
@@ -3182,13 +3182,41 @@
 	BM_mesh_free(bm_new);
 	((Mesh *)basenew->object->data)->edit_btmesh = NULL;
 	
-	return 1;
+	return TRUE;
 }
 
-//BMESH_TODO
-static int mesh_separate_material(Main *UNUSED(bmain), Scene *UNUSED(scene), Base *UNUSED(editbase), wmOperator *UNUSED(wmop))
+static int mesh_separate_material(Main *bmain, Scene *scene, Base *editbase, wmOperator *wmop)
 {
-	return 0;
+	BMFace *f_cmp, *f;
+	BMIter iter;
+	int result = FALSE;
+	Object *obedit = editbase->object;
+	BMEditMesh *em = BMEdit_FromObject(obedit);
+	BMesh *bm = em->bm;
+
+	EDBM_flag_disable_all(em, BM_ELEM_SELECT);
+
+	while ((f_cmp = BM_iter_at_index(bm, BM_FACES_OF_MESH, NULL, 0))) {
+		const short mat_nr = f_cmp->mat_nr;
+		int tot = 0;
+
+		BM_ITER(f, &iter, bm, BM_FACES_OF_MESH, NULL) {
+			if (f->mat_nr == mat_nr) {
+				BM_face_select_set(bm, f, TRUE);
+				tot++;
+			}
+		}
+
+		/* leave the current object with some materials */
+		if (tot == bm->totface) {
+			break;
+		}
+
+		/* Move selection into a separate object */
+		result |= mesh_separate_selected(bmain, scene, editbase, wmop);
+	}
+
+	return result;
 }
 
 static int mesh_separate_loose(Main *bmain, Scene *scene, Base *editbase, wmOperator *wmop)
@@ -3199,22 +3227,15 @@
 	BMVert *v_seed;
 	BMWalker walker;
 	BMIter iter;
-	int result = 0;
+	int result = FALSE;
 	Object *obedit = editbase->object;
-	Mesh *me = obedit->data;
-	BMEditMesh *em = me->edit_btmesh;
+	BMEditMesh *em = BMEdit_FromObject(obedit);
 	BMesh *bm = em->bm;
 	int max_iter = bm->totvert;
 
 	/* Clear all selected vertices */
-	BM_ITER(v, &iter, bm, BM_VERTS_OF_MESH, NULL) {
-		BM_elem_select_set(bm, v, FALSE);
-	}
+	EDBM_flag_disable_all(em, BM_ELEM_SELECT);
 
-	/* Flush the selection to clear edge/face selections to match
-	 * selected vertices */
-	EDBM_selectmode_flush_ex(em, SCE_SELECT_VERTEX);
-
 	/* A "while (true)" loop should work here as each iteration should
 	 * select and remove at least one vertex and when all vertices
 	 * are selected the loop will break out. But guard against bad




More information about the Bf-blender-cvs mailing list