[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [11469] branches/bmesh/source/blender: -> Dissolve Tool

Geoffrey Bantle hairbat at yahoo.com
Thu Aug 2 09:52:41 CEST 2007


Revision: 11469
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=11469
Author:   briggs
Date:     2007-08-02 09:52:40 +0200 (Thu, 02 Aug 2007)

Log Message:
-----------
-> Dissolve Tool

Added a 'dissolve edge' tool that joins two adjacent faces into one.
Also selection flags should be propogated automatically to split faces/
edges now along with all new elements created between a 
BME_model_begin/end marked with a bitflag BME_NEW (test for with
BME_NEWELEM macro)

Modified Paths:
--------------
    branches/bmesh/source/blender/blenkernel/BKE_bmesh.h
    branches/bmesh/source/blender/blenkernel/intern/BME_structure.c
    branches/bmesh/source/blender/blenkernel/intern/BME_tools.c
    branches/bmesh/source/blender/include/editbmesh.h
    branches/bmesh/source/blender/src/editbmesh_tools.c
    branches/bmesh/source/blender/src/editobject.c

Modified: branches/bmesh/source/blender/blenkernel/BKE_bmesh.h
===================================================================
--- branches/bmesh/source/blender/blenkernel/BKE_bmesh.h	2007-08-02 01:38:42 UTC (rev 11468)
+++ branches/bmesh/source/blender/blenkernel/BKE_bmesh.h	2007-08-02 07:52:40 UTC (rev 11469)
@@ -197,10 +197,12 @@
 void BME_select_edge(struct BME_Mesh *bm, struct BME_Edge *e, int select);
 void BME_select_poly(struct BME_Mesh *bm, struct BME_Poly *f, int select);
 #define BME_SELECTED(element) (element->flag & SELECT)
+#define BME_NEWELEM(element) (element->flag & BME_NEW)
 
 /*TOOLS CODE*/
 void BME_cut_edge(struct BME_Mesh *bm, BME_Edge *e, int numcuts);
 void BME_cut_edges(struct BME_Mesh *bm, int numcuts);
 struct BME_Loop *BME_inset_edge(struct BME_Mesh *bm, struct BME_Loop *l, struct BME_Poly *f);
 struct BME_Poly *BME_inset_poly(struct BME_Mesh *bm, struct BME_Poly *f);
+void BME_dissolve_edges(struct BME_Mesh *bm);
 #endif

Modified: branches/bmesh/source/blender/blenkernel/intern/BME_structure.c
===================================================================
--- branches/bmesh/source/blender/blenkernel/intern/BME_structure.c	2007-08-02 01:38:42 UTC (rev 11468)
+++ branches/bmesh/source/blender/blenkernel/intern/BME_structure.c	2007-08-02 07:52:40 UTC (rev 11469)
@@ -91,6 +91,8 @@
 	v = MEM_callocN(sizeof(BME_Vert), "BME Vertex");
 	BLI_addtail(&(bm->verts), v);
 	v->EID = bm->nextv;
+	v->flag |= BME_NEW;
+	if(example && (example->flag & SELECT))v->flag |=SELECT; 
 	bm->nextv++;
 	bm->totvert++;
 
@@ -111,6 +113,8 @@
 	e->d1.data = e;
 	e->d2.data = e;
 	e->EID = bm->nexte;
+	e->flag |= BME_NEW;
+	if(example && (example->flag & SELECT))e->flag |=SELECT;
 	bm->nexte++;
 	bm->totedge++;
 	BLI_addtail(&(bm->edges), e);
@@ -134,6 +138,7 @@
 	l->f = f;
 	l->EID = bm->nextl;
 	l->gref = loopnode;
+	l->flag |= BME_NEW;
 	loopnode->data = l;
 	BLI_addtail(&(bm->loops),loopnode);
 	bm->nextl++;
@@ -153,6 +158,8 @@
 	f= MEM_callocN(sizeof(BME_Poly),"BME_Poly");
 	BLI_addtail(&(bm->polys),f);
 	f->EID = bm->nextp;
+	f->flag |= BME_NEW;
+	if(example && (example->flag & SELECT))f->flag|=SELECT;
 	bm->nextp++;
 	bm->totpoly++;
 

Modified: branches/bmesh/source/blender/blenkernel/intern/BME_tools.c
===================================================================
--- branches/bmesh/source/blender/blenkernel/intern/BME_tools.c	2007-08-02 01:38:42 UTC (rev 11468)
+++ branches/bmesh/source/blender/blenkernel/intern/BME_tools.c	2007-08-02 07:52:40 UTC (rev 11469)
@@ -57,6 +57,25 @@
  *	Returns -
 */
 
+void BME_dissolve_edges(BME_Mesh *bm)
+{
+	BME_Edge *e,*nexte;
+	BME_Poly *f1, *f2;
+	BME_Loop *next;
+	
+	e=BME_first(bm,BME_EDGE);
+	while(e){
+		nexte = BME_next(bm,BME_EDGE,e);
+		if(BME_SELECTED(e)){
+			f1 = e->loop->f;
+			next = BME_radial_nextloop(e->loop);
+			f2 = next->f;
+			BME_JFKE(bm,f1,f2,e);
+		}
+		e = nexte;
+	}
+}
+
 /**
  *			BME_cut_edge
  *
@@ -65,7 +84,8 @@
  *
  */
 
-void BME_cut_edge(BME_Mesh *bm, BME_Edge *e, int numcuts){
+void BME_cut_edge(BME_Mesh *bm, BME_Edge *e, int numcuts)
+{
 	int i;
 	float percent, step,length, vt1[3], v2[3];
 	BME_Vert *nv;
@@ -106,7 +126,7 @@
 {
 	BME_Edge *e;
 	for(e=BME_first(bm,BME_EDGE); e; e=BME_next(bm,BME_EDGE,e)){
-		if(BME_SELECTED(e)) 
+		if(BME_SELECTED(e) && !(BME_NEWELEM(e))) 
 			BME_cut_edge(bm,e,numcuts);
 	}
 }

Modified: branches/bmesh/source/blender/include/editbmesh.h
===================================================================
--- branches/bmesh/source/blender/include/editbmesh.h	2007-08-02 01:38:42 UTC (rev 11468)
+++ branches/bmesh/source/blender/include/editbmesh.h	2007-08-02 07:52:40 UTC (rev 11469)
@@ -26,4 +26,5 @@
 
 
 /*editbmesh_tools.c*/
-void EM_cut_edges(int numcuts);	
\ No newline at end of file
+void EM_cut_edges(int numcuts);
+void EM_dissolve_edges(void);
\ No newline at end of file

Modified: branches/bmesh/source/blender/src/editbmesh_tools.c
===================================================================
--- branches/bmesh/source/blender/src/editbmesh_tools.c	2007-08-02 01:38:42 UTC (rev 11468)
+++ branches/bmesh/source/blender/src/editbmesh_tools.c	2007-08-02 07:52:40 UTC (rev 11469)
@@ -76,4 +76,12 @@
 	BME_model_end(G.editMesh);
 	DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
 	allqueue(REDRAWVIEW3D, 0);
+}
+
+void EM_dissolve_edges(void){
+	BME_model_begin(G.editMesh);
+	BME_dissolve_edges(G.editMesh);	
+	BME_model_end(G.editMesh);
+	DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
+	allqueue(REDRAWVIEW3D, 0);
 }
\ No newline at end of file

Modified: branches/bmesh/source/blender/src/editobject.c
===================================================================
--- branches/bmesh/source/blender/src/editobject.c	2007-08-02 01:38:42 UTC (rev 11468)
+++ branches/bmesh/source/blender/src/editobject.c	2007-08-02 07:52:40 UTC (rev 11469)
@@ -2346,8 +2346,14 @@
 			{
 				EM_cut_edges(1);
 				BIF_undo_push("Cut Edges");            
-				break;
 			}
+			break;
+		case 205:
+			{
+				EM_dissolve_edges();
+				BIF_undo_push("Dissolve Edges");
+			}
+			break;
 		}
 		DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
 		





More information about the Bf-blender-cvs mailing list