Fix #142006: Grease Pencil color jitter settings not transferred
The flags were converted with96e549c092, but the new values only used the new `Brush` level properties inb472570875. 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:
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user