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 /source/blender/bmesh/intern/bmesh_mesh_conv.c
parent1e784c54cd78d75a6eb94eccf81161265e297321 (diff)
bmesh: avoid using BLI_array macros for every face when converting to bmesh, replace with alloca
Diffstat (limited to 'source/blender/bmesh/intern/bmesh_mesh_conv.c')
-rw-r--r--source/blender/bmesh/intern/bmesh_mesh_conv.c95
1 files changed, 37 insertions, 58 deletions
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);
}