Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntonio Vazquez <blendergit@gmail.com>2019-09-09 16:17:35 +0300
committerYimingWu <xp8110@outlook.com>2019-09-12 04:13:41 +0300
commitd0b0bc2a0b7362f223b2bcc6bdac5da1e8c0e25a (patch)
treee63bb82e91a4333199dcf18fe31d4378d103a4c8
parent3f2ae8f4bd3bfc5b5ceff46d806aeb35ded61062 (diff)
GPencil: Fade layer using background color
Now the fade layer uses the same logic used to fade objects and also is available in all modes. Reviewers: mendio, pepeland Reviewed By: mendio, pepeland Differential Revision: https://developer.blender.org/D5707
-rw-r--r--release/scripts/startup/bl_ui/space_view3d.py13
-rw-r--r--source/blender/draw/engines/gpencil/gpencil_draw_utils.c94
-rw-r--r--source/blender/draw/engines/gpencil/gpencil_engine.h1
-rw-r--r--source/blender/draw/engines/gpencil/shaders/gpencil_fill_frag.glsl18
-rw-r--r--source/blender/draw/engines/gpencil/shaders/gpencil_point_frag.glsl18
-rw-r--r--source/blender/draw/engines/gpencil/shaders/gpencil_stroke_frag.glsl18
6 files changed, 118 insertions, 44 deletions
diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py
index 68f61d665c8..8bdd81fbb83 100644
--- a/release/scripts/startup/bl_ui/space_view3d.py
+++ b/release/scripts/startup/bl_ui/space_view3d.py
@@ -6136,19 +6136,18 @@ class VIEW3D_PT_overlay_gpencil_options(Panel):
sub.prop(overlay, "gpencil_grid_opacity", text="Canvas", slider=True)
row = col.row()
+ row.prop(overlay, "use_gpencil_fade_layers", text="")
+ sub = row.row()
+ sub.active = overlay.use_gpencil_fade_layers
+ sub.prop(overlay, "gpencil_fade_layer", text="Fade Layers", slider=True)
+
+ row = col.row()
row.prop(overlay, "use_gpencil_paper", text="")
sub = row.row(align=True)
sub.active = overlay.use_gpencil_paper
sub.prop(overlay, "gpencil_paper_opacity", text="Fade Objects", slider=True)
sub.prop(overlay, "use_gpencil_fade_objects", text="", icon='OUTLINER_OB_GREASEPENCIL')
- if context.object.mode == 'PAINT_GPENCIL':
- row = col.row()
- row.prop(overlay, "use_gpencil_fade_layers", text="")
- sub = row.row()
- sub.active = overlay.use_gpencil_fade_layers
- sub.prop(overlay, "gpencil_fade_layer", text="Fade Layers", slider=True)
-
if context.object.mode in {'EDIT_GPENCIL', 'SCULPT_GPENCIL', 'WEIGHT_GPENCIL'}:
layout.prop(overlay, "use_gpencil_edit_lines", text="Edit Lines")
layout.prop(overlay, "use_gpencil_multiedit_line_only", text="Show Edit Lines only in multiframe")
diff --git a/source/blender/draw/engines/gpencil/gpencil_draw_utils.c b/source/blender/draw/engines/gpencil/gpencil_draw_utils.c
index e3c3f0b5d12..3d1aad827c5 100644
--- a/source/blender/draw/engines/gpencil/gpencil_draw_utils.c
+++ b/source/blender/draw/engines/gpencil/gpencil_draw_utils.c
@@ -83,13 +83,49 @@ static bool gpencil_fade_object_check(GPENCIL_StorageList *stl, Object *ob)
return (bool)((!is_render) && (!playing) && (!is_mat_preview) && (!is_select));
}
+/* Define Fade layer uniforms. */
+static void gpencil_set_fade_layer_uniforms(
+ GPENCIL_StorageList *stl, DRWShadingGroup *grp, Object *ob, bGPDlayer *gpl, const bool skip)
+{
+ const DRWContextState *draw_ctx = DRW_context_state_get();
+ View3D *v3d = draw_ctx->v3d;
+ const bool overlay = v3d != NULL ? (bool)((v3d->flag2 & V3D_HIDE_OVERLAYS) == 0) : true;
+ const bool is_fade = (v3d) && (v3d->gp_flag & V3D_GP_FADE_NOACTIVE_LAYERS) &&
+ (draw_ctx->obact) && (draw_ctx->obact == ob) &&
+ ((gpl->flag & GP_LAYER_ACTIVE) == 0);
+
+ const bool playing = stl->storage->is_playing;
+ const bool is_render = (bool)stl->storage->is_render;
+ const bool is_mat_preview = (bool)stl->storage->is_mat_preview;
+ const bool is_select = (bool)(DRW_state_is_select() || DRW_state_is_depth());
+
+ /* If drawing or not fading layer, skip. */
+ if ((!overlay) || (skip) || (!is_fade) || (is_render) || (playing) || (is_mat_preview) ||
+ (is_select)) {
+ DRW_shgroup_uniform_int_copy(grp, "fade_layer", 0);
+ return;
+ }
+
+ /* If layer is above active, use alpha (2) if below use mix with background (1). */
+ if (stl->storage->is_ontop) {
+ DRW_shgroup_uniform_int_copy(grp, "fade_layer", 2);
+ }
+ else {
+ DRW_shgroup_uniform_int_copy(grp, "fade_layer", 1);
+ }
+ if (v3d) {
+ DRW_shgroup_uniform_vec3(grp, "fade_color", v3d->shading.background_color, 1);
+ DRW_shgroup_uniform_float(grp, "fade_layer_factor", &v3d->overlay.gpencil_fade_layer, 1);
+ }
+}
+
/* Define Fade object uniforms. */
-static void gpencil_set_fade_uniforms(View3D *v3d, DRWShadingGroup *grp, bool status)
+static void gpencil_set_fade_ob_uniforms(View3D *v3d, DRWShadingGroup *grp, bool status)
{
- DRW_shgroup_uniform_bool_copy(grp, "fade_on", status);
+ DRW_shgroup_uniform_bool_copy(grp, "fade_ob", status);
if (v3d) {
DRW_shgroup_uniform_vec3(grp, "fade_color", v3d->shading.background_color, 1);
- DRW_shgroup_uniform_float(grp, "fade_factor", &v3d->overlay.gpencil_paper_opacity, 1);
+ DRW_shgroup_uniform_float(grp, "fade_ob_factor", &v3d->overlay.gpencil_paper_opacity, 1);
}
}
@@ -286,10 +322,6 @@ static void set_wireframe_color(Object *ob,
{
const DRWContextState *draw_ctx = DRW_context_state_get();
World *world = draw_ctx->scene->world;
- const bool is_fade = (v3d) && (v3d->gp_flag & V3D_GP_FADE_NOACTIVE_LAYERS) &&
- (draw_ctx->obact) && (draw_ctx->obact == ob) &&
- ((gpl->flag & GP_LAYER_ACTIVE) == 0);
- const float opacity = is_fade ? v3d->overlay.gpencil_fade_layer : 1.0f;
float color[4];
if (((gp_style->stroke_rgba[3] < GPENCIL_ALPHA_OPACITY_THRESH) ||
@@ -300,7 +332,6 @@ static void set_wireframe_color(Object *ob,
else {
copy_v4_v4(color, gp_style->stroke_rgba);
}
- float alpha = color[3] * opacity;
/* wire color */
if ((v3d) && (id > -1)) {
@@ -337,13 +368,13 @@ static void set_wireframe_color(Object *ob,
else {
copy_v3_v3(color, v3d->shading.single_color);
}
- color[3] = is_fade ? alpha : 1.0f;
+ color[3] = 1.0f;
linearrgb_to_srgb_v4(stl->shgroups[id].wire_color, color);
break;
}
case V3D_SHADING_OBJECT_COLOR: {
copy_v4_v4(color, ob->color);
- color[3] = is_fade ? alpha : 1.0f;
+ color[3] = 1.0f;
linearrgb_to_srgb_v4(stl->shgroups[id].wire_color, color);
break;
}
@@ -360,7 +391,7 @@ static void set_wireframe_color(Object *ob,
hsv_to_rgb_v(hsv, &wire_col[0]);
copy_v3_v3(stl->shgroups[id].wire_color, wire_col);
- stl->shgroups[id].wire_color[3] = is_fade ? alpha : 1.0f;
+ stl->shgroups[id].wire_color[3] = 1.0f;
break;
}
default: {
@@ -375,7 +406,7 @@ static void set_wireframe_color(Object *ob,
/* if solid, the alpha must be set to alpha */
if (stl->shgroups[id].shading_type[0] == OB_SOLID) {
- stl->shgroups[id].wire_color[3] = is_fade ? alpha : 1.0f;
+ stl->shgroups[id].wire_color[3] = 1.0f;
}
}
@@ -467,8 +498,11 @@ static DRWShadingGroup *gpencil_shgroup_fill_create(GPENCIL_Data *vedata,
DRW_shgroup_uniform_int(grp, "shading_type", &stl->shgroups[id].shading_type[0], 2);
+ /* Fade layer uniforms. */
+ gpencil_set_fade_layer_uniforms(stl, grp, ob, gpl, false);
+
/* Fade object uniforms. */
- gpencil_set_fade_uniforms(v3d, grp, gpencil_fade_object_check(stl, ob));
+ gpencil_set_fade_ob_uniforms(v3d, grp, gpencil_fade_object_check(stl, ob));
/* wire color */
set_wireframe_color(ob, gpl, v3d, stl, gp_style, id, true);
@@ -592,8 +626,11 @@ DRWShadingGroup *gpencil_shgroup_stroke_create(GPENCIL_Data *vedata,
}
DRW_shgroup_uniform_int(grp, "shading_type", &stl->shgroups[id].shading_type[0], 2);
+ /* Fade layer uniforms. */
+ gpencil_set_fade_layer_uniforms(stl, grp, ob, gpl, false);
+
/* Fade object uniforms. */
- gpencil_set_fade_uniforms(v3d, grp, gpencil_fade_object_check(stl, ob));
+ gpencil_set_fade_ob_uniforms(v3d, grp, gpencil_fade_object_check(stl, ob));
/* wire color */
set_wireframe_color(ob, gpl, v3d, stl, gp_style, id, false);
@@ -645,8 +682,11 @@ DRWShadingGroup *gpencil_shgroup_stroke_create(GPENCIL_Data *vedata,
DRW_shgroup_uniform_int(grp, "xraymode", &stl->storage->xray, 1);
}
+ /* Fade layer uniforms. */
+ gpencil_set_fade_layer_uniforms(stl, grp, ob, gpl, true);
+
/* Fade object uniforms. */
- gpencil_set_fade_uniforms(v3d, grp, false);
+ gpencil_set_fade_ob_uniforms(v3d, grp, false);
/* image texture for pattern */
if ((gp_style) && (gp_style->stroke_style == GP_STYLE_STROKE_STYLE_TEXTURE) && (!onion)) {
@@ -747,8 +787,11 @@ static DRWShadingGroup *gpencil_shgroup_point_create(GPENCIL_Data *vedata,
}
DRW_shgroup_uniform_int(grp, "shading_type", &stl->shgroups[id].shading_type[0], 2);
+ /* Fade layer uniforms. */
+ gpencil_set_fade_layer_uniforms(stl, grp, ob, gpl, false);
+
/* Fade object uniforms. */
- gpencil_set_fade_uniforms(v3d, grp, gpencil_fade_object_check(stl, ob));
+ gpencil_set_fade_ob_uniforms(v3d, grp, gpencil_fade_object_check(stl, ob));
/* wire color */
set_wireframe_color(ob, gpl, v3d, stl, gp_style, id, false);
@@ -808,8 +851,11 @@ static DRWShadingGroup *gpencil_shgroup_point_create(GPENCIL_Data *vedata,
DRW_shgroup_uniform_int(grp, "xraymode", &stl->storage->xray, 1);
}
+ /* Fade layer uniforms. */
+ gpencil_set_fade_layer_uniforms(stl, grp, ob, gpl, true);
+
/* Fade object uniforms. */
- gpencil_set_fade_uniforms(v3d, grp, false);
+ gpencil_set_fade_ob_uniforms(v3d, grp, false);
/* image texture */
if ((gp_style) && (gp_style->stroke_style == GP_STYLE_STROKE_STYLE_TEXTURE) && (!onion)) {
@@ -1684,6 +1730,8 @@ static void gpencil_shgroups_create(GPENCIL_e_data *e_data,
int start_edlin = 0;
uint stencil_id = 1;
+ /* Flag to determine if the layer is above active layer. */
+ stl->storage->is_ontop = false;
for (int i = 0; i < cache->grp_used; i++) {
elm = &cache->grp_cache[i];
array_elm = &cache_ob->shgrp_array[idx];
@@ -1711,6 +1759,10 @@ static void gpencil_shgroups_create(GPENCIL_e_data *e_data,
}
gpl = elm->gpl;
+ if ((!stl->storage->is_ontop) && (gpl->flag & GP_LAYER_ACTIVE)) {
+ stl->storage->is_ontop = true;
+ }
+
bGPDframe *gpf = elm->gpf;
bGPDstroke *gps = elm->gps;
MaterialGPencilStyle *gp_style = BKE_material_gpencil_settings_get(ob, gps->mat_nr + 1);
@@ -1956,12 +2008,10 @@ void gpencil_populate_datablock(GPENCIL_e_data *e_data,
int cfra_eval = (int)DEG_get_ctime(draw_ctx->depsgraph);
bGPDframe *gpf_eval = NULL;
- const bool overlay = v3d != NULL ? (bool)((v3d->flag2 & V3D_HIDE_OVERLAYS) == 0) : true;
const bool time_remap = BKE_gpencil_has_time_modifiers(ob);
float opacity;
bGPDframe *gpf = NULL;
- bGPDlayer *gpl_active = BKE_gpencil_layer_getactive(gpd);
/* check if playing animation */
const bool playing = stl->storage->is_playing;
@@ -2017,12 +2067,6 @@ void gpencil_populate_datablock(GPENCIL_e_data *e_data,
(v3d->overlay.flag & V3D_OVERLAY_BONE_SELECT)) {
opacity = opacity * v3d->overlay.xray_alpha_bone;
}
- /* fade no active layers */
- if ((overlay) && (draw_ctx->object_mode == OB_MODE_PAINT_GPENCIL) &&
- (v3d->gp_flag & V3D_GP_FADE_NOACTIVE_LAYERS) && (draw_ctx->obact) &&
- (draw_ctx->obact == ob) && (gpl != gpl_active)) {
- opacity = opacity * v3d->overlay.gpencil_fade_layer;
- }
/* Get evaluated frames array data */
int idx_eval = BLI_findindex(&gpd->layers, gpl);
diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.h b/source/blender/draw/engines/gpencil/gpencil_engine.h
index f29e83f64cf..79bcffac512 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.h
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.h
@@ -145,6 +145,7 @@ typedef struct GPENCIL_Storage {
bool is_mat_preview;
bool background_ready;
int is_xray;
+ bool is_ontop;
bool reset_cache;
const float *pixsize;
float render_pixsize;
diff --git a/source/blender/draw/engines/gpencil/shaders/gpencil_fill_frag.glsl b/source/blender/draw/engines/gpencil/shaders/gpencil_fill_frag.glsl
index 7e8f59cf917..0c290260b20 100644
--- a/source/blender/draw/engines/gpencil/shaders/gpencil_fill_frag.glsl
+++ b/source/blender/draw/engines/gpencil/shaders/gpencil_fill_frag.glsl
@@ -26,9 +26,11 @@ uniform int viewport_xray;
uniform int shading_type[2];
uniform vec4 wire_color;
-uniform bool fade_on;
+uniform int fade_layer;
+uniform float fade_layer_factor;
+uniform bool fade_ob;
uniform vec3 fade_color;
-uniform float fade_factor;
+uniform float fade_ob_factor;
/* keep this list synchronized with list in gpencil_draw_utils.c */
#define SOLID 0
@@ -216,7 +218,15 @@ void main()
}
}
/* Apply paper opacity */
- if (fade_on == true) {
- fragColor.rgb = mix(fade_color.rgb, fragColor.rgb, fade_factor);
+ if (fade_layer == 1) {
+ /* Layer is below, mix with background. */
+ fragColor.rgb = mix(fade_color.rgb, fragColor.rgb, fade_layer_factor);
+ }
+ else if (fade_layer == 2) {
+ /* Layer is above, change opacity. */
+ fragColor.a *= fade_layer_factor;
+ }
+ else if (fade_ob == true) {
+ fragColor.rgb = mix(fade_color.rgb, fragColor.rgb, fade_ob_factor);
}
}
diff --git a/source/blender/draw/engines/gpencil/shaders/gpencil_point_frag.glsl b/source/blender/draw/engines/gpencil/shaders/gpencil_point_frag.glsl
index f59c08730fe..d79b8fb4d8a 100644
--- a/source/blender/draw/engines/gpencil/shaders/gpencil_point_frag.glsl
+++ b/source/blender/draw/engines/gpencil/shaders/gpencil_point_frag.glsl
@@ -14,9 +14,11 @@ in vec4 mColor;
in vec2 mTexCoord;
out vec4 fragColor;
-uniform bool fade_on;
+uniform int fade_layer;
+uniform float fade_layer_factor;
+uniform bool fade_ob;
uniform vec3 fade_color;
-uniform float fade_factor;
+uniform float fade_ob_factor;
#define texture2D texture
@@ -110,7 +112,15 @@ void main()
}
/* Apply paper opacity */
- if (fade_on == true) {
- fragColor.rgb = mix(fade_color.rgb, fragColor.rgb, fade_factor);
+ if (fade_layer == 1) {
+ /* Layer is below, mix with background. */
+ fragColor.rgb = mix(fade_color.rgb, fragColor.rgb, fade_layer_factor);
+ }
+ else if (fade_layer == 2) {
+ /* Layer is above, change opacity. */
+ fragColor.a *= fade_layer_factor;
+ }
+ else if (fade_ob == true) {
+ fragColor.rgb = mix(fade_color.rgb, fragColor.rgb, fade_ob_factor);
}
}
diff --git a/source/blender/draw/engines/gpencil/shaders/gpencil_stroke_frag.glsl b/source/blender/draw/engines/gpencil/shaders/gpencil_stroke_frag.glsl
index e64166527a1..0f1665b73c2 100644
--- a/source/blender/draw/engines/gpencil/shaders/gpencil_stroke_frag.glsl
+++ b/source/blender/draw/engines/gpencil/shaders/gpencil_stroke_frag.glsl
@@ -8,9 +8,11 @@ uniform vec4 colormix;
uniform float mix_stroke_factor;
uniform int shading_type[2];
-uniform bool fade_on;
+uniform int fade_layer;
+uniform float fade_layer_factor;
+uniform bool fade_ob;
uniform vec3 fade_color;
-uniform float fade_factor;
+uniform float fade_ob_factor;
in vec4 mColor;
in vec2 mTexCoord;
@@ -94,7 +96,15 @@ void main()
}
/* Apply paper opacity */
- if (fade_on == true) {
- fragColor.rgb = mix(fade_color.rgb, fragColor.rgb, fade_factor);
+ if (fade_layer == 1) {
+ /* Layer is below, mix with background. */
+ fragColor.rgb = mix(fade_color.rgb, fragColor.rgb, fade_layer_factor);
+ }
+ else if (fade_layer == 2) {
+ /* Layer is above, change opacity. */
+ fragColor.a *= fade_layer_factor;
+ }
+ else if (fade_ob == true) {
+ fragColor.rgb = mix(fade_color.rgb, fragColor.rgb, fade_ob_factor);
}
}