[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