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

Geoffrey Bantle hairbat at yahoo.com
Sun Oct 21 05:04:31 CEST 2007


Revision: 12316
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=12316
Author:   briggs
Date:     2007-10-21 05:04:30 +0200 (Sun, 21 Oct 2007)

Log Message:
-----------
-> Split Tool

Return of the split tool.

Also added some new stuff to BME_traversals.c for walking over the
edges of a vertex and the faces of a vertex. Trying to get rid of 
duplicated code....

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

Modified: branches/bmesh/source/blender/blenkernel/BKE_bmesh.h
===================================================================
--- branches/bmesh/source/blender/blenkernel/BKE_bmesh.h	2007-10-21 02:14:21 UTC (rev 12315)
+++ branches/bmesh/source/blender/blenkernel/BKE_bmesh.h	2007-10-21 03:04:30 UTC (rev 12316)
@@ -257,6 +257,7 @@
 void BME_duplicate(struct BME_Mesh *bm);
 void BME_extrude_mesh(struct BME_Mesh *bm, int type);
 int BME_make_edgeface(struct BME_Mesh *bm);
+void BME_split_mesh(struct BME_Mesh *bm);
 
 /*BME_traversals. c*/
 #define BME_RESTRICTWIRE 1
@@ -268,6 +269,8 @@
 struct BME_Edge *BME_edgeshell_nextedge(void *userData, struct BME_Edge *e, struct BME_Vert *sv);
 void BME_MeshRing_walk(struct BME_Mesh *bm, struct BME_Edge *se, void*(*func)(void *userData, struct BME_Loop *walkloop), void *userData, short restrictflag);	
 struct BME_Edge *BME_edgering_nextedge(void *userData, struct BME_Loop *walkloop);
+void BME_VertEdgeWalk(struct BME_Mesh *bm, struct BME_Vert *v, void(*func)(void *userData, struct BME_Edge *apply), void *userData);
+void BME_VertFaceWalk(struct BME_Mesh *bm, struct BME_Vert *v, void(*func)(void *userData, struct BME_Poly *apply), void *userData);
 
 
 /* bevel tool defines */

Modified: branches/bmesh/source/blender/blenkernel/intern/BME_mesh.c
===================================================================
--- branches/bmesh/source/blender/blenkernel/intern/BME_mesh.c	2007-10-21 02:14:21 UTC (rev 12315)
+++ branches/bmesh/source/blender/blenkernel/intern/BME_mesh.c	2007-10-21 03:04:30 UTC (rev 12316)
@@ -59,7 +59,6 @@
 
 #include "BSE_edit.h"
 
-
 /*	
  *	BME FIRST
  *

Modified: branches/bmesh/source/blender/blenkernel/intern/BME_structure.c
===================================================================
--- branches/bmesh/source/blender/blenkernel/intern/BME_structure.c	2007-10-21 02:14:21 UTC (rev 12315)
+++ branches/bmesh/source/blender/blenkernel/intern/BME_structure.c	2007-10-21 03:04:30 UTC (rev 12316)
@@ -46,7 +46,7 @@
 
 #include "BKE_customdata.h"
 /**
- *	MISC utility functions.
+ *	MISC utility functions. Split these off into BME_utilities.c?
  *
  */
  

Modified: branches/bmesh/source/blender/blenkernel/intern/BME_tools.c
===================================================================
--- branches/bmesh/source/blender/blenkernel/intern/BME_tools.c	2007-10-21 02:14:21 UTC (rev 12315)
+++ branches/bmesh/source/blender/blenkernel/intern/BME_tools.c	2007-10-21 03:04:30 UTC (rev 12316)
@@ -958,6 +958,7 @@
 }
 
 /*finds out if any of the faces connected to any of the verts have all other vertices in varr as well. */
+/*this can be MUCH more compact if we just use BME_VertFaceWalk from BME_traversals.c*/
 static int exist_face_overlaps(BME_Mesh *bm, BME_Vert **varr, int len){
 	BME_Edge *curedge;
 	BME_Loop *curloop, *l;
@@ -1469,3 +1470,36 @@
 	BME_selectmode_flush(bm);
 }
 
