[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [11949] branches/bmesh/source/blender: -> Delete Context

Geoffrey Bantle hairbat at yahoo.com
Thu Sep 6 22:49:40 CEST 2007


Revision: 11949
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=11949
Author:   briggs
Date:     2007-09-06 22:49:40 +0200 (Thu, 06 Sep 2007)

Log Message:
-----------
-> Delete Context

Added deletion of verts/edges/faces based upon selection mode.
Deleting a vertex will delete all the edges/faces associated with it
and deleting an edge will delete all faces associated with it.

Modified Paths:
--------------
    branches/bmesh/source/blender/blenkernel/BKE_bmesh.h
    branches/bmesh/source/blender/blenkernel/intern/BME_tools.c
    branches/bmesh/source/blender/include/editbmesh.h
    branches/bmesh/source/blender/src/edit.c
    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-09-06 06:25:31 UTC (rev 11948)
+++ branches/bmesh/source/blender/blenkernel/BKE_bmesh.h	2007-09-06 20:49:40 UTC (rev 11949)
@@ -198,11 +198,19 @@
 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)
-
+#define BME_ISVISITED(element) (element->flag & BME_VISITED)
+#define BME_VISIT(element) (element->flag |= BME_VISITED)
 /*TOOLS CODE*/
+/*Vertex Tools*/
+void BME_connect_verts(struct BME_Mesh *bm);
+void BME_delete_verts(struct BME_Mesh *bm);
+/*Edge Tools*/
 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);
+void BME_dissolve_edges(struct BME_Mesh *bm);
+void BME_delete_edges(struct BME_Mesh *bm);
+/*Face Tools*/
 struct BME_Poly *BME_inset_poly(struct BME_Mesh *bm, struct BME_Poly *f);
-void BME_dissolve_edges(struct BME_Mesh *bm);
+void BME_split_face(struct BME_Mesh *bm, struct BME_Poly *f);
+void BME_delete_polys(struct BME_Mesh *bm);
 #endif

Modified: branches/bmesh/source/blender/blenkernel/intern/BME_tools.c
===================================================================
--- branches/bmesh/source/blender/blenkernel/intern/BME_tools.c	2007-09-06 06:25:31 UTC (rev 11948)
+++ branches/bmesh/source/blender/blenkernel/intern/BME_tools.c	2007-09-06 20:49:40 UTC (rev 11949)
@@ -37,22 +37,61 @@
 #include "MEM_guardedalloc.h"
 
 #include "DNA_listBase.h"
+#include "DNA_object_types.h"
 #include "DNA_meshdata_types.h"
 #include "DNA_mesh_types.h"
 
+#include "BKE_global.h"
+#include "BKE_depsgraph.h"
 #include "BKE_utildefines.h"
 #include "BKE_bmesh.h"
 #include "BLI_blenlib.h"
 #include "BLI_arithb.h"
+#include <windows.h> // for sleep, debug
 
+
+
+
+
+/*Vertex Tools*/
+void BME_connect_verts(BME_Mesh *bm)
+{
+	BME_Poly *f;
+	BME_Loop *l;
+	int split;
+	
+	/*visit the faces with selected verts*/
+	for(f=BME_first(bm,BME_POLY);f;f=BME_next(bm,BME_POLY,f)){
+		split = 0;
+		if(!(BME_NEWELEM(f))){
+			l = f->loopbase;
+			do{
+				if(BME_SELECTED(l->v)){ 
+					BME_VISIT(l->v);
+					split ++;
+				}
+				l = l->next;
+			}while(l != f->loopbase);
+			
+			if(split>1){ 
+				BME_split_face(bm,f);
+			}
+		}
+	}
+}
+
+
+
+
 /**
  *			BME_dissolve_edge
  *
  *	Edge Dissolve Function:
  *	
- *	Dissolves a 2-manifold edge by joining it's two faces. if 
- *	they have opposite windings it first makes them consistent 
- *	by calling BME_loop_reverse()
+ *	Dissolves a 2-manifold edge by joining it's two faces. 
+*	
+*	TODO:if  the two adjacent faces have opposite windings, first 
+*	make them consistent by calling BME_loop_reverse()?
  *
  *	Returns -
 */
@@ -79,9 +118,8 @@
 /**
  *			BME_cut_edge
  *
+ *	Cuts a single edge in a mesh into multiple parts
  *
- *
- *
  */
 
 void BME_cut_edge(BME_Mesh *bm, BME_Edge *e, int numcuts)
@@ -130,22 +168,52 @@
 			BME_cut_edge(bm,e,numcuts);
 	}
 }
