diff options
author | Pablo Dobarro <pablodp606@gmail.com> | 2020-02-19 21:11:47 +0300 |
---|---|---|
committer | Pablo Dobarro <pablodp606@gmail.com> | 2020-02-19 21:12:46 +0300 |
commit | 05fd2acf895847c51d8c02166a87d9fa50def39c (patch) | |
tree | 0b0eb65f52501288f897ca1ef4eab7f29d412389 /source/blender/draw/engines | |
parent | 2df040ed58fb9e80ae69f50262bb702f50f0d71f (diff) |
Theme: Radial gradient background and enum for gradient type
This commit replaces the "Use Gradient" checkbox theme option with an
enum and implements a radial background.
Whith this change, it should be easier to implemet other types of more
complex background types, like a world space oriented gradient.
Reviewed By: billreynish, fclem, brecht
Differential Revision: https://developer.blender.org/D6825
Diffstat (limited to 'source/blender/draw/engines')
-rw-r--r-- | source/blender/draw/engines/overlay/overlay_background.c | 16 | ||||
-rw-r--r-- | source/blender/draw/engines/overlay/shaders/background_frag.glsl | 21 |
2 files changed, 31 insertions, 6 deletions
diff --git a/source/blender/draw/engines/overlay/overlay_background.c b/source/blender/draw/engines/overlay/overlay_background.c index d98a9066a8e..880f5c49b3e 100644 --- a/source/blender/draw/engines/overlay/overlay_background.c +++ b/source/blender/draw/engines/overlay/overlay_background.c @@ -30,6 +30,7 @@ #define BG_SOLID 0 #define BG_GRADIENT 1 #define BG_CHECKER 2 +#define BG_RADIAL 3 void OVERLAY_background_cache_init(OVERLAY_Data *vedata) { @@ -67,11 +68,18 @@ void OVERLAY_background_cache_init(OVERLAY_Data *vedata) copy_v3_v3(color_override, v3d->shading.background_color); color_override[3] = 1.0f; } - else if (UI_GetThemeValue(TH_SHOW_BACK_GRAD)) { - background_type = BG_GRADIENT; - } else { - background_type = BG_SOLID; + switch (UI_GetThemeValue(TH_BACKGROUND_TYPE)) { + case TH_BACKGROUND_SINGLE_COLOR: + background_type = BG_SOLID; + break; + case TH_BACKGROUND_GRADIENT_LINEAR: + background_type = BG_GRADIENT; + break; + case TH_BACKGROUND_GRADIENT_RADIAL: + background_type = BG_RADIAL; + break; + } } DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_BACKGROUND; diff --git a/source/blender/draw/engines/overlay/shaders/background_frag.glsl b/source/blender/draw/engines/overlay/shaders/background_frag.glsl index 737c3acb438..60fa83e1695 100644 --- a/source/blender/draw/engines/overlay/shaders/background_frag.glsl +++ b/source/blender/draw/engines/overlay/shaders/background_frag.glsl @@ -12,6 +12,8 @@ out vec4 fragColor; #define BG_SOLID 0 #define BG_GRADIENT 1 #define BG_CHECKER 2 +#define BG_RADIAL 3 +#define SQRT2 1.4142135623730950488 /* 4x4 bayer matrix prepared for 8bit UNORM precision error. */ #define P(x) (((x + 0.5) * (1.0 / 16.0) - 0.5) * (1.0 / 255.0)) @@ -38,6 +40,8 @@ void main() float depth = texture(depthBuffer, uvcoordsvar.st).r; vec3 bg_col; + vec3 col_high; + vec3 col_low; switch (bgType) { case BG_SOLID: @@ -45,14 +49,27 @@ void main() break; case BG_GRADIENT: /* XXX do interpolation in a non-linear space to have a better visual result. */ - vec3 col_high = pow(colorBackground.rgb, vec3(1.0 / 2.2)); - vec3 col_low = pow(colorBackgroundGradient.rgb, vec3(1.0 / 2.2)); + col_high = pow(colorBackground.rgb, vec3(1.0 / 2.2)); + col_low = pow(colorBackgroundGradient.rgb, vec3(1.0 / 2.2)); bg_col = mix(col_low, col_high, uvcoordsvar.t); /* Convert back to linear. */ bg_col = pow(bg_col, vec3(2.2)); /* Dither to hide low precision buffer. (Could be improved) */ bg_col += dither(); break; + case BG_RADIAL: + /* Do interpolation in a non-linear space to have a better visual result. */ + col_high = pow(colorBackground.rgb, vec3(1.0 / 2.2)); + col_low = pow(colorBackgroundGradient.rgb, vec3(1.0 / 2.2)); + + vec2 uv_n = uvcoordsvar.xy - 0.5; + bg_col = mix(col_high, col_low, length(uv_n) * SQRT2); + + /* Convert back to linear. */ + bg_col = pow(bg_col, vec3(2.2)); + /* Dither to hide low precision buffer. (Could be improved) */ + bg_col += dither(); + break; case BG_CHECKER: float size = 8.0 * sizePixel; ivec2 p = ivec2(floor(gl_FragCoord.xy / size)); |