Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArystanbek Dyussenov <arystan.d@gmail.com>2010-09-04 22:49:07 +0400
committerArystanbek Dyussenov <arystan.d@gmail.com>2010-09-04 22:49:07 +0400
commit90b464d3728d9ed8ec26fdf59058d236b99dbcd9 (patch)
treee88cab4fb1358e962b19f658064ca8c9f8d29f5b /source/blender/editors/mesh/editmesh.c
parent08d02dd04d836976b25793bb1d4c6a86b3f924c7 (diff)
parentb0b787ef38f9947b3176642556f5282eb3518f69 (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.c62
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);