[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