[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [52206] trunk/blender/source/blender/bmesh /operators/bmo_bevel.c: use ghash for bevel verts, saves list lookups when getting a BMVert's BevVert
Campbell Barton
ideasman42 at gmail.com
Wed Nov 14 11:23:41 CET 2012
Revision: 52206
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=52206
Author: campbellbarton
Date: 2012-11-14 10:23:38 +0000 (Wed, 14 Nov 2012)
Log Message:
-----------
use ghash for bevel verts, saves list lookups when getting a BMVert's BevVert
Modified Paths:
--------------
trunk/blender/source/blender/bmesh/operators/bmo_bevel.c
Modified: trunk/blender/source/blender/bmesh/operators/bmo_bevel.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_bevel.c 2012-11-14 10:08:39 UTC (rev 52205)
+++ trunk/blender/source/blender/bmesh/operators/bmo_bevel.c 2012-11-14 10:23:38 UTC (rev 52206)
@@ -92,7 +92,6 @@
/* Data for a vertex involved in a bevel */
typedef struct BevVert {
- struct BevVert *next, *prev;
BMVert *v; /* original mesh vertex */
int edgecount; /* total number of edges around the vertex */
int selcount; /* number of selected edges around the vertex */
@@ -104,7 +103,10 @@
* Bevel parameters and state
*/
typedef struct BevelParams {
- ListBase vertList; /* list of BevVert for each vertex involved in bevel */
+ /* hash of BevVert for each vertex involved in bevel
+ * GHash: (key=(BMVert *), value=(BevVert *)) */
+ GHash *vert_hash;
+
float offset; /* blender units to offset each side of a beveled edge */
int seg; /* number of segments in beveled edge profile */
} BevelParams;
@@ -194,13 +196,7 @@
/* find the BevVert corresponding to BMVert bmv */
static BevVert *find_bevvert(BevelParams *bp, BMVert *bmv)
{
- BevVert *bv;
-
- for (bv = bp->vertList.first; bv; bv = bv->next) {
- if (bv->v == bmv)
- return bv;
- }
- return NULL;
+ return BLI_ghash_lookup(bp->vert_hash, bmv);
}
/* Return a good respresentative face (for materials, etc.) for faces
@@ -1197,7 +1193,7 @@
bv->edges = (EdgeHalf *)MEM_callocN(ntot * sizeof(EdgeHalf), "EdgeHalf");
bv->vmesh = (VMesh *)MEM_callocN(sizeof(VMesh), "VMesh");
bv->vmesh->seg = bp->seg;
- BLI_addtail(&bp->vertList, bv);
+ BLI_ghash_insert(bp->vert_hash, v, bv);
/* add edges to bv->edges in order that keeps adjacent edges sharing
* a face, if possible */
@@ -1435,11 +1431,17 @@
static void free_bevel_params(BevelParams *bp)
{
- BevVert *bv;
VMesh *vm;
BoundVert *v, *vnext;
- for (bv = bp->vertList.first; bv; bv = bv->next) {
+
+ GHashIterator ghi;
+
+ /* look on deform bones first */
+ BLI_ghashIterator_init(&ghi, bp->vert_hash);
+
+ for (; !BLI_ghashIterator_isDone(&ghi); BLI_ghashIterator_step(&ghi)) {
+ BevVert *bv = (BevVert *)BLI_ghashIterator_getValue(&ghi);
MEM_freeN(bv->edges);
vm = bv->vmesh;
v = vm->boundstart;
@@ -1452,8 +1454,9 @@
if (vm->mesh)
MEM_freeN(vm->mesh);
MEM_freeN(vm);
+ MEM_freeN(bv);
}
- BLI_freelistN(&bp->vertList);
+ BLI_ghash_free(bp->vert_hash, NULL, NULL);
}
void bmo_bevel_exec(BMesh *bm, BMOperator *op)
@@ -1462,12 +1465,14 @@
BMOIter siter;
BMVert *v;
BMEdge *e;
- BevelParams bp = {{NULL}};
+ BevelParams bp = {NULL};
bp.offset = BMO_slot_float_get(op, "offset");
bp.seg = BMO_slot_int_get(op, "segments");
if (bp.offset > 0) {
+ bp.vert_hash = BLI_ghash_ptr_new(__func__);
+
/* first flush 'geom' into flags, this makes it possible to check connected data */
BM_mesh_elem_hflag_disable_all(bm, BM_VERT | BM_EDGE, BM_ELEM_TAG, FALSE);
More information about the Bf-blender-cvs
mailing list