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>2013-05-09 14:44:38 +0400
committerCampbell Barton <ideasman42@gmail.com>2013-05-09 14:44:38 +0400
commit278240f4b0c76194ddbc0e420864d7a3206cef05 (patch)
tree24efd70185aa8c346cf292e980cdfe9ea1d686c9
parent1e784c54cd78d75a6eb94eccf81161265e297321 (diff)
bmesh: avoid using BLI_array macros for every face when converting to bmesh, replace with alloca
-rw-r--r--source/blender/blenkernel/intern/modifiers_bmesh.c45
-rw-r--r--source/blender/bmesh/intern/bmesh_mesh_conv.c95
2 files changed, 59 insertions, 81 deletions
diff --git a/source/blender/blenkernel/intern/modifiers_bmesh.c b/source/blender/blenkernel/intern/modifiers_bmesh.c
index 765e65361a8..fa46c425c7e 100644
--- a/source/blender/blenkernel/intern/modifiers_bmesh.c
+++ b/source/blender/blenkernel/intern/modifiers_bmesh.c
@@ -40,6 +40,22 @@
#include "BKE_bmesh.h"
#include "BKE_editmesh.h"
+/* Static function for alloc */
+BLI_INLINE BMFace *bm_face_create_from_mpoly(MPoly *mp, MLoop *ml,
+ BMesh *bm, BMVert **vtable, BMEdge **etable)
+{
+ BMVert **verts = BLI_array_alloca(verts, mp->totloop);
+ BMEdge **edges = BLI_array_alloca(edges, mp->totloop);
+ int j;
+
+ for (j = 0; j < mp->totloop; j++, ml++) {
+ verts[j] = vtable[ml->v];
+ edges[j] = etable[ml->e];
+ }
+
+ return BM_face_create(bm, verts, edges, mp->totloop, BM_CREATE_SKIP_CD);
+}
+
/**
* The main function for copying DerivedMesh data into BMesh.
*
@@ -50,15 +66,13 @@ void DM_to_bmesh_ex(DerivedMesh *dm, BMesh *bm)
MVert *mv, *mvert;
MEdge *me, *medge;
MPoly /* *mpoly, */ /* UNUSED */ *mp;
- MLoop *mloop, *ml;
- BMVert *v, **vtable, **verts = NULL;
- BMEdge *e, **etable, **edges = NULL;
+ MLoop *mloop;
+ BMVert *v, **vtable;
+ BMEdge *e, **etable;
float (*face_normals)[3];
BMFace *f;
BMIter liter;
- BLI_array_declare(verts);
- BLI_array_declare(edges);
- int i, j, k, totvert, totedge /* , totface */ /* UNUSED */ ;
+ int i, k, totvert, totedge /* , totface */ /* UNUSED */ ;
bool is_init = (bm->totvert == 0) && (bm->totedge == 0) && (bm->totface == 0);
bool is_cddm = (dm->type == DM_TYPE_CDDM); /* duplicate the arrays for non cddm */
char has_orig_hflag = 0;
@@ -148,20 +162,8 @@ void DM_to_bmesh_ex(DerivedMesh *dm, BMesh *bm)
for (i = 0; i < dm->numPolyData; i++, mp++) {
BMLoop *l;
- BLI_array_empty(verts);
- BLI_array_empty(edges);
-
- BLI_array_grow_items(verts, mp->totloop);
- BLI_array_grow_items(edges, mp->totloop);
-
- ml = mloop + mp->loopstart;
- for (j = 0; j < mp->totloop; j++, ml++) {
-
- verts[j] = vtable[ml->v];
- edges[j] = etable[ml->e];
- }
-
- f = BM_face_create(bm, verts, edges, mp->totloop, BM_CREATE_SKIP_CD);
+ f = bm_face_create_from_mpoly(mp, mloop + mp->loopstart,
+ bm, vtable, etable);
if (UNLIKELY(f == NULL)) {
continue;
@@ -195,9 +197,6 @@ void DM_to_bmesh_ex(DerivedMesh *dm, BMesh *bm)
MEM_freeN(vtable);
MEM_freeN(etable);
-
- BLI_array_free(verts);
- BLI_array_free(edges);
}
/* converts a cddm to a BMEditMesh. if existing is non-NULL, the
diff --git a/source/blender/bmesh/intern/bmesh_mesh_conv.c b/source/blender/bmesh/intern/bmesh_mesh_conv.c
index 27e4a8df2a7..aab60d7f9f1 100644
--- a/source/blender/bmesh/intern/bmesh_mesh_conv.c
+++ b/source/blender/bmesh/intern/bmesh_mesh_conv.c
@@ -163,6 +163,23 @@ char BM_mesh_cd_flag_from_bmesh(BMesh *bm)
return cd_flag;
}
+/* Static function for alloc (duplicate in modifiers_bmesh.c) */
+BLI_INLINE BMFace *bm_face_create_from_mpoly(MPoly *mp, MLoop *ml,
+ BMesh *bm, BMVert **vtable, BMEdge **etable)
+{
+ BMVert **verts = BLI_array_alloca(verts, mp->totloop);
+ BMEdge **edges = BLI_array_alloca(edges, mp->totloop);
+ int j;
+
+ for (j = 0; j < mp->totloop; j++, ml++) {
+ verts[j] = vtable[ml->v];
+ edges[j] = etable[ml->e];
+ }
+
+ return BM_face_create(bm, verts, edges, mp->totloop, BM_CREATE_SKIP_CD);
+}
+
+
/**
* \brief Mesh -> BMesh
*
@@ -171,15 +188,13 @@ char BM_mesh_cd_flag_from_bmesh(BMesh *bm)
void BM_mesh_bm_from_me(BMesh *bm, Mesh *me, bool set_key, int act_key_nr)
{
MVert *mvert;
- BLI_array_declare(verts);
MEdge *medge;
- MLoop *ml;
- MPoly *mpoly;
+ MLoop *mloop;
+ MPoly *mp;
KeyBlock *actkey, *block;
- BMVert *v, **vt = NULL, **verts = NULL;
- BMEdge *e, **fedges = NULL, **et = NULL;
+ BMVert *v, **vtable = NULL;
+ BMEdge *e, **etable = NULL;
BMFace *f;
- BLI_array_declare(fedges);
float (*keyco)[3] = NULL;
int *keyi;
int totuv, i, j;
@@ -210,7 +225,7 @@ void BM_mesh_bm_from_me(BMesh *bm, Mesh *me, bool set_key, int act_key_nr)
return; /* sanity check */
}
- vt = MEM_mallocN(sizeof(void **) * me->totvert, "mesh to bmesh vtable");
+ vtable = MEM_mallocN(sizeof(void **) * me->totvert, "mesh to bmesh vtable");
CustomData_copy(&me->vdata, &bm->vdata, CD_MASK_BMESH, CD_CALLOC, 0);
CustomData_copy(&me->edata, &bm->edata, CD_MASK_BMESH, CD_CALLOC, 0);
@@ -275,9 +290,8 @@ void BM_mesh_bm_from_me(BMesh *bm, Mesh *me, bool set_key, int act_key_nr)
cd_edge_crease_offset = CustomData_get_offset(&bm->edata, CD_CREASE);
for (i = 0, mvert = me->mvert; i < me->totvert; i++, mvert++) {
- v = BM_vert_create(bm, keyco && set_key ? keyco[i] : mvert->co, NULL, BM_CREATE_SKIP_CD);
+ v = vtable[i] = BM_vert_create(bm, keyco && set_key ? keyco[i] : mvert->co, NULL, BM_CREATE_SKIP_CD);
BM_elem_index_set(v, i); /* set_ok */
- vt[i] = v;
/* transfer flag */
v->head.hflag = BM_vert_flag_from_mflag(mvert->flag & ~SELECT);
@@ -315,17 +329,16 @@ void BM_mesh_bm_from_me(BMesh *bm, Mesh *me, bool set_key, int act_key_nr)
bm->elem_index_dirty &= ~BM_VERT; /* added in order, clear dirty flag */
if (!me->totedge) {
- MEM_freeN(vt);
+ MEM_freeN(vtable);
return;
}
- et = MEM_mallocN(sizeof(void **) * me->totedge, "mesh to bmesh etable");
+ etable = MEM_mallocN(sizeof(void **) * me->totedge, "mesh to bmesh etable");
medge = me->medge;
for (i = 0; i < me->totedge; i++, medge++) {
- e = BM_edge_create(bm, vt[medge->v1], vt[medge->v2], NULL, BM_CREATE_SKIP_CD);
+ e = etable[i] = BM_edge_create(bm, vtable[medge->v1], vtable[medge->v2], NULL, BM_CREATE_SKIP_CD);
BM_elem_index_set(e, i); /* set_ok */
- et[i] = e;
/* transfer flags */
e->head.hflag = BM_edge_flag_from_mflag(medge->flag & ~SELECT);
@@ -345,45 +358,14 @@ void BM_mesh_bm_from_me(BMesh *bm, Mesh *me, bool set_key, int act_key_nr)
bm->elem_index_dirty &= ~BM_EDGE; /* added in order, clear dirty flag */
- mpoly = me->mpoly;
- for (i = 0; i < me->totpoly; i++, mpoly++) {
+ mloop = me->mloop;
+ mp = me->mpoly;
+ for (i = 0; i < me->totpoly; i++, mp++) {
BMLoop *l_iter;
BMLoop *l_first;
- BLI_array_empty(fedges);
- BLI_array_empty(verts);
-
- BLI_array_grow_items(fedges, mpoly->totloop);
- BLI_array_grow_items(verts, mpoly->totloop);
-
- for (j = 0; j < mpoly->totloop; j++) {
- ml = &me->mloop[mpoly->loopstart + j];
- v = vt[ml->v];
- e = et[ml->e];
-
- fedges[j] = e;
- verts[j] = v;
- }
-
- /* not sure what this block is supposed to do,
- * but its unused. so commenting - campbell */
-#if 0
- {
- BMVert *v1, *v2;
- v1 = vt[me->mloop[mpoly->loopstart].v];
- v2 = vt[me->mloop[mpoly->loopstart + 1].v];
-
- if (v1 == fedges[0]->v1) {
- v2 = fedges[0]->v2;
- }
- else {
- v1 = fedges[0]->v2;
- v2 = fedges[0]->v1;
- }
- }
-#endif
-
- f = BM_face_create(bm, verts, fedges, mpoly->totloop, BM_CREATE_SKIP_CD);
+ f = bm_face_create_from_mpoly(mp, mloop + mp->loopstart,
+ bm, vtable, etable);
if (UNLIKELY(f == NULL)) {
printf("%s: Warning! Bad face in mesh"
@@ -396,17 +378,17 @@ void BM_mesh_bm_from_me(BMesh *bm, Mesh *me, bool set_key, int act_key_nr)
BM_elem_index_set(f, bm->totface - 1); /* set_ok */
/* transfer flag */
- f->head.hflag = BM_face_flag_from_mflag(mpoly->flag & ~ME_FACE_SEL);
+ f->head.hflag = BM_face_flag_from_mflag(mp->flag & ~ME_FACE_SEL);
/* this is necessary for selection counts to work properly */
- if (mpoly->flag & ME_FACE_SEL) {
+ if (mp->flag & ME_FACE_SEL) {
BM_face_select_set(bm, f, true);
}
- f->mat_nr = mpoly->mat_nr;
+ f->mat_nr = mp->mat_nr;
if (i == me->act_face) bm->act_face = f;
- j = mpoly->loopstart;
+ j = mp->loopstart;
l_iter = l_first = BM_FACE_FIRST_LOOP(f);
do {
/* Save index of correspsonding MLoop */
@@ -462,11 +444,8 @@ void BM_mesh_bm_from_me(BMesh *bm, Mesh *me, bool set_key, int act_key_nr)
}
}
- BLI_array_free(fedges);
- BLI_array_free(verts);
-
- MEM_freeN(vt);
- MEM_freeN(et);
+ MEM_freeN(vtable);
+ MEM_freeN(etable);
}