[Bf-blender-cvs] [ef9eb626a8c] sculpt-dev: Sculpt: Initial support for custom pressure input curves

Pablo Dobarro noreply at git.blender.org
Thu Dec 31 19:49:36 CET 2020


Commit: ef9eb626a8c9a07d4a58f8ec5396c2db74eaddc6
Author: Pablo Dobarro
Date:   Thu Dec 31 19:48:25 2020 +0100
Branches: sculpt-dev
https://developer.blender.org/rBef9eb626a8c9a07d4a58f8ec5396c2db74eaddc6

Sculpt: Initial support for custom pressure input curves

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

M	release/scripts/startup/bl_ui/properties_paint_common.py
M	source/blender/blenkernel/intern/brush.c
M	source/blender/editors/sculpt_paint/paint_stroke.c
M	source/blender/editors/sculpt_paint/sculpt.c
M	source/blender/makesdna/DNA_brush_types.h
M	source/blender/makesrna/intern/rna_brush.c

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

diff --git a/release/scripts/startup/bl_ui/properties_paint_common.py b/release/scripts/startup/bl_ui/properties_paint_common.py
index 5d241e8e216..0eaa994a1e2 100644
--- a/release/scripts/startup/bl_ui/properties_paint_common.py
+++ b/release/scripts/startup/bl_ui/properties_paint_common.py
@@ -771,6 +771,10 @@ def brush_settings(layout, context, brush, popover=False):
         elif sculpt_tool == 'MASK':
             layout.row().prop(brush, "mask_tool", expand=True)
 
+
+        layout.template_curve_mapping(brush, "pressure_size_curve")
+        layout.template_curve_mapping(brush, "pressure_strength_curve", brush=True)
+
         # End sculpt_tool interface.
 
     # 3D and 2D Texture Paint Mode.
diff --git a/source/blender/blenkernel/intern/brush.c b/source/blender/blenkernel/intern/brush.c
index df9306822df..12a8d0782d0 100644
--- a/source/blender/blenkernel/intern/brush.c
+++ b/source/blender/blenkernel/intern/brush.c
@@ -85,6 +85,8 @@ static void brush_copy_data(Main *UNUSED(bmain), ID *id_dst, const ID *id_src, c
   }
 
   brush_dst->curve = BKE_curvemapping_copy(brush_src->curve);
