diff options
author | Antonio Vazquez <blendergit@gmail.com> | 2019-08-30 15:19:07 +0300 |
---|---|---|
committer | Antonio Vazquez <blendergit@gmail.com> | 2019-08-30 15:26:39 +0300 |
commit | d5d3dc418912863b172ef9f79f9991bb9d46bea8 (patch) | |
tree | d3aeb45c89025a1c5c0cabdf6ca4d3746115b848 /source/blender/blenkernel | |
parent | 4608220c9b3c0adfdab3cd6994d29c0ced748794 (diff) |
GPencil: Use default material when slot material is empty
When a material slot is empty, the default material is used.
The default color used is Gray to get a good contrast in dense scenes with dark and white background.
Reviewers: brecht, dfelinto, mendio, pepeland
Differential Revision: https://developer.blender.org/D5625
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r-- | source/blender/blenkernel/BKE_gpencil.h | 5 | ||||
-rw-r--r-- | source/blender/blenkernel/BKE_material.h | 4 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/gpencil.c | 19 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/material.c | 35 |
4 files changed, 44 insertions, 19 deletions
diff --git a/source/blender/blenkernel/BKE_gpencil.h b/source/blender/blenkernel/BKE_gpencil.h index f1cf87ea1b5..75e98ee31de 100644 --- a/source/blender/blenkernel/BKE_gpencil.h +++ b/source/blender/blenkernel/BKE_gpencil.h @@ -155,7 +155,7 @@ struct Material *BKE_gpencil_brush_material_get(struct Brush *brush); void BKE_gpencil_brush_material_set(struct Brush *brush, struct Material *material); /* Object */ -struct Material *BKE_gpencil_object_material_ensure_active(struct Main *bmain, struct Object *ob); +struct Material *BKE_gpencil_object_material_ensure_active(struct Object *ob); struct Material *BKE_gpencil_object_material_ensure_from_brush(struct Main *bmain, struct Object *ob, struct Brush *brush); @@ -179,8 +179,7 @@ struct Material *BKE_gpencil_object_material_ensure_from_active_input_toolsettin struct Material *BKE_gpencil_object_material_ensure_from_active_input_brush(struct Main *bmain, struct Object *ob, struct Brush *brush); -struct Material *BKE_gpencil_object_material_ensure_from_active_input_material(struct Main *bmain, - struct Object *ob); +struct Material *BKE_gpencil_object_material_ensure_from_active_input_material(struct Object *ob); /* object boundbox */ bool BKE_gpencil_data_minmax(const struct bGPdata *gpd, float r_min[3], float r_max[3]); diff --git a/source/blender/blenkernel/BKE_material.h b/source/blender/blenkernel/BKE_material.h index 44a8f98e994..7ff9c4e6376 100644 --- a/source/blender/blenkernel/BKE_material.h +++ b/source/blender/blenkernel/BKE_material.h @@ -38,6 +38,7 @@ struct bNode; /* materials */ void init_def_material(void); +void BKE_material_gpencil_default_free(void); void BKE_material_free(struct Material *ma); void test_object_materials(struct Main *bmain, struct Object *ob, struct ID *id); void test_all_objects_materials(struct Main *bmain, struct ID *id); @@ -46,6 +47,7 @@ void BKE_material_resize_object(struct Main *bmain, const short totcol, bool do_id_user); void BKE_material_init(struct Material *ma); +void BKE_material_gpencil_init(struct Material *ma); void BKE_material_remap_object(struct Object *ob, const unsigned int *remap); void BKE_material_remap_object_calc(struct Object *ob_dst, struct Object *ob_src, @@ -92,6 +94,7 @@ bool BKE_object_material_slot_add(struct Main *bmain, struct Object *ob); bool BKE_object_material_slot_remove(struct Main *bmain, struct Object *ob); bool BKE_object_material_slot_used(struct ID *id, short actcol); +struct Material *BKE_material_gpencil_get(struct Object *ob, short act); struct MaterialGPencilStyle *BKE_material_gpencil_settings_get(struct Object *ob, short act); void BKE_texpaint_slot_refresh_cache(struct Scene *scene, struct Material *ma); @@ -123,6 +126,7 @@ struct Depsgraph; void BKE_material_eval(struct Depsgraph *depsgraph, struct Material *material); extern struct Material defmaterial; +extern struct Material defgpencil_material; #ifdef __cplusplus } diff --git a/source/blender/blenkernel/intern/gpencil.c b/source/blender/blenkernel/intern/gpencil.c index d4bf76ea44a..456bc0c88f9 100644 --- a/source/blender/blenkernel/intern/gpencil.c +++ b/source/blender/blenkernel/intern/gpencil.c @@ -1161,38 +1161,34 @@ Material *BKE_gpencil_object_material_ensure_from_active_input_brush(Main *bmain brush->gpencil_settings->flag &= ~GP_BRUSH_MATERIAL_PINNED; } } - return BKE_gpencil_object_material_ensure_from_active_input_material(bmain, ob); + return BKE_gpencil_object_material_ensure_from_active_input_material(ob); } /** * Guaranteed to return a material assigned to object. Returns never NULL. * Only use this for materials unrelated to user input. */ -Material *BKE_gpencil_object_material_ensure_from_active_input_material(Main *bmain, Object *ob) +Material *BKE_gpencil_object_material_ensure_from_active_input_material(Object *ob) { Material *ma = give_current_material(ob, ob->actcol); if (ma) { return ma; } - /* If the slot is empty, remove because will be added again, - * if not, we will get an empty slot. */ - if ((ob->totcol > 0) && (ob->actcol == ob->totcol)) { - BKE_object_material_slot_remove(bmain, ob); - } - return BKE_gpencil_object_material_new(bmain, ob, "Material", NULL); + + return &defgpencil_material; } /* Get active color, and add all default settings if we don't find anything */ -Material *BKE_gpencil_object_material_ensure_active(Main *bmain, Object *ob) +Material *BKE_gpencil_object_material_ensure_active(Object *ob) { Material *ma = NULL; /* sanity checks */ - if (ELEM(NULL, bmain, ob)) { + if (ob == NULL) { return NULL; } - ma = BKE_gpencil_object_material_ensure_from_active_input_material(bmain, ob); + ma = BKE_gpencil_object_material_ensure_from_active_input_material(ob); if (ma->gp_style == NULL) { BKE_material_init_gpencil_settings(ma); } @@ -2008,6 +2004,7 @@ void BKE_gpencil_material_index_reassign(bGPdata *gpd, int totcol, int index) /* reassign strokes */ if ((gps->mat_nr > index) || (gps->mat_nr > totcol - 1)) { gps->mat_nr--; + CLAMP_MIN(gps->mat_nr, 0); } } } diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c index 1545ae4f48f..cc9be2c5dda 100644 --- a/source/blender/blenkernel/intern/material.c +++ b/source/blender/blenkernel/intern/material.c @@ -71,6 +71,7 @@ /* used in UI and render */ Material defmaterial; +Material defgpencil_material; static CLG_LogRef LOG = {"bke.material"}; @@ -78,6 +79,13 @@ static CLG_LogRef LOG = {"bke.material"}; void init_def_material(void) { BKE_material_init(&defmaterial); + BKE_material_gpencil_init(&defgpencil_material); +} + +/* Free the GPencil data of the deafult material, creator.c */ +void BKE_material_gpencil_default_free(void) +{ + MEM_SAFE_FREE(defgpencil_material.gp_style); } /** Free (or release) any data used by this material (does not free the material itself). */ @@ -144,6 +152,16 @@ void BKE_material_init(Material *ma) ma->blend_shadow = MA_BS_SOLID; } +void BKE_material_gpencil_init(Material *ma) +{ + BKE_material_init(ma); + + /* grease pencil settings */ + strcpy(ma->id.name, "MADefault GPencil"); + BKE_material_init_gpencil_settings(ma); + add_v3_fl(&ma->gp_style->stroke_rgba[0], 0.6f); +} + Material *BKE_material_add(Main *bmain, const char *name) { Material *ma; @@ -580,6 +598,17 @@ Material *give_current_material(Object *ob, short act) return ma_p ? *ma_p : NULL; } +Material *BKE_material_gpencil_get(Object *ob, short act) +{ + Material *ma = give_current_material(ob, act); + if (ma != NULL) { + return ma; + } + else { + return &defgpencil_material; + } +} + MaterialGPencilStyle *BKE_material_gpencil_settings_get(Object *ob, short act) { Material *ma = give_current_material(ob, act); @@ -591,7 +620,7 @@ MaterialGPencilStyle *BKE_material_gpencil_settings_get(Object *ob, short act) return ma->gp_style; } else { - return NULL; + return defgpencil_material.gp_style; } } @@ -1070,10 +1099,6 @@ bool BKE_object_material_slot_remove(Main *bmain, Object *ob) } /* check indices from gpencil */ else if (ob->type == OB_GPENCIL) { - /* need one color */ - if (ob->totcol == 0) { - BKE_gpencil_object_material_ensure_from_active_input_material(bmain, ob); - } BKE_gpencil_material_index_reassign((bGPdata *)ob->data, ob->totcol, actcol - 1); } |