Fix #142006: Grease Pencil color jitter settings not transferred

The flags were converted with 96e549c092,
but the new values only used the new `Brush` level properties in
b472570875.

Additionally, the `CurveMapping` structs were not initialized inside
the various operations that depended on them, potentially leading to
a crash if custom curves are used.

This commit fixes what was missing from both previous commitsL
* Conversion of the HSV jitter values and their curves to the new
  storage location.
* Correct initialization in relevant operators

Pull Request: https://projects.blender.org/blender/blender/pulls/142104
This commit is contained in:
Sean Kim
2025-07-22 23:23:29 +02:00
committed by Sean Kim
parent 828bd5336b
commit 9e44e975c1
6 changed files with 67 additions and 16 deletions

View File

@@ -27,7 +27,7 @@
/* Blender file format version. */
#define BLENDER_FILE_VERSION BLENDER_VERSION
#define BLENDER_FILE_SUBVERSION 39
#define BLENDER_FILE_SUBVERSION 40
/* Minimum Blender version that supports reading file written with the current
* version. Older Blender versions will test this and cancel loading the file, showing a warning to

View File

@@ -11,6 +11,7 @@
#include <fmt/format.h>
#include "DNA_ID.h"
#include "DNA_brush_types.h"
#include "DNA_curves_types.h"
#include "DNA_grease_pencil_types.h"
#include "DNA_mesh_types.h"
@@ -1129,6 +1130,48 @@ static void do_version_remove_lzo_and_lzma_compression(FileData *fd, Object *obj
BLI_freelistN(&pidlist);
}
static void do_version_convert_gp_jitter_values(Brush *brush)
{
/* Because this change is backported into the 4.5 branch, we need to avoid performing versioning
* in case the user updated their custom brush assets between using 4.5 and 5.0 to avoid
* overwriting their changes.
*
* See #142104
*/
if ((brush->flag2 & BRUSH_JITTER_COLOR) != 0 || !is_zero_v3(brush->hsv_jitter)) {
return;
}
BrushGpencilSettings *settings = brush->gpencil_settings;
float old_hsv_jitter[3] = {
settings->random_hue, settings->random_saturation, settings->random_value};
if (!is_zero_v3(old_hsv_jitter)) {
brush->flag2 |= BRUSH_JITTER_COLOR;
}
copy_v3_v3(brush->hsv_jitter, old_hsv_jitter);
if (brush->curve_rand_hue) {
BKE_curvemapping_free_data(brush->curve_rand_hue);
BKE_curvemapping_copy_data(brush->curve_rand_hue, settings->curve_rand_hue);
}
else {
brush->curve_rand_hue = BKE_curvemapping_copy(settings->curve_rand_hue);
}
if (brush->curve_rand_saturation) {
BKE_curvemapping_free_data(brush->curve_rand_saturation);
BKE_curvemapping_copy_data(brush->curve_rand_saturation, settings->curve_rand_saturation);
}
else {
brush->curve_rand_saturation = BKE_curvemapping_copy(settings->curve_rand_saturation);
}
if (brush->curve_rand_value) {
BKE_curvemapping_free_data(brush->curve_rand_value);
BKE_curvemapping_copy_data(brush->curve_rand_value, settings->curve_rand_value);
}
else {
brush->curve_rand_value = BKE_curvemapping_copy(settings->curve_rand_value);
}
}
void do_versions_after_linking_500(FileData *fd, Main *bmain)
{
if (!MAIN_VERSION_FILE_ATLEAST(bmain, 500, 9)) {
@@ -1516,6 +1559,14 @@ void blo_do_versions_500(FileData * /*fd*/, Library * /*lib*/, Main *bmain)
}
}
if (!MAIN_VERSION_FILE_ATLEAST(bmain, 500, 40)) {
LISTBASE_FOREACH (Brush *, brush, &bmain->brushes) {
if (brush->gpencil_settings) {
do_version_convert_gp_jitter_values(brush);
}
}
}
/**
* Always bump subversion in BKE_blender_version.h when adding versioning
* code here, and wrap it inside a MAIN_VERSION_FILE_ATLEAST check.

View File

@@ -781,9 +781,9 @@ static wmOperatorStatus grease_pencil_primitive_invoke(bContext *C,
BKE_curvemapping_init(ptd.settings->curve_rand_pressure);
BKE_curvemapping_init(ptd.settings->curve_rand_strength);
BKE_curvemapping_init(ptd.settings->curve_rand_uv);
BKE_curvemapping_init(ptd.settings->curve_rand_hue);
BKE_curvemapping_init(ptd.settings->curve_rand_saturation);
BKE_curvemapping_init(ptd.settings->curve_rand_value);
BKE_curvemapping_init(ptd.brush->curve_rand_hue);
BKE_curvemapping_init(ptd.brush->curve_rand_saturation);
BKE_curvemapping_init(ptd.brush->curve_rand_value);
ToolSettings *ts = vc.scene->toolsettings;
GP_Sculpt_Settings *gset = &ts->gp_sculpt;

View File

@@ -1513,9 +1513,9 @@ static bool grease_pencil_fill_init(bContext &C, wmOperator &op)
BKE_curvemapping_init(brush.gpencil_settings->curve_rand_pressure);
BKE_curvemapping_init(brush.gpencil_settings->curve_rand_strength);
BKE_curvemapping_init(brush.gpencil_settings->curve_rand_uv);
BKE_curvemapping_init(brush.gpencil_settings->curve_rand_hue);
BKE_curvemapping_init(brush.gpencil_settings->curve_rand_saturation);
BKE_curvemapping_init(brush.gpencil_settings->curve_rand_value);
BKE_curvemapping_init(brush.curve_rand_hue);
BKE_curvemapping_init(brush.curve_rand_saturation);
BKE_curvemapping_init(brush.curve_rand_value);
Material *material = BKE_grease_pencil_object_material_ensure_from_brush(&bmain, &ob, &brush);
const int material_index = BKE_object_material_index_get(&ob, material);

View File

@@ -155,9 +155,9 @@ static Brush *create_fill_guide_brush()
BKE_curvemapping_init(settings->curve_rand_pressure);
BKE_curvemapping_init(settings->curve_rand_strength);
BKE_curvemapping_init(settings->curve_rand_uv);
BKE_curvemapping_init(settings->curve_rand_hue);
BKE_curvemapping_init(settings->curve_rand_saturation);
BKE_curvemapping_init(settings->curve_rand_value);
BKE_curvemapping_init(fill_guides_brush->curve_rand_hue);
BKE_curvemapping_init(fill_guides_brush->curve_rand_saturation);
BKE_curvemapping_init(fill_guides_brush->curve_rand_value);
fill_guides_brush->flag |= BRUSH_LOCK_SIZE;
fill_guides_brush->unprojected_radius = 0.005f;
@@ -1179,9 +1179,9 @@ void PaintOperation::on_stroke_begin(const bContext &C, const InputSample &start
BKE_curvemapping_init(settings->curve_rand_pressure);
BKE_curvemapping_init(settings->curve_rand_strength);
BKE_curvemapping_init(settings->curve_rand_uv);
BKE_curvemapping_init(settings->curve_rand_hue);
BKE_curvemapping_init(settings->curve_rand_saturation);
BKE_curvemapping_init(settings->curve_rand_value);
BKE_curvemapping_init(brush->curve_rand_hue);
BKE_curvemapping_init(brush->curve_rand_saturation);
BKE_curvemapping_init(brush->curve_rand_value);
BLI_assert(grease_pencil->has_active_layer());
const bke::greasepencil::Layer &layer = *grease_pencil->get_active_layer();

View File

@@ -80,9 +80,9 @@ void init_brush(Brush &brush)
BKE_curvemapping_init(brush.gpencil_settings->curve_rand_pressure);
BKE_curvemapping_init(brush.gpencil_settings->curve_rand_strength);
BKE_curvemapping_init(brush.gpencil_settings->curve_rand_uv);
BKE_curvemapping_init(brush.gpencil_settings->curve_rand_hue);
BKE_curvemapping_init(brush.gpencil_settings->curve_rand_saturation);
BKE_curvemapping_init(brush.gpencil_settings->curve_rand_value);
BKE_curvemapping_init(brush.curve_rand_hue);
BKE_curvemapping_init(brush.curve_rand_saturation);
BKE_curvemapping_init(brush.curve_rand_value);
}
float brush_radius(const Paint &paint, const Brush &brush, const float pressure = 1.0f)