+  brush_dst->pressure_size_curve = BKE_curvemapping_copy(brush_src->pressure_size_curve);
+  brush_dst->pressure_strength_curve = BKE_curvemapping_copy(brush_src->pressure_strength_curve);
   if (brush_src->gpencil_settings != NULL) {
     brush_dst->gpencil_settings = MEM_dupallocN(brush_src->gpencil_settings);
     brush_dst->gpencil_settings->curve_sensitivity = BKE_curvemapping_copy(
@@ -119,6 +121,8 @@ static void brush_free_data(ID *id)
     IMB_freeImBuf(brush->icon_imbuf);
   }
   BKE_curvemapping_free(brush->curve);
+  BKE_curvemapping_free(brush->pressure_size_curve);
+  BKE_curvemapping_free(brush->pressure_strength_curve);
 
   if (brush->gpencil_settings != NULL) {
     BKE_curvemapping_free(brush->gpencil_settings->curve_sensitivity);
@@ -209,6 +213,12 @@ static void brush_blend_write(BlendWriter *writer, ID *id, const void *id_addres
     if (brush->curve) {
       BKE_curvemapping_blend_write(writer, brush->curve);
     }
+    if (brush->pressure_size_curve) {
+      BKE_curvemapping_blend_write(writer, brush->pressure_size_curve);
+    }
+    if (brush->pressure_strength_curve) {
+      BKE_curvemapping_blend_write(writer, brush->pressure_strength_curve);
+    }
 
     if (brush->gpencil_settings) {
       BLO_write_struct(writer, BrushGpencilSettings, brush->gpencil_settings);
@@ -247,6 +257,29 @@ static void brush_blend_write(BlendWriter *writer, ID *id, const void *id_addres
   }
 }
 
+static void brush_reset_input_curve(CurveMapping *cumap)
+{
+  cumap->flag &= ~CUMA_EXTEND_EXTRAPOLATE;
+  cumap->preset = CURVE_PRESET_LINE;
+
+  CurveMap *cuma = cumap->cm;
+  BKE_curvemap_reset(cuma, &cumap->clipr, cumap->preset, CURVEMAP_SLOPE_POSITIVE);
+  BKE_curvemapping_changed(cumap, false);
+}
+
+static void BKE_brush_default_input_curves_set(Brush *brush)
+{
+  if (!brush->pressure_size_curve) {
+    brush->pressure_size_curve = BKE_curvemapping_add(1, 0, 0, 1, 1);
+    brush_reset_input_curve(brush->pressure_size_curve);
+  }
+
+  if (!brush->pressure_strength_curve) {
+    brush->pressure_strength_curve = BKE_curvemapping_add(1, 0, 0, 1, 1);
+    brush_reset_input_curve(brush->pressure_strength_curve);
+  }
+}
+
 static void brush_blend_read_data(BlendDataReader *reader, ID *id)
 {
   Brush *brush = (Brush *)id;
@@ -254,6 +287,10 @@ static void brush_blend_read_data(BlendDataReader *reader, ID *id)
   /* Falloff curve. */
   BLO_read_data_address(reader, &brush->curve);
 
+  /* Input Curves. */
+  BLO_read_data_address(reader, &brush->pressure_size_curve);
+  BLO_read_data_address(reader, &brush->pressure_strength_curve);
+
   BLO_read_data_address(reader, &brush->gradient);
 
   if (brush->curve) {
@@ -263,6 +300,20 @@ static void brush_blend_read_data(BlendDataReader *reader, ID *id)
     BKE_brush_curve_preset(brush, CURVE_PRESET_SHARP);
   }
 
+  if (brush->pressure_size_curve) {
+    BKE_curvemapping_blend_read(reader, brush->pressure_size_curve);
+  }
+  else {
+    BKE_brush_default_input_curves_set(brush);
+  }
+
+  if (brush->pressure_strength_curve) {
+    BKE_curvemapping_blend_read(reader, brush->pressure_strength_curve);
+  }
+  else {
+    BKE_brush_default_input_curves_set(brush);
+  }
+
   /* grease pencil */
   BLO_read_data_address(reader, &brush->gpencil_settings);
   if (brush->gpencil_settings != NULL) {
@@ -1678,6 +1729,7 @@ void BKE_brush_sculpt_reset(Brush *br)
 
   brush_defaults(br);
   BKE_brush_curve_preset(br, CURVE_PRESET_SMOOTH);
+  BKE_brush_default_input_curves_set(br);
 
   /* Use the curve presets by default */
   br->curve_preset = BRUSH_CURVE_SMOOTH;
diff --git a/source/blender/editors/sculpt_paint/paint_stroke.c b/source/blender/editors/sculpt_paint/paint_stroke.c
index 57b1102219e..a44709ef071 100644
--- a/source/blender/editors/sculpt_paint/paint_stroke.c
+++ b/source/blender/editors/sculpt_paint/paint_stroke.c
@@ -679,7 +679,11 @@ static float paint_space_stroke_spacing(bContext *C,
   ePaintMode mode = BKE_paintmode_get_active_from_context(C);
   Brush *brush = BKE_paint_brush(paint);
   float size_clamp = 0.0f;
-  float size = BKE_brush_size_get(scene, stroke->brush) * size_pressure;
+  float final_size_pressure = size_pressure;
+  if (brush->pressure_size_curve) {
+    final_size_pressure = BKE_curvemapping_evaluateF(brush->pressure_size_curve, 0, size_pressure);
+  }
+  float size = BKE_brush_size_get(scene, stroke->brush) * final_size_pressure;
   if (paint_stroke_use_scene_spacing(brush, mode)) {
     if (!BKE_brush_use_locked_size(scene, brush)) {
       float last_object_space_position[3];
@@ -688,7 +692,7 @@ static float paint_space_stroke_spacing(bContext *C,
       size_clamp = paint_calc_object_space_radius(&stroke->vc, last_object_space_position, size);
     }
     else {
-      size_clamp = BKE_brush_unprojected_radius_get(scene, brush) * size_pressure;
+      size_clamp = BKE_brush_unprojected_radius_get(scene, brush) * final_size_pressure;
     }
   }
   else {
@@ -788,6 +792,7 @@ static float paint_space_stroke_spacing_variable(bContext *C,
     /* average spacing */
     float last_spacing = paint_space_stroke_spacing(
         C, scene, stroke, last_size_pressure, pressure);
+
     float new_spacing = paint_space_stroke_spacing(C, scene, stroke, new_size_pressure, pressure);
 
     return 0.5f * (last_spacing + new_spacing);
diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c
index 9da3525e4d6..98485b769bd 100644
--- a/source/blender/editors/sculpt_paint/sculpt.c
+++ b/source/blender/editors/sculpt_paint/sculpt.c
@@ -2297,7 +2297,6 @@ static float brush_strength(const Sculpt *sd,
   const float root_alpha = BKE_brush_alpha_get(scene, brush);
   const float alpha = root_alpha * root_alpha;
   const float dir = (brush->flag & BRUSH_DIR_IN) ? -1.0f : 1.0f;
-  const float pressure = BKE_brush_use_alpha_pressure(brush) ? cache->pressure : 1.0f;
   const float pen_flip = cache->pen_flip ? -1.0f : 1.0f;
   const float invert = cache->invert ? -1.0f : 1.0f;
   float overlap = ups->overlap_factor;
@@ -2309,14 +2308,18 @@ static float brush_strength(const Sculpt *sd,
     flip = 1.0f;
   }
 
+  float pressure = BKE_brush_use_alpha_pressure(brush) ? cache->pressure : 1.0f;
+  pressure = BKE_brush_use_alpha_pressure(brush) && brush->pressure_strength_curve ?
+                 BKE_curvemapping_evaluateF(brush->pressure_strength_curve, 0, cache->pressure) :
+                 pressure;
   /* Pressure final value after being tweaked depending on the brush. */
   float final_pressure;
 
   switch (brush->sculpt_tool) {
     case SCULPT_TOOL_CLAY:
-      final_pressure = pow4f(pressure);
+      // final_pressure = pow4f(pressure);
       overlap = (1.0f + overlap) / 2.0f;
-      return 0.25f * alpha * flip * final_pressure * overlap * feather;
+      return 0.25f * alpha * flip * pressure * overlap * feather;
     case SCULPT_TOOL_DRAW:
     case SCULPT_TOOL_DRAW_SHARP:
     case SCULPT_TOOL_LAYER:
@@ -2356,11 +2359,11 @@ static float brush_strength(const Sculpt *sd,
       return alpha * pressure * overlap * feather;
     case SCULPT_TOOL_CLAY_STRIPS:
       /* Clay Strips needs less strength to compensate the curve. */
-      final_pressure = powf(pressure, 1.5f);
-      return alpha * flip * final_pressure * overlap * feather * 0.3f;
+      // final_pressure = powf(pressure, 1.5f);
+      return alpha * flip * pressure * overlap * feather * 0.3f;
     case SCULPT_TOOL_CLAY_THUMB:
-      final_pressure = pressure * pressure;
-      return alpha * flip * final_pressure * overlap * feather * 1.3f;
+      // final_pressure = pressure * pressure;
+      return alpha * flip * pressure * overlap * feather * 1.3f;
 
     case SCULPT_TOOL_MASK:
       overlap = (1.0f + overlap) / 2.0f;
@@ -7196,6 +7199,11 @@ static void sculpt_update_cache_invariants(
 
 static float sculpt_brush_dynamic_size_get(Brush *brush, StrokeCache *cache, float initial_size)
 {
+  if (brush->pressure_size_curve) {
+    return initial_size *
+           BKE_curvemapping_evaluateF(brush->pressure_size_curve, 0, cache->pressure);
+  }
+
   switch (brush->sculpt_tool) {
     case SCULPT_TOOL_CLAY:
       return max_ff(initial_size * 0.20f, initial_size * pow3f(cache->pressure));
diff --git a/source/blender/makesdna/DNA_brush_types.h b/source/blender/makesdna/DNA_brush_types.h
index 4b020019062..2eed24a7054 100644
--- a/source/blender/makesdna/DNA_brush_types.h
+++ b/source/blender/makesdna/DNA_brush_types.h
@@ -154,6 +154,10 @@ typedef struct Brush {
   struct MTex mtex;
   struct MTex mask_mtex;
 
+  /** Pen Input curves */
+  struct CurveMapping *pressure_size_curve;
+  struct CurveMapping *pressure_strength_curve;
+
   struct Brush *toggle_brush;
 
   struct ImBuf *icon_imbuf;
diff --git a/source/blender/makesrna/intern/rna_brush.c b/source/blender/makesrna/intern/rna_brush.c
index d9aeb627001..9ea36c76828 100644
--- a/source/blender/makesrna/intern/rna_brush.c
+++ b/source/blender/makesrna/intern/rna_brush.c
@@ -3249,6 +3249,16 @@ static void rna_def_brush(BlenderRNA *brna)
   RNA_def_property_ui_text(prop, "Curve", "Editable falloff curve");
   RNA_def_property_update(prop, 0, "r

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list