GP: Add option to select color affected in modifiers

Now it's possible to define if the Tint, Hue and OPacity modifier affect the stroke color, fill color or both.
This commit is contained in:
Charlie Jolly 2018-08-09 13:42:02 +02:00 committed by Antonioya
parent f284821bf7
commit 2e10c658f4
6 changed files with 81 additions and 29 deletions

View File

@ -1757,6 +1757,8 @@ class DATA_PT_gpencil_modifiers(ModifierButtonsPanel, Panel):
row = layout.row()
row.prop(md, "create_materials")
row.prop(md, "modify_color")
def GP_COLOR(self, layout, ob, md):
gpd = ob.data
@ -1779,6 +1781,7 @@ class DATA_PT_gpencil_modifiers(ModifierButtonsPanel, Panel):
row = layout.row()
row.prop(md, "create_materials")
row.prop(md, "modify_color")
def GP_OPACITY(self, layout, ob, md):
gpd = ob.data
@ -1805,6 +1808,7 @@ class DATA_PT_gpencil_modifiers(ModifierButtonsPanel, Panel):
row = layout.row()
row.prop(md, "create_materials")
row.prop(md, "modify_color")
def GP_INSTANCE(self, layout, ob, md):
gpd = ob.data

View File

@ -60,6 +60,7 @@ static void initData(GpencilModifierData *md)
ARRAY_SET_ITEMS(gpmd->hsv, 1.0f, 1.0f, 1.0f);
gpmd->layername[0] = '\0';
gpmd->flag |= GP_COLOR_CREATE_COLORS;
gpmd->modify_color = GP_MODIFY_COLOR_BOTH;
}
static void copyData(const GpencilModifierData *md, GpencilModifierData *target)
@ -86,15 +87,19 @@ static void deformStroke(
copy_v3_v3(factor, mmd->hsv);
add_v3_fl(factor, -1.0f);
rgb_to_hsv_v(gps->runtime.tmp_stroke_rgba, hsv);
add_v3_v3(hsv, factor);
CLAMP3(hsv, 0.0f, 1.0f);
hsv_to_rgb_v(hsv, gps->runtime.tmp_stroke_rgba);
if (mmd->modify_color != GP_MODIFY_COLOR_FILL) {
rgb_to_hsv_v(gps->runtime.tmp_stroke_rgba, hsv);
add_v3_v3(hsv, factor);
CLAMP3(hsv, 0.0f, 1.0f);
hsv_to_rgb_v(hsv, gps->runtime.tmp_stroke_rgba);
}
rgb_to_hsv_v(gps->runtime.tmp_fill_rgba, hsv);
add_v3_v3(hsv, factor);
CLAMP3(hsv, 0.0f, 1.0f);
hsv_to_rgb_v(hsv, gps->runtime.tmp_fill_rgba);
if (mmd->modify_color != GP_MODIFY_COLOR_STROKE) {
rgb_to_hsv_v(gps->runtime.tmp_fill_rgba, hsv);
add_v3_v3(hsv, factor);
CLAMP3(hsv, 0.0f, 1.0f);
hsv_to_rgb_v(hsv, gps->runtime.tmp_fill_rgba);
}
}
static void bakeModifier(

View File

@ -61,6 +61,7 @@ static void initData(GpencilModifierData *md)
gpmd->layername[0] = '\0';
gpmd->vgname[0] = '\0';
gpmd->flag |= GP_OPACITY_CREATE_COLORS;
gpmd->modify_color = GP_MODIFY_COLOR_BOTH;
}
static void copyData(const GpencilModifierData *md, GpencilModifierData *target)
@ -84,18 +85,23 @@ static void deformStroke(
return;
}
gps->runtime.tmp_fill_rgba[3] *= mmd->factor;
/* if factor is > 1, then force opacity */
if (mmd->factor > 1.0f) {
gps->runtime.tmp_stroke_rgba[3] += mmd->factor - 1.0f;
if (gps->runtime.tmp_fill_rgba[3] > 1e-5) {
gps->runtime.tmp_fill_rgba[3] += mmd->factor - 1.0f;
if (mmd->modify_color != GP_MODIFY_COLOR_FILL) {
gps->runtime.tmp_stroke_rgba[3] *= mmd->factor;
/* if factor is > 1, then force opacity */
if (mmd->factor > 1.0f) {
gps->runtime.tmp_stroke_rgba[3] += mmd->factor - 1.0f;
}
CLAMP(gps->runtime.tmp_stroke_rgba[3], 0.0f, 1.0f);
}
CLAMP(gps->runtime.tmp_stroke_rgba[3], 0.0f, 1.0f);
CLAMP(gps->runtime.tmp_fill_rgba[3], 0.0f, 1.0f);
if (mmd->modify_color != GP_MODIFY_COLOR_STROKE) {
gps->runtime.tmp_fill_rgba[3] *= mmd->factor;
/* if factor is > 1, then force opacity */
if (mmd->factor > 1.0f && gps->runtime.tmp_fill_rgba[3] > 1e-5) {
gps->runtime.tmp_fill_rgba[3] += mmd->factor - 1.0f;
}
CLAMP(gps->runtime.tmp_fill_rgba[3], 0.0f, 1.0f);
}
/* if opacity > 1.0, affect the strength of the stroke */
if (mmd->factor > 1.0f) {

View File

@ -60,6 +60,7 @@ static void initData(GpencilModifierData *md)
gpmd->layername[0] = '\0';
ARRAY_SET_ITEMS(gpmd->rgb, 1.0f, 1.0f, 1.0f);
gpmd->flag |= GP_TINT_CREATE_COLORS;
gpmd->modify_color = GP_MODIFY_COLOR_BOTH;
}
static void copyData(const GpencilModifierData *md, GpencilModifierData *target)
@ -81,19 +82,23 @@ static void deformStroke(
return;
}
interp_v3_v3v3(gps->runtime.tmp_stroke_rgba, gps->runtime.tmp_stroke_rgba, mmd->rgb, mmd->factor);
interp_v3_v3v3(gps->runtime.tmp_fill_rgba, gps->runtime.tmp_fill_rgba, mmd->rgb, mmd->factor);
/* if factor is > 1, the alpha must be changed to get full tint */
if (mmd->factor > 1.0f) {
gps->runtime.tmp_stroke_rgba[3] += mmd->factor - 1.0f;
if (gps->runtime.tmp_fill_rgba[3] > 1e-5) {
gps->runtime.tmp_fill_rgba[3] += mmd->factor - 1.0f;
if (mmd->modify_color != GP_MODIFY_COLOR_FILL) {
interp_v3_v3v3(gps->runtime.tmp_stroke_rgba, gps->runtime.tmp_stroke_rgba, mmd->rgb, mmd->factor);
/* if factor is > 1, the alpha must be changed to get full tint */
if (mmd->factor > 1.0f) {
gps->runtime.tmp_stroke_rgba[3] += mmd->factor - 1.0f;
}
CLAMP4(gps->runtime.tmp_stroke_rgba, 0.0f, 1.0f);
}
CLAMP4(gps->runtime.tmp_stroke_rgba, 0.0f, 1.0f);
CLAMP4(gps->runtime.tmp_fill_rgba, 0.0f, 1.0f);
if (mmd->modify_color != GP_MODIFY_COLOR_STROKE) {
interp_v3_v3v3(gps->runtime.tmp_fill_rgba, gps->runtime.tmp_fill_rgba, mmd->rgb, mmd->factor);
/* if factor is > 1, the alpha must be changed to get full tint */
if (mmd->factor > 1.0f && gps->runtime.tmp_fill_rgba[3] > 1e-5) {
gps->runtime.tmp_fill_rgba[3] += mmd->factor - 1.0f;
}
CLAMP4(gps->runtime.tmp_fill_rgba, 0.0f, 1.0f);
}
/* if factor > 1.0, affect the strength of the stroke */
if (mmd->factor > 1.0f) {

View File

@ -138,6 +138,12 @@ typedef enum eThickGpencil_Flag {
GP_THICK_NORMALIZE = (1 << 4),
} eThickGpencil_Flag;
typedef enum eModifyColorGpencil_Flag {
GP_MODIFY_COLOR_BOTH = 0,
GP_MODIFY_COLOR_STROKE = 1,
GP_MODIFY_COLOR_FILL = 2
} eModifyColorGpencil_Flag;
typedef struct TintGpencilModifierData {
GpencilModifierData modifier;
char layername[64]; /* layer name */
@ -145,6 +151,8 @@ typedef struct TintGpencilModifierData {
int flag; /* flags */
float rgb[3]; /* Tint color */
float factor; /* Mix factor */
char modify_color; /* modify stroke, fill or both */
char pad[7];
} TintGpencilModifierData;
typedef enum eTintGpencil_Flag {
@ -159,7 +167,8 @@ typedef struct ColorGpencilModifierData {
int pass_index; /* custom index for passes */
int flag; /* flags */
float hsv[3]; /* hsv factors */
char pad[4];
char modify_color; /* modify stroke, fill or both */
char pad[3];
} ColorGpencilModifierData;
typedef enum eColorGpencil_Flag {
@ -175,7 +184,8 @@ typedef struct OpacityGpencilModifierData {
int pass_index; /* custom index for passes */
int flag; /* flags */
float factor; /* Main Opacity factor */
char pad[4];
char modify_color; /* modify stroke, fill or both */
char pad[3];
} OpacityGpencilModifierData;
typedef enum eOpacityGpencil_Flag {

View File

@ -82,6 +82,13 @@ const EnumPropertyItem rna_enum_object_greasepencil_modifier_type_items[] = {
};
#ifndef RNA_RUNTIME
static const EnumPropertyItem modifier_modify_color_items[] = {
{ GP_MODIFY_COLOR_BOTH, "BOTH", 0, "Both", "Modify fill and stroke colors" },
{ GP_MODIFY_COLOR_STROKE, "STROKE", 0, "Stroke", "Modify stroke color only" },
{ GP_MODIFY_COLOR_FILL, "FILL", 0, "Fill", "Modify fill color only" },
{ 0, NULL, 0, NULL, NULL }
};
static const EnumPropertyItem modifier_gphook_falloff_items[] = {
{ eGPHook_Falloff_None, "NONE", 0, "No Falloff", "" },
{ eGPHook_Falloff_Curve, "CURVE", 0, "Curve", "" },
@ -663,6 +670,11 @@ static void rna_def_modifier_gpenciltint(BlenderRNA *brna)
RNA_def_struct_sdna(srna, "TintGpencilModifierData");
RNA_def_struct_ui_icon(srna, ICON_COLOR);
prop = RNA_def_property(srna, "modify_color", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, modifier_modify_color_items); /* share the enum */
RNA_def_property_ui_text(prop, "Mode", "Set what colors of the stroke are affected");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
prop = RNA_def_property(srna, "layer", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "layername");
RNA_def_property_ui_text(prop, "Layer", "Layer name");
@ -713,6 +725,11 @@ static void rna_def_modifier_gpencilcolor(BlenderRNA *brna)
RNA_def_struct_sdna(srna, "ColorGpencilModifierData");
RNA_def_struct_ui_icon(srna, ICON_GROUP_VCOL);
prop = RNA_def_property(srna, "modify_color", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, modifier_modify_color_items); /* share the enum */
RNA_def_property_ui_text(prop, "Mode", "Set what colors of the stroke are affected");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
prop = RNA_def_property(srna, "layer", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "layername");
RNA_def_property_ui_text(prop, "Layer", "Layer name");
@ -771,6 +788,11 @@ static void rna_def_modifier_gpencilopacity(BlenderRNA *brna)
RNA_def_struct_sdna(srna, "OpacityGpencilModifierData");
RNA_def_struct_ui_icon(srna, ICON_MOD_MASK);
prop = RNA_def_property(srna, "modify_color", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, modifier_modify_color_items); /* share the enum */
RNA_def_property_ui_text(prop, "Mode", "Set what colors of the stroke are affected");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
prop = RNA_def_property(srna, "layer", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "layername");
RNA_def_property_ui_text(prop, "Layer", "Layer name");