[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