[Bf-blender-cvs] [1c53becdf75] greasepencil-object: Fix Tint and Hue/Saturation modifiers
Antonio Vazquez
noreply at git.blender.org
Fri Apr 20 11:01:44 CEST 2018
Commit: 1c53becdf75266b7c5ce982a8d65fa97fb7e31ec
Author: Antonio Vazquez
Date: Fri Apr 20 11:01:36 2018 +0200
Branches: greasepencil-object
https://developer.blender.org/rB1c53becdf75266b7c5ce982a8d65fa97fb7e31ec
Fix Tint and Hue/Saturation modifiers
Now the modifiers don't use the palettecolor pointer
===================================================================
M source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
M source/blender/draw/engines/gpencil/gpencil_geom.c
M source/blender/makesdna/DNA_gpencil_types.h
M source/blender/modifiers/intern/MOD_gpencilcolor.c
M source/blender/modifiers/intern/MOD_gpenciltint.c
===================================================================
diff --git a/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c b/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
index d89a080152f..10a956abea6 100644
--- a/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
+++ b/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
@@ -319,8 +319,8 @@ static void gpencil_add_fill_shgroup(GpencilBatchCache *cache, DRWShadingGroup *
if (gps->totpoints >= 3) {
float tfill[4];
/* set color using palette, tint color and opacity */
- interp_v3_v3v3(tfill, gps_palcolor->fill, tintcolor, tintcolor[3]);
- tfill[3] = gps_palcolor->fill[3] * gpl->opacity;
+ interp_v3_v3v3(tfill, gps->tmp_fill, tintcolor, tintcolor[3]);
+ tfill[3] = gps->tmp_fill[3] * gpl->opacity;
if ((tfill[3] > GPENCIL_ALPHA_OPACITY_THRESH) || (gps_palcolor->fill_style > 0)) {
const float *color;
if (!onion) {
@@ -331,7 +331,7 @@ static void gpencil_add_fill_shgroup(GpencilBatchCache *cache, DRWShadingGroup *
color = tintcolor;
}
else {
- ARRAY_SET_ITEMS(tfill, UNPACK3(gps_palcolor->fill), tintcolor[3]);
+ ARRAY_SET_ITEMS(tfill, UNPACK3(gps->tmp_fill), tintcolor[3]);
color = tfill;
}
}
@@ -358,12 +358,12 @@ static void gpencil_add_stroke_shgroup(GpencilBatchCache *cache, DRWShadingGroup
if (!onion) {
/* if special stroke, use fill color as stroke color */
if (gps->flag & GP_STROKE_NOFILL) {
- interp_v3_v3v3(tcolor, gps_palcolor->fill, tintcolor, tintcolor[3]);
- tcolor[3] = gps_palcolor->fill[3] * opacity;
+ interp_v3_v3v3(tcolor, gps->tmp_fill, tintcolor, tintcolor[3]);
+ tcolor[3] = gps->tmp_fill[3] * opacity;
}
else {
- interp_v3_v3v3(tcolor, gps_palcolor->rgb, tintcolor, tintcolor[3]);
- tcolor[3] = gps_palcolor->rgb[3] * opacity;
+ interp_v3_v3v3(tcolor, gps->tmp_rgb, tintcolor, tintcolor[3]);
+ tcolor[3] = gps->tmp_rgb[3] * opacity;
}
copy_v4_v4(ink, tcolor);
}
@@ -372,7 +372,7 @@ static void gpencil_add_stroke_shgroup(GpencilBatchCache *cache, DRWShadingGroup
copy_v4_v4(ink, tintcolor);
}
else {
- ARRAY_SET_ITEMS(tcolor, gps_palcolor->rgb[0], gps_palcolor->rgb[1], gps_palcolor->rgb[2], opacity);
+ ARRAY_SET_ITEMS(tcolor, gps->tmp_rgb[0], gps->tmp_rgb[1], gps->tmp_rgb[2], opacity);
copy_v4_v4(ink, tcolor);
}
}
@@ -449,6 +449,8 @@ static void gpencil_draw_onion_strokes(GpencilBatchCache *cache, GPENCIL_e_data
for (bGPDstroke *gps = gpf->strokes.first; gps; gps = gps->next) {
PaletteColor *gps_palcolor = BKE_palette_color_getbyname(gps->palette, gps->colorname);
+ copy_v4_v4(gps->tmp_rgb, gps_palcolor->rgb);
+ copy_v4_v4(gps->tmp_fill, gps_palcolor->fill);
int id = stl->storage->shgroup_id;
/* check if stroke can be drawn */
@@ -574,6 +576,10 @@ static void gpencil_draw_strokes(GpencilBatchCache *cache, GPENCIL_e_data *e_dat
fillgrp = stl->shgroups[id].shgrps_fill;
strokegrp = stl->shgroups[id].shgrps_stroke;
+ /* copy color to temp fields to apply temporal changes in the stroke */
+ copy_v4_v4(gps->tmp_rgb, gps_palcolor->rgb);
+ copy_v4_v4(gps->tmp_fill, gps_palcolor->fill);
+
/* apply modifiers (only modify geometry, but not create ) */
if ((cache->is_dirty) && (ob->modifiers.first) && (!is_multiedit)) {
if (!stl->storage->simplify_modif) {
diff --git a/source/blender/draw/engines/gpencil/gpencil_geom.c b/source/blender/draw/engines/gpencil/gpencil_geom.c
index 3637d9d6fdc..ad265702e38 100644
--- a/source/blender/draw/engines/gpencil/gpencil_geom.c
+++ b/source/blender/draw/engines/gpencil/gpencil_geom.c
@@ -665,8 +665,6 @@ Gwn_Batch *DRW_gpencil_get_edit_geom(bGPDstroke *gps, float alpha, short dflag)
/* for now, we assume that the base color of the points is not too close to the real color */
/* set color using palette */
- PaletteColor *palcolor = BKE_palette_color_getbyname(gps->palette, gps->colorname);
-
float selectColor[4];
UI_GetThemeColor3fv(TH_GP_VERTEX_SELECT, selectColor);
selectColor[3] = alpha;
@@ -717,7 +715,7 @@ Gwn_Batch *DRW_gpencil_get_edit_geom(bGPDstroke *gps, float alpha, short dflag)
fsize = vsize;
}
else {
- copy_v4_v4(fcolor, palcolor->rgb);
+ copy_v4_v4(fcolor, gps->tmp_rgb);
fsize = bsize;
}
}
diff --git a/source/blender/makesdna/DNA_gpencil_types.h b/source/blender/makesdna/DNA_gpencil_types.h
index 17331223ce8..d71d20c09d2 100644
--- a/source/blender/makesdna/DNA_gpencil_types.h
+++ b/source/blender/makesdna/DNA_gpencil_types.h
@@ -192,7 +192,11 @@ typedef struct bGPDstroke {
char colorname[128]; /* color name */
Palette *palette; /* current palette */
-
+
+ /* runtime final colors (result of original colors and modifiers) */
+ float tmp_rgb[4];
+ float tmp_fill[4];
+
/* temporary layer name only used during copy/paste to put the stroke in the original layer */
char tmp_layerinfo[128];
diff --git a/source/blender/modifiers/intern/MOD_gpencilcolor.c b/source/blender/modifiers/intern/MOD_gpencilcolor.c
index 11c130366c7..0684a8e45b7 100644
--- a/source/blender/modifiers/intern/MOD_gpencilcolor.c
+++ b/source/blender/modifiers/intern/MOD_gpencilcolor.c
@@ -69,10 +69,8 @@ static void copyData(ModifierData *md, ModifierData *target)
static void deformStroke(ModifierData *md, Depsgraph *UNUSED(depsgraph),
Object *UNUSED(ob), bGPDlayer *gpl, bGPDstroke *gps)
{
-#if 0
GpencilColorModifierData *mmd = (GpencilColorModifierData *)md;
- PaletteColor *palcolor;
float hsv[3], factor[3];
if (!is_stroke_affected_by_modifier(
@@ -82,25 +80,18 @@ static void deformStroke(ModifierData *md, Depsgraph *UNUSED(depsgraph),
return;
}
- if (ELEM(NULL, gps->palette, gps->palcolor)) {
- /* sometimes palette/color info is missing */
- return;
- }
-
- palcolor = gps->palcolor;
copy_v3_v3(factor, mmd->hsv);
add_v3_fl(factor, -1.0f);
- rgb_to_hsv_v(palcolor->rgb, hsv);
+ rgb_to_hsv_v(gps->tmp_rgb, hsv);
add_v3_v3(hsv, factor);
CLAMP3(hsv, 0.0f, 1.0f);
- hsv_to_rgb_v(hsv, palcolor->rgb);
+ hsv_to_rgb_v(hsv, gps->tmp_rgb);
- rgb_to_hsv_v(palcolor->fill, hsv);
+ rgb_to_hsv_v(gps->tmp_fill, hsv);
add_v3_v3(hsv, factor);
CLAMP3(hsv, 0.0f, 1.0f);
- hsv_to_rgb_v(hsv, palcolor->fill);
-#endif
+ hsv_to_rgb_v(hsv, gps->tmp_fill);
}
static void bakeModifierGP(const bContext *C, Depsgraph *depsgraph,
@@ -111,16 +102,19 @@ static void bakeModifierGP(const bContext *C, Depsgraph *depsgraph,
bGPdata *gpd = ob->data;
Palette *newpalette = NULL;
-#if 0
GHash *gh_layer = BLI_ghash_str_new("GP_Color Layer modifier");
GHash *gh_color;
for (bGPDlayer *gpl = gpd->layers.first; gpl; gpl = gpl->next) {
for (bGPDframe *gpf = gpl->frames.first; gpf; gpf = gpf->next) {
for (bGPDstroke *gps = gpf->strokes.first; gps; gps = gps->next) {
/* skip stroke if it doesn't have color info */
- if (ELEM(NULL, gps->palette, gps->palcolor))
+ if (ELEM(NULL, gps->palette, gps->colorname))
continue;
-
+
+ PaletteColor *gps_palcolor = BKE_palette_color_getbyname(gps->palette, gps->colorname);
+ copy_v4_v4(gps->tmp_rgb, gps_palcolor->rgb);
+ copy_v4_v4(gps->tmp_fill, gps_palcolor->fill);
+
/* look for palette */
gh_color = (GHash *)BLI_ghash_lookup(gh_layer, gps->palette->id.name);
if (gh_color == NULL) {
@@ -129,26 +123,31 @@ static void bakeModifierGP(const bContext *C, Depsgraph *depsgraph,
}
/* look for color */
- PaletteColor *newpalcolor = (PaletteColor *)BLI_ghash_lookup(gh_color, gps->palcolor->info);
+ PaletteColor *newpalcolor = (PaletteColor *)BLI_ghash_lookup(gh_color, gps->colorname);
if (newpalcolor == NULL) {
if (mmd->flag & GP_COLOR_CREATE_COLORS) {
if (!newpalette) {
bGPDpaletteref *palslot = BKE_gpencil_paletteslot_addnew(bmain, gpd, "Tinted Colors");
newpalette = palslot->palette;
}
- newpalcolor = BKE_palette_color_copy(newpalette, gps->palcolor);
+ newpalcolor = BKE_palette_color_copy(newpalette, gps_palcolor);
BLI_strncpy(gps->colorname, newpalcolor->info, sizeof(gps->colorname));
- gps->palcolor = newpalcolor;
- }
- else {
- newpalcolor = gps->palcolor;
}
- BLI_ghash_insert(gh_color, gps->palcolor->info, newpalcolor);
+ BLI_ghash_insert(gh_color, gps->colorname, newpalcolor);
deformStroke(md, depsgraph, ob, gpl, gps);
- }
- else {
- gps->palcolor = newpalcolor;
+
+ /* update palette */
+ if ((newpalette) && (mmd->flag & GP_COLOR_CREATE_COLORS)) {
+ copy_v4_v4(newpalcolor->rgb, gps->tmp_rgb);
+ copy_v4_v4(newpalcolor->fill, gps->tmp_fill);
+ gps->palette = newpalette;
+ }
+ else {
+ /* reuse existing color */
+ copy_v4_v4(gps_palcolor->rgb, gps->tmp_rgb);
+ copy_v4_v4(gps_palcolor->fill, gps->tmp_fill);
+ }
}
}
}
@@ -169,7 +168,6 @@ static void bakeModifierGP(const bContext *C, Depsgraph *depsgraph,
BLI_ghash_free(gh_layer, NULL, NULL);
gh_layer = NULL;
}
-#endif
}
ModifierTypeInfo modifierType_GpencilColor = {
diff --git a/source/blender/modifiers/intern/MOD_gpenciltint.c b/source/blender/modifiers/intern/MOD_gpenciltint.c
index 4be74bcafc4..7756a208bc7 100644
--- a/source/blender/modifiers/intern/MOD_gpenciltint.c
+++ b/source/blender/modifiers/intern/MOD_gpenciltint.c
@@ -68,8 +68,6 @@ static void copyData(ModifierData *md, ModifierData *target)
static void deformStroke(ModifierData *md, Depsgraph *UNUSED(depsgraph),
Object *UNUSED(ob), bGPDlayer *gpl, bGPDstroke *gps)
{
-#if 0
-
GpencilTintModifierData *mmd = (GpencilTintModifierData *)md;
if (!is_stroke_affected_by_modifier(
@@ -79,19 +77,19 @@ static void deformStroke(ModifierData *md, Depsgraph *UNUSED(depsgraph),
return;
}
- interp_v3_v3v3(gps->palcolor->rgb, gps->palcolor->rgb, mmd->rgb, mmd->factor);
- interp_v3_v3v3(gps->palcolor->fill, gps->palcolor->fill, mmd->rgb, mmd->factor);
+ interp_v3_v3v3(gps->tmp_rgb, gps->tmp_rgb, mmd->rgb, mmd->factor);
+ interp_v3_v3v3(gps->tmp_fill, gps->tmp_fill, mmd->rgb, mmd->factor);
/* if factor is > 1, the alpha must be changed to get full tint */
if (mmd->factor > 1.0f) {
- gps->palcolor->rgb[3] += mmd->factor - 1.
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list