[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [11466] branches/bmesh/source/blender: -> Cut Tool and new specials menu

Geoffrey Bantle hairbat at yahoo.com
Wed Aug 1 20:54:23 CEST 2007


Revision: 11466
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=11466
Author:   briggs
Date:     2007-08-01 20:54:23 +0200 (Wed, 01 Aug 2007)

Log Message:
-----------
-> Cut Tool and new specials menu

Added a simple cut tool along with menu entries for some other tools
that should be coming along soon. Also fixed a bug in mesh iterators
introduced by last commit.

Modified Paths:
--------------
    branches/bmesh/source/blender/blenkernel/BKE_bmesh.h
    branches/bmesh/source/blender/blenkernel/intern/BME_eulers.c
    branches/bmesh/source/blender/blenkernel/intern/BME_mesh.c
    branches/bmesh/source/blender/blenkernel/intern/BME_tools.c
    branches/bmesh/source/blender/include/editbmesh.h
    branches/bmesh/source/blender/src/editbmesh_interface.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-08-01 18:04:44 UTC (rev 11465)
+++ branches/bmesh/source/blender/blenkernel/BKE_bmesh.h	2007-08-01 18:54:23 UTC (rev 11466)
@@ -48,99 +48,99 @@
 struct RetopoPaintData;
 struct DerivedMesh;
 
+/*defines for mesh iterators*/
 #define BME_VERT 1
 #define BME_EDGE 2
 #define BME_POLY 3
 #define BME_LOOP 4
+#define SELECT 1
+/*defines for element->flag*/
+#define BME_VISITED 2											/*for traversal/selection functions*/
+#define BME_NEW 4											/*for tools*/
 
 typedef struct BME_CycleNode{
-	struct BME_CycleNode *next, *prev;
-	void *data;
+	struct BME_CycleNode 	*next, *prev;
+	void 				*data;
 } BME_CycleNode;
 
 typedef struct BME_Mesh
 {
-	ListBase verts, edges, polys, loops;
-	int lock;										/*if set, all calls to eulers will fail.*/
-	struct BME_Mesh *backup;						/*full copy of the mesh*/
-	int totvert, totedge, totpoly, totloop;			/*record keeping*/
-	int nextv, nexte, nextp, nextl;					/*Next element ID for verts/edges/faces/loops. Never reused*/
-	struct CustomData vdata, edata, pdata, ldata;	/*Custom Data Layer information*/
-	struct DerivedMesh *derivedFinal, *derivedCage;
-	struct RetopoPaintData *retopo_paint_data; /*here for temporary code compatibility only*/
-	//BME_ElementList selection;
-	int lastDataMask;
+	ListBase 			verts, edges, polys, loops;
+	int 				lock;									/*if set, all calls to eulers will fail.*/
+	struct BME_Mesh 	*backup;								/*full copy of the mesh*/
+	int 				totvert, totedge, totpoly, totloop;				/*record keeping*/
+	int 				nextv, nexte, nextp, nextl;					/*Next element ID for verts/edges/faces/loops. Never reused*/
+	struct CustomData 	vdata, edata, pdata, ldata;					/*Custom Data Layer information*/
+	struct DerivedMesh 	*derivedFinal, *derivedCage;					/*Derived Meshes for this bmesh*/
+	struct RetopoPaintData *retopo_paint_data; 						/*here for temporary code compatibility only*/
+	int 				lastDataMask;
 } BME_Mesh;
 
-//60, 52, 52, 12 704
-//60, 52, 84 
-
-/*only defined to make certain things easier*/
+/*Beginning of all mesh elements should share this layout!*/
 typedef struct BME_Element
 {
-	struct BME_Element *next, *prev;
-	int EID;
-	unsigned short flag,h;
-
+	struct BME_Element 	*next, *prev;
+	int 				EID;
+	unsigned short 		flag,h;
+	int 				eflag1, eflag2;							//eflag and tflag will be going away...								
+	int 				tflag1, tflag2;								
 } BME_Element;
 
 typedef struct BME_Vert
 {
-	struct BME_Vert *next, *prev;
-	int	EID;
-	unsigned short flag, h;
-	float co[3];									/*vertex location. Actually pointer to custom data block*/
-	float no[3];									/*vertex normal. Actually pointer to custom data block*/
-	struct BME_Edge *edge;							/*first edge in the disk cycle for this vertex*/
-	void *data;										/*custom vertex data*/
-	int eflag1, eflag2;								/*reserved for use by eulers*/
-	int tflag1, tflag2;								/*reserved for use by tools*/
-
+	struct BME_Vert 		*next, *prev;
+	int				EID;
+	unsigned short 		flag, h;
+	int 				eflag1, eflag2;							/*reserved for use by eulers*/
+	int 				tflag1, tflag2;							/*reserved for use by tools*/
+	float 			co[3];								/*vertex location. Actually pointer to custom data block*/
+	float 			no[3];								/*vertex normal. Actually pointer to custom data block*/
+	struct BME_Edge		*edge;								/*first edge in the disk cycle for this vertex*/
+	void 				*data;								/*custom vertex data*/
 } BME_Vert;
 
 typedef struct BME_Edge
 {
-	struct BME_Edge *next, *prev;
-	int EID;
-	unsigned short flag, h;
-	struct BME_Vert *v1, *v2;						/*note that order of vertex pointers means nothing to eulers*/
-	struct BME_CycleNode d1, d2;					/*disk cycle nodes for v1 and v2 respectivley*/
-	struct BME_Loop *loop;							/*first BME_Loop in the radial cycle around this edge*/
-	void *data;										/*custom edge data*/
-	int eflag1, eflag2;								/*reserved for use by eulers*/
-	int tflag1, tflag2;								/*reserved for use by tools*/
+	struct BME_Edge 	*next, *prev;
+	int 				EID;
+	unsigned short 		flag, h;
+	int 				eflag1, eflag2;							/*reserved for use by eulers*/
+	int 				tflag1, tflag2;							/*reserved for use by tools*/
+	struct BME_Vert 		*v1, *v2;								/*note that order of vertex pointers means nothing to eulers*/
+	struct BME_CycleNode 	d1, d2;								/*disk cycle nodes for v1 and v2 respectivley*/
+	struct BME_Loop 	*loop;								/*first BME_Loop in the radial cycle around this edge*/
+	void 				*data;								/*custom edge data*/
 
 	float crease;
 } BME_Edge;
 
 typedef struct BME_Loop 
 {	
-	struct BME_Loop *next, *prev;					/*circularly linked list around face*/
-	int EID;
-	unsigned short flag, h;
-	struct BME_CycleNode radial;					/*circularly linked list used to find faces around an edge*/
-	struct BME_CycleNode *gref;						/*pointer to loop ref. Nasty.*/
-	struct BME_Vert *v;								/*vertex that this loop starts at.*/
-	struct BME_Edge *e;								/*edge this loop belongs to*/
-	struct BME_Poly *f;								/*face this loop belongs to*/	
-	void *data;										/*custom per face vertex data*/
-	int eflag1, eflag2;								/*reserved for use by eulers*/
-	int tflag1, tflag2;								/*reserved for use by tools*/
-
+	struct BME_Loop 	*next, *prev;							/*circularly linked list around face*/
+	int 				EID;
+	unsigned short 		flag, h;
+	int 				eflag1, eflag2;							/*reserved for use by eulers*/
+	int 				tflag1, tflag2;							/*reserved for use by tools*/
+	struct BME_CycleNode 	radial;								/*circularly linked list used to find faces around an edge*/
+	struct BME_CycleNode 	*gref;								/*pointer to loop ref. Nasty.*/
+	struct BME_Vert 		*v;									/*vertex that this loop starts at.*/
+	struct BME_Edge 	*e;									/*edge this loop belongs to*/
+	struct BME_Poly 		*f;									/*face this loop belongs to*/	
+	void 				*data;								/*custom per face vertex data*/
 } BME_Loop;
 
 typedef struct BME_Poly
 {
-	struct BME_Poly *next, *prev;
-	int EID;
-	unsigned short flag, h; 
-	unsigned short mat_nr;
-	struct BME_Loop *loopbase;						/*First editloop around Polygon.*/
-	struct ListBase holes;							/*list of inner loops in the face*/
-	unsigned int len;								/*total length of the face. Eulers should preserve this data*/
-	void *data;										/*custom face data*/
-	int eflag1, eflag2;								/*reserved for use by eulers*/
-	int tflag1, tflag2;								/*reserved for use by tools*/
+	struct BME_Poly 		*next, *prev;
+	int 				EID;
+	int 				eflag1, eflag2;							/*reserved for use by eulers*/
+	int 				tflag1, tflag2;							/*reserved for use by tools*/
+	unsigned short 		flag, h; 
+	unsigned short 		mat_nr;
+	struct BME_Loop 	*loopbase;								/*First editloop around Polygon.*/
+	struct ListBase 		holes;								/*list of inner loops in the face*/
+	unsigned int 		len;									/*total length of the face. Eulers should preserve this data*/
+	void 				*data;								/*custom face data*/
 
 } BME_Poly;
 
@@ -199,6 +199,8 @@
 #define BME_SELECTED(element) (element->flag & SELECT)
 
 /*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);
 #endif

Modified: branches/bmesh/source/blender/blenkernel/intern/BME_eulers.c
===================================================================
--- branches/bmesh/source/blender/blenkernel/intern/BME_eulers.c	2007-08-01 18:04:44 UTC (rev 11465)
+++ branches/bmesh/source/blender/blenkernel/intern/BME_eulers.c	2007-08-01 18:54:23 UTC (rev 11466)
@@ -48,7 +48,7 @@
 #include "BLI_ghash.h"
 
 /*********************************************************
- *                    "Euler API"                        *
+ *                    "Euler API"                     *
  *                                                       *
  *                                                       *
  *	 Primitive construction operators for mesh tools.    *
@@ -85,6 +85,9 @@
 
 	TODO:
 	-Finish inserting 'strict' validation in all Eulers
+	-Add in proper handling of propogation of selection flags
+	-Fix lack of custom data handling for new loops with BME_SFME.
+	-Add in flagging of new elements with BME_NEW bitflag.
 */
 
 #define RETCLEAR(bm) {bm->rval->v = bm->rval->e = bm->rval->f = bm->rva->l = NULL;}

Modified: branches/bmesh/source/blender/blenkernel/intern/BME_mesh.c
===================================================================
--- branches/bmesh/source/blender/blenkernel/intern/BME_mesh.c	2007-08-01 18:04:44 UTC (rev 11465)
+++ branches/bmesh/source/blender/blenkernel/intern/BME_mesh.c	2007-08-01 18:54:23 UTC (rev 11466)
@@ -86,7 +86,8 @@
 	if(type == BME_VERT) return ((BME_Vert*)element)->next;
 	else if(type == BME_EDGE) return ((BME_Edge*)element)->next;
 	else if(type == BME_POLY) return ((BME_Poly*)element)->next;
-	else if(type == BME_LOOP) return ((BME_Loop*)element)->gref->next->data;
+	else if(type == BME_LOOP && ((BME_Loop*)element)->gref->next) 
+			return ((BME_Loop*)element)->gref->next->data;
 	return NULL;
 }
 
