[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [52328] trunk/blender/source/blender: bmesh: move internal API flags out of BMFlagLayer, into BMHeader which was being padded up anyway, added static assert to make sure it stays <=16 bytes.

Campbell Barton ideasman42 at gmail.com
Sun Nov 18 11:17:09 CET 2012


Revision: 52328
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=52328
Author:   campbellbarton
Date:     2012-11-18 10:17:07 +0000 (Sun, 18 Nov 2012)
Log Message:
-----------
bmesh: move internal API flags out of BMFlagLayer, into BMHeader which was being padded up anyway, added static assert to make sure it stays <=16 bytes.

Modified Paths:
--------------
    trunk/blender/source/blender/bmesh/bmesh_class.h
    trunk/blender/source/blender/bmesh/intern/bmesh_construct.c
    trunk/blender/source/blender/bmesh/intern/bmesh_operators.c
    trunk/blender/source/blender/bmesh/intern/bmesh_private.h
    trunk/blender/source/blender/bmesh/tools/bmesh_bevel.c
    trunk/blender/source/blender/modifiers/intern/MOD_bevel.c

Modified: trunk/blender/source/blender/bmesh/bmesh_class.h
===================================================================
--- trunk/blender/source/blender/bmesh/bmesh_class.h	2012-11-18 09:33:11 UTC (rev 52327)
+++ trunk/blender/source/blender/bmesh/bmesh_class.h	2012-11-18 10:17:07 UTC (rev 52328)
@@ -48,6 +48,8 @@
  * hrm. it doesn't but stull works ok, remove the comment above? - campbell.
  */
 
+// #pragma GCC diagnostic error "-Wpadded"
+
 /**
  * BMHeader
  *
@@ -69,10 +71,19 @@
 	            *   this is abused by various tools which set it dirty.
 	            * - For loops this is used for sorting during tessellation. */
 
-	char htype; /* element geometric type (verts/edges/loops/faces) */
-	char hflag; /* this would be a CD layer, see below */
+	char htype;    /* element geometric type (verts/edges/loops/faces) */
+	char hflag;    /* this would be a CD layer, see below */
+
+	/* internal use only!
+	 * note,.we are very picky about not bloating this struct
+	 * but in this case its padded up to 16 bytes anyway,
+	 * so adding a flag here gives no increase in size */
+	char api_flag;
+//	char _pad;
 } BMHeader;
 
+BLI_STATIC_ASSERT((sizeof(BMHeader) <= 16), "BMHeader size has grown!");
+
 /* note: need some way to specify custom locations for custom data layers.  so we can
  * make them point directly into structs.  and some way to make it only happen to the
  * active layer, and properly update when switching active layers.*/
@@ -142,21 +153,24 @@
 	BMHeader head;
 	struct BMFlagLayer *oflags; /* an array of flags, mostly used by the operator stack */
 
-	int len; /*includes all boundary loops*/
 #ifdef USE_BMESH_HOLES
 	int totbounds; /*total boundaries, is one plus the number of holes in the face*/
 	ListBase loops;
 #else
 	BMLoop *l_first;
 #endif
-	float no[3]; /*yes, we do store this here*/
+	int   len;   /* includes all boundary loops */
+	float no[3]; /* yes, we do store this here */
 	short mat_nr;
+//	short _pad[3];
 } BMFace;
 
 typedef struct BMFlagLayer {
-	short f, pflag; /* flags */
+	short f; /* flags */
 } BMFlagLayer;
 