+
+
 /**
- *			BME_inset_edge
+ *			BME_split_face
  *
- *	Edge Inset Function:
+ *	Face Split Tool:
  *	
- *	Splits a face in two along an edge and returns the next loop 
- *
+ *	Splits a face into multiple other faces depending oh how 
+ *	many of its vertices have been visited.
+*	
+*	TODO: This is only one 'fill type' for face subdivisions. Need to 
+*	port over all the old subdivision fill types from editmesh and figure
+*	out best strategy for dealing with n-gons.
+*
  *	Returns -
- *	A BME_Poly pointer.
+ *	Nothing
  */
+void BME_split_face(BME_Mesh *bm, BME_Poly *f)
+{
+	return;
+}
 
-BME_Loop *BME_inset_edge(BME_Mesh *bm, BME_Loop *l, BME_Poly *f){
-	BME_Loop *nloop;
-	BME_SFME(bm, f, l->v, l->next->v, &nloop);
-	return nloop->next; 
+/*
+
+{
+	BME_Loop *l, *scanloop, *nextl;
+	int len, i,j;
+	len = f->len;
+	for(i=0,l=f->loopbase; i <= len; ){
+		nextl = l->next;
+		j=2;
+		//printf("Face ID is%i, BM->Nextp is %i",f->EID,bm->nextp);
+		if(BME_ISVISITED(l->v)){
+			for(scanloop = l->next->next; j < (len-1); j++ , scanloop = scanloop->next){
+				if(BME_ISVISITED(scanloop->v)){
+					f = BME_SFME(bm,f,l->v,scanloop->v,NULL);
+					nextl=scanloop;
+					break;
+				}
+			}
+		}
+		l=nextl;
+		i+=j;
+	}
 }
+*/
 
 /**
  *			BME_inset_poly
@@ -154,7 +222,9 @@
  *	
  *	Insets a single face and returns a pointer to the face at the 
  *	center of the newly created region
- *
+*	
+*	TODO: Rewrite this. It's a mess. Especially take out the geometry modification stuff and make it a topo only thingy.
+*
  *	Returns -
  *	A BME_Poly pointer.
  */
@@ -253,4 +323,97 @@
 		l->v->co[2] = (l->v->co[2] + cent[2]) / 2.0;
 	}
 	return NULL;
-}
\ No newline at end of file
+}
+
+static void remove_tagged_polys(BME_Mesh *bm){
+	BME_Poly *f, *nextf;
+	f=BME_first(bm,BME_POLY);
+	while(f){
+		nextf = BME_next(bm,BME_POLY,f);
+		if(BME_ISVISITED(f)) BME_KF(bm,f);
+		f = nextf;
+	}
+}
+static void remove_tagged_edges(BME_Mesh *bm){
+	BME_Edge *e, *nexte;
+	e=BME_first(bm,BME_EDGE);
+	while(e){
+		nexte = BME_next(bm,BME_EDGE,e);
+		if(BME_ISVISITED(e)) BME_KE(bm,e);
+		e = nexte;
+	}
+}
+static void remove_tagged_verts(BME_Mesh *bm){
+	BME_Vert *v, *nextv;
+	v=BME_first(bm,BME_VERT);
+	while(v){
+		nextv = BME_next(bm,BME_VERT,v);
+		if(BME_ISVISITED(v)) BME_KV(bm,v);
+		v=nextv;
+	}
+}
+
+void BME_delete_verts(BME_Mesh *bm){
+	BME_Vert *v;
+	BME_Edge *e, *curedge;
+	BME_Loop *curloop;
+	
+	for(v=BME_first(bm,BME_VERT);v;v=BME_next(bm,BME_VERT,v)){
+		if(BME_SELECTED(v)){
+			BME_VISIT(v); // mark for delete
+			/*visit edges and faces of edges*/
+			if(v->edge){
+				curedge = v->edge;
+				do{
+					BME_VISIT(curedge); // mark for delete
+					if(curedge->loop){
+						curloop = curedge->loop;
+						do{
+							BME_VISIT(curloop->f); // mark for delete
+							curloop = curloop->radial.next->data;
+						} while(curloop != curedge->loop);
+					}
+					curedge = BME_disk_nextedge(curedge,v);
+				} while(curedge != v->edge);
+			}
+		}
+	}
+
+	remove_tagged_polys(bm);
+	remove_tagged_edges(bm);
+	remove_tagged_verts(bm);
+}
+
+void BME_delete_edges(BME_Mesh *bm){
+	BME_Edge *e;
+	BME_Loop *curloop;
+	
+	for(e=BME_first(bm,BME_EDGE);e;e=BME_next(bm,BME_EDGE,e)){
+		if(BME_SELECTED(e)){
+			BME_VISIT(e); //mark for delete
+			if(e->loop){
+				curloop = e->loop;
+				do{
+					BME_VISIT(curloop->f); //mark for delete
+					curloop = curloop->radial.next->data;
+				} while(curloop != e->loop);
+			}
+		}
+	}
+	remove_tagged_polys(bm);
+	remove_tagged_edges(bm);
+}
+
+void BME_delete_polys(BME_Mesh *bm){
+	BME_Poly *f;
+	for(f=BME_first(bm,BME_POLY);f;f=BME_next(bm,BME_POLY,f)){
+		if(BME_SELECTED(f)) BME_VISIT(f);
+	}
+	remove_tagged_polys(bm);
+}
+	
+
+
+
+
+

