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
This commit is contained in:
@@ -30,6 +30,7 @@
|
|||||||
#define BG_SOLID 0
|
#define BG_SOLID 0
|
||||||
#define BG_GRADIENT 1
|
#define BG_GRADIENT 1
|
||||||
#define BG_CHECKER 2
|
#define BG_CHECKER 2
|
||||||
|
#define BG_RADIAL 3
|
||||||
|
|
||||||
void OVERLAY_background_cache_init(OVERLAY_Data *vedata)
|
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);
|
copy_v3_v3(color_override, v3d->shading.background_color);
|
||||||
color_override[3] = 1.0f;
|
color_override[3] = 1.0f;
|
||||||
}
|
}
|
||||||
else if (UI_GetThemeValue(TH_SHOW_BACK_GRAD)) {
|
|
||||||
background_type = BG_GRADIENT;
|
|
||||||
}
|
|
||||||
else {
|
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;
|
DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_BACKGROUND;
|
||||||
|
|||||||
@@ -12,6 +12,8 @@ out vec4 fragColor;
|
|||||||
#define BG_SOLID 0
|
#define BG_SOLID 0
|
||||||
#define BG_GRADIENT 1
|
#define BG_GRADIENT 1
|
||||||
#define BG_CHECKER 2
|
#define BG_CHECKER 2
|
||||||
|
#define BG_RADIAL 3
|
||||||
|
#define SQRT2 1.4142135623730950488
|
||||||
|
|
||||||
/* 4x4 bayer matrix prepared for 8bit UNORM precision error. */
|
/* 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))
|
#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;
|
float depth = texture(depthBuffer, uvcoordsvar.st).r;
|
||||||
|
|
||||||
vec3 bg_col;
|
vec3 bg_col;
|
||||||
|
vec3 col_high;
|
||||||
|
vec3 col_low;
|
||||||
|
|
||||||
switch (bgType) {
|
switch (bgType) {
|
||||||
case BG_SOLID:
|
case BG_SOLID:
|
||||||
@@ -45,9 +49,22 @@ void main()
|
|||||||
break;
|
break;
|
||||||
case BG_GRADIENT:
|
case BG_GRADIENT:
|
||||||
/* XXX do interpolation in a non-linear space to have a better visual result. */
|
/* 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));
|
col_high = pow(colorBackground.rgb, vec3(1.0 / 2.2));
|
||||||
vec3 col_low = pow(colorBackgroundGradient.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);
|
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. */
|
/* Convert back to linear. */
|
||||||
bg_col = pow(bg_col, vec3(2.2));
|
bg_col = pow(bg_col, vec3(2.2));
|
||||||
/* Dither to hide low precision buffer. (Could be improved) */
|
/* Dither to hide low precision buffer. (Could be improved) */
|
||||||
|
|||||||
@@ -309,7 +309,7 @@ typedef enum ThemeColorID {
|
|||||||
TH_GIZMO_A,
|
TH_GIZMO_A,
|
||||||
TH_GIZMO_B,
|
TH_GIZMO_B,
|
||||||
|
|
||||||
TH_SHOW_BACK_GRAD,
|
TH_BACKGROUND_TYPE,
|
||||||
|
|
||||||
TH_INFO_SELECTED,
|
TH_INFO_SELECTED,
|
||||||
TH_INFO_SELECTED_TEXT,
|
TH_INFO_SELECTED_TEXT,
|
||||||
|
|||||||
@@ -196,9 +196,9 @@ const uchar *UI_ThemeGetColorPtr(bTheme *btheme, int spacetype, int colorid)
|
|||||||
cp = ts->back_grad;
|
cp = ts->back_grad;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TH_SHOW_BACK_GRAD:
|
case TH_BACKGROUND_TYPE:
|
||||||
cp = &setting;
|
cp = &setting;
|
||||||
setting = ts->show_back_grad;
|
setting = ts->background_type;
|
||||||
break;
|
break;
|
||||||
case TH_TEXT:
|
case TH_TEXT:
|
||||||
if (theme_regionid == RGN_TYPE_WINDOW) {
|
if (theme_regionid == RGN_TYPE_WINDOW) {
|
||||||
|
|||||||
@@ -214,7 +214,7 @@ typedef struct ThemeSpace {
|
|||||||
unsigned char back[4];
|
unsigned char back[4];
|
||||||
unsigned char back_grad[4];
|
unsigned char back_grad[4];
|
||||||
|
|
||||||
char show_back_grad;
|
char background_type;
|
||||||
char _pad0[3];
|
char _pad0[3];
|
||||||
|
|
||||||
/** Panel title. */
|
/** Panel title. */
|
||||||
@@ -424,6 +424,14 @@ typedef struct ThemeSpace {
|
|||||||
|
|
||||||
} ThemeSpace;
|
} ThemeSpace;
|
||||||
|
|
||||||
|
/* Viewport Background Gradient Types. */
|
||||||
|
|
||||||
|
typedef enum eBackgroundGradientTypes {
|
||||||
|
TH_BACKGROUND_SINGLE_COLOR = 0,
|
||||||
|
TH_BACKGROUND_GRADIENT_LINEAR = 1,
|
||||||
|
TH_BACKGROUND_GRADIENT_RADIAL = 2,
|
||||||
|
} eBackgroundGradientTypes;
|
||||||
|
|
||||||
/* set of colors for use as a custom color set for Objects/Bones wire drawing */
|
/* set of colors for use as a custom color set for Objects/Bones wire drawing */
|
||||||
typedef struct ThemeWireColor {
|
typedef struct ThemeWireColor {
|
||||||
unsigned char solid[4];
|
unsigned char solid[4];
|
||||||
|
|||||||
@@ -109,3 +109,4 @@ DNA_STRUCT_RENAME_ELEM(bTheme, tstatusbar, space_statusbar)
|
|||||||
DNA_STRUCT_RENAME_ELEM(bTheme, ttopbar, space_topbar)
|
DNA_STRUCT_RENAME_ELEM(bTheme, ttopbar, space_topbar)
|
||||||
DNA_STRUCT_RENAME_ELEM(bTheme, tuserpref, space_preferences)
|
DNA_STRUCT_RENAME_ELEM(bTheme, tuserpref, space_preferences)
|
||||||
DNA_STRUCT_RENAME_ELEM(bTheme, tv3d, space_view3d)
|
DNA_STRUCT_RENAME_ELEM(bTheme, tv3d, space_view3d)
|
||||||
|
DNA_STRUCT_RENAME_ELEM(ThemeSpace, show_back_grad, background_type)
|
||||||
|
|||||||
@@ -1306,6 +1306,25 @@ static void rna_def_userdef_theme_ui_panel(BlenderRNA *brna)
|
|||||||
RNA_def_property_update(prop, 0, "rna_userdef_theme_update");
|
RNA_def_property_update(prop, 0, "rna_userdef_theme_update");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const EnumPropertyItem rna_enum_userdef_theme_background_types_items[] = {
|
||||||
|
{TH_BACKGROUND_SINGLE_COLOR,
|
||||||
|
"Single Color",
|
||||||
|
0,
|
||||||
|
"Single Color",
|
||||||
|
"Use a solid color as viewport background"},
|
||||||
|
{TH_BACKGROUND_GRADIENT_LINEAR,
|
||||||
|
"LINEAR",
|
||||||
|
0,
|
||||||
|
"Linear Gradient",
|
||||||
|
"Use a screen space vertical linear gradient as viewport background"},
|
||||||
|
{TH_BACKGROUND_GRADIENT_RADIAL,
|
||||||
|
"RADIAL",
|
||||||
|
0,
|
||||||
|
"Vignette",
|
||||||
|
"Use a radial gradient as viewport background"},
|
||||||
|
{0, NULL, 0, NULL, NULL},
|
||||||
|
};
|
||||||
|
|
||||||
static void rna_def_userdef_theme_ui_gradient(BlenderRNA *brna)
|
static void rna_def_userdef_theme_ui_gradient(BlenderRNA *brna)
|
||||||
{
|
{
|
||||||
/* Fake struct, keep this for compatible theme presets. */
|
/* Fake struct, keep this for compatible theme presets. */
|
||||||
@@ -1318,10 +1337,10 @@ static void rna_def_userdef_theme_ui_gradient(BlenderRNA *brna)
|
|||||||
RNA_def_struct_ui_text(
|
RNA_def_struct_ui_text(
|
||||||
srna, "Theme Background Color", "Theme settings for background colors and gradient");
|
srna, "Theme Background Color", "Theme settings for background colors and gradient");
|
||||||
|
|
||||||
prop = RNA_def_property(srna, "show_grad", PROP_BOOLEAN, PROP_NONE);
|
prop = RNA_def_property(srna, "background_type", PROP_ENUM, PROP_NONE);
|
||||||
RNA_def_property_boolean_sdna(prop, NULL, "show_back_grad", 1);
|
RNA_def_property_enum_sdna(prop, NULL, "background_type");
|
||||||
RNA_def_property_ui_text(
|
RNA_def_property_enum_items(prop, rna_enum_userdef_theme_background_types_items);
|
||||||
prop, "Use Gradient", "Do a gradient for the background of the viewport working area");
|
RNA_def_property_ui_text(prop, "Background Type", "Type of background in the 3D viewport");
|
||||||
RNA_def_property_update(prop, 0, "rna_userdef_theme_update");
|
RNA_def_property_update(prop, 0, "rna_userdef_theme_update");
|
||||||
|
|
||||||
prop = RNA_def_property(srna, "high_gradient", PROP_FLOAT, PROP_COLOR_GAMMA);
|
prop = RNA_def_property(srna, "high_gradient", PROP_FLOAT, PROP_COLOR_GAMMA);
|
||||||
|
|||||||
Reference in New Issue
Block a user