+// #pragma GCC diagnostic ignored "-Wpadded"
+
 typedef struct BMesh {
 	int totvert, totedge, totloop, totface;
 	int totvertsel, totedgesel, totfacesel;
@@ -166,7 +180,7 @@
 	 * valid flags are - BM_VERT | BM_EDGE | BM_FACE.
 	 * BM_LOOP isn't handled so far. */
 	char elem_index_dirty;
-	
+
 	/*element pools*/
 	struct BLI_mempool *vpool, *epool, *lpool, *fpool;
 
@@ -192,7 +206,7 @@
 	
 	int walkers, totflags;
 	ListBase selected, error_stack;
-	
+
 	BMFace *act_face;
 
 	ListBase errorstack;

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_construct.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_construct.c	2012-11-18 09:33:11 UTC (rev 52327)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_construct.c	2012-11-18 10:17:07 UTC (rev 52328)
@@ -187,8 +187,10 @@
 	 *  _and_ the old bmesh_mf functions, so its kindof smashed together
 	 * - joeedh */
 
-	if (!len || !v1 || !v2 || !edges || !bm)
+	if (!len || !v1 || !v2 || !edges || !bm) {
+		BLI_assert(0);
 		return NULL;
+	}
 
 	/* put edges in correct order */
 	for (i = 0; i < len; i++) {

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_operators.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_operators.c	2012-11-18 09:33:11 UTC (rev 52327)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_operators.c	2012-11-18 10:17:07 UTC (rev 52328)
@@ -1068,18 +1068,21 @@
 		ele->oflags = BLI_mempool_calloc(newpool);
 		memcpy(ele->oflags, oldflags, old_totflags_size);
 		BM_elem_index_set(ele, i); /* set_inline */
+		BM_ELEM_API_FLAG_CLEAR((BMElemF *)ele);
 	}
 	BM_ITER_MESH_INDEX (ele, &iter, bm, BM_EDGES_OF_MESH, i) {
 		oldflags = ele->oflags;
 		ele->oflags = BLI_mempool_calloc(newpool);
 		memcpy(ele->oflags, oldflags, old_totflags_size);
 		BM_elem_index_set(ele, i); /* set_inline */
+		BM_ELEM_API_FLAG_CLEAR((BMElemF *)ele);
 	}
 	BM_ITER_MESH_INDEX (ele, &iter, bm, BM_FACES_OF_MESH, i) {
 		oldflags = ele->oflags;
 		ele->oflags = BLI_mempool_calloc(newpool);
 		memcpy(ele->oflags, oldflags, old_totflags_size);
 		BM_elem_index_set(ele, i); /* set_inline */
+		BM_ELEM_API_FLAG_CLEAR((BMElemF *)ele);
 	}
 
 	bm->elem_index_dirty &= ~(BM_VERT | BM_EDGE | BM_FACE);
@@ -1113,18 +1116,21 @@
 		ele->oflags = BLI_mempool_calloc(newpool);
 		memcpy(ele->oflags, oldflags, new_totflags_size);
 		BM_elem_index_set(ele, i); /* set_inline */
+		BM_ELEM_API_FLAG_CLEAR((BMElemF *)ele);
 	}
 	BM_ITER_MESH_INDEX (ele, &iter, bm, BM_EDGES_OF_MESH, i) {
 		oldflags = ele->oflags;
 		ele->oflags = BLI_mempool_calloc(newpool);
 		memcpy(ele->oflags, oldflags, new_totflags_size);
 		BM_elem_index_set(ele, i); /* set_inline */
+		BM_ELEM_API_FLAG_CLEAR((BMElemF *)ele);
 	}
 	BM_ITER_MESH_INDEX (ele, &iter, bm, BM_FACES_OF_MESH, i) {
 		oldflags = ele->oflags;
 		ele->oflags = BLI_mempool_calloc(newpool);
 		memcpy(ele->oflags, oldflags, new_totflags_size);
 		BM_elem_index_set(ele, i); /* set_inline */
+		BM_ELEM_API_FLAG_CLEAR((BMElemF *)ele);
 	}
 
 	bm->elem_index_dirty &= ~(BM_VERT | BM_EDGE | BM_FACE);

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_private.h
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_private.h	2012-11-18 09:33:11 UTC (rev 52327)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_private.h	2012-11-18 10:17:07 UTC (rev 52328)
@@ -62,9 +62,10 @@
 #define _FLAG_MF	2 /* make face */
 #define _FLAG_MV	2 /* make face, vertex */
 
