diff options
author | Campbell Barton <ideasman42@gmail.com> | 2011-11-27 06:05:46 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2011-11-27 06:05:46 +0400 |
commit | 565e2b4d7388aafcef024e114e19802c756174eb (patch) | |
tree | 8cbc7c93358441c6a0eaaacab7c2610d843c6990 /source/blender | |
parent | 7553440aa404743b537dd33e9feea9616e9abbfe (diff) |
use faster method of getting vert/edge/face indices which uses BLI_mempool_findelem to skip over chunks rather than going over every element
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/bmesh/bmesh.h | 4 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_iterators.c | 4 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_mesh.c | 15 | ||||
-rw-r--r-- | source/blender/editors/mesh/bmesh_select.c | 12 | ||||
-rw-r--r-- | source/blender/editors/object/object_vgroup.c | 2 |
5 files changed, 29 insertions, 8 deletions
diff --git a/source/blender/bmesh/bmesh.h b/source/blender/bmesh/bmesh.h index c8e4b4defa3..4f51019a2e0 100644 --- a/source/blender/bmesh/bmesh.h +++ b/source/blender/bmesh/bmesh.h @@ -334,6 +334,10 @@ void BM_ElemIndex_Ensure(BMesh *bm, const char hflag); void BM_ElemIndex_Validate(BMesh *bm, const char *location, const char *func, const char *msg_a, const char *msg_b); +BMVert *BM_Vert_AtIndex(BMesh *bm, const int index); +BMEdge *BM_Edge_AtIndex(BMesh *bm, const int index); +BMFace *BM_Face_AtIndex(BMesh *bm, const int index); + /*start/stop edit*/ void bmesh_begin_edit(struct BMesh *bm, int flag); void bmesh_end_edit(struct BMesh *bm, int flag); diff --git a/source/blender/bmesh/intern/bmesh_iterators.c b/source/blender/bmesh/intern/bmesh_iterators.c index 9a7064c136a..34aed35a890 100644 --- a/source/blender/bmesh/intern/bmesh_iterators.c +++ b/source/blender/bmesh/intern/bmesh_iterators.c @@ -3,7 +3,9 @@ #include "bmesh.h" #include "bmesh_private.h" - +/* + * note, we have BM_Vert_AtIndex/BM_Edge_AtIndex/BM_Face_AtIndex for arrays + */ void *BMIter_AtIndex(struct BMesh *bm, const char htype, void *data, int index) { BMIter iter; diff --git a/source/blender/bmesh/intern/bmesh_mesh.c b/source/blender/bmesh/intern/bmesh_mesh.c index f9f19f760ee..acb23034ca7 100644 --- a/source/blender/bmesh/intern/bmesh_mesh.c +++ b/source/blender/bmesh/intern/bmesh_mesh.c @@ -587,3 +587,18 @@ void BM_ElemIndex_Validate(BMesh *bm, const char *location, const char *func, co #endif #endif } + +BMVert *BM_Vert_AtIndex(BMesh *bm, const int index) +{ + return BLI_mempool_findelem(bm->vpool, index); +} + +BMEdge *BM_Edge_AtIndex(BMesh *bm, const int index) +{ + return BLI_mempool_findelem(bm->epool, index); +} + +BMFace *BM_Face_AtIndex(BMesh *bm, const int index) +{ + return BLI_mempool_findelem(bm->fpool, index); +} diff --git a/source/blender/editors/mesh/bmesh_select.c b/source/blender/editors/mesh/bmesh_select.c index a4f381321dd..ad6715f9668 100644 --- a/source/blender/editors/mesh/bmesh_select.c +++ b/source/blender/editors/mesh/bmesh_select.c @@ -366,7 +366,7 @@ static void findnearestvert__doClosest(void *userData, BMVert *eve, int x, int y static unsigned int findnearestvert__backbufIndextest(void *handle, unsigned int index) { BMEditMesh *em= (BMEditMesh *)handle; - BMVert *eve = BMIter_AtIndex(em->bm, BM_VERTS_OF_MESH, NULL, index-1); + BMVert *eve = BM_Vert_AtIndex(em->bm, index-1); if(eve && BM_TestHFlag(eve, BM_SELECT)) return 0; return 1; @@ -390,7 +390,7 @@ BMVert *EDBM_findnearestvert(ViewContext *vc, int *dist, short sel, short strict if(strict) index = view3d_sample_backbuf_rect(vc, vc->mval, 50, bm_wireoffs, 0xFFFFFF, &distance, strict, vc->em, findnearestvert__backbufIndextest); else index = view3d_sample_backbuf_rect(vc, vc->mval, 50, bm_wireoffs, 0xFFFFFF, &distance, 0, NULL, NULL); - eve = BMIter_AtIndex(vc->em->bm, BM_VERTS_OF_MESH, NULL, index-1); + eve = BM_Vert_AtIndex(vc->em->bm, index-1); if(eve && distance < *dist) { *dist = distance; @@ -405,7 +405,7 @@ BMVert *EDBM_findnearestvert(ViewContext *vc, int *dist, short sel, short strict static int lastSelectedIndex=0; static BMVert *lastSelected=NULL; - if (lastSelected && BMIter_AtIndex(vc->em->bm, BM_VERTS_OF_MESH, NULL, lastSelectedIndex)!=lastSelected) { + if (lastSelected && BM_Vert_AtIndex(vc->em->bm, lastSelectedIndex) != lastSelected) { lastSelectedIndex = 0; lastSelected = NULL; } @@ -499,7 +499,7 @@ BMEdge *EDBM_findnearestedge(ViewContext *vc, int *dist) view3d_validate_backbuf(vc); index = view3d_sample_backbuf_rect(vc, vc->mval, 50, bm_solidoffs, bm_wireoffs, &distance,0, NULL, NULL); - eed = BMIter_AtIndex(vc->em->bm, BM_EDGES_OF_MESH, NULL, index-1); + eed = BM_Edge_AtIndex(vc->em->bm, index-1); if (eed && distance<*dist) { *dist = distance; @@ -569,7 +569,7 @@ BMFace *EDBM_findnearestface(ViewContext *vc, int *dist) view3d_validate_backbuf(vc); index = view3d_sample_backbuf(vc, vc->mval[0], vc->mval[1]); - efa = BMIter_AtIndex(vc->em->bm, BM_FACES_OF_MESH, NULL, index-1); + efa = BM_Face_AtIndex(vc->em->bm, index-1); if (efa) { struct { short mval[2]; int dist; BMFace *toFace; } data; @@ -594,7 +594,7 @@ BMFace *EDBM_findnearestface(ViewContext *vc, int *dist) static int lastSelectedIndex=0; static BMFace *lastSelected=NULL; - if (lastSelected && BMIter_AtIndex(vc->em->bm, BM_FACES_OF_MESH, NULL, lastSelectedIndex)!=lastSelected) { + if (lastSelected && BM_Face_AtIndex(vc->em->bm, lastSelectedIndex) != lastSelected) { lastSelectedIndex = 0; lastSelected = NULL; } diff --git a/source/blender/editors/object/object_vgroup.c b/source/blender/editors/object/object_vgroup.c index b747d3bc9fc..94328259dc3 100644 --- a/source/blender/editors/object/object_vgroup.c +++ b/source/blender/editors/object/object_vgroup.c @@ -556,7 +556,7 @@ static float get_vert_def_nr(Object *ob, int def_nr, int vertnum) me= ob->data; if(me->edit_btmesh) { - eve= BMIter_AtIndex(me->edit_btmesh->bm, BM_VERTS_OF_MESH, NULL, vertnum); + eve= BM_Vert_AtIndex(me->edit_btmesh->bm, vertnum); if(!eve) { return 0.0f; } |