diff options
author | Arystanbek Dyussenov <arystan.d@gmail.com> | 2010-09-04 22:49:07 +0400 |
---|---|---|
committer | Arystanbek Dyussenov <arystan.d@gmail.com> | 2010-09-04 22:49:07 +0400 |
commit | 90b464d3728d9ed8ec26fdf59058d236b99dbcd9 (patch) | |
tree | e88cab4fb1358e962b19f658064ca8c9f8d29f5b /source/blender/editors/mesh/editmesh.c | |
parent | 08d02dd04d836976b25793bb1d4c6a86b3f924c7 (diff) | |
parent | b0b787ef38f9947b3176642556f5282eb3518f69 (diff) |
COLLADA branch: merge from trunk -r 28015:31610.soc-2009-chingachgook
Diffstat (limited to 'source/blender/editors/mesh/editmesh.c')
-rw-r--r-- | source/blender/editors/mesh/editmesh.c | 62 |
1 files changed, 34 insertions, 28 deletions
diff --git a/source/blender/editors/mesh/editmesh.c b/source/blender/editors/mesh/editmesh.c index e3f0d96ccfc..e6ba228c260 100644 --- a/source/blender/editors/mesh/editmesh.c +++ b/source/blender/editors/mesh/editmesh.c @@ -32,8 +32,11 @@ #include "MEM_guardedalloc.h" - +#include "DNA_scene_types.h" +#include "DNA_object_types.h" #include "DNA_key_types.h" +#include "DNA_meshdata_types.h" +#include "DNA_modifier_types.h" #include "BLI_blenlib.h" #include "BLI_math.h" @@ -41,27 +44,15 @@ #include "BLI_dynstr.h" #include "BLI_rand.h" -#include "BKE_cloth.h" +#include "BKE_DerivedMesh.h" #include "BKE_context.h" -#include "BKE_customdata.h" #include "BKE_depsgraph.h" -#include "BKE_DerivedMesh.h" #include "BKE_global.h" #include "BKE_key.h" -#include "BKE_library.h" #include "BKE_main.h" #include "BKE_material.h" #include "BKE_mesh.h" -#include "BKE_modifier.h" -#include "BKE_object.h" #include "BKE_paint.h" -#include "BKE_pointcache.h" -#include "BKE_softbody.h" -#include "BKE_texture.h" -#include "BKE_utildefines.h" - -#include "LBM_fluidsim.h" - #include "ED_mesh.h" #include "ED_object.h" @@ -87,8 +78,8 @@ editmesh.c: */ /* XXX */ -static void BIF_undo_push() {} -static void error() {} +static void BIF_undo_push(const char *dummy) {} +static void error(const char *dummy) {} /* ***************** HASH ********************* */ @@ -1333,7 +1324,7 @@ static EnumPropertyItem prop_separate_types[] = { }; /* return 1: success */ -static int mesh_separate_selected(Scene *scene, Base *editbase) +static int mesh_separate_selected(Main *bmain, Scene *scene, Base *editbase) { EditMesh *em, *emnew; EditVert *eve, *v1; @@ -1375,7 +1366,7 @@ static int mesh_separate_selected(Scene *scene, Base *editbase) */ /* 1 */ - basenew= ED_object_add_duplicate(scene, editbase, 0); /* 0 = fully linked */ + basenew= ED_object_add_duplicate(bmain, scene, editbase, 0); /* 0 = fully linked */ ED_base_object_select(basenew, BA_DESELECT); /* 2 */ @@ -1444,7 +1435,7 @@ static int mesh_separate_selected(Scene *scene, Base *editbase) } /* return 1: success */ -static int mesh_separate_material(Scene *scene, Base *editbase) +static int mesh_separate_material(Main *bmain, Scene *scene, Base *editbase) { Mesh *me= editbase->object->data; EditMesh *em= BKE_mesh_get_editmesh(me); @@ -1456,7 +1447,7 @@ static int mesh_separate_material(Scene *scene, Base *editbase) /* select the material */ EM_select_by_material(em, curr_mat); /* and now separate */ - if(0==mesh_separate_selected(scene, editbase)) { + if(0==mesh_separate_selected(bmain, scene, editbase)) { BKE_mesh_end_editmesh(me, em); return 0; } @@ -1467,7 +1458,7 @@ static int mesh_separate_material(Scene *scene, Base *editbase) } /* return 1: success */ -static int mesh_separate_loose(Scene *scene, Base *editbase) +static int mesh_separate_loose(Main *bmain, Scene *scene, Base *editbase) { Mesh *me; EditMesh *em; @@ -1483,10 +1474,18 @@ static int mesh_separate_loose(Scene *scene, Base *editbase) } EM_clear_flag_all(em, SELECT); - - while(doit && em->verts.first) { + + while(doit) { /* Select a random vert to start with */ - EditVert *eve= em->verts.first; + EditVert *eve; + int tot; + + /* check if all verts that are visible have been done */ + for(eve=em->verts.first; eve; eve= eve->next) + if(!eve->h) break; + if(eve==NULL) break; /* only hidden verts left, quit early */ + + /* first non hidden vert */ eve->f |= SELECT; selectconnected_mesh_all(em); @@ -1496,8 +1495,14 @@ static int mesh_separate_loose(Scene *scene, Base *editbase) if((eve->f & SELECT)==0) break; if(eve==NULL) break; + tot= BLI_countlist(&em->verts); + /* and now separate */ - doit= mesh_separate_selected(scene, editbase); + doit= mesh_separate_selected(bmain, scene, editbase); + + /* with hidden verts this can happen */ + if(tot == BLI_countlist(&em->verts)) + break; } BKE_mesh_end_editmesh(me, em); @@ -1507,16 +1512,17 @@ static int mesh_separate_loose(Scene *scene, Base *editbase) static int mesh_separate_exec(bContext *C, wmOperator *op) { + Main *bmain= CTX_data_main(C); Scene *scene= CTX_data_scene(C); Base *base= CTX_data_active_base(C); int retval= 0, type= RNA_enum_get(op->ptr, "type"); if(type == 0) - retval= mesh_separate_selected(scene, base); + retval= mesh_separate_selected(bmain, scene, base); else if(type == 1) - retval= mesh_separate_material (scene, base); + retval= mesh_separate_material(bmain, scene, base); else if(type == 2) - retval= mesh_separate_loose(scene, base); + retval= mesh_separate_loose(bmain, scene, base); if(retval) { WM_event_add_notifier(C, NC_GEOM|ND_DATA, base->object->data); |