-#define BM_ELEM_API_FLAG_ENABLE(element, f)  ((element)->oflags[0].pflag |=  (f))
-#define BM_ELEM_API_FLAG_DISABLE(element, f) ((element)->oflags[0].pflag &= ~(f))
-#define BM_ELEM_API_FLAG_TEST(element, f)    ((element)->oflags[0].pflag &   (f))
+#define BM_ELEM_API_FLAG_ENABLE(element, f)  ((element)->head.api_flag |=  (f))
+#define BM_ELEM_API_FLAG_DISABLE(element, f) ((element)->head.api_flag &= ~(f))
+#define BM_ELEM_API_FLAG_TEST(element, f)    ((element)->head.api_flag &   (f))
+#define BM_ELEM_API_FLAG_CLEAR(element)      ((element)->head.api_flag = 0)
 
 void calc_poly_plane(float (*verts)[3], const int nverts);
 void poly_rotate_plane(const float normal[3], float (*verts)[3], const int nverts);

Modified: trunk/blender/source/blender/bmesh/tools/bmesh_bevel.c
===================================================================
--- trunk/blender/source/blender/bmesh/tools/bmesh_bevel.c	2012-11-18 09:33:11 UTC (rev 52327)
+++ trunk/blender/source/blender/bmesh/tools/bmesh_bevel.c	2012-11-18 10:17:07 UTC (rev 52328)
@@ -252,22 +252,19 @@
 	BMFace *f;
 
 	if (totv == 3) {
-		f = BM_face_create_quad_tri(bm,
-		                            vert_arr[0], vert_arr[1], vert_arr[2], NULL, facerep, 0);
+		f = BM_face_create_quad_tri_v(bm, vert_arr, 3, facerep, 0);
 	}
 	else if (totv == 4) {
-		f = BM_face_create_quad_tri(bm,
-		                            vert_arr[0], vert_arr[1], vert_arr[2], vert_arr[3], facerep, 0);
+		f = BM_face_create_quad_tri_v(bm, vert_arr, 4, facerep, 0);
 	}
 	else {
 		int i;
-		BMEdge *e;
 		BMEdge **ee = NULL;
-		BLI_array_staticdeclare(ee, 30);
+		BLI_array_staticdeclare(ee, BM_DEFAULT_NGON_STACK_SIZE);
 
+		BLI_array_grow_items(ee, totv);
 		for (i = 0; i < totv; i++) {
-			e = BM_edge_create(bm, vert_arr[i], vert_arr[(i + 1) % totv], NULL, TRUE);
-			BLI_array_append(ee, e);
+			ee[i] = BM_edge_create(bm, vert_arr[i], vert_arr[(i + 1) % totv], NULL, TRUE);
 		}
 		f = BM_face_create_ngon(bm, vert_arr[0], vert_arr[1], ee, totv, FALSE);
 		BLI_array_free(ee);

Modified: trunk/blender/source/blender/modifiers/intern/MOD_bevel.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_bevel.c	2012-11-18 09:33:11 UTC (rev 52327)
+++ trunk/blender/source/blender/modifiers/intern/MOD_bevel.c	2012-11-18 10:17:07 UTC (rev 52328)
@@ -111,7 +111,7 @@
 	BMIter iter;
 	BMEdge *e;
 	BevelModifierData *bmd = (BevelModifierData *) md;
-	float threshold = cosf((bmd->bevel_angle + 0.00001f) * (float)M_PI / 180.0f);
+	const float threshold = cosf((bmd->bevel_angle + 0.00001f) * (float)M_PI / 180.0f);
 	const int segments = 16;  /* XXX */
 
 	bm = DM_to_bmesh(dm);
@@ -119,11 +119,9 @@
 	if (bmd->lim_flags & BME_BEVEL_ANGLE) {
 		BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
 			/* check for 1 edge having 2 face users */
-			BMLoop *l1, *l2;
-			if ((l1 = e->l) &&
-			    (l2 = e->l->radial_next) != l1)
-			{
-				if (dot_v3v3(l1->f->no, l2->f->no) < threshold) {
+			BMLoop *l_a, *l_b;
+			if (BM_edge_loop_pair(e, &l_a, &l_b)) {
+				if (dot_v3v3(l_a->f->no, l_b->f->no) < threshold) {
 					BM_elem_flag_enable(e, BM_ELEM_TAG);
 					BM_elem_flag_enable(e->v1, BM_ELEM_TAG);
 					BM_elem_flag_enable(e->v2, BM_ELEM_TAG);




More information about the Bf-blender-cvs mailing list