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-11 20:20:29 +0400
committerCampbell Barton <ideasman42@gmail.com>2013-05-11 20:20:29 +0400
commitdc1a36534d2832e9b30f369acd0dabcad93c632f (patch)
tree75270ee9dd4e00eda8b8a56a013869b8ec08b5b2 /source/blender/bmesh/intern/bmesh_edgeloop.c
parent01063faf6fa8513e0afff7392dc9f111de9e5ff1 (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.c49
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 */