Paint: Rename curve and curve_preset

This commit renames the following DNA fields and corresponding RNA
properties to better represnt usage:

* `Brush.curve` to `Brush.curve_distance_falloff`
* `Brush.curve_preset` to `Brush.curve_distance_falloff_preset`

Pull Request: https://projects.blender.org/blender/blender/pulls/146254
This commit is contained in:
Sean Kim
2025-09-25 11:54:53 +02:00
committed by Sean Kim
parent b279e74889
commit 327a1925cf
32 changed files with 128 additions and 92 deletions

View File

@@ -184,8 +184,8 @@ class GreasePencilBrushFalloff:
row = col.row(align=True)
col.prop(brush, "curve_preset", text="")
if brush.curve_preset == 'CUSTOM':
layout.template_curve_mapping(brush, "curve", brush=True, use_negative_slope=True)
if brush.curve_distance_falloff_preset == 'CUSTOM':
layout.template_curve_mapping(brush, "curve_distance_falloff", brush=True, use_negative_slope=True)
col = layout.column(align=True)
row = col.row(align=True)

View File

@@ -630,7 +630,7 @@ class FalloffPanel(BrushPanel):
if not super().poll(context):
return False
settings = cls.paint_settings(context)
if not (settings and settings.brush and settings.brush.curve):
if not (settings and settings.brush and settings.brush.curve_distance_falloff):
return False
if cls.get_brush_mode(context) == 'SCULPT_CURVES':
brush = settings.brush
@@ -654,8 +654,8 @@ class FalloffPanel(BrushPanel):
row = col.row(align=True)
col.prop(brush, "curve_preset", text="")
if brush.curve_preset == 'CUSTOM':
layout.template_curve_mapping(brush, "curve", brush=True, use_negative_slope=True)
if brush.curve_distance_falloff_preset == 'CUSTOM':
layout.template_curve_mapping(brush, "curve_distance_falloff", brush=True, use_negative_slope=True)
col = layout.column(align=True)
row = col.row(align=True)

View File

