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-12 14:00:15 +0400
committerCampbell Barton <ideasman42@gmail.com>2013-05-12 14:00:15 +0400
commitf87464392c5cc270381d1c8d358abd525df53e9a (patch)
treebd72c8ccf2bdbd36a93f2cb8216b0c53c1bd2a70 /source/blender/bmesh
parent877e0e1184230c320cf61d10873cbf1c0ed31072 (diff)
bridge option to bridge loop pairs,
change the operator option to an enum: Connect Loops - open/closed/pairs because it was getting confusing having all as bools.
Diffstat (limited to 'source/blender/bmesh')
-rw-r--r--source/blender/bmesh/intern/bmesh_edgeloop.c17
-rw-r--r--source/blender/bmesh/intern/bmesh_edgeloop.h2
-rw-r--r--source/blender/bmesh/intern/bmesh_opdefines.c1
-rw-r--r--source/blender/bmesh/operators/bmo_bridge.c12
4 files changed, 28 insertions, 4 deletions
diff --git a/source/blender/bmesh/intern/bmesh_edgeloop.c b/source/blender/bmesh/intern/bmesh_edgeloop.c
index 2f68effc97a..d85db111a23 100644
--- a/source/blender/bmesh/intern/bmesh_edgeloop.c
+++ b/source/blender/bmesh/intern/bmesh_edgeloop.c
@@ -190,7 +190,7 @@ void BM_mesh_edgeloops_calc_normal(BMesh *bm, ListBase *eloops)
}
}
-void BM_mesh_edgeloops_calc_order(BMesh *UNUSED(bm), ListBase *eloops)
+void BM_mesh_edgeloops_calc_order(BMesh *UNUSED(bm), ListBase *eloops, const bool use_normals)
{
ListBase eloops_ordered = {NULL};
BMEdgeLoopStore *el_store;
@@ -223,9 +223,22 @@ void BM_mesh_edgeloops_calc_order(BMesh *UNUSED(bm), ListBase *eloops)
while (eloops->first) {
BMEdgeLoopStore *el_store_best = NULL;
const float *co = ((BMEdgeLoopStore *)eloops_ordered.last)->co;
+ const float *no = ((BMEdgeLoopStore *)eloops_ordered.last)->no;
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);
+ float len;
+ if (use_normals) {
+ /* scale the length by how close the loops are to pointing at eachother */
+ float dir[3];
+ sub_v3_v3v3(dir, co, el_store->co);
+ len = normalize_v3(dir);
+ len = len * ((1.0f - fabsf(dot_v3v3(dir, no))) +
+ (1.0f - fabsf(dot_v3v3(dir, el_store->no))));
+ }
+ else {
+ len = len_squared_v3v3(co, el_store->co);
+ }
+
if (len < len_best) {
len_best = len;
el_store_best = el_store;
diff --git a/source/blender/bmesh/intern/bmesh_edgeloop.h b/source/blender/bmesh/intern/bmesh_edgeloop.h
index b569f0cf4ce..c8cd6943af9 100644
--- a/source/blender/bmesh/intern/bmesh_edgeloop.h
+++ b/source/blender/bmesh/intern/bmesh_edgeloop.h
@@ -38,7 +38,7 @@ int BM_mesh_edgeloops_find(BMesh *bm, struct ListBase *r_lb,
void BM_mesh_edgeloops_free(struct ListBase *eloops);
void BM_mesh_edgeloops_calc_center(BMesh *bm, struct ListBase *eloops);
void BM_mesh_edgeloops_calc_normal(BMesh *bm, struct ListBase *eloops);
-void BM_mesh_edgeloops_calc_order(BMesh *UNUSED(bm), ListBase *eloops);
+void BM_mesh_edgeloops_calc_order(BMesh *UNUSED(bm), ListBase *eloops, const bool use_normals);
/* single edgeloop */
diff --git a/source/blender/bmesh/intern/bmesh_opdefines.c b/source/blender/bmesh/intern/bmesh_opdefines.c
index f145d6939d9..53e01b94712 100644
--- a/source/blender/bmesh/intern/bmesh_opdefines.c
+++ b/source/blender/bmesh/intern/bmesh_opdefines.c
@@ -515,6 +515,7 @@ static BMOpDefine bmo_bridge_loops_def = {
"bridge_loops",
/* slots_in */
{{"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}}, /* input edges */
+ {"use_pairs", BMO_OP_SLOT_BOOL},
{"use_cyclic", BMO_OP_SLOT_BOOL},
{"use_merge", BMO_OP_SLOT_BOOL},
{"merge_factor", BMO_OP_SLOT_FLT},
diff --git a/source/blender/bmesh/operators/bmo_bridge.c b/source/blender/bmesh/operators/bmo_bridge.c
index bf7c9f86df7..5182ac56f88 100644
--- a/source/blender/bmesh/operators/bmo_bridge.c
+++ b/source/blender/bmesh/operators/bmo_bridge.c
@@ -370,6 +370,7 @@ void bmo_bridge_loops_exec(BMesh *bm, BMOperator *op)
LinkData *el_store;
/* merge-bridge support */
+ const bool use_pairs = BMO_slot_bool_get(op->slots_in, "use_pairs");
const bool use_merge = BMO_slot_bool_get(op->slots_in, "use_merge");
const float merge_factor = BMO_slot_float_get(op->slots_in, "merge_factor");
const bool use_cyclic = BMO_slot_bool_get(op->slots_in, "use_cyclic") && (use_merge == false);
@@ -389,6 +390,12 @@ void bmo_bridge_loops_exec(BMesh *bm, BMOperator *op)
goto cleanup;
}
+ if (use_pairs && (count % 2)) {
+ BMO_error_raise(bm, op, BMERR_INVALID_SELECTION,
+ "Select an even number of loops to bridge pairs");
+ goto cleanup;
+ }
+
if (use_merge) {
bool match = true;
const int eloop_len = BM_edgeloop_length_get(eloops.first);
@@ -406,7 +413,7 @@ void bmo_bridge_loops_exec(BMesh *bm, BMOperator *op)
}
if (count > 2) {
- BM_mesh_edgeloops_calc_order(bm, &eloops);
+ BM_mesh_edgeloops_calc_order(bm, &eloops, use_pairs);
}
for (el_store = eloops.first; el_store; el_store = el_store->next) {
@@ -425,6 +432,9 @@ void bmo_bridge_loops_exec(BMesh *bm, BMOperator *op)
(struct BMEdgeLoopStore *)el_store,
(struct BMEdgeLoopStore *)el_store_next,
use_merge, merge_factor);
+ if (use_pairs) {
+ el_store = el_store->next;
+ }
change = true;
}