[Bf-blender-cvs] [b7b0409] soc-2016-uv_tools: WIP: Select shortest path - Validate selection
Phil Gosch
noreply at git.blender.org
Wed Jun 1 10:25:21 CEST 2016
Commit: b7b04095c029ffc9d93872ead9c436850acfdd91
Author: Phil Gosch
Date: Wed Jun 1 10:24:46 2016 +0200
Branches: soc-2016-uv_tools
https://developer.blender.org/rBb7b04095c029ffc9d93872ead9c436850acfdd91
WIP: Select shortest path - Validate selection
Validation of the current selection, makes sure 2 matching elements are selected for path computation
===================================================================
M source/blender/editors/include/ED_uvedit.h
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/include/ED_uvedit.h b/source/blender/editors/include/ED_uvedit.h
index 5356838..89ca709 100644
--- a/source/blender/editors/include/ED_uvedit.h
+++ b/source/blender/editors/include/ED_uvedit.h
@@ -106,6 +106,8 @@ void ED_uvedit_unwrap_cube_project(struct Object *ob, struct BMesh *bm, float cu
/* single call up unwrap using scene settings, used for edge tag unwrapping */
void ED_unwrap_lscm(struct Scene *scene, struct Object *obedit, const short sel);
+/* select shortest path */
+bool ED_uvedit_shortest_path_select(struct Scene *scene,struct Object *ob,struct BMesh *bm);
/* uvedit_draw.c */
void ED_image_draw_cursor(struct ARegion *ar, const float cursor[2]);
diff --git a/source/blender/editors/uvedit/uvedit_ops.c b/source/blender/editors/uvedit/uvedit_ops.c
index 6a6e746..8d2a7d3 100644
--- a/source/blender/editors/uvedit/uvedit_ops.c
+++ b/source/blender/editors/uvedit/uvedit_ops.c
@@ -1477,16 +1477,128 @@ static int uv_shortest_path_exec(bContext *C, wmOperator *op)
{
Scene *scene = CTX_data_scene(C);
Object *obedit = CTX_data_edit_object(C);
+ Image *ima = CTX_data_edit_image(C);
+ SpaceImage *sima = CTX_wm_space_image(C);
ToolSettings *ts = scene->toolsettings;
- BMEditMesh *em = BKE_editmesh_from_object(obedit);
+ BMEditMesh *em = BKE_editmesh_from_object(obedit);
+ BMesh *bm = em->bm;
+ BMFace *efa;
+ BMEdge *e;
+ BMIter iter, liter;
+ BMLoop *l;
+ BMEditSelection *ese_src, *ese_dst;
+ BMElem *ele_src = NULL, *ele_dst = NULL, *ele;
+ MLoopUV *luv_src = NULL, *luv_dst = NULL;
+ int elem_sel = 0;
+
if (ts->uv_flag & UV_SYNC_SELECTION) {
return EDBM_shortest_path_select(C, op);
}
+
+ const int cd_loop_uv_offset = CustomData_get_offset(&em->bm->ldata, CD_MLOOPUV);
+ const int cd_poly_tex_offset = CustomData_get_offset(&em->bm->pdata, CD_MTEXPOLY);
- /* TODO(SaphireS): implementation of operator based on UV islands*/
+ /* -------- Check for 2 selected elements of same type on the same UV island ---------- */
+
+ if (ts->uv_selectmode & UV_SELECT_FACE) {
+ /* clear tags */
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
+ BM_elem_flag_disable(efa, BM_ELEM_TAG);
+ }
- return OPERATOR_FINISHED;
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
+ MTexPoly *tf = BM_ELEM_CD_GET_VOID_P(efa, cd_poly_tex_offset);
+
+ if (uvedit_face_visible_test(scene, ima, efa, tf)) {
+ if (uvedit_face_select_test(scene, efa, cd_loop_uv_offset)) {
+ elem_sel++;
+
+ if (luv_src == NULL) {
+ luv_src = efa;
+ }
+ else if ((luv_dst == NULL)) {
+ luv_dst = efa;
+ }
+ }
+ }
+ }
+ }
+ else if (ts->uv_selectmode & UV_SELECT_EDGE) {
+ /* clear tags */
+ BM_ITER_MESH(e, &iter, bm, BM_EDGES_OF_MESH) {
+ BM_elem_flag_disable(e, BM_ELEM_TAG);
+ }
+
+ BM_ITER_MESH(e, &iter, bm, BM_EDGES_OF_MESH) {
+ if (uvedit_edge_select_test(scene, e->l, cd_loop_uv_offset)) {
+
+ elem_sel++;
+
+ if (luv_src == NULL) {
+ luv_src = e;
+ }
+ else if ((luv_dst == NULL)) {
+ luv_dst = e;
+ }
+ }
+ }
+ }
+
+ else if (ts->uv_selectmode & UV_SELECT_VERTEX) {
+ /* clear tags */
+ BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
+ BM_elem_flag_disable(l, BM_ELEM_TAG);
+ }
+ }
+
+ BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
+ MTexPoly *tf = BM_ELEM_CD_GET_VOID_P(efa, cd_poly_tex_offset);
+
+ if (uvedit_face_visible_test(scene, ima, efa, tf)) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
+
+ MLoopUV *luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
+
+ if ((luv->flag & MLOOPUV_VERTSEL) != 0) {
+ if (luv_src == NULL) {
+ luv_src = luv;
+ elem_sel++;
+ }
+ else if ((luv_dst == NULL) && (!compare_v2v2(luv->uv, luv_src->uv, 0.000003f))) {
+ luv_dst = luv;
+ elem_sel++;
+ }
+ else if ((!compare_v2v2(luv->uv, luv_src->uv, 0.000003f)) && (!compare_v2v2(luv->uv, luv_dst->uv, 0.000003f))) {
+ elem_sel++;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if (elem_sel != 2) {
+ /* Not exactly 2 elements of same typ selected */
+ BKE_report(op->reports, RPT_WARNING, "Path selection requires exactly two matching elements of the same island to be selected");
+ return OPERATOR_CANCELLED;
+ }
+
+ /* -------- Now select shortest path between the 2 found elements ---------- */
+
+ 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);
+
+ return OPERATOR_FINISHED;
+ }
+ else {
+ /* No path found because the selected elements aren't part of the same uv island */
+ BKE_report(op->reports, RPT_WARNING, "Path selection requires exactly two matching elements of the same island to be selected");
+ return OPERATOR_CANCELLED;
+ }
}
static void UV_OT_shortest_path(wmOperatorType *ot)
diff --git a/source/blender/editors/uvedit/uvedit_parametrizer.c b/source/blender/editors/uvedit/uvedit_parametrizer.c
index 9b95865..81cbe56 100644
--- a/source/blender/editors/uvedit/uvedit_parametrizer.c
+++ b/source/blender/editors/uvedit/uvedit_parametrizer.c
@@ -153,7 +153,8 @@ enum PVertFlag {
PVERT_SELECT = 2,
PVERT_INTERIOR = 4,
PVERT_COLLAPSE = 8,
- PVERT_SPLIT = 16
+ PVERT_SPLIT = 16,
+ PVERT_MARKED = 32
};
enum PEdgeFlag {
@@ -165,7 +166,8 @@ enum PEdgeFlag {
PEDGE_FILLED = 32,
PEDGE_COLLAPSE = 64,
PEDGE_COLLAPSE_EDGE = 128,
- PEDGE_COLLAPSE_PAIR = 256
+ PEDGE_COLLAPSE_PAIR = 256,
+ PEDGE_MARKED = 512
};
/* for flipping faces */
@@ -4703,6 +4705,11 @@ void param_scale_bounds(ParamHandle *handle)
}
}
+void param_shortest_path(ParamHandle *handle)
+{
+ /* TODO (SaphireS): Shortest Path computation here */
+}
+
void param_flush(ParamHandle *handle)
{
PHandle *phandle = (PHandle *)handle;
diff --git a/source/blender/editors/uvedit/uvedit_parametrizer.h b/source/blender/editors/uvedit/uvedit_parametrizer.h
index efbaae7..7f0a77e 100644
--- a/source/blender/editors/uvedit/uvedit_parametrizer.h
+++ b/source/blender/editors/uvedit/uvedit_parametrizer.h
@@ -113,6 +113,10 @@ void param_scale(ParamHandle *handle, float x, float y);
void param_scale_bounds(ParamHandle *handle);
+/* Select shortest Path */
+
+void param_shortest_path(ParamHandle *handle);
+
/* Flushing */
void param_flush(ParamHandle *handle);
diff --git a/source/blender/editors/uvedit/uvedit_unwrap_ops.c b/source/blender/editors/uvedit/uvedit_unwrap_ops.c
index 1d16146..aff3136 100644
--- a/source/blender/editors/uvedit/uvedit_unwrap_ops.c
+++ b/source/blender/editors/uvedit/uvedit_unwrap_ops.c
@@ -712,6 +712,17 @@ void UV_OT_minimize_stretch(wmOperatorType *ot)
RNA_def_int(ot->srna, "iterations", 0, 0, INT_MAX, "Iterations", "Number of iterations to run, 0 is unlimited when run interactively", 0, 100);
}
+/* ******************** Select Shortest Path operator **************** */
+bool ED_uvedit_shortest_path_select(Scene *scene, Object *ob, BMesh *bm)
+{
+ ParamHandle *handle;
+ handle = construct_param_handle(scene, ob, bm, false, false, false, true);
+ param_shortest_path(handle);
+ param_flush(handle);
+ param_delete(handle);
+ return true; /* TODO (SaphireS): WIP Code, return true only if a valid path was found*/
+}
+
/* ******************** Pack Islands operator **************** */
void ED_uvedit_pack_islands(Scene *scene, Object *ob, BMesh *bm, bool selected, bool correct_aspect, bool do_rotate)
More information about the Bf-blender-cvs
mailing list