Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2011-11-27 06:05:46 +0400
committerCampbell Barton <ideasman42@gmail.com>2011-11-27 06:05:46 +0400
commit565e2b4d7388aafcef024e114e19802c756174eb (patch)
tree8cbc7c93358441c6a0eaaacab7c2610d843c6990 /source/blender
parent7553440aa404743b537dd33e9feea9616e9abbfe (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.h4
-rw-r--r--source/blender/bmesh/intern/bmesh_iterators.c4
-rw-r--r--source/blender/bmesh/intern/bmesh_mesh.c15
-rw-r--r--source/blender/editors/mesh/bmesh_select.c12
-rw-r--r--source/blender/editors/object/object_vgroup.c2
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;
}