Commit: c67be0b14fd2c2db260508b9b8d1b853aa5598ce
Author: Phil Gosch
Date:   Thu Jun 2 21:39:36 2016 +0200
Branches: soc-2016-uv_tools
https://developer.blender.org/rBc67be0b14fd2c2db260508b9b8d1b853aa5598ce

Wip: Select Shortest Path: Tagging of found path edges for selection

Selection flags of MLOOPUV should be set in p_flush_uvs(), needs a closer look

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

M       source/blender/editors/uvedit/uvedit_ops.c
M       source/blender/editors/uvedit/uvedit_parametrizer.c
M       source/blender/editors/uvedit/uvedit_parametrizer.h
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 8d2a7d3..b76ea8d 100644
--- a/source/blender/editors/uvedit/uvedit_ops.c
+++ b/source/blender/editors/uvedit/uvedit_ops.c
@@ -1590,7 +1590,7 @@ static int uv_shortest_path_exec(bContext *C, wmOperator 
*op)
        if (ED_uvedit_shortest_path_select(scene, obedit, bm)) {
 
                DAG_id_tag_update(obedit->data, 0);
-               WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
+               WM_event_add_notifier(C, NC_GEOM | ND_SELECT | ND_DATA, 
obedit->data);
 
                return OPERATOR_FINISHED;
        }
diff --git a/source/blender/editors/uvedit/uvedit_parametrizer.c 
b/source/blender/editors/uvedit/uvedit_parametrizer.c
index eb8f595..ef48ef5 100644
--- a/source/blender/editors/uvedit/uvedit_parametrizer.c
+++ b/source/blender/editors/uvedit/uvedit_parametrizer.c
@@ -131,6 +131,7 @@ typedef struct PEdge {
        struct PEdge *next;
        struct PFace *face;
        float *orig_uv, old_uv[2];
+       int *orig_flag;
        unsigned short flag;
 
 } PEdge;
@@ -679,12 +680,27 @@ static void p_vert_load_pin_select_uvs(PHandle *handle, 
PVert *v)
 static void p_flush_uvs(PHandle *handle, PChart *chart)
 {
        PEdge *e;
+       int sel_flag = 0;
+       /* ToDo (SaphireS): Find sensible variable names*/
+       int MLOOPEDGE_SELECTED = (1 << 0); /* MLOOPUV_EDGESEL*/
+       int MLOOPVERT_SELECTED = (1 << 1); /* MLOOPUV_VERTSEL*/
 
        for (e = chart->edges; e; e = e->nextlink) {
                if (e->orig_uv) {
                        e->orig_uv[0] = e->vert->uv[0] / handle->aspx;
                        e->orig_uv[1] = e->vert->uv[1] / handle->aspy;
                }
+
+               /* ToDo (SaphireS): Move to own p_flush_uvs_selection() 
function ?*/
+               if (e->flag & PEDGE_SELECT) {
+                       //if (e->orig_flag) {
+                               //printf("---param_flush_uvs: orig_flag 
found\n");
+                               sel_flag = e->orig_flag;
+                               sel_flag |= MLOOPEDGE_SELECTED;/* 
MLOOPUV_EDGESEL*/
+                               sel_flag |= MLOOPVERT_SELECTED; /* 
MLOOPUV_VERTSEL*/
+                               e->orig_flag = sel_flag; //sel_flag
+                       //}
+               }
        }
 }
 
