[Bf-blender-cvs] [e5c1e13ef09] master: Sculpt: Init Face Sets by Face Sets boundaries

Pablo Dobarro noreply at git.blender.org
Tue Mar 9 18:55:59 CET 2021


Commit: e5c1e13ef09bbb81f6da15d99fe1c49b4fe527ec
Author: Pablo Dobarro
Date:   Wed Mar 3 20:01:54 2021 +0100
Branches: master
https://developer.blender.org/rBe5c1e13ef09bbb81f6da15d99fe1c49b4fe527ec

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

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

M	release/scripts/startup/bl_ui/space_view3d.py
M	source/blender/editors/sculpt_paint/sculpt_face_set.c

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

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;



More information about the Bf-blender-cvs mailing list