[Bf-blender-cvs] [caf5f5767f0] sculpt-dev: Cloth Filter: Add pinch origin modes

Pablo Dobarro noreply at git.blender.org
Wed Mar 24 20:56:31 CET 2021


Commit: caf5f5767f082b72820ceb85d306db81866772a3
Author: Pablo Dobarro
Date:   Wed Mar 24 18:47:01 2021 +0100
Branches: sculpt-dev
https://developer.blender.org/rBcaf5f5767f082b72820ceb85d306db81866772a3

Cloth Filter: Add pinch origin modes

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

M	release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
M	source/blender/editors/sculpt_paint/sculpt_cloth.c

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

diff --git a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
index 1bb8bce91dd..1faf9e6e1c4 100644
--- a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
+++ b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
@@ -1505,6 +1505,8 @@ class _defs_sculpt:
             layout.prop(props, "strength")
             row = layout.row(align=True)
             row.prop(props, "force_axis")
+            if props.type == "PINCH":
+                layout.prop(props, "pinch_origin", expand=False)
             layout.prop(props, "orientation", expand=False)
             layout.prop(props, "cloth_mass")
             layout.prop(props, "cloth_damping")
diff --git a/source/blender/editors/sculpt_paint/sculpt_cloth.c b/source/blender/editors/sculpt_paint/sculpt_cloth.c
index 91e82d5b9cb..ac78cc67b2e 100644
--- a/source/blender/editors/sculpt_paint/sculpt_cloth.c
+++ b/source/blender/editors/sculpt_paint/sculpt_cloth.c
@@ -1440,6 +1440,18 @@ static EnumPropertyItem prop_cloth_filter_type[] = {
     {0, NULL, 0, NULL, NULL},
 };
 
+typedef enum eSculpClothFilterPinchOriginType {
+  CLOTH_FILTER_PINCH_ORIGIN_CURSOR,
+  CLOTH_FILTER_PINCH_ORIGIN_FACE_SET,
+} eSculptClothFilterPinchOriginType;
+
+static EnumPropertyItem prop_cloth_filter_pinch_origin_type[] = {
+    {CLOTH_FILTER_PINCH_ORIGIN_CURSOR, "CURSOR", 0, "Cursor", "Pinches to the location of the cursor"},
+    {CLOTH_FILTER_PINCH_ORIGIN_FACE_SET, "FACE_SET", 0, "Face Set", "Pinches to the average location of the Face Set"},
+    {0, NULL, 0, NULL, NULL},
+};
+
+
 static EnumPropertyItem prop_cloth_filter_orientation_items[] = {
     {SCULPT_FILTER_ORIENTATION_LOCAL,
      "LOCAL",
@@ -1658,6 +1670,27 @@ static int sculpt_cloth_filter_modal(bContext *C, wmOperator *op, const wmEvent
   return OPERATOR_RUNNING_MODAL;
 }
 
+
+static void sculpt_cloth_filter_face_set_pinch_origin_calculate(float r_pinch_origin[3], SculptSession *ss) {
+    const int totvert = SCULPT_vertex_count_get(ss);
+    const int active_face_set = SCULPT_active_face_set_get(ss);
+    float accum[3] = {0.0f};
+    int tot = 0;
+    for (int i = 0; i < totvert; i++) {
+      if (!SCULPT_vertex_has_face_set(ss, i, active_face_set)) {
+        continue;
+      }
+      add_v3_v3(accum, SCULPT_vertex_co_get(ss, i));
+      tot++;
+    }
+    if (tot > 0) {
+      mul_v3_v3fl(r_pinch_origin, accum, 1.0f/ tot);
+    }
+    else {
+      copy_v3_v3(r_pinch_origin, SCULPT_active_vertex_co_get(ss));
+    }
+}
+
 static int sculpt_cloth_filter_invoke(bContext *C, wmOperator *op, const wmEvent *event)
 {
   Object *ob = CTX_data_active_object(C);
@@ -1687,6 +1720,7 @@ static int sculpt_cloth_filter_invoke(bContext *C, wmOperator *op, const wmEvent
   const float cloth_mass = RNA_float_get(op->ptr, "cloth_mass");
   const float cloth_damping = RNA_float_get(op->ptr, "cloth_damping");
   const bool use_collisions = RNA_boolean_get(op->ptr, "use_collisions");
+  const int pinch_origin = RNA_enum_get(op->ptr, "pinch_origin");
   ss->filter_cache->cloth_sim = SCULPT_cloth_brush_simulation_create(
       ss,
       cloth_mass,
@@ -1695,7 +1729,15 @@ static int sculpt_cloth_filter_invoke(bContext *C, wmOperator *op, const wmEvent
       use_collisions,
       cloth_filter_is_deformation_filter(filter_type));
 
-  copy_v3_v3(ss->filter_cache->cloth_sim_pinch_point, SCULPT_active_vertex_co_get(ss));
+  switch (pinch_origin)
+  {
+  case CLOTH_FILTER_PINCH_ORIGIN_CURSOR:
+    copy_v3_v3(ss->filter_cache->cloth_sim_pinch_point, SCULPT_active_vertex_co_get(ss));
+    break;
+  case CLOTH_FILTER_PINCH_ORIGIN_FACE_SET:
+    sculpt_cloth_filter_face_set_pinch_origin_calculate(ss->filter_cache->cloth_sim_pinch_point, ss);
+    break;
+  }
 
   SCULPT_cloth_brush_simulation_init(ss, ss->filter_cache->cloth_sim);
 
@@ -1751,6 +1793,12 @@ void SCULPT_OT_cloth_filter(struct wmOperatorType *ot)
                "Operation that is going to be applied to the mesh");
   RNA_def_float(
       ot->srna, "strength", 1.0f, -10.0f, 10.0f, "Strength", "Filter strength", -10.0f, 10.0f);
+  RNA_def_enum(ot->srna,
+               "pinch_origin",
+               prop_cloth_filter_pinch_origin_type,
+               CLOTH_FILTER_PINCH_ORIGIN_CURSOR,
+               "Pinch Origin",
+               "Location that is used to direct the pinch force");
   RNA_def_enum_flag(ot->srna,
                     "force_axis",
                     prop_cloth_filter_force_axis_items,



More information about the Bf-blender-cvs mailing list