[Bf-blender-cvs] [0a02603] master: BMesh: make toolflags optional

Campbell Barton noreply at git.blender.org
Fri Jul 1 11:30:40 CEST 2016


Commit: 0a026033ae46c83a84fcca54112190e1aa80d51f
Author: Campbell Barton
Date:   Fri Jul 1 19:07:11 2016 +1000
Branches: master
https://developer.blender.org/rB0a026033ae46c83a84fcca54112190e1aa80d51f

BMesh: make toolflags optional

Saves 8 bytes per vert/edge/face.
Gives overall ~20-25% memory saving for dyntopo sculpting
and modifiers that use BMesh.

===================================================================

M	source/blender/blenkernel/BKE_mesh.h
M	source/blender/blenkernel/intern/mesh.c
M	source/blender/blenkernel/intern/modifiers_bmesh.c
M	source/blender/bmesh/bmesh_class.h
M	source/blender/bmesh/intern/bmesh_construct.c
M	source/blender/bmesh/intern/bmesh_core.c
M	source/blender/bmesh/intern/bmesh_delete.c
M	source/blender/bmesh/intern/bmesh_iterators.c
M	source/blender/bmesh/intern/bmesh_mesh.c
M	source/blender/bmesh/intern/bmesh_mesh.h
M	source/blender/bmesh/intern/bmesh_operator_api.h
M	source/blender/bmesh/intern/bmesh_operator_api_inline.h
M	source/blender/bmesh/intern/bmesh_operators.c
M	source/blender/bmesh/intern/bmesh_walkers_impl.c
M	source/blender/bmesh/operators/bmo_beautify.c
M	source/blender/bmesh/operators/bmo_bridge.c
M	source/blender/bmesh/operators/bmo_connect.c
M	source/blender/bmesh/operators/bmo_connect_concave.c
M	source/blender/bmesh/operators/bmo_connect_nonplanar.c
M	source/blender/bmesh/operators/bmo_connect_pair.c
M	source/blender/bmesh/operators/bmo_create.c
M	source/blender/bmesh/operators/bmo_dissolve.c
M	source/blender/bmesh/operators/bmo_dupe.c
M	source/blender/bmesh/operators/bmo_edgenet.c
M	source/blender/bmesh/operators/bmo_extrude.c
M	source/blender/bmesh/operators/bmo_fill_edgeloop.c
M	source/blender/bmesh/operators/bmo_fill_grid.c
M	source/blender/bmesh/operators/bmo_hull.c
M	source/blender/bmesh/operators/bmo_inset.c
M	source/blender/bmesh/operators/bmo_join_triangles.c
M	source/blender/bmesh/operators/bmo_normals.c
M	source/blender/bmesh/operators/bmo_offset_edgeloops.c
M	source/blender/bmesh/operators/bmo_planar_faces.c
M	source/blender/bmesh/operators/bmo_poke.c
M	source/blender/bmesh/operators/bmo_primitive.c
M	source/blender/bmesh/operators/bmo_removedoubles.c
M	source/blender/bmesh/operators/bmo_similar.c
M	source/blender/bmesh/operators/bmo_subdivide.c
M	source/blender/bmesh/operators/bmo_subdivide_edgering.c
M	source/blender/bmesh/operators/bmo_triangulate.c
M	source/blender/bmesh/operators/bmo_utils.c
M	source/blender/bmesh/tools/bmesh_beautify.c
M	source/blender/bmesh/tools/bmesh_bisect_plane.c
M	source/blender/bmesh/tools/bmesh_decimate_dissolve.c
M	source/blender/bmesh/tools/bmesh_decimate_unsubdivide.c
M	source/blender/collada/collada_utils.cpp
M	source/blender/editors/mesh/editmesh_select.c
M	source/blender/editors/mesh/editmesh_tools.c
M	source/blender/editors/mesh/editmesh_undo.c
M	source/blender/editors/mesh/editmesh_utils.c
M	source/blender/editors/sculpt_paint/paint_image_proj.c
M	source/blender/editors/sculpt_paint/sculpt.c
M	source/blender/editors/sculpt_paint/sculpt_undo.c
M	source/blender/editors/transform/transform.c
M	source/blender/modifiers/intern/MOD_boolean.c
M	source/blender/modifiers/intern/MOD_skin.c
M	source/blender/python/bmesh/bmesh_py_api.c
M	source/blender/python/bmesh/bmesh_py_ops_call.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_mesh.h b/source/blender/blenkernel/BKE_mesh.h
index 9330f41..2cc28ca 100644
--- a/source/blender/blenkernel/BKE_mesh.h
+++ b/source/blender/blenkernel/BKE_mesh.h
@@ -32,6 +32,7 @@
  */
 
 struct ID;
