[Bf-blender-cvs] [243e329ec3c] sculpt-dev: Sculpt: Cloth Deform target for transform

Pablo Dobarro noreply at git.blender.org
Wed Dec 16 21:36:54 CET 2020


Commit: 243e329ec3cde5ac92df532b2645532089ab3f01
Author: Pablo Dobarro
Date:   Tue Dec 15 22:07:08 2020 +0100
Branches: sculpt-dev
https://developer.blender.org/rB243e329ec3cde5ac92df532b2645532089ab3f01

Sculpt: Cloth Deform target for transform

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

M	release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
M	source/blender/editors/sculpt_paint/sculpt.c
M	source/blender/editors/sculpt_paint/sculpt_transform.c
M	source/blender/makesdna/DNA_scene_types.h
M	source/blender/makesrna/intern/rna_sculpt_paint.c

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

diff --git a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
index c107f67dd29..5546e44feeb 100644
--- a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
+++ b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
@@ -269,6 +269,7 @@ class _defs_transform:
     def draw_transform_sculpt_tool_settings(context, layout):
         if context.mode != 'SCULPT':
             return
+        layout.prop(context.tool_settings.sculpt, "transform_deform_target")
         layout.prop(context.tool_settings.sculpt, "transform_mode")
 
     @ToolDef.from_fn
diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c
index 70779882dc5..3f521d20646 100644
--- a/source/blender/editors/sculpt_paint/sculpt.c
+++ b/source/blender/editors/sculpt_paint/sculpt.c
@@ -6210,7 +6210,14 @@ static void sculpt_combine_proxies_task_cb(void *__restrict userdata,
       add_v3_v3(val, proxies[p].co[vd.i]);
     }
 
