diff options
author | Bastien Montagne <montagne29@wanadoo.fr> | 2014-04-15 18:18:27 +0400 |
---|---|---|
committer | Bastien Montagne <montagne29@wanadoo.fr> | 2014-04-15 18:20:07 +0400 |
commit | e4c2a3c31cf262fcf5d3577552e66b1c5e63218f (patch) | |
tree | cae7af23fb84a9ea564a67ecfb93341b1a906ff2 /source | |
parent | a15ae564217f2b47848c337e477068be0e150973 (diff) |
Various fixes/improvements regarding BMesh's elem_index_dirty and BM_LOOP handling.
Most notably, BM_LOOP and BM_FACE index recompute should now be fully decoupled.
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/blenkernel/intern/cdderivedmesh.c | 4 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/modifiers_bmesh.c | 5 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_mesh.c | 42 | ||||
-rw-r--r-- | source/blender/bmesh/operators/bmo_removedoubles.c | 2 | ||||
-rw-r--r-- | source/blender/bmesh/tools/bmesh_decimate_collapse.c | 2 |
5 files changed, 33 insertions, 22 deletions
diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c index 176ef505a9a..b1bf1b4889f 100644 --- a/source/blender/blenkernel/intern/cdderivedmesh.c +++ b/source/blender/blenkernel/intern/cdderivedmesh.c @@ -2162,6 +2162,8 @@ static DerivedMesh *cddm_from_bmesh_ex(struct BMesh *bm, const bool use_mdisps, mloop->e = BM_elem_index_get(l_iter->e); CustomData_from_bmesh_block(&bm->ldata, &dm->loopData, l_iter->head.data, j); + BM_elem_index_set(l_iter, j); /* set_inline */ + j++; mloop++; } while ((l_iter = l_iter->next) != l_first); @@ -2170,7 +2172,7 @@ static DerivedMesh *cddm_from_bmesh_ex(struct BMesh *bm, const bool use_mdisps, if (add_orig) *index++ = i; } - bm->elem_index_dirty &= ~BM_FACE; + bm->elem_index_dirty &= ~(BM_FACE | BM_LOOP); dm->cd_flag = BM_mesh_cd_flag_from_bmesh(bm); diff --git a/source/blender/blenkernel/intern/modifiers_bmesh.c b/source/blender/blenkernel/intern/modifiers_bmesh.c index 13368be1acb..3cb607730d4 100644 --- a/source/blender/blenkernel/intern/modifiers_bmesh.c +++ b/source/blender/blenkernel/intern/modifiers_bmesh.c @@ -176,7 +176,8 @@ void DM_to_bmesh_ex(DerivedMesh *dm, BMesh *bm, const bool calc_face_normal) l_iter = l_first = BM_FACE_FIRST_LOOP(f); do { /* Save index of correspsonding MLoop */ - CustomData_to_bmesh_block(&dm->loopData, &bm->ldata, j++, &l_iter->head.data, true); + CustomData_to_bmesh_block(&dm->loopData, &bm->ldata, j, &l_iter->head.data, true); + BM_elem_index_set(l_iter, j++); /* set_inline */ } while ((l_iter = l_iter->next) != l_first); CustomData_to_bmesh_block(&dm->polyData, &bm->pdata, i, &f->head.data, true); @@ -195,7 +196,7 @@ void DM_to_bmesh_ex(DerivedMesh *dm, BMesh *bm, const bool calc_face_normal) *orig_index = ORIGINDEX_NONE; } } - if (is_init) bm->elem_index_dirty &= ~BM_FACE; + if (is_init) bm->elem_index_dirty &= ~(BM_FACE | BM_LOOP); MEM_freeN(vtable); MEM_freeN(etable); diff --git a/source/blender/bmesh/intern/bmesh_mesh.c b/source/blender/bmesh/intern/bmesh_mesh.c index ee7dc8139d1..e7233535760 100644 --- a/source/blender/bmesh/intern/bmesh_mesh.c +++ b/source/blender/bmesh/intern/bmesh_mesh.c @@ -451,10 +451,12 @@ static void bm_mesh_edges_sharp_tag(BMesh *bm, const float (*vnos)[3], const flo { char hflag = BM_LOOP; - if (vnos) + if (vnos) { hflag |= BM_VERT; - if (fnos) + } + if (fnos) { hflag |= BM_FACE; + } BM_mesh_elem_index_ensure(bm, hflag); } @@ -508,10 +510,12 @@ static void bm_mesh_loops_calc_normals(BMesh *bm, const float (*vcos)[3], const { char hflag = BM_LOOP; - if (vcos) + if (vcos) { hflag |= BM_VERT; - if (fnos) + } + if (fnos) { hflag |= BM_FACE; + } BM_mesh_elem_index_ensure(bm, hflag); } @@ -822,27 +826,31 @@ void BM_mesh_elem_index_ensure(BMesh *bm, const char hflag) BMIter iter; BMElem *ele; - const bool hflag_loop = (hflag & BM_LOOP) && (bm->elem_index_dirty & BM_LOOP); + const bool update_face = (hflag & BM_FACE) && (bm->elem_index_dirty & BM_FACE); + const bool update_loop = (hflag & BM_LOOP) && (bm->elem_index_dirty & BM_LOOP); int index; - int index_loop_start = 0; + int index_loop = 0; + BM_ITER_MESH_INDEX (ele, &iter, bm, BM_FACES_OF_MESH, index) { - BM_elem_index_set(ele, index); /* set_ok */ + if (update_face) { + BM_elem_index_set(ele, index); /* set_ok */ + } - if (hflag_loop) { - BMIter liter; - BMElem *lele; + if (update_loop) { + BMLoop *l_iter, *l_first; - int index_diff; - BM_ITER_ELEM_INDEX (lele, &liter, ele, BM_LOOPS_OF_FACE, index_diff) { - BM_elem_index_set(lele, index_loop_start + index_diff); /* set_ok */ - } - index_loop_start += index_diff; + l_iter = l_first = BM_FACE_FIRST_LOOP((BMFace *)ele); + do { + BM_elem_index_set(l_iter, index_loop++); /* set_ok */ + } while ((l_iter = l_iter->next) != l_first); } } + BLI_assert(index == bm->totface); - if (hflag & BM_LOOP) - BLI_assert(index_loop_start == bm->totloop); + if (update_loop) { + BLI_assert(index_loop == bm->totloop); + } } else { // printf("%s: skipping face/loop index calc!\n", __func__); diff --git a/source/blender/bmesh/operators/bmo_removedoubles.c b/source/blender/bmesh/operators/bmo_removedoubles.c index cef7c70d520..216d3410de8 100644 --- a/source/blender/bmesh/operators/bmo_removedoubles.c +++ b/source/blender/bmesh/operators/bmo_removedoubles.c @@ -219,7 +219,7 @@ void bmo_weld_verts_exec(BMesh *bm, BMOperator *op) } } } - bm->elem_index_dirty |= BM_FACE; + bm->elem_index_dirty |= BM_FACE | BM_LOOP; /* faces get "modified" by creating new faces here, then at the * end the old faces are deleted */ diff --git a/source/blender/bmesh/tools/bmesh_decimate_collapse.c b/source/blender/bmesh/tools/bmesh_decimate_collapse.c index ef628a10607..1e9d8e9ee9d 100644 --- a/source/blender/bmesh/tools/bmesh_decimate_collapse.c +++ b/source/blender/bmesh/tools/bmesh_decimate_collapse.c @@ -1006,7 +1006,7 @@ void BM_mesh_decimate_collapse(BMesh *bm, const float factor, float *vweights, c bm_decim_build_edge_cost(bm, vquadrics, vweights, eheap, eheap_table); face_tot_target = bm->totface * factor; - bm->elem_index_dirty |= BM_FACE | BM_LOOP | BM_EDGE | BM_VERT; + bm->elem_index_dirty |= BM_ALL; #ifdef USE_CUSTOMDATA |