[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