[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