@@ -871,8 +871,8 @@ class VIEW3D_PT_tools_weight_gradient(Panel, View3DPaintPanel):
col = layout.column(align=True)
col.prop(brush, "curve_preset", expand=True)
if brush.curve_preset == 'CUSTOM':
layout.template_curve_mapping(brush, "curve", brush=True)
if brush.curve_distance_falloff_preset == 'CUSTOM':
layout.template_curve_mapping(brush, "curve_distance_falloff", brush=True)
col = layout.column(align=True)
row = col.row(align=True)
@@ -1616,7 +1616,7 @@ class VIEW3D_PT_tools_grease_pencil_brush_weight_falloff(GreasePencilBrushFallof
tool_settings = context.tool_settings
settings = tool_settings.gpencil_weight_paint
brush = settings.brush
return (brush and brush.curve)
return (brush and brush.curve_distance_falloff)
class VIEW3D_PT_tools_grease_pencil_weight_options(Panel, View3DPanel, GreasePencilWeightPanel):
@@ -1719,7 +1719,7 @@ class VIEW3D_PT_tools_grease_pencil_brush_vertex_falloff(GreasePencilBrushFallof
def poll(cls, context):
tool_settings = context.tool_settings
settings = tool_settings.gpencil_vertex_paint
return (settings and settings.brush and settings.brush.curve)
return (settings and settings.brush and settings.brush.curve_distance_falloff)
class VIEW3D_PT_tools_grease_pencil_brush_vertex_palette(View3DPanel, Panel):

View File

@@ -82,7 +82,7 @@ static void brush_copy_data(Main * /*bmain*/,
brush_dst->preview = nullptr;
}
brush_dst->curve = BKE_curvemapping_copy(brush_src->curve);
brush_dst->curve_distance_falloff = BKE_curvemapping_copy(brush_src->curve_distance_falloff);
brush_dst->automasking_cavity_curve = BKE_curvemapping_copy(brush_src->automasking_cavity_curve);
brush_dst->curve_rand_hue = BKE_curvemapping_copy(brush_src->curve_rand_hue);
@@ -130,7 +130,7 @@ static void brush_copy_data(Main * /*bmain*/,
static void brush_free_data(ID *id)
{
Brush *brush = reinterpret_cast<Brush *>(id);
BKE_curvemapping_free(brush->curve);
BKE_curvemapping_free(brush->curve_distance_falloff);
BKE_curvemapping_free(brush->automasking_cavity_curve);
BKE_curvemapping_free(brush->curve_rand_hue);
@@ -236,8 +236,8 @@ static void brush_blend_write(BlendWriter *writer, ID *id, const void *id_addres
BLO_write_id_struct(writer, Brush, id_address, &brush->id);
BKE_id_blend_write(writer, &brush->id);
if (brush->curve) {
BKE_curvemapping_blend_write(writer, brush->curve);
if (brush->curve_distance_falloff) {
BKE_curvemapping_blend_write(writer, brush->curve_distance_falloff);
}
if (brush->automasking_cavity_curve) {
@@ -311,12 +311,12 @@ static void brush_blend_read_data(BlendDataReader *reader, ID *id)
Brush *brush = reinterpret_cast<Brush *>(id);
/* Falloff curve. */
BLO_read_struct(reader, CurveMapping, &brush->curve);
BLO_read_struct(reader, CurveMapping, &brush->curve_distance_falloff);
BLO_read_struct(reader, ColorBand, &brush->gradient);
if (brush->curve) {
BKE_curvemapping_blend_read(reader, brush->curve);
if (brush->curve_distance_falloff) {
BKE_curvemapping_blend_read(reader, brush->curve_distance_falloff);
}
else {
BKE_brush_curve_preset(brush, CURVE_PRESET_SHARP);
@@ -878,14 +878,14 @@ void BKE_brush_curve_preset(Brush *b, eCurveMappingPreset preset)
CurveMapping *cumap = nullptr;
CurveMap *cuma = nullptr;
if (!b->curve) {
b->curve = BKE_curvemapping_add(1, 0, 0, 1, 1);
if (!b->curve_distance_falloff) {
b->curve_distance_falloff = BKE_curvemapping_add(1, 0, 0, 1, 1);
}
cumap = b->curve;
cumap = b->curve_distance_falloff;
cumap->flag &= ~CUMA_EXTEND_EXTRAPOLATE;
cumap->preset = preset;
cuma = b->curve->cm;
cuma = b->curve_distance_falloff->cm;
BKE_curvemap_reset(cuma, &cumap->clipr, cumap->preset, CURVEMAP_SLOPE_NEGATIVE);
BKE_curvemapping_changed(cumap, false);
BKE_brush_tag_unsaved_changes(b);
@@ -1617,7 +1617,8 @@ float BKE_brush_curve_strength(const eBrushCurvePreset preset,
float BKE_brush_curve_strength(const Brush *br, float p, const float len)
{
return BKE_brush_curve_strength(eBrushCurvePreset(br->curve_preset), br->curve, p, len);
return BKE_brush_curve_strength(
eBrushCurvePreset(br->curve_distance_falloff_preset), br->curve_distance_falloff, p, len);
}
float BKE_brush_curve_strength_clamped(const Brush *br, float p, const float len)
@@ -1666,7 +1667,7 @@ ImBuf *BKE_brush_gen_radial_control_imbuf(Brush *br, bool secondary, bool displa
int side = 512;
int half = side / 2;
BKE_curvemapping_init(br->curve);
BKE_curvemapping_init(br->curve_distance_falloff);
float *rect_float = MEM_calloc_arrayN<float>(size_t(side) * size_t(side), "radial control rect");
IMB_assign_float_buffer(im, rect_float, IB_DO_NOT_TAKE_OWNERSHIP);

View File

@@ -284,7 +284,7 @@ void BKE_paint_invalidate_cursor_overlay(Scene *scene, ViewLayer *view_layer, Cu
}
Brush *br = BKE_paint_brush(paint);
if (br && br->curve == curve) {
if (br && br->curve_distance_falloff == curve) {
overlay_flags |= PAINT_OVERLAY_INVALID_CURVE;
}
}

View File

@@ -1391,8 +1391,8 @@ void blo_do_versions_250(FileData *fd, Library * /*lib*/, Main *bmain)
if (!MAIN_VERSION_FILE_ATLEAST(bmain, 252, 1)) {
LISTBASE_FOREACH (Brush *, brush, &bmain->brushes) {
if (brush->curve) {
brush->curve->preset = CURVE_PRESET_SMOOTH;
if (brush->curve_distance_falloff) {
brush->curve_distance_falloff->preset = CURVE_PRESET_SMOOTH;
}
}

View File

@@ -838,8 +838,8 @@ static void do_version_curvemapping_walker(Main *bmain, void (*callback)(CurveMa
FOREACH_NODETREE_END;
LISTBASE_FOREACH (Brush *, brush, &bmain->brushes) {
if (brush->curve) {
callback(brush->curve);
if (brush->curve_distance_falloff) {
callback(brush->curve_distance_falloff);
}
if (brush->gpencil_settings) {
if (brush->gpencil_settings->curve_sensitivity) {

View File

@@ -3302,7 +3302,7 @@ void blo_do_versions_300(FileData *fd, Library * /*lib*/, Main *bmain)
br->spacing = 5;
br->flag &= ~BRUSH_ALPHA_PRESSURE;
br->flag &= ~BRUSH_SPACE_ATTEN;
br->curve_preset = BRUSH_CURVE_SPHERE;
br->curve_distance_falloff_preset = BRUSH_CURVE_SPHERE;
}
}
@@ -3456,7 +3456,7 @@ void blo_do_versions_300(FileData *fd, Library * /*lib*/, Main *bmain)
br->spacing = 5;
br->flag &= ~BRUSH_ALPHA_PRESSURE;
br->flag &= ~BRUSH_SPACE_ATTEN;
br->curve_preset = BRUSH_CURVE_SPHERE;
br->curve_distance_falloff_preset = BRUSH_CURVE_SPHERE;
}
}

View File

@@ -169,8 +169,11 @@ static void calc_faces(const Depsgraph &depsgraph,
calc_brush_cube_distances<float2>(brush, xy_positions, distances);
filter_distances_with_radius(1.0f, distances, factors);
apply_hardness_to_distances(1.0f, cache.hardness, distances);
BKE_brush_calc_curve_factors(
eBrushCurvePreset(brush.curve_preset), brush.curve, distances, 1.0f, factors);
BKE_brush_calc_curve_factors(eBrushCurvePreset(brush.curve_distance_falloff_preset),
brush.curve_distance_falloff,
distances,
1.0f,
factors);
auto_mask::calc_vert_factors(depsgraph, object, cache.automasking.get(), node, verts, factors);
@@ -221,8 +224,11 @@ static void calc_grids(const Depsgraph &depsgraph,
calc_brush_cube_distances<float2>(brush, xy_positions, distances);
filter_distances_with_radius(1.0f, distances, factors);
apply_hardness_to_distances(1.0f, cache.hardness, distances);
BKE_brush_calc_curve_factors(
eBrushCurvePreset(brush.curve_preset), brush.curve, distances, 1.0f, factors);
BKE_brush_calc_curve_factors(eBrushCurvePreset(brush.curve_distance_falloff_preset),
brush.curve_distance_falloff,
distances,
1.0f,
factors);
auto_mask::calc_grids_factors(depsgraph, object, cache.automasking.get(), node, grids, factors);
@@ -272,8 +278,11 @@ static void calc_bmesh(const Depsgraph &depsgraph,
calc_brush_cube_distances<float2>(brush, xy_positions, distances);
filter_distances_with_radius(1.0f, distances, factors);
apply_hardness_to_distances(1.0f, cache.hardness, distances);
BKE_brush_calc_curve_factors(
eBrushCurvePreset(brush.curve_preset), brush.curve, distances, 1.0f, factors);
BKE_brush_calc_curve_factors(eBrushCurvePreset(brush.curve_distance_falloff_preset),
brush.curve_distance_falloff,
distances,
1.0f,
factors);
auto_mask::calc_vert_factors(depsgraph, object, cache.automasking.get(), node, verts, factors);

View File

@@ -163,8 +163,11 @@ static void sample_node_surface_mesh(const Depsgraph &depsgraph,
calc_brush_distances(ss, positions, eBrushFalloffShape(brush.falloff_shape), distances);
filter_distances_with_radius(radius, distances, factors);
apply_hardness_to_distances(radius, cache.hardness, distances);
BKE_brush_calc_curve_factors(
eBrushCurvePreset(brush.curve_preset), brush.curve, distances, radius, factors);
BKE_brush_calc_curve_factors(eBrushCurvePreset(brush.curve_distance_falloff_preset),
brush.curve_distance_falloff,
distances,
radius,
factors);
tls.local_positions.resize(verts.size());
MutableSpan<float3> local_positions = tls.local_positions;
@@ -206,8 +209,11 @@ static void sample_node_surface_grids(const Depsgraph &depsgraph,
calc_brush_distances(ss, positions, eBrushFalloffShape(brush.falloff_shape), distances);
filter_distances_with_radius(radius, distances, factors);
apply_hardness_to_distances(radius, cache.hardness, distances);
BKE_brush_calc_curve_factors(
eBrushCurvePreset(brush.curve_preset), brush.curve, distances, radius, factors);
BKE_brush_calc_curve_factors(eBrushCurvePreset(brush.curve_distance_falloff_preset),
brush.curve_distance_falloff,
distances,
radius,
factors);
tls.local_positions.resize(positions.size());
MutableSpan<float3> local_positions = tls.local_positions;
@@ -252,8 +258,11 @@ static void sample_node_surface_bmesh(const Depsgraph &depsgraph,
calc_brush_distances(ss, positions, eBrushFalloffShape(brush.falloff_shape), distances);
filter_distances_with_radius(radius, distances, factors);
apply_hardness_to_distances(radius, cache.hardness, distances);
BKE_brush_calc_curve_factors(
eBrushCurvePreset(brush.curve_preset), brush.curve, distances, radius, factors);
BKE_brush_calc_curve_factors(eBrushCurvePreset(brush.curve_distance_falloff_preset),
brush.curve_distance_falloff,
distances,
radius,
factors);
tls.local_positions.resize(verts.size());
MutableSpan<float3> local_positions = tls.local_positions;

View File

@@ -225,8 +225,11 @@ static void calc_faces(const Depsgraph &depsgraph,
filter_distances_with_radius(1.0f, distances, factors);
apply_hardness_to_distances(1.0f, cache.hardness, distances);
BKE_brush_calc_curve_factors(
eBrushCurvePreset(brush.curve_preset), brush.curve, distances, 1.0f, factors);
BKE_brush_calc_curve_factors(eBrushCurvePreset(brush.curve_distance_falloff_preset),
brush.curve_distance_falloff,
distances,
1.0f,
factors);
auto_mask::calc_vert_factors(depsgraph, object, cache.automasking.get(), node, verts, factors);
@@ -279,8 +282,11 @@ static void calc_grids(const Depsgraph &depsgraph,
filter_distances_with_radius(1.0f, distances, factors);
apply_hardness_to_distances(1.0f, cache.hardness, distances);
BKE_brush_calc_curve_factors(
eBrushCurvePreset(brush.curve_preset), brush.curve, distances, 1.0f, factors);
BKE_brush_calc_curve_factors(eBrushCurvePreset(brush.curve_distance_falloff_preset),
brush.curve_distance_falloff,
distances,
1.0f,
factors);
auto_mask::calc_grids_factors(depsgraph, object, cache.automasking.get(), node, grids, factors);
@@ -331,8 +337,11 @@ static void calc_bmesh(const Depsgraph &depsgraph,
filter_distances_with_radius(1.0f, distances, factors);
apply_hardness_to_distances(1.0f, cache.hardness, distances);
BKE_brush_calc_curve_factors(
eBrushCurvePreset(brush.curve_preset), brush.curve, distances, 1.0f, factors);
BKE_brush_calc_curve_factors(eBrushCurvePreset(brush.curve_distance_falloff_preset),
brush.curve_distance_falloff,
distances,
1.0f,
factors);
auto_mask::calc_vert_factors(depsgraph, object, cache.automasking.get(), node, verts, factors);

View File

@@ -1061,7 +1061,7 @@ void EraseOperation::on_stroke_begin(const bContext &C, const InputSample & /*st
}
BLI_assert(brush->gpencil_settings != nullptr);
BKE_curvemapping_init(brush->curve);
BKE_curvemapping_init(brush->curve_distance_falloff);
BKE_curvemapping_init(brush->gpencil_settings->curve_strength);
eraser_mode_ = eGP_BrushEraserMode(brush->gpencil_settings->eraser_mode);

View File

@@ -73,7 +73,7 @@ void init_brush(Brush &brush)
BKE_brush_init_gpencil_settings(&brush);
}
BLI_assert(brush.gpencil_settings != nullptr);
BKE_curvemapping_init(brush.curve);
BKE_curvemapping_init(brush.curve_distance_falloff);
BKE_curvemapping_init(brush.gpencil_settings->curve_strength);
BKE_curvemapping_init(brush.gpencil_settings->curve_sensitivity);
BKE_curvemapping_init(brush.gpencil_settings->curve_jitter);

View File

@@ -76,7 +76,7 @@ void SmoothOperation::toggle_smooth_brush_on(const bContext &C)
const int current_brush_size = BKE_brush_size_get(paint, current_brush);
BKE_brush_size_set(paint, smooth_brush, current_brush_size);
BKE_curvemapping_init(smooth_brush->curve);
BKE_curvemapping_init(smooth_brush->curve_distance_falloff);
}
void SmoothOperation::toggle_smooth_brush_off(const bContext &C)

View File

@@ -82,7 +82,7 @@ void TintOperation::on_stroke_begin(const bContext &C, const InputSample & /*sta
}
BLI_assert(brush->gpencil_settings != nullptr);
BKE_curvemapping_init(brush->curve);
BKE_curvemapping_init(brush->curve_distance_falloff);
radius_ = brush->size / 2.0f;
strength_ = brush->alpha;

View File

@@ -137,7 +137,7 @@ class WeightPaintOperation : public GreasePencilStrokeOperation {
this->mouse_position_previous = start_sample.mouse_position;
this->invert_brush_weight = false;
BKE_curvemapping_init(brush->curve);
BKE_curvemapping_init(brush->curve_distance_falloff);
/* Auto-normalize weights is only applied when the object is deformed by an armature. */
const ToolSettings *ts = CTX_data_tool_settings(&C);

View File

@@ -429,7 +429,7 @@ static int load_tex_cursor(Brush *br, ViewContext *vc, float zoom)
int size;
const bool refresh = !cursor_snap.overlay_texture ||
(overlay_flags & PAINT_OVERLAY_INVALID_CURVE) || cursor_snap.zoom != zoom ||
cursor_snap.curve_preset != br->curve_preset;
cursor_snap.curve_preset != br->curve_distance_falloff_preset;
init = (cursor_snap.overlay_texture != nullptr);
@@ -463,7 +463,7 @@ static int load_tex_cursor(Brush *br, ViewContext *vc, float zoom)
}
buffer = MEM_malloc_arrayN<uchar>(size * size, "load_tex");
BKE_curvemapping_init(br->curve);
BKE_curvemapping_init(br->curve_distance_falloff);
LoadTexData data{};
data.br = br;
@@ -500,7 +500,7 @@ static int load_tex_cursor(Brush *br, ViewContext *vc, float zoom)
size = cursor_snap.size;
}
cursor_snap.curve_preset = br->curve_preset;
cursor_snap.curve_preset = br->curve_distance_falloff_preset;
BKE_paint_reset_overlay_invalid(PAINT_OVERLAY_INVALID_CURVE);
return 1;

View File

@@ -112,7 +112,8 @@ static bool is_sampled_curve_valid(const CurveMaskCache *curve_mask_cache, const
if (curve_mask_cache->sampled_curve == nullptr) {
return false;
}
return curve_mask_cache->last_curve_timestamp == brush->curve->changed_timestamp;
return curve_mask_cache->last_curve_timestamp ==
brush->curve_distance_falloff->changed_timestamp;
}
static void sampled_curve_free(CurveMaskCache *curve_mask_cache)
@@ -132,7 +133,7 @@ static void update_sampled_curve(CurveMaskCache *curve_mask_cache, const Brush *
const float sample_weight = BKE_brush_curve_strength_clamped(brush, len, 1.0f);
curve_mask_cache->sampled_curve[i] = sample_weight;
}
curve_mask_cache->last_curve_timestamp = brush->curve->changed_timestamp;
curve_mask_cache->last_curve_timestamp = brush->curve_distance_falloff->changed_timestamp;
}
static size_t diameter_to_curve_mask_size(const int diameter)

View File

@@ -988,7 +988,7 @@ PaintStroke *paint_stroke_new(bContext *C,
}
/* initialize here to avoid initialization conflict with threaded strokes */
BKE_curvemapping_init(br->curve);
BKE_curvemapping_init(br->curve_distance_falloff);
if (paint->flags & PAINT_USE_CAVITY_MASK) {
BKE_curvemapping_init(paint->cavity_curve);
}

View File

@@ -189,7 +189,7 @@ static wmOperatorStatus brush_curve_preset_exec(bContext *C, wmOperator *op)
Scene *scene = CTX_data_scene(C);
ViewLayer *view_layer = CTX_data_view_layer(C);
BKE_brush_curve_preset(br, eCurveMappingPreset(RNA_enum_get(op->ptr, "shape")));
BKE_paint_invalidate_cursor_overlay(scene, view_layer, br->curve);
BKE_paint_invalidate_cursor_overlay(scene, view_layer, br->curve_distance_falloff);
}
return OPERATOR_FINISHED;
@@ -199,7 +199,7 @@ static bool brush_curve_preset_poll(bContext *C)
{
Brush *br = BKE_paint_brush(BKE_paint_get_active_from_context(C));
return br && br->curve;
return br && br->curve_distance_falloff;
}
static const EnumPropertyItem prop_shape_items[] = {

View File

@@ -599,7 +599,7 @@ void smooth_brush_toggle_on(const bContext *C, Paint *paint, StrokeCache *cache)
cache->saved_active_brush = cur_brush;
cache->saved_smooth_size = BKE_brush_size_get(paint, smooth_brush);
BKE_brush_size_set(paint, smooth_brush, cur_brush_size);
BKE_curvemapping_init(smooth_brush->curve);
BKE_curvemapping_init(smooth_brush->curve_distance_falloff);
}
/** \} */
} // namespace blender::ed::sculpt_paint::vwpaint

View File

@@ -819,7 +819,7 @@ static wmOperatorStatus paint_weight_gradient_exec(bContext *C, wmOperator *op)
VPaint *wp = ts->wpaint;
Brush *brush = BKE_paint_brush(&wp->paint);
BKE_curvemapping_init(brush->curve);
BKE_curvemapping_init(brush->curve_distance_falloff);
data.brush = brush;
data.weightpaint = BKE_brush_weight_get(&wp->paint, brush);

View File

@@ -3902,7 +3902,7 @@ static void smooth_brush_toggle_on(const bContext *C, Paint *paint, StrokeCache
cache->saved_smooth_size = BKE_brush_size_get(paint, smooth_brush);
BKE_brush_size_set(paint, smooth_brush, cur_brush_size);
BKE_curvemapping_init(smooth_brush->curve);
BKE_curvemapping_init(smooth_brush->curve_distance_falloff);
}
static void smooth_brush_toggle_off(Paint *paint, StrokeCache *cache)
@@ -7185,8 +7185,11 @@ void calc_brush_strength_factors(const StrokeCache &cache,
const Span<float> distances,
const MutableSpan<float> factors)
{
BKE_brush_calc_curve_factors(
eBrushCurvePreset(brush.curve_preset), brush.curve, distances, cache.radius, factors);
BKE_brush_calc_curve_factors(eBrushCurvePreset(brush.curve_distance_falloff_preset),
brush.curve_distance_falloff,
distances,
cache.radius,
factors);
}
void calc_brush_texture_factors(const SculptSession &ss,

View File

@@ -2891,7 +2891,7 @@ static void init_falloff_mesh(const Span<float> mask,
boundary.edit_info.strength_factor.size());
const int num_elements = boundary.edit_info.strength_factor.size();
BKE_curvemapping_init(brush.curve);
BKE_curvemapping_init(brush.curve_distance_falloff);
for (const int i : IndexRange(num_elements)) {
if (boundary.edit_info.propagation_steps_num[i] != BOUNDARY_STEPS_NONE) {
@@ -2937,7 +2937,7 @@ static void init_falloff_grids(const SubdivCCG &subdiv_ccg,
const CCGKey key = BKE_subdiv_ccg_key_top_level(subdiv_ccg);
BKE_curvemapping_init(brush.curve);
BKE_curvemapping_init(brush.curve_distance_falloff);
for (const int grid : IndexRange(subdiv_ccg.grids_num)) {
for (const int index : bke::ccg::grid_range(key, grid)) {
@@ -2986,7 +2986,7 @@ static void init_falloff_bmesh(BMesh *bm,
const int num_elements = boundary.edit_info.strength_factor.size();
BKE_curvemapping_init(brush.curve);
BKE_curvemapping_init(brush.curve_distance_falloff);
for (const int i : IndexRange(num_elements)) {
if (boundary.edit_info.propagation_steps_num[i] != BOUNDARY_STEPS_NONE) {

View File

@@ -2646,7 +2646,7 @@ static void cache_initial_config_set(bContext *C, wmOperator *op, Cache &expand_
const Sculpt &sd = *CTX_data_tool_settings(C)->sculpt;
expand_cache.paint = paint;
expand_cache.brush = BKE_paint_brush_for_read(&sd.paint);
BKE_curvemapping_init(expand_cache.brush->curve);
BKE_curvemapping_init(expand_cache.brush->curve_distance_falloff);
copy_v4_fl(expand_cache.fill_color, 1.0f);
copy_v3_v3(expand_cache.fill_color, BKE_brush_color_get(paint, expand_cache.brush));

View File

@@ -399,8 +399,11 @@ static void do_paint_brush_task(const Depsgraph &depsgraph,
}
filter_distances_with_radius(radius, distances, factors);
apply_hardness_to_distances(radius, cache.hardness, distances);
BKE_brush_calc_curve_factors(
eBrushCurvePreset(brush.curve_preset), brush.curve, distances, radius, factors);
BKE_brush_calc_curve_factors(eBrushCurvePreset(brush.curve_distance_falloff_preset),
brush.curve_distance_falloff,
distances,
radius,
factors);
MutableSpan<float> auto_mask;
if (cache.automasking) {
@@ -574,7 +577,7 @@ void do_paint_brush(const Depsgraph &depsgraph,
return;
}
BKE_curvemapping_init(brush.curve);
BKE_curvemapping_init(brush.curve_distance_falloff);
float4x4 mat;
@@ -901,7 +904,7 @@ void do_smear_brush(const Depsgraph &depsgraph,
});
}
BKE_curvemapping_init(brush.curve);
BKE_curvemapping_init(brush.curve_distance_falloff);
/* Smooth colors mode. */
if (ss.cache->alt_smooth) {

View File

@@ -1949,7 +1949,7 @@ std::unique_ptr<SculptPoseIKChainPreview> preview_ik_chain_init(const Depsgraph
static void sculpt_pose_do_translate_deform(SculptSession &ss, const Brush &brush)
{
IKChain &ik_chain = *ss.cache->pose_ik_chain;
BKE_curvemapping_init(brush.curve);
BKE_curvemapping_init(brush.curve_distance_falloff);
solve_translate_chain(ik_chain, ss.cache->grab_delta);
}
@@ -1988,7 +1988,7 @@ static void calc_twist_deform(SculptSession &ss, const Brush &brush)
/* Calculate the maximum roll. 0.02 radians per pixel works fine. */
float roll = (ss.cache->initial_mouse[0] - ss.cache->mouse[0]) * ss.cache->bstrength * 0.02f;
BKE_curvemapping_init(brush.curve);
BKE_curvemapping_init(brush.curve_distance_falloff);
solve_roll_chain(ik_chain, brush, roll);
}

View File

@@ -172,8 +172,7 @@ typedef struct Brush {
ID id;
/** Falloff curve. */
struct CurveMapping *curve;
struct CurveMapping *curve_distance_falloff;
struct MTex mtex;
struct MTex mask_mtex;
@@ -331,7 +330,7 @@ typedef struct Brush {
float texture_sample_bias;
int curve_preset;
int curve_distance_falloff_preset;
/* Maximum distance to search fake neighbors from a vertex. */
float disconnected_distance_max;

View File

@@ -66,6 +66,8 @@ DNA_STRUCT_RENAME_MEMBER(Bone, scaleIn, scale_in_x)
DNA_STRUCT_RENAME_MEMBER(Bone, scaleOut, scale_out_x)
DNA_STRUCT_RENAME_MEMBER(Bone, scale_in_y, scale_in_z)
DNA_STRUCT_RENAME_MEMBER(Bone, scale_out_y, scale_out_z)
DNA_STRUCT_RENAME_MEMBER(Brush, curve, curve_distance_falloff)
DNA_STRUCT_RENAME_MEMBER(Brush, curve_preset, curve_distance_falloff_preset)
DNA_STRUCT_RENAME_MEMBER(Brush, curves_sculpt_tool, curves_sculpt_brush_type)
DNA_STRUCT_RENAME_MEMBER(Brush, gpencil_sculpt_tool, gpencil_sculpt_brush_type)
DNA_STRUCT_RENAME_MEMBER(Brush, gpencil_tool, gpencil_brush_type)

View File

@@ -2563,9 +2563,9 @@ static void rna_def_brush(BlenderRNA *brna)
RNA_def_property_translation_context(prop, BLT_I18NCONTEXT_ID_MASK);
RNA_def_property_update(prop, 0, "rna_Brush_update");
prop = RNA_def_property(srna, "curve_preset", PROP_ENUM, PROP_NONE);
prop = RNA_def_property(srna, "curve_distance_falloff_preset", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, rna_enum_brush_curve_preset_items);
RNA_def_property_ui_text(prop, "Curve Preset", "");
RNA_def_property_ui_text(prop, "Falloff Curve Preset", "");
RNA_def_property_translation_context(prop,
BLT_I18NCONTEXT_ID_CURVE_LEGACY); /* Abusing id_curve :/ */
RNA_def_property_update(prop, 0, "rna_Brush_update");
@@ -3749,9 +3749,9 @@ static void rna_def_brush(BlenderRNA *brna)
prop, "Affect Alpha", "When this is disabled, lock alpha while painting");
RNA_def_property_update(prop, 0, "rna_Brush_update");
prop = RNA_def_property(srna, "curve", PROP_POINTER, PROP_NONE);
prop = RNA_def_property(srna, "curve_distance_falloff", PROP_POINTER, PROP_NONE);
RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_ui_text(prop, "Curve", "Editable falloff curve");
RNA_def_property_ui_text(prop, "Falloff Curve", "Editable falloff curve");
RNA_def_property_update(prop, 0, "rna_Brush_update");
prop = RNA_def_property(srna, "paint_curve", PROP_POINTER, PROP_NONE);

View File

@@ -2783,7 +2783,7 @@ static void radial_control_paint_curve(uint pos, Brush *br, float radius, int li
GPU_line_width(2.0f);
immUniformColor4f(0.8f, 0.8f, 0.8f, 0.85f);
float step = (radius * 2.0f) / float(line_segments);
BKE_curvemapping_init(br->curve);
BKE_curvemapping_init(br->curve_distance_falloff);
immBegin(GPU_PRIM_LINES, line_segments * 2);
for (int i = 0; i < line_segments; i++) {
float h1 = BKE_brush_curve_strength_clamped(br, fabsf((i * step) - radius), radius);

View File

@@ -113,39 +113,39 @@ class BrushCurvesTest(unittest.TestCase):
self.assertTrue(all_valid, "All position componentes should be rational values")
def test_smooth_preset_curve_creates_valid_stroke(self):
bpy.context.tool_settings.sculpt.brush.curve_preset = 'SMOOTH'
bpy.context.tool_settings.sculpt.brush.curve_distance_falloff_preset = 'SMOOTH'
self._check_stroke()
def test_smoother_preset_curve_creates_valid_stroke(self):
bpy.context.tool_settings.sculpt.brush.curve_preset = 'SMOOTHER'
bpy.context.tool_settings.sculpt.brush.curve_distance_falloff_preset = 'SMOOTHER'
self._check_stroke()
def test_sphere_preset_curve_creates_valid_stroke(self):
bpy.context.tool_settings.sculpt.brush.curve_preset = 'SPHERE'
bpy.context.tool_settings.sculpt.brush.curve_distance_falloff_preset = 'SPHERE'
self._check_stroke()
def test_root_preset_curve_creates_valid_stroke(self):
bpy.context.tool_settings.sculpt.brush.curve_preset = 'ROOT'
bpy.context.tool_settings.sculpt.brush.curve_distance_falloff_preset = 'ROOT'
self._check_stroke()
def test_sharp_preset_curve_creates_valid_stroke(self):
bpy.context.tool_settings.sculpt.brush.curve_preset = 'SHARP'
bpy.context.tool_settings.sculpt.brush.curve_distance_falloff_preset = 'SHARP'
self._check_stroke()
def test_linear_preset_curve_creates_valid_stroke(self):
bpy.context.tool_settings.sculpt.brush.curve_preset = 'LIN'
bpy.context.tool_settings.sculpt.brush.curve_distance_falloff_preset = 'LIN'
self._check_stroke()
def test_sharper_preset_curve_creates_valid_stroke(self):
bpy.context.tool_settings.sculpt.brush.curve_preset = 'POW4'
bpy.context.tool_settings.sculpt.brush.curve_distance_falloff_preset = 'POW4'
self._check_stroke()
def test_inverse_square_preset_curve_creates_valid_stroke(self):
bpy.context.tool_settings.sculpt.brush.curve_preset = 'INVSQUARE'
bpy.context.tool_settings.sculpt.brush.curve_distance_falloff_preset = 'INVSQUARE'
self._check_stroke()
def test_constant_preset_curve_creates_valid_stroke(self):
bpy.context.tool_settings.sculpt.brush.curve_preset = 'CONSTANT'
bpy.context.tool_settings.sculpt.brush.curve_distance_falloff_preset = 'CONSTANT'
self._check_stroke()