-    SCULPT_clip(sd, ss, vd.co, val);
+    if (ss->filter_cache->cloth_sim) {
+      /* When there is a simulation running in the filter cache that was created by a tool, combine
+       * the proxies into the simulation instead of directly into the mesh. */
+      SCULPT_clip(sd, ss, ss->filter_cache->cloth_sim->pos[vd.index], val);
+    }
+    else {
+      SCULPT_clip(sd, ss, vd.co, val);
+    }
 
     if (ss->deform_modifiers_active) {
       sculpt_flush_pbvhvert_deform(ob, &vd);
diff --git a/source/blender/editors/sculpt_paint/sculpt_transform.c b/source/blender/editors/sculpt_paint/sculpt_transform.c
index 4b7639bdeb3..0c6f6123289 100644
--- a/source/blender/editors/sculpt_paint/sculpt_transform.c
+++ b/source/blender/editors/sculpt_paint/sculpt_transform.c
@@ -75,16 +75,35 @@ void ED_sculpt_init_transform(struct bContext *C)
   copy_v3_v3(ss->prev_pivot_pos, ss->pivot_pos);
   copy_v4_v4(ss->prev_pivot_rot, ss->pivot_rot);
   copy_v3_v3(ss->prev_pivot_scale, ss->pivot_scale);
-
-  SCULPT_undo_push_begin(ob, "Transform");
-  BKE_sculpt_update_object_for_edit(depsgraph, ob, false, false, false);
-
   ss->pivot_rot[3] = 1.0f;
 
+  SCULPT_undo_push_begin(ob, "Transform");
   SCULPT_vertex_random_access_ensure(ss);
   SCULPT_filter_cache_init(C, ob, sd, SCULPT_UNDO_COORDS);
 
-  if (sd->transform_mode == SCULPT_TRANSFORM_MODE_RADIUS_ELASTIC) {
+  switch (sd->transform_deform_target) {
+    case SCULPT_TRANSFORM_DEFORM_TARGET_GEOMETRY:
+      BKE_sculpt_update_object_for_edit(depsgraph, ob, false, false, false);
+      break;
+    case SCULPT_TRANSFORM_DEFORM_TARGET_CLOTH_SIM:
+      BKE_sculpt_update_object_for_edit(depsgraph, ob, true, true, false);
+      ss->filter_cache->cloth_sim = SCULPT_cloth_brush_simulation_create(
+          ss, 1.0f, 1.0f, 0.0f, true, false);
+      SCULPT_cloth_brush_simulation_init(ss, ss->filter_cache->cloth_sim);
+      SCULPT_cloth_brush_store_simulation_state(ss, ss->filter_cache->cloth_sim);
+      SCULPT_cloth_brush_ensure_nodes_constraints(sd,
+                                                  ob,
+                                                  ss->filter_cache->nodes,
+                                                  ss->filter_cache->totnode,
+                                                  ss->filter_cache->cloth_sim,
+                                                  ss->pivot_pos,
+                                                  FLT_MAX);
+
+      break;
+  }
+
+  if (sd->transform_mode == SCULPT_TRANSFORM_MODE_RADIUS_ELASTIC ||
+      sd->transform_deform_target == SCULPT_TRANSFORM_DEFORM_TARGET_CLOTH_SIM) {
     ss->filter_cache->transform_displacement_mode = SCULPT_TRANSFORM_DISPLACEMENT_INCREMENTAL;
   }
   else {
@@ -193,7 +212,15 @@ static void sculpt_transform_task_cb(void *__restrict userdata,
     mul_m4_v3(data->transform_mats[(int)symm_area], transformed_co);
     sub_v3_v3v3(disp, transformed_co, start_co);
     mul_v3_fl(disp, 1.0f - fade);
-    add_v3_v3v3(vd.co, start_co, disp);
+
+    switch (data->sd->transform_deform_target) {
+      case SCULPT_TRANSFORM_DEFORM_TARGET_GEOMETRY:
+        add_v3_v3v3(vd.co, start_co, disp);
+        break;
+      case SCULPT_TRANSFORM_DEFORM_TARGET_CLOTH_SIM:
+        add_v3_v3v3(ss->filter_cache->cloth_sim->pos[vd.index], start_co, disp);
+        break;
+    }
 
     if (vd.mvert) {
       vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
@@ -342,6 +369,13 @@ void ED_sculpt_update_modal_transform(struct bContext *C)
   copy_v4_v4(ss->prev_pivot_rot, ss->pivot_rot);
   copy_v3_v3(ss->prev_pivot_scale, ss->pivot_scale);
 
+  if (sd->transform_deform_target == SCULPT_TRANSFORM_DEFORM_TARGET_CLOTH_SIM) {
+    SCULPT_cloth_sim_activate_nodes(
+        ss->filter_cache->cloth_sim, ss->filter_cache->nodes, ss->filter_cache->totnode);
+    SCULPT_cloth_brush_do_simulation_step(
+        sd, ob, ss->filter_cache->cloth_sim, ss->filter_cache->nodes, ss->filter_cache->totnode);
+  }
+
   if (ss->deform_modifiers_active || ss->shapekey_active) {
     SCULPT_flush_stroke_deform(sd, ob, true);
   }
diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h
index 3b756c72a9b..c8345ff7076 100644
--- a/source/blender/makesdna/DNA_scene_types.h
+++ b/source/blender/makesdna/DNA_scene_types.h
@@ -970,6 +970,7 @@ typedef struct Sculpt {
 
   /* Transform tool. */
   int transform_mode;
+  int transform_deform_target;
 
   int automasking_flags;
 
@@ -991,8 +992,6 @@ typedef struct Sculpt {
   float constant_detail;
   float detail_percent;
 
-  char _pad[4];
-
   struct Object *gravity_object;
 } Sculpt;
 
@@ -2215,6 +2214,12 @@ typedef enum eSculptTransformMode {
   SCULPT_TRANSFORM_MODE_RADIUS_ELASTIC = 1,
 } eSculptTrasnformMode;
 
+/* Sculpt.transform_deform_target */
+typedef enum eSculptTransformDeformTarget {
+  SCULPT_TRANSFORM_DEFORM_TARGET_GEOMETRY = 0,
+  SCULPT_TRANSFORM_DEFORM_TARGET_CLOTH_SIM = 1,
+} eSculptTransformDeformTarget;
+
 /* ImagePaintSettings.mode */
 typedef enum eImagePaintMode {
   IMAGEPAINT_MODE_MATERIAL = 0, /* detect texture paint slots from the material */
diff --git a/source/blender/makesrna/intern/rna_sculpt_paint.c b/source/blender/makesrna/intern/rna_sculpt_paint.c
index 49eaa5b45be..e67290d61a8 100644
--- a/source/blender/makesrna/intern/rna_sculpt_paint.c
+++ b/source/blender/makesrna/intern/rna_sculpt_paint.c
@@ -748,6 +748,20 @@ static void rna_def_sculpt(BlenderRNA *brna)
       {0, NULL, 0, NULL, NULL},
   };
 
+  static const EnumPropertyItem sculpt_transform_deform_target_items[] = {
+      {SCULPT_TRANSFORM_DEFORM_TARGET_GEOMETRY,
+       "GEOMETRY",
+       0,
+       "Geometry",
+       "Transform displaces the vertices of the mesh"},
+      {SCULPT_TRANSFORM_DEFORM_TARGET_CLOTH_SIM,
+       "CLOTH_SIM",
+       0,
+       "Cloth Simulation",
+       "Transform displaces the positions of the cloth simulation"},
+      {0, NULL, 0, NULL, NULL},
+  };
+
   StructRNA *srna;
   PropertyRNA *prop;
 
@@ -891,6 +905,12 @@ static void rna_def_sculpt(BlenderRNA *brna)
       prop, "Transform Mode", "How the transformation is going to be applied to the target");
   RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL);
 
+  prop = RNA_def_property(srna, "transform_deform_target", PROP_ENUM, PROP_NONE);
+  RNA_def_property_enum_items(prop, sculpt_transform_deform_target_items);
+  RNA_def_property_ui_text(
+      prop, "Deformation Target", "Target for the displacement of the transformation");
+  RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL);
+
   prop = RNA_def_property(srna, "gravity_object", PROP_POINTER, PROP_NONE);
   RNA_def_property_flag(prop, PROP_EDITABLE);
   RNA_def_property_ui_text(



More information about the Bf-blender-cvs mailing list