Fix: UV box/lasso/circle selection fails with edge & face modes enabled
When select-sync was used with both edge & face modes enabled, vertex selection logic was used which resulted in no visible selection. Now edge selection is used when both edge and face modes are enabled. Ref !148181
This commit is contained in:
@@ -4507,12 +4507,9 @@ static wmOperatorStatus uv_box_select_exec(bContext *C, wmOperator *op)
|
|||||||
const ToolSettings *ts = scene->toolsettings;
|
const ToolSettings *ts = scene->toolsettings;
|
||||||
|
|
||||||
const bool pinned = RNA_boolean_get(op->ptr, "pinned");
|
const bool pinned = RNA_boolean_get(op->ptr, "pinned");
|
||||||
const bool use_face_center = ((ts->uv_flag & UV_FLAG_SELECT_SYNC) ?
|
|
||||||
(ts->selectmode == SCE_SELECT_FACE) :
|
/* Note that face selection uses the face-center. */
|
||||||
(ts->uv_selectmode == UV_SELECT_FACE));
|
const char uv_select_mode = ED_uvedit_select_mode_get(scene);
|
||||||
const bool use_edge = ((ts->uv_flag & UV_FLAG_SELECT_SYNC) ?
|
|
||||||
(ts->selectmode == SCE_SELECT_EDGE) :
|
|
||||||
(ts->uv_selectmode == UV_SELECT_EDGE));
|
|
||||||
const bool use_select_linked = pinned ? false : ED_uvedit_select_island_check(ts);
|
const bool use_select_linked = pinned ? false : ED_uvedit_select_island_check(ts);
|
||||||
|
|
||||||
if (pinned) {
|
if (pinned) {
|
||||||
@@ -4567,9 +4564,8 @@ static wmOperatorStatus uv_box_select_exec(bContext *C, wmOperator *op)
|
|||||||
/* Special case, nothing is pinned so it's known in advance that nothing will be selected.
|
/* Special case, nothing is pinned so it's known in advance that nothing will be selected.
|
||||||
* Still run the code after this block finishes as the UV's may have been de-selected. */
|
* Still run the code after this block finishes as the UV's may have been de-selected. */
|
||||||
}
|
}
|
||||||
else if (use_face_center) {
|
else if (uv_select_mode == UV_SELECT_FACE) {
|
||||||
/* handle face selection mode */
|
/* Handle face selection (face center). */
|
||||||
|
|
||||||
if (use_select_linked) {
|
if (use_select_linked) {
|
||||||
BM_mesh_elem_hflag_disable_all(bm, BM_FACE, BM_ELEM_TAG, false);
|
BM_mesh_elem_hflag_disable_all(bm, BM_FACE, BM_ELEM_TAG, false);
|
||||||
}
|
}
|
||||||
@@ -4604,7 +4600,7 @@ static wmOperatorStatus uv_box_select_exec(bContext *C, wmOperator *op)
|
|||||||
uv_select_flush_from_tag_face(scene, obedit, select);
|
uv_select_flush_from_tag_face(scene, obedit, select);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (use_edge) {
|
else if (uv_select_mode == UV_SELECT_EDGE) {
|
||||||
bool do_second_pass = true;
|
bool do_second_pass = true;
|
||||||
BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
|
BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
|
||||||
if (!uvedit_face_visible_test(scene, efa)) {
|
if (!uvedit_face_visible_test(scene, efa)) {
|
||||||
@@ -4661,7 +4657,9 @@ static wmOperatorStatus uv_box_select_exec(bContext *C, wmOperator *op)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* other selection modes */
|
/* Handle vert selection. */
|
||||||
|
BLI_assert(uv_select_mode == UV_SELECT_VERT);
|
||||||
|
|
||||||
changed = true;
|
changed = true;
|
||||||
BM_mesh_elem_hflag_disable_all(bm, BM_VERT, BM_ELEM_TAG, false);
|
BM_mesh_elem_hflag_disable_all(bm, BM_VERT, BM_ELEM_TAG, false);
|
||||||
|
|
||||||
@@ -4784,12 +4782,8 @@ static wmOperatorStatus uv_circle_select_exec(bContext *C, wmOperator *op)
|
|||||||
float zoomx, zoomy;
|
float zoomx, zoomy;
|
||||||
float offset[2], ellipse[2];
|
float offset[2], ellipse[2];
|
||||||
|
|
||||||
const bool use_face_center = ((ts->uv_flag & UV_FLAG_SELECT_SYNC) ?
|
/* Note that face selection uses the face-center. */
|
||||||
(ts->selectmode == SCE_SELECT_FACE) :
|
const char uv_select_mode = ED_uvedit_select_mode_get(scene);
|
||||||
(ts->uv_selectmode == UV_SELECT_FACE));
|
|
||||||
const bool use_edge = ((ts->uv_flag & UV_FLAG_SELECT_SYNC) ?
|
|
||||||
(ts->selectmode == SCE_SELECT_EDGE) :
|
|
||||||
(ts->uv_selectmode == UV_SELECT_EDGE));
|
|
||||||
const bool use_select_linked = ED_uvedit_select_island_check(ts);
|
const bool use_select_linked = ED_uvedit_select_island_check(ts);
|
||||||
|
|
||||||
/* get operator properties */
|
/* get operator properties */
|
||||||
@@ -4836,7 +4830,8 @@ static wmOperatorStatus uv_circle_select_exec(bContext *C, wmOperator *op)
|
|||||||
const BMUVOffsets offsets = BM_uv_map_offsets_get(bm);
|
const BMUVOffsets offsets = BM_uv_map_offsets_get(bm);
|
||||||
|
|
||||||
/* do selection */
|
/* do selection */
|
||||||
if (use_face_center) {
|
if (uv_select_mode == UV_SELECT_FACE) {
|
||||||
|
/* Handle face selection (face center). */
|
||||||
if (use_select_linked) {
|
if (use_select_linked) {
|
||||||
BM_mesh_elem_hflag_disable_all(bm, BM_FACE, BM_ELEM_TAG, false);
|
BM_mesh_elem_hflag_disable_all(bm, BM_FACE, BM_ELEM_TAG, false);
|
||||||
}
|
}
|
||||||
@@ -4873,7 +4868,8 @@ static wmOperatorStatus uv_circle_select_exec(bContext *C, wmOperator *op)
|
|||||||
uv_select_flush_from_tag_face(scene, obedit, select);
|
uv_select_flush_from_tag_face(scene, obedit, select);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (use_edge) {
|
else if (uv_select_mode == UV_SELECT_EDGE) {
|
||||||
|
/* Handle edge selection. */
|
||||||
BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
|
BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
|
||||||
if (!uvedit_face_visible_test(scene, efa)) {
|
if (!uvedit_face_visible_test(scene, efa)) {
|
||||||
continue;
|
continue;
|
||||||
@@ -4900,6 +4896,9 @@ static wmOperatorStatus uv_circle_select_exec(bContext *C, wmOperator *op)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
/* Handle vert selection. */
|
||||||
|
BLI_assert(uv_select_mode == UV_SELECT_VERT);
|
||||||
|
|
||||||
BM_mesh_elem_hflag_disable_all(bm, BM_VERT, BM_ELEM_TAG, false);
|
BM_mesh_elem_hflag_disable_all(bm, BM_VERT, BM_ELEM_TAG, false);
|
||||||
|
|
||||||
BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
|
BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
|
||||||
@@ -5014,12 +5013,9 @@ static bool do_lasso_select_mesh_uv(bContext *C, const Span<int2> mcoords, const
|
|||||||
Scene *scene = CTX_data_scene(C);
|
Scene *scene = CTX_data_scene(C);
|
||||||
const ToolSettings *ts = scene->toolsettings;
|
const ToolSettings *ts = scene->toolsettings;
|
||||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||||
const bool use_face_center = ((ts->uv_flag & UV_FLAG_SELECT_SYNC) ?
|
|
||||||
(ts->selectmode == SCE_SELECT_FACE) :
|
/* Note that face selection uses the face-center. */
|
||||||
(ts->uv_selectmode == UV_SELECT_FACE));
|
const char uv_select_mode = ED_uvedit_select_mode_get(scene);
|
||||||
const bool use_edge = ((ts->uv_flag & UV_FLAG_SELECT_SYNC) ?
|
|
||||||
(ts->selectmode == SCE_SELECT_EDGE) :
|
|
||||||
(ts->uv_selectmode == UV_SELECT_EDGE));
|
|
||||||
const bool use_select_linked = ED_uvedit_select_island_check(ts);
|
const bool use_select_linked = ED_uvedit_select_island_check(ts);
|
||||||
|
|
||||||
const bool select = (sel_op != SEL_OP_SUB);
|
const bool select = (sel_op != SEL_OP_SUB);
|
||||||
@@ -5055,7 +5051,8 @@ static bool do_lasso_select_mesh_uv(bContext *C, const Span<int2> mcoords, const
|
|||||||
}
|
}
|
||||||
const BMUVOffsets offsets = BM_uv_map_offsets_get(bm);
|
const BMUVOffsets offsets = BM_uv_map_offsets_get(bm);
|
||||||
|
|
||||||
if (use_face_center) { /* Face Center Select. */
|
if (uv_select_mode == UV_SELECT_FACE) {
|
||||||
|
/* Handle face selection (face center). */
|
||||||
if (use_select_linked) {
|
if (use_select_linked) {
|
||||||
BM_mesh_elem_hflag_disable_all(bm, BM_FACE, BM_ELEM_TAG, false);
|
BM_mesh_elem_hflag_disable_all(bm, BM_FACE, BM_ELEM_TAG, false);
|
||||||
}
|
}
|
||||||
@@ -5092,7 +5089,8 @@ static bool do_lasso_select_mesh_uv(bContext *C, const Span<int2> mcoords, const
|
|||||||
uv_select_flush_from_tag_face(scene, obedit, select);
|
uv_select_flush_from_tag_face(scene, obedit, select);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (use_edge) {
|
else if (uv_select_mode == UV_SELECT_EDGE) {
|
||||||
|
/* Handle edge selection. */
|
||||||
bool do_second_pass = true;
|
bool do_second_pass = true;
|
||||||
BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
|
BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
|
||||||
if (!uvedit_face_visible_test(scene, efa)) {
|
if (!uvedit_face_visible_test(scene, efa)) {
|
||||||
@@ -5149,7 +5147,10 @@ static bool do_lasso_select_mesh_uv(bContext *C, const Span<int2> mcoords, const
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else { /* Vert Selection. */
|
else {
|
||||||
|
/* Handle vert selection. */
|
||||||
|
BLI_assert(uv_select_mode == UV_SELECT_VERT);
|
||||||
|
|
||||||
BM_mesh_elem_hflag_disable_all(bm, BM_VERT, BM_ELEM_TAG, false);
|
BM_mesh_elem_hflag_disable_all(bm, BM_VERT, BM_ELEM_TAG, false);
|
||||||
|
|
||||||
BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
|
BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
|
||||||
|
|||||||
Reference in New Issue
Block a user