@@ -1101,7 +1117,7 @@ static PFace *p_face_add(PHandle *handle)
 
 static PFace *p_face_add_construct(PHandle *handle, ParamKey key, ParamKey 
*vkeys,
                                    float *co[4], float *uv[4], int i1, int i2, 
int i3,
-                                   ParamBool *pin, ParamBool *select)
+                                   ParamBool *pin, ParamBool *select, int 
flag[4])
 {
        PFace *f = p_face_add(handle);
        PEdge *e1 = f->edge, *e2 = e1->next, *e3 = e2->next;
@@ -1114,6 +1130,10 @@ static PFace *p_face_add_construct(PHandle *handle, 
ParamKey key, ParamKey *vkey
        e2->orig_uv = uv[i2];
        e3->orig_uv = uv[i3];
 
+       e1->orig_flag = flag[i1];
+       e2->orig_flag = flag[i2];
+       e3->orig_flag = flag[i3];
+
        if (pin) {
                if (pin[i1]) e1->flag |= PEDGE_PIN;
                if (pin[i2]) e2->flag |= PEDGE_PIN;
@@ -4158,7 +4178,7 @@ void param_delete(ParamHandle *handle)
 
 static void p_add_ngon(ParamHandle *handle, ParamKey key, int nverts,
                        ParamKey *vkeys, float **co, float **uv,
-                       ParamBool *pin, ParamBool *select, const float 
normal[3])
+                                          ParamBool *pin, ParamBool *select, 
const float normal[3], int *flag)
 {
        int *boundary = BLI_array_alloca(boundary, nverts);
 
@@ -4212,10 +4232,11 @@ static void p_add_ngon(ParamHandle *handle, ParamKey 
key, int nverts,
                        ParamKey tri_vkeys[3] = {vkeys[v0], vkeys[v1], 
vkeys[v2]};
                        float *tri_co[3] = {co[v0], co[v1], co[v2]};
                        float *tri_uv[3] = {uv[v0], uv[v1], uv[v2]};
+                       int tri_flag[3] = {flag[v0], flag[v1], flag[v2]};
                        ParamBool tri_pin[3] = {pin[v0], pin[v1], pin[v2]};
                        ParamBool tri_select[3] = {select[v0], select[v1], 
select[v2]};
 
-                       param_face_add(handle, key, 3, tri_vkeys, tri_co, 
tri_uv, tri_pin, tri_select, NULL);
+                       param_face_add(handle, key, 3, tri_vkeys, tri_co, 
tri_uv, tri_pin, tri_select, NULL, tri_flag);
                }
 
                /* remove corner */
@@ -4228,7 +4249,7 @@ static void p_add_ngon(ParamHandle *handle, ParamKey key, 
int nverts,
 
 void param_face_add(ParamHandle *handle, ParamKey key, int nverts,
                     ParamKey *vkeys, float *co[4], float *uv[4],
-                    ParamBool *pin, ParamBool *select, float normal[3])
+                    ParamBool *pin, ParamBool *select, float normal[3], int 
flag[4])
 {
        PHandle *phandle = (PHandle *)handle;
 
@@ -4238,22 +4259,22 @@ void param_face_add(ParamHandle *handle, ParamKey key, 
int nverts,
 
        if (nverts > 4) {
                /* ngon */
-               p_add_ngon(handle, key, nverts, vkeys, co, uv, pin, select, 
normal);
+               p_add_ngon(handle, key, nverts, vkeys, co, uv, pin, select, 
normal, flag);
        }
        else if (nverts == 4) {
                /* quad */
                if (p_quad_split_direction(phandle, co, vkeys)) {
-                       p_face_add_construct(phandle, key, vkeys, co, uv, 0, 1, 
2, pin, select);
-                       p_face_add_construct(phandle, key, vkeys, co, uv, 0, 2, 
3, pin, select);
+                       p_face_add_construct(phandle, key, vkeys, co, uv, 0, 1, 
2, pin, select, flag);
+                       p_face_add_construct(phandle, key, vkeys, co, uv, 0, 2, 
3, pin, select, flag);
                }
                else {
-                       p_face_add_construct(phandle, key, vkeys, co, uv, 0, 1, 
3, pin, select);
-                       p_face_add_construct(phandle, key, vkeys, co, uv, 1, 2, 
3, pin, select);
+                       p_face_add_construct(phandle, key, vkeys, co, uv, 0, 1, 
3, pin, select, flag);
+                       p_face_add_construct(phandle, key, vkeys, co, uv, 1, 2, 
3, pin, select, flag);
                }
        }
        else if (!p_face_exists(phandle, vkeys, 0, 1, 2)) {
                /* triangle */
-               p_face_add_construct(phandle, key, vkeys, co, uv, 0, 1, 2, pin, 
select);
+               p_face_add_construct(phandle, key, vkeys, co, uv, 0, 1, 2, pin, 
select, flag);
        }
 }
 
@@ -4747,11 +4768,6 @@ LinkNode* p_calc_path_vert(PChart *chart, PVert *src, 
PVert *dst)
                vert->u.id = index; /* Abuse lscm id field */
        }
 
-       //src->flag &= ~PVERT_MARKED;
-       //printf(" src unmarked, index: %i \n", src->u.id);
-       //dst->flag &= ~PVERT_MARKED;
-       //printf(" src unmarked, index: %i \n", dst->u.id);
-
        /* alloc */
        totvert = chart->nverts;
        verts_prev = MEM_callocN(sizeof(*verts_prev) * totvert, __func__);
@@ -4798,8 +4814,10 @@ void param_shortest_path(ParamHandle *handle, bool 
*p_found)
        int i, j;
        bool success = false;
 
-       if (phandle->ncharts == 0)
+       if (phandle->ncharts == 0) {
+               *p_found = success;
                return;
+       }
 
        /* Get src and dst */
        for (i = 0; i < phandle->ncharts; i++) {
@@ -4819,16 +4837,27 @@ void param_shortest_path(ParamHandle *handle, bool 
*p_found)
                                        }
                                }
                        }
+
+                       /* ToDo (SaphireS): Possible that more than one 
instance of src selected in different charts */
                }
        }
 
        /* Connect src and dst */
