From 76f513f6dcc352c62944858123d91dc393a55650 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 1 Sep 2020 14:48:10 +1000 Subject: Fix T78601: User count errors when reading home-file Calling: bpy.ops.wm.read_homefile(use_empty=True) exposes invalid user-counts in versioning code. Simplified logic for assigning materials in versioning code. Caused by 29f3af9527259. --- source/blender/blenkernel/intern/brush.c | 61 +++++++++++++++++++------------- 1 file changed, 37 insertions(+), 24 deletions(-) (limited to 'source/blender/blenkernel/intern') diff --git a/source/blender/blenkernel/intern/brush.c b/source/blender/blenkernel/intern/brush.c index 0749f29879c..b35d2b199aa 100644 --- a/source/blender/blenkernel/intern/brush.c +++ b/source/blender/blenkernel/intern/brush.c @@ -35,6 +35,7 @@ #include "BKE_brush.h" #include "BKE_colortools.h" #include "BKE_context.h" +#include "BKE_gpencil.h" #include "BKE_icons.h" #include "BKE_idtype.h" #include "BKE_lib_id.h" @@ -478,6 +479,12 @@ void BKE_gpencil_brush_preset_set(Main *bmain, Brush *brush, const short type) CurveMapping *custom_curve = NULL; + /* Optionally assign a material preset. */ + enum { + PRESET_MATERIAL_NONE = 0, + PRESET_MATERIAL_DOT_STROKE, + } material_preset = PRESET_MATERIAL_NONE; + /* Set general defaults at brush level. */ brush->smooth_stroke_radius = SMOOTH_STROKE_RADIUS; brush->smooth_stroke_factor = SMOOTH_STROKE_FACTOR; @@ -521,19 +528,10 @@ void BKE_gpencil_brush_preset_set(Main *bmain, Brush *brush, const short type) brush->gpencil_tool = GPAINT_TOOL_DRAW; brush->gpencil_settings->icon_id = GP_BRUSH_ICON_AIRBRUSH; - /* Create and link Black Dots material to brush. - * This material is required because the brush uses the material to define how the stroke is - * drawn. */ - Material *ma = BLI_findstring(&bmain->materials, "Dots Stroke", offsetof(ID, name) + 2); - if (ma == NULL) { - ma = BKE_gpencil_material_add(bmain, "Dots Stroke"); - ma->gp_style->mode = GP_MATERIAL_MODE_DOT; - } - brush->gpencil_settings->material = ma; - /* Pin the matterial to the brush. */ - brush->gpencil_settings->flag |= GP_BRUSH_MATERIAL_PINNED; - zero_v3(brush->secondary_rgb); + + material_preset = PRESET_MATERIAL_DOT_STROKE; + break; } case GP_BRUSH_PRESET_INK_PEN: { @@ -746,19 +744,10 @@ void BKE_gpencil_brush_preset_set(Main *bmain, Brush *brush, const short type) brush->gpencil_settings->icon_id = GP_BRUSH_ICON_PENCIL; brush->gpencil_tool = GPAINT_TOOL_DRAW; - /* Create and link Black Dots material to brush. - * This material is required because the brush uses the material to define how the stroke is - * drawn. */ - Material *ma = BLI_findstring(&bmain->materials, "Dots Stroke", offsetof(ID, name) + 2); - if (ma == NULL) { - ma = BKE_gpencil_material_add(bmain, "Dots Stroke"); - ma->gp_style->mode = GP_MATERIAL_MODE_DOT; - } - brush->gpencil_settings->material = ma; - /* Pin the matterial to the brush. */ - brush->gpencil_settings->flag |= GP_BRUSH_MATERIAL_PINNED; - zero_v3(brush->secondary_rgb); + + material_preset = PRESET_MATERIAL_DOT_STROKE; + break; } case GP_BRUSH_PRESET_PENCIL: { @@ -1070,6 +1059,30 @@ void BKE_gpencil_brush_preset_set(Main *bmain, Brush *brush, const short type) default: break; } + + switch (material_preset) { + case PRESET_MATERIAL_NONE: + break; + case PRESET_MATERIAL_DOT_STROKE: { + /* Create and link Black Dots material to brush. + * This material is required because the brush uses the material + * to define how the stroke is drawn. */ + const char *ma_id = "Dots Stroke"; + Material *ma = BLI_findstring(&bmain->materials, ma_id, offsetof(ID, name) + 2); + if (ma == NULL) { + ma = BKE_gpencil_material_add(bmain, ma_id); + ma->gp_style->mode = GP_MATERIAL_MODE_DOT; + BLI_assert(ma->id.us == 1); + id_us_min(&ma->id); + } + + BKE_gpencil_brush_material_set(brush, ma); + + /* Pin the material to the brush. */ + brush->gpencil_settings->flag |= GP_BRUSH_MATERIAL_PINNED; + break; + } + } } static Brush *gpencil_brush_ensure( -- cgit v1.2.3