[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [18751] branches/blender2.5/blender/source /blender/editors: 2.5
Ton Roosendaal
ton at blender.org
Fri Jan 30 16:01:17 CET 2009
Revision: 18751
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18751
Author: ton
Date: 2009-01-30 16:01:14 +0100 (Fri, 30 Jan 2009)
Log Message:
-----------
2.5
Edit mesh: Separate options back. Use SHIFT+P for it, PKEY has been
stolen! :)
Modified Paths:
--------------
branches/blender2.5/blender/source/blender/editors/include/ED_object.h
branches/blender2.5/blender/source/blender/editors/mesh/editmesh.c
branches/blender2.5/blender/source/blender/editors/mesh/mesh_intern.h
branches/blender2.5/blender/source/blender/editors/mesh/mesh_ops.c
branches/blender2.5/blender/source/blender/editors/object/object_edit.c
Modified: branches/blender2.5/blender/source/blender/editors/include/ED_object.h
===================================================================
--- branches/blender2.5/blender/source/blender/editors/include/ED_object.h 2009-01-30 14:23:31 UTC (rev 18750)
+++ branches/blender2.5/blender/source/blender/editors/include/ED_object.h 2009-01-30 15:01:14 UTC (rev 18751)
@@ -40,6 +40,7 @@
struct Mesh;
struct Curve;
+/* object_edit.c */
void ED_operatortypes_object(void);
void ED_keymap_object(struct wmWindowManager *wm);
@@ -51,6 +52,8 @@
void ED_base_object_free_and_unlink(struct Scene *scene, struct Base *base);
void ED_object_apply_obmat(struct Object *ob);
+ /* single object duplicate, if dupflag==0, fully linked, else it uses U.dupflag */
+Base *ED_object_add_duplicate(struct Scene *scene, struct Base *base, int usedupflag);
/* bitflags for enter/exit editmode */
Modified: branches/blender2.5/blender/source/blender/editors/mesh/editmesh.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/mesh/editmesh.c 2009-01-30 14:23:31 UTC (rev 18750)
+++ branches/blender2.5/blender/source/blender/editors/mesh/editmesh.c 2009-01-30 15:01:14 UTC (rev 18751)
@@ -79,8 +79,15 @@
#include "ED_mesh.h"
#include "ED_object.h"
#include "ED_util.h"
+#include "ED_screen.h"
#include "ED_view3d.h"
+#include "RNA_access.h"
+#include "RNA_define.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
/* own include */
#include "mesh_intern.h"
@@ -94,7 +101,6 @@
/* XXX */
static void BIF_undo_push() {}
static void error() {}
-static int pupmenu() {return 0;}
/* ***************** HASH ********************* */
@@ -581,6 +587,7 @@
{
EditEdge *eed;
+ if(em->hashedgetab) MEM_freeN(em->hashedgetab);
em->hashedgetab= NULL;
for(eed=em->edges.first; eed; eed= eed->next) {
@@ -1424,353 +1431,199 @@
BIF_undo_push("Undo all changes");
}
-/* *************** (partial exit editmode) *************/
+/* *************** Operator: separate parts *************/
+static EnumPropertyItem prop_separate_types[] = {
+ {0, "SELECTED", "Selection", ""},
+ {1, "MATERIAL", "By Material", ""},
+ {2, "LOOSE", "By loose parts", ""},
+ {0, NULL, NULL, NULL}
+};
-
-
-void separate_mesh(Scene *scene, Object *obedit)
+/* return 1: success */
+static int mesh_separate_selected(Scene *scene, Base *editbase)
{
- EditMesh *em, emcopy;
+ EditMesh *em, *emnew;
EditVert *eve, *v1;
EditEdge *eed, *e1;
- EditFace *efa, *vl1;
- Object *oldob;
- Mesh *me, *men;
- Base *base, *oldbase;
- ListBase edve, eded, edvl;
+ EditFace *efa, *f1;
+ Object *obedit;
+ Mesh *me, *menew;
+ Base *basenew;
- if(obedit==NULL) return;
-
+ if(editbase==NULL) return 0;
+
+ obedit= editbase->object;
me= obedit->data;
em= me->edit_mesh;
if(me->key) {
error("Can't separate with vertex keys");
- return;
+ return 0;
}
- if(em->selected.first) BLI_freelistN(&(em->selected)); /* clear the selection order */
+ if(em->selected.first)
+ BLI_freelistN(&(em->selected)); /* clear the selection order */
EM_selectmode_set(em); // enforce full consistant selection flags
- /* we are going to abuse the system as follows:
- * 1. add a duplicate object: this will be the new one, we remember old pointer
- * 2: then do a split if needed.
- * 3. put apart: all NOT selected verts, edges, faces
- * 4. call load_editMesh(): this will be the new object
- * 5. freelist and get back old verts, edges, facs
+ EM_stats_update(em);
+
+ if(em->totvertsel==0) return 0;
+
+ /* we are going to work as follows:
+ * 1. add a linked duplicate object: this will be the new one, we remember old pointer
+ * 2. give new object empty mesh and put in editmode
+ * 3: do a split if needed on current editmesh.
+ * 4. copy over: all NOT selected verts, edges, faces
+ * 5. call load_editMesh() on the new object
*/
- /* make only obedit selected */
- base= FIRSTBASE;
- while(base) {
-// XXX if(base->lay & G.vd->lay) {
- if(base->object==obedit) base->flag |= SELECT;
- else base->flag &= ~SELECT;
-// }
- base= base->next;
- }
+ /* 1 */
+ basenew= ED_object_add_duplicate(scene, editbase, 0); /* 0 = fully linked */
+ ED_base_object_select(basenew, BA_DESELECT);
- /* no test for split, split doesn't split when a loose part is selected */
+ /* 2 */
+ basenew->object->data= menew= add_mesh(me->id.name); /* empty */
+ me->id.us--;
+ make_editMesh(scene, basenew->object);
+ emnew= menew->edit_mesh;
+
+ /* 3 */
/* SPLIT: first make duplicate */
adduplicateflag(em, SELECT);
-
/* SPLIT: old faces have 3x flag 128 set, delete these ones */
delfaceflag(em, 128);
-
/* since we do tricky things with verts/edges/faces, this makes sure all is selected coherent */
EM_selectmode_set(em);
- /* set apart: everything that is not selected */
- edve.first= edve.last= eded.first= eded.last= edvl.first= edvl.last= 0;
- eve= em->verts.first;
- while(eve) {
+ /* 4 */
+ /* move over: everything that is selected */
+ for(eve= em->verts.first; eve; eve= v1) {
v1= eve->next;
- if((eve->f & SELECT)==0) {
+ if(eve->f & SELECT) {
BLI_remlink(&em->verts, eve);
- BLI_addtail(&edve, eve);
+ BLI_addtail(&emnew->verts, eve);
}
-
- eve= v1;
}
- eed= em->edges.first;
- while(eed) {
+
+ for(eed= em->edges.first; eed; eed= e1) {
e1= eed->next;
- if((eed->f & SELECT)==0) {
+ if(eed->f & SELECT) {
BLI_remlink(&em->edges, eed);
- BLI_addtail(&eded, eed);
+ BLI_addtail(&emnew->edges, eed);
}
- eed= e1;
}
- efa= em->faces.first;
- while(efa) {
- vl1= efa->next;
+
+ for(efa= em->faces.first; efa; efa= f1) {
+ f1= efa->next;
if (efa == em->act_face && (efa->f & SELECT)) {
EM_set_actFace(em, NULL);
}
- if((efa->f & SELECT)==0) {
+ if(efa->f & SELECT) {
BLI_remlink(&em->faces, efa);
- BLI_addtail(&edvl, efa);
+ BLI_addtail(&emnew->faces, efa);
}
- efa= vl1;
}
+
+ /* 5 */
+ load_editMesh(scene, basenew->object);
+ free_editMesh(emnew);
- oldob= obedit;
- oldbase= BASACT;
-
-// XXX adduplicate(1, 0); /* notrans and a linked duplicate */
-
- obedit= BASACT->object; /* basact was set in adduplicate() */
-
- men= copy_mesh(me);
- set_mesh(obedit, men);
- /* because new mesh is a copy: reduce user count */
- men->id.us--;
-
- load_editMesh(scene, obedit);
-
- BASACT->flag &= ~SELECT;
-
- /* we cannot free the original buffer... */
- emcopy= *em;
- emcopy.allverts= NULL;
- emcopy.alledges= NULL;
- emcopy.allfaces= NULL;
- emcopy.derivedFinal= emcopy.derivedCage= NULL;
- memset(&emcopy.vdata, 0, sizeof(emcopy.vdata));
- memset(&emcopy.fdata, 0, sizeof(emcopy.fdata));
- free_editMesh(&emcopy);
-
- em->verts= edve;
- em->edges= eded;
- em->faces= edvl;
-
- /* hashedges are freed now, make new! */
+ /* hashedges are invalid now, make new! */
editMesh_set_hash(em);
DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
- obedit= oldob;
- BASACT= oldbase;
- BASACT->flag |= SELECT;
-
- DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
+ DAG_object_flush_update(scene, basenew->object, OB_RECALC_DATA);
+ return 1;
}
-void separate_material(Scene *scene, Object *obedit)
+/* return 1: success */
+static int mesh_separate_material(Scene *scene, Base *editbase)
{
- Mesh *me;
- EditMesh *em;
+ Mesh *me= editbase->object->data;
+ EditMesh *em= me->edit_mesh;
unsigned char curr_mat;
- me= obedit->data;
- em= me->edit_mesh;
- if(me->key) {
- error("Can't separate with vertex keys");
- return;
+ for (curr_mat = 1; curr_mat < editbase->object->totcol; ++curr_mat) {
+ /* clear selection, we're going to use that to select material group */
+ EM_clear_flag_all(em, SELECT);
+ /* select the material */
+ editmesh_select_by_material(em, curr_mat);
+ /* and now separate */
+ if(0==mesh_separate_selected(scene, editbase))
+ return 0;
}
-
- if(obedit && em) {
- if(obedit->type == OB_MESH) {
- for (curr_mat = 1; curr_mat < obedit->totcol; ++curr_mat) {
- /* clear selection, we're going to use that to select material group */
- EM_clear_flag_all(em, SELECT);
- /* select the material */
- editmesh_select_by_material(em, curr_mat);
- /* and now separate */
- separate_mesh(scene, obedit);
- }
- }
- }
-
- DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
-
+ return 1;
}
-
-void separate_mesh_loose(Scene *scene, Object *obedit)
+/* return 1: success */
+static int mesh_separate_loose(Scene *scene, Base *editbase)
{
- EditMesh *em, emcopy;
- EditVert *eve, *v1;
- EditEdge *eed, *e1;
- EditFace *efa, *vl1;
- Object *oldob=NULL;
- Mesh *me, *men;
- Base *base, *oldbase;
- ListBase edve, eded, edvl;
- int vertsep=0;
- short done=0, check=1;
-
- me= obedit->data;
+ Mesh *me;
+ EditMesh *em;
+ int doit= 1;
+
+ me= editbase->object->data;
em= me->edit_mesh;
+
if(me->key) {
- error("Can't separate a mesh with vertex keys");
- return;
+ error("Can't separate with vertex keys");
+ return 0;
}
-
- /* we are going to abuse the system as follows:
- * 1. add a duplicate object: this will be the new one, we remember old pointer
- * 2: then do a split if needed.
- * 3. put apart: all NOT selected verts, edges, faces
- * 4. call load_editMesh(): this will be the new object
- * 5. freelist and get back old verts, edges, facs
- */
-
- while(!done){
- vertsep=check=1;
-
- /* make only obedit selected */
- base= FIRSTBASE;
- while(base) {
-// if(base->lay & G.vd->lay) {
- if(base->object==obedit) base->flag |= SELECT;
- else base->flag &= ~SELECT;
-// }
- base= base->next;
- }
-
- /*--------- Select connected-----------*/
-
- EM_clear_flag_all(em, SELECT);
-
+
+ EM_clear_flag_all(em, SELECT);
+
+ while(doit && em->verts.first) {
/* Select a random vert to start with */
- eve= em->verts.first;
+ EditVert *eve= em->verts.first;
eve->f |= SELECT;
- while(check==1) {
- check= 0;
- eed= em->edges.first;
- while(eed) {
- if(eed->h==0) {
- if(eed->v1->f & SELECT) {
- if( (eed->v2->f & SELECT)==0 ) {
- eed->v2->f |= SELECT;
- vertsep++;
- check= 1;
- }
- }
- else if(eed->v2->f & SELECT) {
- if( (eed->v1->f & SELECT)==0 ) {
- eed->v1->f |= SELECT;
- vertsep++;
- check= SELECT;
- }
- }
- }
- eed= eed->next;
- }
- }
- /*----------End of select connected--------*/
+ selectconnected_mesh_all(em);
-
- /* If the amount of vertices that is about to be split == the total amount
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list