-
        LinkNode* path = NULL;
        if (vert_src && vert_dst){
+               //printf("start path computation!\n");
                path = p_calc_path_vert(current_chart, vert_src, vert_dst);
                if (path) {
-                       /* TODO (SaphireS): Set *_SELECT tag for verts/edges */
+                       printf("--- DEBUG (SaphireS): path found\n");
+                       LinkNode *node = NULL;
+                       node = path;
+                       do {
+                               //printf("---tagging vert/edge for 
selection\n");
+                               PVert *v = node->link;
+                               v->flag |= PVERT_SELECT; /* ToDo: Necessary to 
set vert selection since only edge has orig_flag ?*/
+                               PEdge *e = v->edge;
+                               e->flag |= PEDGE_SELECT;
+                       } while (node = node->next);
                        success = true;
                }
        }
diff --git a/source/blender/editors/uvedit/uvedit_parametrizer.h 
b/source/blender/editors/uvedit/uvedit_parametrizer.h
index 2ce7fe1..8223e44 100644
--- a/source/blender/editors/uvedit/uvedit_parametrizer.h
+++ b/source/blender/editors/uvedit/uvedit_parametrizer.h
@@ -63,7 +63,8 @@ void param_face_add(ParamHandle *handle,
                     float *uv[4],
                     ParamBool *pin,
                     ParamBool *select,
-                    float face_normal[3]);
+                    float face_normal[3], 
+                                       int flag[4]);
 
 void param_edge_set_seam(ParamHandle *handle,
                          ParamKey *vkeys);
diff --git a/source/blender/editors/uvedit/uvedit_unwrap_ops.c 
b/source/blender/editors/uvedit/uvedit_unwrap_ops.c
index 3aefb61..347cc6e 100644
--- a/source/blender/editors/uvedit/uvedit_unwrap_ops.c
+++ b/source/blender/editors/uvedit/uvedit_unwrap_ops.c
@@ -235,6 +235,7 @@ static void construct_param_handle_face_add(ParamHandle 
*handle, Scene *scene,
        ParamBool *select = BLI_array_alloca(select, efa->len);
        float **co = BLI_array_alloca(co, efa->len);
        float **uv = BLI_array_alloca(uv, efa->len);
+       int *flag = BLI_array_alloca(flag, efa->len);
        int i;
 
        BMIter liter;
@@ -251,10 +252,11 @@ static void construct_param_handle_face_add(ParamHandle 
*handle, Scene *scene,
                co[i] = l->v->co;
                uv[i] = luv->uv;
                pin[i] = (luv->flag & MLOOPUV_PINNED) != 0;
+               flag[i] = luv->flag;
                select[i] = uvedit_uv_select_test(scene, l, cd_loop_uv_offset);
        }
 
-       param_face_add(handle, key, i, vkeys, co, uv, pin, select, efa->no);
+       param_face_add(handle, key, i, vkeys, co, uv, pin, select, efa->no, 
flag);
 }
 
 static ParamHandle *construct_param_handle(Scene *scene, Object *ob, BMesh *bm,
@@ -325,7 +327,7 @@ static ParamHandle *construct_param_handle(Scene *scene, 
Object *ob, BMesh *bm,
 
 
 static void texface_from_original_index(BMFace *efa, int index, float **uv, 
ParamBool *pin, ParamBool *select,
-                                        Scene *scene, const int 
cd_loop_uv_offset)
+                                        int *flag, Scene *scene, const int 
cd_loop_uv_offset)
 {
        BMLoop *l;
        BMIter liter;
@@ -334,6 +336,7 @@ static void texface_from_original_index(BMFace *efa, int 
index, float **uv, Para
        *uv = NULL;
        *pin = 0;
        *select = 1;
+       *flag = 0;
 
        if (index == ORIGINDEX_NONE)
                return;
@@ -344,6 +347,7 @@ static void texface_from_original_index(BMFace *efa, int 
index, float **uv, Para
                        *uv = luv->uv;
                        *pin = (luv->flag & MLOOPUV_PINNED) ? 1 : 0;
                        *select = uvedit_uv_select_test(scene, l, 
cd_loop_uv_offset);
+                       *flag = luv->flag;
                        break;
                }
        }
@@ -445,6 +449,7 @@ static ParamHandle *construct_param_handle_subsurfed(Scene 
*scene, Object *ob, B
                ParamBool pin[4], select[4];
                float *co[4];
                float *uv[4];
+               int flag[4];
                BMFace *origFace = faceMap[i];
 
                if (scene->toolsettings->uv_flag & UV_SYNC_SELECTION) {
@@ -473,12 +478,12 @@ static ParamHandle 
*construct_param_handle_subsurfed(Scene *scene, Object *ob, B
                
                /* This is where all the magic is done. If the vertex exists

@@ Diff output truncated at 10240 characters. @@

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

Reply via email to