+struct BMeshCreateParams;
 struct BoundBox;
 struct EdgeHash;
 struct ListBase;
@@ -69,7 +70,9 @@ extern "C" {
 
 /* *** mesh.c *** */
 
-struct BMesh *BKE_mesh_to_bmesh(struct Mesh *me, struct Object *ob, const bool add_key_index);
+struct BMesh *BKE_mesh_to_bmesh(
+        struct Mesh *me, struct Object *ob,
+        const bool add_key_index, const struct BMeshCreateParams *params);
 
 int poly_find_loop_from_vert(
         const struct MPoly *poly,
diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c
index f82e5cf..706902e 100644
--- a/source/blender/blenkernel/intern/mesh.c
+++ b/source/blender/blenkernel/intern/mesh.c
@@ -561,12 +561,14 @@ Mesh *BKE_mesh_copy(Mesh *me)
 	return BKE_mesh_copy_ex(G.main, me);
 }
 
-BMesh *BKE_mesh_to_bmesh(Mesh *me, Object *ob, const bool add_key_index)
+BMesh *BKE_mesh_to_bmesh(
+        Mesh *me, Object *ob,
+        const bool add_key_index, const struct BMeshCreateParams *params)
 {
 	BMesh *bm;
 	const BMAllocTemplate allocsize = BMALLOC_TEMPLATE_FROM_ME(me);
 
-	bm = BM_mesh_create(&allocsize);
+	bm = BM_mesh_create(&allocsize, params);
 
 	BM_mesh_bm_from_me(
 	        bm, me, (&(struct BMeshFromMeshParams){
diff --git a/source/blender/blenkernel/intern/modifiers_bmesh.c b/source/blender/blenkernel/intern/modifiers_bmesh.c
index 18f3db6..0838630 100644
--- a/source/blender/blenkernel/intern/modifiers_bmesh.c
+++ b/source/blender/blenkernel/intern/modifiers_bmesh.c
@@ -211,7 +211,9 @@ BMEditMesh *DM_to_editbmesh(DerivedMesh *dm, BMEditMesh *existing, const bool do
 		bm = em->bm;
 	}
 	else {
-		bm = BM_mesh_create(&bm_mesh_allocsize_default);
+		bm = BM_mesh_create(
+		        &bm_mesh_allocsize_default,
+		        &((struct BMeshCreateParams){.use_toolflags = false,}));
 	}
 
 	DM_to_bmesh_ex(dm, bm, do_tessellate);
@@ -233,7 +235,9 @@ BMesh *DM_to_bmesh(DerivedMesh *dm, const bool calc_face_normal)
 	BMesh *bm;
 	const BMAllocTemplate allocsize = BMALLOC_TEMPLATE_FROM_DM(dm);
 
-	bm = BM_mesh_create(&allocsize);
+	bm = BM_mesh_create(
+	        &allocsize,
+	        &((struct BMeshCreateParams){.use_toolflags = false,}));
 
 	DM_to_bmesh_ex(dm, bm, calc_face_normal);
 
diff --git a/source/blender/bmesh/bmesh_class.h b/source/blender/bmesh/bmesh_class.h
index e3caeed..72ea7bd 100644
--- a/source/blender/bmesh/bmesh_class.h
+++ b/source/blender/bmesh/bmesh_class.h
@@ -89,7 +89,6 @@ BLI_STATIC_ASSERT((sizeof(BMHeader) <= 16), "BMHeader size has grown!");
 
 typedef struct BMVert {
 	BMHeader head;
-	struct BMFlagLayer *oflags; /* keep after header, an array of flags, mostly used by the operator stack */
 
 	float co[3];  /* vertex coordinates */
 	float no[3];  /* vertex normal */
@@ -102,6 +101,11 @@ typedef struct BMVert {
 	struct BMEdge *e;
 } BMVert;
 
+typedef struct BMVert_OFlag {
+	BMVert base;
+	struct BMFlagLayer *oflags;
+} BMVert_OFlag;
+
 /* disk link structure, only used by edges */
 typedef struct BMDiskLink {
 	struct BMEdge *next, *prev;
@@ -109,7 +113,6 @@ typedef struct BMDiskLink {
 
 typedef struct BMEdge {
 	BMHeader head;
-	struct BMFlagLayer *oflags; /* keep after header, an array of flags, mostly used by the operator stack */
 
 	struct BMVert *v1, *v2;  /* vertices (unordered) */
 
@@ -122,6 +125,11 @@ typedef struct BMEdge {
 	BMDiskLink v1_disk_link, v2_disk_link;
 } BMEdge;
 
+typedef struct BMEdge_OFlag {
+	BMEdge base;
+	struct BMFlagLayer *oflags;
+} BMEdge_OFlag;
+
 typedef struct BMLoop {
 	BMHeader head;
 	/* notice no flags layer */
@@ -142,10 +150,6 @@ typedef struct BMLoop {
 /* can cast BMFace/BMEdge/BMVert, but NOT BMLoop, since these don't have a flag layer */
 typedef struct BMElemF {
 	BMHeader head;
-
-	/* keep directly after header,
-	 * optional array of flags, only used by the operator stack */
-	struct BMFlagLayer *oflags;
 } BMElemF;
 
 /* can cast anything to this, including BMLoop */
@@ -163,7 +167,6 @@ typedef struct BMLoopList {
 
 typedef struct BMFace {
 	BMHeader head;
-	struct BMFlagLayer *oflags; /* an array of flags, mostly used by the operator stack */
 
 #ifdef USE_BMESH_HOLES
 	int totbounds; /*total boundaries, is one plus the number of holes in the face*/
@@ -177,6 +180,11 @@ typedef struct BMFace {
 //	short _pad[3];
 } BMFace;
 
+typedef struct BMFace_OFlag {
+	BMFace base;
+	struct BMFlagLayer *oflags;
+} BMFace_OFlag;
+
 typedef struct BMFlagLayer {
 	short f; /* flags */
 } BMFlagLayer;
@@ -217,6 +225,8 @@ typedef struct BMesh {
 	/* operator api stuff (must be all NULL or all alloc'd) */
 	struct BLI_mempool *vtoolflagpool, *etoolflagpool, *ftoolflagpool;
 
+	unsigned int use_toolflags : 1;
+
 	int toolflag_index;
 	struct BMOperator *currentop;
 	
@@ -259,10 +269,12 @@ enum {
 /* args for _Generic */
 #define _BM_GENERIC_TYPE_ELEM_NONCONST \
 	void *, BMVert *, BMEdge *, BMLoop *, BMFace *, \
+	BMVert_OFlag *, BMEdge_OFlag *, BMFace_OFlag *, \
 	BMElem *, BMElemF *, BMHeader *
 
 #define _BM_GENERIC_TYPE_ELEM_CONST \
 	const void *, const BMVert *, const BMEdge *, const BMLoop *, const BMFace *, \
+	const BMVert_OFlag *, const BMEdge_OFlag *, const BMFace_OFlag *, \
 	const BMElem *, const BMElemF *, const BMHeader *, \
 	void * const, BMVert * const, BMEdge * const, BMLoop * const, BMFace * const, \
 	BMElem * const, BMElemF * const, BMHeader * const
@@ -276,6 +288,27 @@ enum {
 #define BM_CHECK_TYPE_ELEM(ele) \
 	CHECK_TYPE_ANY(ele, _BM_GENERIC_TYPE_ELEM_NONCONST, _BM_GENERIC_TYPE_ELEM_CONST)
 
+/* vert */
+#define _BM_GENERIC_TYPE_VERT_NONCONST BMVert *, BMVert_OFlag *
+#define _BM_GENERIC_TYPE_VERT_CONST const BMVert *, const BMVert_OFlag *
+#define BM_CHECK_TYPE_VERT_CONST(ele) CHECK_TYPE_ANY(ele, _BM_GENERIC_TYPE_VERT_CONST)
+#define BM_CHECK_TYPE_VERT_NONCONST(ele) CHECK_TYPE_ANY(ele, _BM_GENERIC_TYPE_ELEM_NONCONST)
+#define BM_CHECK_TYPE_VERT(ele) CHECK_TYPE_ANY(ele, _BM_GENERIC_TYPE_VERT_NONCONST, _BM_GENERIC_TYPE_VERT_CONST)
+/* edge */
+#define _BM_GENERIC_TYPE_EDGE_NONCONST BMEdge *, BMEdge_OFlag *
+#define _BM_GENERIC_TYPE_EDGE_CONST const BMEdge *, const BMEdge_OFlag *
+#define BM_CHECK_TYPE_EDGE_CONST(ele) CHECK_TYPE_ANY(ele, _BM_GENERIC_TYPE_EDGE_CONST)
+#define BM_CHECK_TYPE_EDGE_NONCONST(ele) CHECK_TYPE_ANY(ele, _BM_GENERIC_TYPE_ELEM_NONCONST)
+#define BM_CHECK_TYPE_EDGE(ele) CHECK_TYPE_ANY(ele, _BM_GENERIC_TYPE_EDGE_NONCONST, _BM_GENERIC_TYPE_EDGE_CONST)
+/* face */
+#define _BM_GENERIC_TYPE_FACE_NONCONST BMFace *, BMFace_OFlag *
+#define _BM_GENERIC_TYPE_FACE_CONST const BMFace *, const BMFace_OFlag *
+#define BM_CHECK_TYPE_FACE_CONST(ele) CHECK_TYPE_ANY(ele, _BM_GENERIC_TYPE_FACE_CONST)
+#define BM_CHECK_TYPE_FACE_NONCONST(ele) CHECK_TYPE_ANY(ele, _BM_GENERIC_TYPE_ELEM_NONCONST)
+#define BM_CHECK_TYPE_FACE(ele) CHECK_TYPE_ANY(ele, _BM_GENERIC_TYPE_FACE_NONCONST, _BM_GENERIC_TYPE_FACE_CONST)
+
+
+
 /* Assignment from a void* to a typed pointer is not allowed in C++,
  * casting the LHS to void works fine though.
  */
diff --git a/source/blender/bmesh/intern/bmesh_construct.c b/source/blender/bmesh/intern/bmesh_construct.c
index fdad93e..4d92baa 100644
--- a/source/blender/bmesh/intern/bmesh_construct.c
+++ b/source/blender/bmesh/intern/bmesh_construct.c
@@ -714,7 +714,9 @@ BMesh *BM_mesh_copy(BMesh *bm_old)
 	const BMAllocTemplate allocsize = BMALLOC_TEMPLATE_FROM_BM(bm_old);
 
 	/* allocate a bmesh */
-	bm_new = BM_mesh_create(&allocsize);
+	bm_new = BM_mesh_create(
+	        &allocsize,
+	        &((struct BMeshCreateParams){.use_toolflags = bm_old->use_toolflags,}));
 
 	BM_mesh_copy_init_customdata(bm_new, bm_old, &allocsize);
 
diff --git a/source/blender/bmesh/intern/bmesh_core.c b/source/blender/bmesh/intern/bmesh_core.c
index 1d68cdcf..e83b752 100644
--- a/source/blender/bmesh/intern/bmesh_core.c
+++ b/source/blender/bmesh/intern/bmesh_core.c
@@ -81,7 +81,9 @@ BMVert *BM_vert_create(
 	v->head.api_flag = 0;
 
 	/* allocate flags */
-	v->oflags = bm->vtoolflagpool ? BLI_mempool_calloc(bm->vtoolflagpool) : NULL;
+	if (bm->use_toolflags) {
+		((BMVert_OFlag *)v)->oflags = bm->vtoolflagpool ? BLI_mempool_calloc(bm->vtoolflagpool) : NULL;
+	}
 
 	/* 'v->no' is handled by BM_elem_attrs_copy */
 	if (co) {
@@ -174,7 +176,9 @@ BMEdge *BM_edge_create(
 	e->head.api_flag = 0;
 
 	/* allocate flags */
-	e->oflags = bm->etoolflagpool ? BLI_mempool_calloc(bm->etoolflagpool) : NULL;
+	if (bm->use_toolflags) {
+		((BMEdge_OFlag *)e)->oflags = bm->etoolflagpool ? BLI_mempool_calloc(bm->etoolflagpool) : NULL;
+	}
 
 	e->v1 = v1;
 	e->v2 = v2;
@@ -386,7 +390,9 @@ BLI_INLINE BMFace *bm_face_create__internal(BMesh *bm)
 	f->head.api_flag = 0;
 
 	/* allocate flags */
-	f->oflags = bm->ftoolflagpool ? BLI_mempool_calloc(bm->ftoolflagpool) : NULL;
+	if (bm->use_toolflags) {
+		((BMFace_OFlag *)f)->oflags = bm->ftoolflagpool ? BLI_mempool_calloc(bm->ftoolflagpool) : NULL;
+	}
 
 #ifdef USE_BMESH_HOLES
 	BLI_listbase_clear(&f->loops);
@@ -758,7 +764,7 @@ static void bm_kill_only_vert(BMesh *bm, BMVert *v)
 		CustomData_bmesh_free_block(&bm->vdata, &v->head.data);
 
 	if (bm->vtoolflagpool) {
-		BLI_mempool_free(bm->vtoolflagpool, v->oflags);
+		BLI_mempool_free(bm->vtoolflagpool, ((BMVert_OFlag *)v)->oflags);
 	}
 	BLI_mempool_free(bm->vpool, v);
 }
@@ -779,7 +785,7 @@ static void bm_kill_only_edge(BMesh *bm, BMEdge *e)
 		CustomData_bmesh_free_block(&bm->edata, &e->head.data);
 
 	if (bm->etoolflagpool) {
-		BLI_mempool_free(bm->etoolflagpool, e->oflags);
+		BLI_mempool_free(bm->etoolflagpool, ((BMEdge_OFlag *)e)->oflags);
 	}
 	BLI_mempool_free(bm->epool, e);
 }
@@ -803,7 +809,7 @@ static void bm_kill_only_face(BMesh *bm, BMFace *f)
 		CustomData_bmesh_free_block(&bm->pdata, &f->head.data);
 
 	if (bm->ftoolflagpool) {
-		BLI_mempool_free(bm->ftoolflagpool, f->oflags);
+		BLI_mempool_free(bm->ftoolflagpool, ((BMFace_OFlag *)f)->oflags);
 	}
 	BLI_mempool_free(bm->fpool, f);
 }
@@ -2196,7 +2202,7 @@ BMFace *bmesh_jfke(BMesh *bm, BMFace *f1, BMFace *f2, BMEdge *e)
 	
 	/* deallocate edge and its two loops as well as f2 */
 	if (bm->etoolflagpool) {


@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list