diff options
author | Campbell Barton <ideasman42@gmail.com> | 2011-11-28 22:43:34 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2011-11-28 22:43:34 +0400 |
commit | 40d6765de97328dc5ad50e5a420820933234ed28 (patch) | |
tree | bf114148789227f9cacc970e6f8cad2774be6835 /source/blender | |
parent | 79ffbe96a3b0366bf8b68f90421501a9048faa76 (diff) |
validate the index values when an operator finishes since the arrays are looped over anyway.
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/bmesh/intern/bmesh_operators.c | 61 |
1 files changed, 35 insertions, 26 deletions
diff --git a/source/blender/bmesh/intern/bmesh_operators.c b/source/blender/bmesh/intern/bmesh_operators.c index bd5c6156927..139ae4a13dd 100644 --- a/source/blender/bmesh/intern/bmesh_operators.c +++ b/source/blender/bmesh/intern/bmesh_operators.c @@ -820,6 +820,7 @@ static void alloc_flag_layer(BMesh *bm) BMIter iter; BLI_mempool *oldpool = bm->toolflagpool; /*old flag pool*/ + BLI_mempool *newpool; void *oldflags; /* store memcpy size for reuse */ @@ -828,24 +829,24 @@ static void alloc_flag_layer(BMesh *bm) bm->totflags++; /*allocate new flag pool*/ - bm->toolflagpool = BLI_mempool_create(sizeof(BMFlagLayer)*bm->totflags, 512, 512, FALSE, FALSE); + bm->toolflagpool= newpool= BLI_mempool_create(sizeof(BMFlagLayer)*bm->totflags, 512, 512, FALSE, FALSE); /*now go through and memcpy all the flags. Loops don't get a flag layer at this time...*/ - for(ele = BMIter_New(&iter, bm, BM_VERTS_OF_MESH, bm), i = 0; ele; ele = BMIter_Step(&iter), i++){ + for (ele = BMIter_New(&iter, bm, BM_VERTS_OF_MESH, bm), i = 0; ele; ele = BMIter_Step(&iter), i++) { oldflags = ele->flags; - ele->flags = BLI_mempool_calloc(bm->toolflagpool); + ele->flags = BLI_mempool_calloc(newpool); memcpy(ele->flags, oldflags, old_totflags_size); BM_SetIndex(ele, i); /* set_inline */ } - for(ele = BMIter_New(&iter, bm, BM_EDGES_OF_MESH, bm), i = 0; ele; ele = BMIter_Step(&iter), i++){ + for (ele = BMIter_New(&iter, bm, BM_EDGES_OF_MESH, bm), i = 0; ele; ele = BMIter_Step(&iter), i++) { oldflags = ele->flags; - ele->flags = BLI_mempool_calloc(bm->toolflagpool); + ele->flags = BLI_mempool_calloc(newpool); memcpy(ele->flags, oldflags, old_totflags_size); BM_SetIndex(ele, i); /* set_inline */ } - for(ele = BMIter_New(&iter, bm, BM_FACES_OF_MESH, bm), i = 0; ele; ele = BMIter_Step(&iter), i++){ + for (ele = BMIter_New(&iter, bm, BM_FACES_OF_MESH, bm), i = 0; ele; ele = BMIter_Step(&iter), i++) { oldflags = ele->flags; - ele->flags = BLI_mempool_calloc(bm->toolflagpool); + ele->flags = BLI_mempool_calloc(newpool); memcpy(ele->flags, oldflags, old_totflags_size); BM_SetIndex(ele, i); /* set_inline */ } @@ -857,38 +858,46 @@ static void alloc_flag_layer(BMesh *bm) static void free_flag_layer(BMesh *bm) { - BMVert *v; - BMEdge *e; - BMFace *f; + BMHeader *ele; + /* set the index values since we are looping over all data anyway, + * may save time later on */ + int i; - BMIter verts; - BMIter edges; - BMIter faces; + BMIter iter; BLI_mempool *oldpool = bm->toolflagpool; + BLI_mempool *newpool; void *oldflags; + /* store memcpy size for reuse */ + const size_t new_totflags_size= ((bm->totflags-1) * sizeof(BMFlagLayer)); + /*de-increment the totflags first...*/ bm->totflags--; /*allocate new flag pool*/ - bm->toolflagpool = BLI_mempool_create(sizeof(BMFlagLayer)*bm->totflags, 512, 512, TRUE, FALSE); + bm->toolflagpool= newpool= BLI_mempool_create(new_totflags_size, 512, 512, TRUE, FALSE); /*now go through and memcpy all the flags*/ - for(v = BMIter_New(&verts, bm, BM_VERTS_OF_MESH, bm); v; v = BMIter_Step(&verts)){ - oldflags = v->head.flags; - v->head.flags = BLI_mempool_calloc(bm->toolflagpool); - memcpy(v->head.flags, oldflags, sizeof(BMFlagLayer)*bm->totflags); /*correct?*/ + for (ele = BMIter_New(&iter, bm, BM_VERTS_OF_MESH, bm), i = 0; ele; ele = BMIter_Step(&iter), i++) { + oldflags = ele->flags; + ele->flags = BLI_mempool_calloc(newpool); + memcpy(ele->flags, oldflags, new_totflags_size); + BM_SetIndex(ele, i); /* set_inline */ } - for(e = BMIter_New(&edges, bm, BM_EDGES_OF_MESH, bm); e; e = BMIter_Step(&edges)){ - oldflags = e->head.flags; - e->head.flags = BLI_mempool_calloc(bm->toolflagpool); - memcpy(e->head.flags, oldflags, sizeof(BMFlagLayer)*bm->totflags); + for (ele = BMIter_New(&iter, bm, BM_EDGES_OF_MESH, bm), i = 0; ele; ele = BMIter_Step(&iter), i++) { + oldflags = ele->flags; + ele->flags = BLI_mempool_calloc(newpool); + memcpy(ele->flags, oldflags, new_totflags_size); + BM_SetIndex(ele, i); /* set_inline */ } - for(f = BMIter_New(&faces, bm, BM_FACES_OF_MESH, bm); f; f = BMIter_Step(&faces)){ - oldflags = f->head.flags; - f->head.flags = BLI_mempool_calloc(bm->toolflagpool); - memcpy(f->head.flags, oldflags, sizeof(BMFlagLayer)*bm->totflags); + for (ele = BMIter_New(&iter, bm, BM_FACES_OF_MESH, bm), i = 0; ele; ele = BMIter_Step(&iter), i++) { + oldflags = ele->flags; + ele->flags = BLI_mempool_calloc(newpool); + memcpy(ele->flags, oldflags, new_totflags_size); + BM_SetIndex(ele, i); /* set_inline */ } + bm->elem_index_dirty &= ~(BM_VERT|BM_EDGE|BM_FACE); + BLI_mempool_destroy(oldpool); } |