Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPablo Dobarro <pablodp606@gmail.com>2021-03-03 22:01:54 +0300
committerPablo Dobarro <pablodp606@gmail.com>2021-03-09 20:55:20 +0300
commite5c1e13ef09bbb81f6da15d99fe1c49b4fe527ec (patch)
tree5bb70e32ba2cdc5448e34a734bcd514bb334f6bd
parentb1ef55abdbb9f47712049748ccf65d009c059160 (diff)
Sculpt: Init Face Sets by Face Sets boundaries
This adds an extra option to the Face Sets Init operator to initialize individual Face Sets based on the current Face Sets boundaries. In particular, this is useful for splitting the patterns created by Expand into individual Face Sets for further editing. Reviewed By: JacquesLucke Differential Revision: https://developer.blender.org/D10608
-rw-r--r--release/scripts/startup/bl_ui/space_view3d.py3
-rw-r--r--source/blender/editors/sculpt_paint/sculpt_face_set.c21
2 files changed, 24 insertions, 0 deletions
diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py
index 26e0c128f7c..4b687945974 100644
--- a/release/scripts/startup/bl_ui/space_view3d.py
+++ b/release/scripts/startup/bl_ui/space_view3d.py
@@ -3197,6 +3197,9 @@ class VIEW3D_MT_face_sets_init(Menu):
op = layout.operator("sculpt.face_sets_init", text='By Loose Parts')
op.mode = 'LOOSE_PARTS'
+ op = layout.operator("sculpt.face_sets_init", text='By Face Set Boundaries')
+ op.mode = 'FACE_SET_BOUNDARIES'
+
op = layout.operator("sculpt.face_sets_init", text='By Materials')
op.mode = 'MATERIALS'
diff --git a/source/blender/editors/sculpt_paint/sculpt_face_set.c b/source/blender/editors/sculpt_paint/sculpt_face_set.c
index df03d2adeaf..332e551c577 100644
--- a/source/blender/editors/sculpt_paint/sculpt_face_set.c
+++ b/source/blender/editors/sculpt_paint/sculpt_face_set.c
@@ -447,6 +447,7 @@ typedef enum eSculptFaceSetsInitMode {
SCULPT_FACE_SETS_FROM_SHARP_EDGES = 5,
SCULPT_FACE_SETS_FROM_BEVEL_WEIGHT = 6,
SCULPT_FACE_SETS_FROM_FACE_MAPS = 7,
+ SCULPT_FACE_SETS_FROM_FACE_SET_BOUNDARIES = 8,
} eSculptFaceSetsInitMode;
static EnumPropertyItem prop_sculpt_face_sets_init_types[] = {
@@ -506,6 +507,14 @@ static EnumPropertyItem prop_sculpt_face_sets_init_types[] = {
"Face Sets from Face Maps",
"Create a Face Set per Face Map",
},
+ {
+ SCULPT_FACE_SETS_FROM_FACE_SET_BOUNDARIES,
+ "FACE_SET_BOUNDARIES",
+ 0,
+ "Face Sets from Face Set Boundaries",
+ "Create a Face Set per isolated Face Set",
+ },
+
{0, NULL, 0, NULL, NULL},
};
@@ -557,6 +566,14 @@ static bool sculpt_face_sets_init_sharp_edges_test(BMesh *UNUSED(bm),
return BM_elem_flag_test(from_e, BM_ELEM_SMOOTH);
}
+static bool sculpt_face_sets_init_face_set_boundary_test(
+ BMesh *bm, BMFace *from_f, BMEdge *UNUSED(from_e), BMFace *to_f, const float UNUSED(threshold))
+{
+ const int cd_face_sets_offset = CustomData_get_offset(&bm->pdata, CD_SCULPT_FACE_SETS);
+ return BM_ELEM_CD_GET_INT(from_f, cd_face_sets_offset) ==
+ BM_ELEM_CD_GET_INT(to_f, cd_face_sets_offset);
+}
+
static void sculpt_face_sets_init_flood_fill(Object *ob,
face_sets_flood_fill_test test,
const float threshold)
@@ -725,6 +742,10 @@ static int sculpt_face_set_init_exec(bContext *C, wmOperator *op)
case SCULPT_FACE_SETS_FROM_BEVEL_WEIGHT:
sculpt_face_sets_init_flood_fill(ob, sculpt_face_sets_init_bevel_weight_test, threshold);
break;
+ case SCULPT_FACE_SETS_FROM_FACE_SET_BOUNDARIES:
+ sculpt_face_sets_init_flood_fill(
+ ob, sculpt_face_sets_init_face_set_boundary_test, threshold);
+ break;
case SCULPT_FACE_SETS_FROM_FACE_MAPS:
sculpt_face_sets_init_loop(ob, SCULPT_FACE_SETS_FROM_FACE_MAPS);
break;