Commit: 2d7ce3a69d7fa88899da7646b9a00cbc71101d29
Author: Phil Gosch
Date:   Tue Jun 7 14:37:26 2016 +0200
Branches: soc-2016-uv_tools
https://developer.blender.org/rB2d7ce3a69d7fa88899da7646b9a00cbc71101d29

Added "Topological distance" option to Select Shortest Path operator

Similar to the editmesh operator: "Find the minimum number of steps, ignoring 
spatial distance"

===================================================================

M       source/blender/editors/uvedit/uvedit_ops.c
M       source/blender/editors/uvedit/uvedit_parametrizer.c
M       source/blender/editors/uvedit/uvedit_unwrap_ops.c

===================================================================

diff --git a/source/blender/editors/uvedit/uvedit_ops.c 
b/source/blender/editors/uvedit/uvedit_ops.c
index a559fe2..5caeac8 100644
--- a/source/blender/editors/uvedit/uvedit_ops.c
+++ b/source/blender/editors/uvedit/uvedit_ops.c
@@ -1490,6 +1490,7 @@ static int uv_shortest_path_exec(bContext *C, wmOperator 
*op)
        BMElem *ele_src = NULL, *ele_dst = NULL, *ele;
        MLoopUV *luv_src = NULL, *luv_dst = NULL;
        int elem_sel = 0;
+       const bool topological_distance = RNA_boolean_get(op->ptr, 
"topological_distance");
        
 
        if (ts->uv_flag & UV_SYNC_SELECTION) {
@@ -1587,7 +1588,7 @@ static int uv_shortest_path_exec(bContext *C, wmOperator 
*op)
        
        /* -------- Now select shortest path between the 2 found elements 
---------- */
 
-       if (ED_uvedit_shortest_path_select(scene, obedit, bm)) {
+       if (ED_uvedit_shortest_path_select(scene, obedit, bm, 
topological_distance)) {
 
                DAG_id_tag_update(obedit->data, 0);
                WM_event_add_notifier(C, NC_GEOM | ND_SELECT | ND_DATA, 
obedit->data);
@@ -1612,6 +1613,9 @@ static void UV_OT_select_shortest_path(wmOperatorType *ot)
        /* api callbacks */
        ot->exec = uv_shortest_path_exec;
        ot->poll = ED_operator_uvedit;
+
+       /* properties */
+       RNA_def_boolean(ot->srna, "topological_distance", 0, "Topological 
Distance", "Find the minimum number of steps, ignoring spatial distance");
 }
 
 /* ******************** align operator **************** */
diff --git a/source/blender/editors/uvedit/uvedit_parametrizer.c 
b/source/blender/editors/uvedit/uvedit_parametrizer.c
index 9236edf..0eaf483 100644
--- a/source/blender/editors/uvedit/uvedit_parametrizer.c
+++ b/source/blender/editors/uvedit/uvedit_parametrizer.c
@@ -4747,7 +4747,7 @@ void param_scale_bounds(ParamHandle *handle)
        }
 }
 
-void p_verttag_add_adjacent(Heap *heap, PChart *chart, PVert *v_a, PVert 
**v_prev, float *cost)
+void p_verttag_add_adjacent(Heap *heap, PChart *chart, PVert *v_a, PVert 
**v_prev, float *cost, bool use_topology_distance)
 {
        const int v_a_index = v_a->u.id;
        PEdge *e, *we, *lastwe = NULL;
@@ -4769,7 +4769,7 @@ void p_verttag_add_adjacent(Heap *heap, PChart *chart, 
PVert *v_a, PVert **v_pre
                if (!(v_b->flag & PVERT_MARKED) && !(we->flag & PEDGE_DIAG )) {
                        /* v_b not visited yet, check it out! */
                        const int v_b_index = v_b->u.id;
-                       const float cost_cut = len_v2v2(v_a->uv, v_b->uv); /* 
params->use_topology_distance ? 1.0f : len_v2v2(v_a->uv, v_b->uv); */
+                       const float cost_cut = use_topology_distance ? 1.0f : 
len_v2v2(v_a->uv, v_b->uv); 
                        const float cost_new = cost[v_a_index] + cost_cut;
 
                        if (cost[v_b_index] > cost_new) {
@@ -4783,7 +4783,7 @@ void p_verttag_add_adjacent(Heap *heap, PChart *chart, 
PVert *v_a, PVert **v_pre
        } while (we && (we != lastwe));
 }
 
-LinkNode* p_calc_path_vert(PChart *chart, PVert *src, PVert *dst)
+LinkNode* p_calc_path_vert(PChart *chart, PVert *src, PVert *dst, bool 
topological_distance)
 {
        LinkNode *path = NULL;
        Heap *heap;
@@ -4819,7 +4819,7 @@ LinkNode* p_calc_path_vert(PChart *chart, PVert *src, 
PVert *dst)
 
                if (!(vert->flag & PVERT_MARKED)) {
                        vert->flag |= PVERT_MARKED;
-                       p_verttag_add_adjacent(heap, chart, vert, verts_prev, 
cost);
+                       p_verttag_add_adjacent(heap, chart, vert, verts_prev, 
cost, topological_distance);
                }
        }
 
@@ -4859,7 +4859,7 @@ void p_vert_select_edges(PVert* v, bool recursive)
        } while (we && (we != lastwe));
 }
 
-void param_shortest_path(ParamHandle *handle, bool *p_found)
+void param_shortest_path(ParamHandle *handle, bool *p_found, bool 
topological_distance)
 {
        PHandle *phandle = (PHandle *)handle;
        PChart *chart, *current_chart;
@@ -4899,7 +4899,7 @@ void param_shortest_path(ParamHandle *handle, bool 
*p_found)
        LinkNode* path = NULL;
        if (vert_src && vert_dst){
                //printf("start path computation!\n");
-               path = p_calc_path_vert(current_chart, vert_src, vert_dst);
+               path = p_calc_path_vert(current_chart, vert_src, vert_dst, 
topological_distance);
                if (path) {
                        LinkNode *node = NULL;
                        node = path;
diff --git a/source/blender/editors/uvedit/uvedit_unwrap_ops.c 
b/source/blender/editors/uvedit/uvedit_unwrap_ops.c
index 60339aa..656c95c 100644
--- a/source/blender/editors/uvedit/uvedit_unwrap_ops.c
+++ b/source/blender/editors/uvedit/uvedit_unwrap_ops.c
@@ -718,12 +718,12 @@ void UV_OT_minimize_stretch(wmOperatorType *ot)
 }
 
 /* ******************** Select Shortest Path operator **************** */
-bool ED_uvedit_shortest_path_select(Scene *scene, Object *ob, BMesh *bm) 
+bool ED_uvedit_shortest_path_select(Scene *scene, Object *ob, BMesh *bm, bool 
topo_dist) 
 {
        ParamHandle *handle;
        bool path_found = false;
        handle = construct_param_handle(scene, ob, bm, false, false, false, 
true);
-       param_shortest_path(handle, &path_found);
+       param_shortest_path(handle, &path_found, topo_dist);
        param_flush(handle);
        param_delete(handle);
        return path_found;

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to