Modified: branches/bmesh/source/blender/include/editbmesh.h
===================================================================
--- branches/bmesh/source/blender/include/editbmesh.h	2007-09-06 06:25:31 UTC (rev 11948)
+++ branches/bmesh/source/blender/include/editbmesh.h	2007-09-06 20:49:40 UTC (rev 11949)
@@ -27,4 +27,5 @@
 
 /*editbmesh_tools.c*/
 void EM_cut_edges(int numcuts);
-void EM_dissolve_edges(void);
\ No newline at end of file
+void EM_dissolve_edges(void);
+void EM_delete_context(void);
\ No newline at end of file

Modified: branches/bmesh/source/blender/src/edit.c
===================================================================
--- branches/bmesh/source/blender/src/edit.c	2007-09-06 06:25:31 UTC (rev 11948)
+++ branches/bmesh/source/blender/src/edit.c	2007-09-06 20:49:40 UTC (rev 11949)
@@ -1780,8 +1780,8 @@
 void delete_context_selected(void) 
 {
 	if(G.obedit) {
-		/*//EDITBMESHGREP if(G.obedit->type==OB_MESH) delete_mesh();
-		else */if ELEM(G.obedit->type, OB_CURVE, OB_SURF) delNurb();
+		if(G.obedit->type==OB_MESH) EM_delete_context();
+		else if ELEM(G.obedit->type, OB_CURVE, OB_SURF) delNurb();
 		else if(G.obedit->type==OB_MBALL) delete_mball();
 		else if (G.obedit->type==OB_ARMATURE) delete_armature();
 	}

Modified: branches/bmesh/source/blender/src/editbmesh_tools.c
===================================================================
--- branches/bmesh/source/blender/src/editbmesh_tools.c	2007-09-06 06:25:31 UTC (rev 11948)
+++ branches/bmesh/source/blender/src/editbmesh_tools.c	2007-09-06 20:49:40 UTC (rev 11949)
@@ -84,4 +84,21 @@
 	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
+}
+void EM_connect_verts(void){
+	BME_model_begin(G.editMesh);
+	BME_connect_verts(G.editMesh);
+	BME_model_end(G.editMesh);
+	DAG_object_flush_update(G.scene,G.obedit,OB_RECALC_DATA);
+	allqueue(REDRAWVIEW3D,0);
+}
+
+void EM_delete_context(void){
+	BME_model_begin(G.editMesh);
+	if(G.scene->selectmode == SCE_SELECT_VERTEX) BME_delete_verts(G.editMesh);
+	else if(G.scene->selectmode == SCE_SELECT_EDGE) BME_delete_edges(G.editMesh);
+	else if(G.scene->selectmode == SCE_SELECT_FACE) BME_delete_polys(G.editMesh);
+	BME_model_end(G.editMesh);
+	DAG_object_flush_update(G.scene,G.obedit,OB_RECALC_DATA);
+	allqueue(REDRAWVIEW3D,0);
+}

Modified: branches/bmesh/source/blender/src/editobject.c
===================================================================
--- branches/bmesh/source/blender/src/editobject.c	2007-09-06 06:25:31 UTC (rev 11948)
+++ branches/bmesh/source/blender/src/editobject.c	2007-09-06 20:49:40 UTC (rev 11949)
@@ -2354,7 +2354,15 @@
 				BIF_undo_push("Dissolve Edges");
 			}
 			break;
+		
+		case 100:
+			{
+				EM_connect_verts();
+				BIF_undo_push("Connect Vertices");
+			}
+			break;
 		}
+		
 		DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
 		
 	}





More information about the Bf-blender-cvs mailing list