[Bf-blender-cvs] [0ce18561bc8] master: Fix (unreported) uv unwrap selected was splitting selection
Chris Blackbourn
noreply at git.blender.org
Fri Nov 25 03:54:08 CET 2022
Commit: 0ce18561bc82f533d248f0f7268263abc0fc6fe1
Author: Chris Blackbourn
Date: Fri Nov 25 15:48:17 2022 +1300
Branches: master
https://developer.blender.org/rB0ce18561bc82f533d248f0f7268263abc0fc6fe1
Fix (unreported) uv unwrap selected was splitting selection
Add support for `pin_unselected` in new UV Packing API.
Regression introduced by API change in rBe3075f3cf7ce.
===================================================================
M source/blender/editors/include/ED_uvedit.h
M source/blender/editors/uvedit/uvedit_islands.cc
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 5fea8711a84..4a7081baa38 100644
--- a/source/blender/editors/include/ED_uvedit.h
+++ b/source/blender/editors/include/ED_uvedit.h
@@ -353,6 +353,7 @@ struct UVPackIsland_Params {
uint use_seams : 1;
uint correct_aspect : 1;
bool ignore_pinned; /* Ignore islands which have any pinned UVs. */
+ bool pin_unselected; /* Treat unselected UVs as if they were pinned. */
eUVPackIsland_MarginMethod margin_method; /* Which formula to use when scaling island margin. */
float margin; /* Additional space to add around each island. */
};
diff --git a/source/blender/editors/uvedit/uvedit_islands.cc b/source/blender/editors/uvedit/uvedit_islands.cc
index d8e10435146..61fd1c53b95 100644
--- a/source/blender/editors/uvedit/uvedit_islands.cc
+++ b/source/blender/editors/uvedit/uvedit_islands.cc
@@ -618,7 +618,7 @@ static BoxPack *pack_islands_params(const blender::Vector<FaceIsland *> &island_
return box_array;
}
-static bool island_has_pins(FaceIsland *island)
+static bool island_has_pins(const Scene *scene, FaceIsland *island, const bool pin_unselected)
{
BMLoop *l;
BMIter iter;
@@ -629,6 +629,9 @@ static bool island_has_pins(FaceIsland *island)
if (luv->flag & MLOOPUV_PINNED) {
return true;
}
+ if (pin_unselected && !uvedit_uv_select_test(scene, l, cd_loop_uv_offset)) {
+ return true;
+ }
}
}
return false;
@@ -675,12 +678,18 @@ void ED_uvedit_pack_islands_multi(const Scene *scene,
}
}
+ bool only_selected_faces = params->only_selected_faces;
+ bool only_selected_uvs = params->only_selected_uvs;
+ if (params->ignore_pinned && params->pin_unselected) {
+ only_selected_faces = false;
+ only_selected_uvs = false;
+ }
ListBase island_list = {nullptr};
bm_mesh_calc_uv_islands(scene,
bm,
&island_list,
- params->only_selected_faces,
- params->only_selected_uvs,
+ only_selected_faces,
+ only_selected_uvs,
params->use_seams,
aspect_y,
cd_loop_uv_offset);
@@ -688,7 +697,7 @@ void ED_uvedit_pack_islands_multi(const Scene *scene,
/* Remove from linked list and append to blender::Vector. */
LISTBASE_FOREACH_MUTABLE (struct FaceIsland *, island, &island_list) {
BLI_remlink(&island_list, island);
- if (params->ignore_pinned && island_has_pins(island)) {
+ if (params->ignore_pinned && island_has_pins(scene, island, params->pin_unselected)) {
MEM_freeN(island->faces);
MEM_freeN(island);
continue;
diff --git a/source/blender/editors/uvedit/uvedit_unwrap_ops.c b/source/blender/editors/uvedit/uvedit_unwrap_ops.c
index ce9a083dfeb..b310132bdd2 100644
--- a/source/blender/editors/uvedit/uvedit_unwrap_ops.c
+++ b/source/blender/editors/uvedit/uvedit_unwrap_ops.c
@@ -1100,6 +1100,7 @@ static int pack_islands_exec(bContext *C, wmOperator *op)
.use_seams = !options.topology_from_uvs || options.topology_from_uvs_use_seams,
.correct_aspect = options.correct_aspect,
.ignore_pinned = false,
+ .pin_unselected = options.pin_unselected,
.margin_method = RNA_enum_get(op->ptr, "margin_method"),
.margin = RNA_float_get(op->ptr, "margin"),
};
@@ -1878,6 +1879,7 @@ void ED_uvedit_live_unwrap(const Scene *scene, Object **objects, int objects_len
.use_seams = !options.topology_from_uvs || options.topology_from_uvs_use_seams,
.correct_aspect = options.correct_aspect,
.ignore_pinned = true,
+ .pin_unselected = options.pin_unselected,
.margin_method = ED_UVPACK_MARGIN_SCALED,
.margin = scene->toolsettings->uvcalc_margin,
};
@@ -2025,6 +2027,7 @@ static int unwrap_exec(bContext *C, wmOperator *op)
.use_seams = !options.topology_from_uvs || options.topology_from_uvs_use_seams,
.correct_aspect = options.correct_aspect,
.ignore_pinned = true,
+ .pin_unselected = options.pin_unselected,
.margin_method = RNA_enum_get(op->ptr, "margin_method"),
.margin = RNA_float_get(op->ptr, "margin"),
};
More information about the Bf-blender-cvs
mailing list