@@ -223,16 +224,22 @@
  *
 */
 
+static void BME_clear_flag(BME_Mesh *bm, BME_Element *elem){
+	elem->tflag1 = elem->tflag2 = 0;
+	elem->flag &= ~BME_VISITED;
+	elem->flag &= ~BME_NEW;
+}
+
 int BME_model_begin(BME_Mesh *bm){
 	BME_Vert *v;
 	BME_Edge *e;
 	BME_Poly *f;
 	BME_Loop *l;
 
-	for(v=BME_first(bm,BME_VERT); v; v=BME_next(bm,BME_VERT,v)) v->tflag1 = v->tflag2 = 0;
-	for(e=BME_first(bm,BME_EDGE); e; e=BME_next(bm,BME_EDGE,e)) e->tflag1 = e->tflag2 = 0;
-	for(f=BME_first(bm,BME_POLY); f; f=BME_next(bm,BME_POLY,f)) f->tflag1 = f->tflag2 = 0;
-	for(l=BME_first(bm,BME_LOOP); l; l=BME_next(bm,BME_LOOP,l)) l->tflag1 = l->tflag2 = 0;
+	for(v=BME_first(bm,BME_VERT); v; v=BME_next(bm,BME_VERT,v)) BME_clear_flag(bm,v);
+	for(e=BME_first(bm,BME_EDGE); e; e=BME_next(bm,BME_EDGE,e)) BME_clear_flag(bm,e);
+	for(f=BME_first(bm,BME_POLY); f; f=BME_next(bm,BME_POLY,f)) BME_clear_flag(bm,f);
+	for(l=BME_first(bm,BME_LOOP); l; l=BME_next(bm,BME_LOOP,l)) BME_clear_flag(bm,l);
 }
 
 void BME_model_end(BME_Mesh *bm){

Modified: branches/bmesh/source/blender/blenkernel/intern/BME_tools.c
===================================================================

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list