diff options
author | Campbell Barton <ideasman42@gmail.com> | 2013-05-11 20:20:29 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2013-05-11 20:20:29 +0400 |
commit | dc1a36534d2832e9b30f369acd0dabcad93c632f (patch) | |
tree | 75270ee9dd4e00eda8b8a56a013869b8ec08b5b2 /source/blender/bmesh/intern/bmesh_edgeloop.c | |
parent | 01063faf6fa8513e0afff7392dc9f111de9e5ff1 (diff) |
add support for bridging multiple edge loops at once.
Diffstat (limited to 'source/blender/bmesh/intern/bmesh_edgeloop.c')
-rw-r--r-- | source/blender/bmesh/intern/bmesh_edgeloop.c | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/source/blender/bmesh/intern/bmesh_edgeloop.c b/source/blender/bmesh/intern/bmesh_edgeloop.c index ce2a80c6cfc..1c302668409 100644 --- a/source/blender/bmesh/intern/bmesh_edgeloop.c +++ b/source/blender/bmesh/intern/bmesh_edgeloop.c @@ -188,6 +188,55 @@ void BM_mesh_edgeloops_calc_normal(BMesh *bm, ListBase *eloops) } } +void BM_mesh_edgeloops_calc_order(BMesh *UNUSED(bm), ListBase *eloops) +{ + ListBase eloops_ordered = {NULL}; + BMEdgeLoopStore *el_store; + float cent[3]; + int tot = 0; + zero_v3(cent); + /* assumes we calculated centers already */ + for (el_store = eloops->first; el_store; el_store = el_store->next, tot++) { + add_v3_v3(cent, el_store->co); + } + mul_v3_fl(cent, 1.0f / (float)tot); + + /* find far outest loop */ + { + BMEdgeLoopStore *el_store_best = NULL; + float len_best = -1.0f; + for (el_store = eloops->first; el_store; el_store = el_store->next) { + const float len = len_squared_v3v3(cent, el_store->co); + if (len > len_best) { + len_best = len; + el_store_best = el_store; + } + } + + BLI_remlink(eloops, el_store_best); + BLI_addtail(&eloops_ordered, el_store_best); + } + + /* not so efficient re-ordering */ + while (eloops->first) { + BMEdgeLoopStore *el_store_best = NULL; + const float *co = ((BMEdgeLoopStore *)eloops_ordered.last)->co; + float len_best = FLT_MAX; + for (el_store = eloops->first; el_store; el_store = el_store->next) { + const float len = len_squared_v3v3(co, el_store->co); + if (len < len_best) { + len_best = len; + el_store_best = el_store; + } + } + + BLI_remlink(eloops, el_store_best); + BLI_addtail(&eloops_ordered, el_store_best); + } + + *eloops = eloops_ordered; +} + /* -------------------------------------------------------------------- */ /* BM_edgeloop_*** functions */ |