+void BME_split_mesh(BME_Mesh *bm){
+	BME_Vert *v;
+	BME_Edge *e;
+	BME_Poly *f;
+	
+	/*first mark all selected elements*/
+	for(v=BME_first(bm,BME_VERT);v;v=BME_next(bm,BME_VERT,v)){
+		if(BME_SELECTED(v)) v->tflag1 = 1;
+	}
+	for(e=BME_first(bm,BME_EDGE);e;e=BME_next(bm,BME_EDGE,e)){
+		if(BME_SELECTED(e)) e->tflag1 = 1;
+	}
+	for(f=BME_first(bm,BME_POLY);f;f=BME_next(bm,BME_POLY,f)){
+		if(BME_SELECTED(f)) f->tflag1 = 1;
+	}
+	
+	BME_duplicate(bm); //dupe the selected parts.
+	BME_clear_flag_all(bm,BME_VISITED); //clear visited flags set in the duplicate function
+	/*now go through and visit all the previously selected parts and delete them*/
+	for(v=BME_first(bm,BME_VERT);v;v=BME_next(bm,BME_VERT,v)){
+		if(v->tflag1) BME_VISIT(v);
+	}
+	for(e=BME_first(bm,BME_EDGE);e;e=BME_next(bm,BME_EDGE,e)){
+		if(e->tflag1) BME_VISIT(e);
+	}
+	for(f=BME_first(bm,BME_POLY);f;f=BME_next(bm,BME_POLY,f)){
+		if(f->tflag1) BME_VISIT(f);
+	}
+	
+	remove_tagged_polys(bm);
+	remove_tagged_edges(bm);
+	remove_tagged_verts(bm);
+}

Modified: branches/bmesh/source/blender/blenkernel/intern/BME_traversals.c
===================================================================
--- branches/bmesh/source/blender/blenkernel/intern/BME_traversals.c	2007-10-21 02:14:21 UTC (rev 12315)
+++ branches/bmesh/source/blender/blenkernel/intern/BME_traversals.c	2007-10-21 03:04:30 UTC (rev 12316)
@@ -111,7 +111,38 @@
 	}
 }
 
+void BME_VertEdgeWalk(BME_Mesh *bm, BME_Vert *v, void(*func)(void *userData, BME_Edge *apply), void *userData)
+{
+	BME_Edge *curedge;
+	if(v->edge){
+		curedge = v->edge;
+		do{
+			func(userData,curedge);
+			curedge = BME_disk_nextedge(curedge,v);
+		}while(curedge!=v->edge);
+	}
+}
 
+void BME_VertFaceWalk(BME_Mesh *bm, BME_Vert *v, void(*func)(void *userData, BME_Poly *apply), void *userData)
+{
+	BME_Edge *curedge;
+	BME_Loop *l;
+	
+	if(v->edge){
+		curedge = v->edge;
+		do{
+			if(curedge->loop){
+				l=curedge->loop;
+				do{
+					func(userData,l->f);
+					l = BME_radial_nextloop(l);
+				}while(l!=curedge->loop);
+			}
+			curedge = BME_disk_nextedge(curedge,v);
+		}while(curedge!=v->edge);
+	}
+}
+
 /*Edge Loop Callback for BME_MeshLoop_walk*/
 BME_Edge *BME_edgeloop_nextedge(void *userData, BME_Edge *e, BME_Vert *sv)
 {

Modified: branches/bmesh/source/blender/include/editbmesh.h
===================================================================
--- branches/bmesh/source/blender/include/editbmesh.h	2007-10-21 02:14:21 UTC (rev 12315)
+++ branches/bmesh/source/blender/include/editbmesh.h	2007-10-21 03:04:30 UTC (rev 12316)
@@ -36,8 +36,8 @@
 void EM_remove_doubles(void);	
 void EM_bevel(void);
 void EM_collapse_edges(void);
+void EM_split_mesh(void);
 
-
 /*editbmesh_select.c*/
 void EM_deselectall_mesh(void);
 void EM_selectconnected_mesh(int qual);

Modified: branches/bmesh/source/blender/src/buttons_editing.c
===================================================================
--- branches/bmesh/source/blender/src/buttons_editing.c	2007-10-21 02:14:21 UTC (rev 12315)
+++ branches/bmesh/source/blender/src/buttons_editing.c	2007-10-21 03:04:30 UTC (rev 12316)
@@ -4224,7 +4224,7 @@
 		break;
 	case B_SPLIT:
 		G.f |= G_DISABLE_OK;
-		split_mesh();
+		EM_split_mesh();
 		G.f -= G_DISABLE_OK;
 		break;
 	case B_REMDOUB:

Modified: branches/bmesh/source/blender/src/editbmesh_tools.c
===================================================================
--- branches/bmesh/source/blender/src/editbmesh_tools.c	2007-10-21 02:14:21 UTC (rev 12315)
+++ branches/bmesh/source/blender/src/editbmesh_tools.c	2007-10-21 03:04:30 UTC (rev 12316)
@@ -322,4 +322,14 @@
 	countall();
 	DAG_object_flush_update(G.scene,G.obedit,OB_RECALC_DATA);
 	allqueue(REDRAWVIEW3D,0);
-}
\ No newline at end of file
+}
+
+void EM_split_mesh(void){
+	BME_Mesh *bm = G.editMesh;
+	BME_model_begin(bm);
+	BME_split_mesh(bm);
+	BME_model_end(bm);
+	countall();
+	DAG_object_flush_update(G.scene,G.obedit,OB_RECALC_DATA);
+	allqueue(REDRAWVIEW3D,0);	
+}





More information about the Bf-blender-cvs mailing list