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:
authorJeroen Bakker <j.bakker@atmind.nl>2018-06-05 09:15:30 +0300
committerJeroen Bakker <j.bakker@atmind.nl>2018-06-05 12:38:33 +0300
commita3815f87773c7d45740c98c888718424d736870b (patch)
tree4cd46cb327fe76e1dfcde04dcdd99d1cc4a2e9b5 /source/blender/draw
parentade710500df4f333077daa96e3ab72eb2cdc3b94 (diff)
Workbench: Matcaps T55291
- users can use their own matcaps .config/blender/2.80/datafiles/studiolights/matcap/ folder - upto 100 matcaps can be loaded - color of the matcap is influenced by the color of the material/single color etc. To show the plain matcap use single color at 1.0 - chosing a matcap is at lighting level (flat/studio/matcap) - matcap only possible in solid mode - also works for X-Ray mode As the old matcaps are still in used by the clay engine I didn't remove it yet.
Diffstat (limited to 'source/blender/draw')
-rw-r--r--source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl1
-rw-r--r--source/blender/draw/engines/workbench/shaders/workbench_deferred_composite_frag.glsl37
-rw-r--r--source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl17
-rw-r--r--source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl22
-rw-r--r--source/blender/draw/engines/workbench/shaders/workbench_world_light_lib.glsl6
-rw-r--r--source/blender/draw/engines/workbench/workbench_data.c10
-rw-r--r--source/blender/draw/engines/workbench/workbench_deferred.c7
-rw-r--r--source/blender/draw/engines/workbench/workbench_forward.c6
-rw-r--r--source/blender/draw/engines/workbench/workbench_materials.c52
-rw-r--r--source/blender/draw/engines/workbench/workbench_private.h22
10 files changed, 120 insertions, 60 deletions
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl b/source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl
index fc076ee8117..8d648ce7d7b 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl
@@ -23,4 +23,5 @@ struct MaterialData {
vec4 diffuse_color;
vec4 specular_color;
float roughness;
+ int matcap_texture_index;
};
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_deferred_composite_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_deferred_composite_frag.glsl
index 5f37490603d..326837bc69f 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_deferred_composite_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_deferred_composite_frag.glsl
@@ -11,6 +11,9 @@ uniform float lightMultiplier;
uniform float shadowShift = 0.1;
uniform mat3 normalWorldMatrix;
+#ifdef STUDIOLIGHT_ORIENTATION_VIEWNORMAL
+uniform sampler2D matcapImage;
+#endif
layout(std140) uniform world_block {
WorldData world_data;
@@ -43,16 +46,21 @@ void main()
#endif /* !V3D_SHADING_OBJECT_OUTLINE */
vec4 diffuse_color = texelFetch(colorBuffer, texel, 0);
+
/* Do we need normals */
#ifdef NORMAL_VIEWPORT_PASS_ENABLED
-#ifdef WORKBENCH_ENCODE_NORMALS
+# ifdef WORKBENCH_ENCODE_NORMALS
vec3 normal_viewport = normal_decode(texelFetch(normalBuffer, texel, 0).rg);
if (diffuse_color.a == 0.0) {
normal_viewport = -normal_viewport;
}
-#else /* WORKBENCH_ENCODE_NORMALS */
+# else /* WORKBENCH_ENCODE_NORMALS */
vec3 normal_viewport = texelFetch(normalBuffer, texel, 0).rgb;
-#endif /* WORKBENCH_ENCODE_NORMALS */
+# endif /* WORKBENCH_ENCODE_NORMALS */
+#endif
+
+#ifdef STUDIOLIGHT_ORIENTATION_VIEWNORMAL
+ diffuse_color = texture(matcapImage, normal_viewport.xy / 2.0 + 0.5);
#endif
#ifdef V3D_SHADING_SPECULAR_HIGHLIGHT
@@ -64,22 +72,27 @@ void main()
vec3 specular_color = vec3(0.0);
#endif
+#ifdef V3D_LIGHTING_FLAT
+ vec3 diffuse_light = vec3(1.0);
+#endif
+
+#ifdef V3D_LIGHTING_MATCAP
+ /* TODO: if pixel data is matcap. then */
+ vec3 diffuse_light = texelFetch(specularBuffer, texel, 0).rgb;
+#endif
+
#ifdef V3D_LIGHTING_STUDIO
- #ifdef STUDIOLIGHT_ORIENTATION_CAMERA
+# ifdef STUDIOLIGHT_ORIENTATION_CAMERA
vec3 diffuse_light = get_camera_diffuse_light(world_data, normal_viewport);
- #endif
+# endif
- #ifdef STUDIOLIGHT_ORIENTATION_WORLD
+# ifdef STUDIOLIGHT_ORIENTATION_WORLD
vec3 normal_world = normalWorldMatrix * normal_viewport;
vec3 diffuse_light = get_world_diffuse_light(world_data, normal_world);
- #endif
+# endif
+#endif
vec3 shaded_color = diffuse_light * diffuse_color.rgb + specular_color;
-#else /* V3D_LIGHTING_STUDIO */
- vec3 shaded_color = diffuse_color.rgb + specular_color;
-
-#endif /* V3D_LIGHTING_STUDIO */
-
#ifdef V3D_SHADING_SHADOW
float light_factor = -dot(normal_viewport, world_data.light_direction_vs.xyz);
/* The step function might be ok for meshes but it's
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl
index a9c84e11aa6..e04bffdeea5 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl
@@ -10,6 +10,9 @@ in vec3 normal_viewport;
#ifdef OB_TEXTURE
in vec2 uv_interp;
#endif
+#ifdef STUDIOLIGHT_ORIENTATION_VIEWNORMAL
+uniform sampler2D matcapImage;
+#endif
layout(std140) uniform world_block {
WorldData world_data;
@@ -25,6 +28,7 @@ layout(location=0) out vec4 transparentAccum;
void main()
{
vec4 diffuse_color;
+ vec3 diffuse_light = vec3(1.0);
#ifdef OB_SOLID
diffuse_color = material_data.diffuse_color;
#endif /* OB_SOLID */
@@ -32,6 +36,10 @@ void main()
diffuse_color = texture(image, uv_interp);
#endif /* OB_TEXTURE */
+#ifdef V3D_LIGHTING_MATCAP
+ diffuse_light = texture(matcapImage, normal_viewport.xy / 2.0 + 0.5).rgb;
+#endif
+
#ifdef V3D_SHADING_SPECULAR_HIGHLIGHT
vec3 specular_color = get_world_specular_lights(world_data, vec4(material_data.specular_color.rgb, material_data.roughness), normal_viewport, vec3(0.0, 0.0, 1.0));
#else
@@ -40,17 +48,16 @@ void main()
#ifdef V3D_LIGHTING_STUDIO
# ifdef STUDIOLIGHT_ORIENTATION_CAMERA
- vec3 diffuse_light = get_camera_diffuse_light(world_data, normal_viewport);
+ diffuse_light = get_camera_diffuse_light(world_data, normal_viewport);
# endif
# ifdef STUDIOLIGHT_ORIENTATION_WORLD
vec3 normal_world = normalWorldMatrix * normal_viewport;
- vec3 diffuse_light = get_world_diffuse_light(world_data, normal_world);
+ diffuse_light = get_world_diffuse_light(world_data, normal_world);
# endif
- vec3 shaded_color = diffuse_light * diffuse_color.rgb + specular_color;
-#else
- vec3 shaded_color = diffuse_color.rgb + specular_color;
#endif
+ vec3 shaded_color = diffuse_light * diffuse_color.rgb + specular_color;
+
vec4 premultiplied = vec4(shaded_color.rgb * alpha, alpha);
transparentAccum = calculate_transparent_accum(premultiplied);
}
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
index bc7741f853c..5931a11f184 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
@@ -24,19 +24,29 @@ layout(location=0) out uint objectId;
layout(location=1) out vec4 diffuseColor;
layout(location=2) out vec4 specularColor;
#ifdef NORMAL_VIEWPORT_PASS_ENABLED
- #ifdef WORKBENCH_ENCODE_NORMALS
+# ifdef WORKBENCH_ENCODE_NORMALS
layout(location=3) out vec2 normalViewport;
- #else /* WORKBENCH_ENCODE_NORMALS */
+# else /* WORKBENCH_ENCODE_NORMALS */
layout(location=3) out vec3 normalViewport;
- #endif /* WORKBENCH_ENCODE_NORMALS */
+# endif /* WORKBENCH_ENCODE_NORMALS */
#endif /* NORMAL_VIEWPORT_PASS_ENABLED */
void main()
{
objectId = uint(object_id);
+
+#ifdef NORMAL_VIEWPORT_PASS_ENABLED
+ vec3 n = (gl_FrontFacing) ? normal_viewport : -normal_viewport;
+ n = normalize(n);
+#endif
+
#ifdef OB_SOLID
diffuseColor = vec4(material_data.diffuse_color.rgb, 0.0);
+# ifdef STUDIOLIGHT_ORIENTATION_VIEWNORMAL
+ specularColor = vec4(material_data.diffuse_color.rgb, material_data.matcap_texture_index);
+# endif
#endif /* OB_SOLID */
+
#ifdef OB_TEXTURE
diffuseColor = texture(image, uv_interp);
#endif /* OB_TEXTURE */
@@ -47,14 +57,12 @@ void main()
#ifdef V3D_SHADING_SPECULAR_HIGHLIGHT
specularColor = vec4(material_data.specular_color.rgb, material_data.roughness);
-#ifdef HAIR_SHADER
+# ifdef HAIR_SHADER
specularColor.rgb = clamp(specularColor.rgb - hair_color_variation, 0.0, 1.0);
-#endif
+# endif
#endif
#ifdef NORMAL_VIEWPORT_PASS_ENABLED
- vec3 n = (gl_FrontFacing) ? normal_viewport : -normal_viewport;
- n = normalize(n);
# ifdef WORKBENCH_ENCODE_NORMALS
diffuseColor.a = float(gl_FrontFacing);
normalViewport = normal_encode(n);
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_world_light_lib.glsl b/source/blender/draw/engines/workbench/shaders/workbench_world_light_lib.glsl
index be124257c33..6f4237ebd0a 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_world_light_lib.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_world_light_lib.glsl
@@ -29,7 +29,7 @@ vec3 get_world_specular_light(vec4 specular_data, LightData light_data, vec3 N,
float shininess = exp2(10*(1.0-specular_data.a) + 1);
-#ifdef BLINN
+# ifdef BLINN
float normalization_factor = (shininess + 8) / (8 * M_PI);
vec3 L = -light_data.light_direction_vs.xyz;
vec3 halfDir = normalize(L + I);
@@ -37,11 +37,11 @@ vec3 get_world_specular_light(vec4 specular_data, LightData light_data, vec3 N,
float NL = max(dot(L, N), 0.0);
float specular_influence = pow(specAngle, shininess) * NL * normalization_factor;
-#else
+# else
vec3 reflection_vector = reflect(I, N);
float specAngle = max(dot(light_data.light_direction_vs.xyz, reflection_vector), 0.0);
float specular_influence = pow(specAngle, shininess);
-#endif
+# endif
vec3 specular_color = specular_light * specular_influence;
diff --git a/source/blender/draw/engines/workbench/workbench_data.c b/source/blender/draw/engines/workbench/workbench_data.c
index 4ee12a692f5..4eca3acf238 100644
--- a/source/blender/draw/engines/workbench/workbench_data.c
+++ b/source/blender/draw/engines/workbench/workbench_data.c
@@ -15,7 +15,11 @@ void workbench_private_data_init(WORKBENCH_PrivateData *wpd)
if (v3d) {
wpd->shading = v3d->shading;
wpd->drawtype = v3d->drawtype;
- wpd->studio_light = BKE_studiolight_find(wpd->shading.studio_light, 0);
+ if (wpd->shading.light == V3D_LIGHTING_MATCAP) {
+ wpd->studio_light = BKE_studiolight_find(wpd->shading.matcap, STUDIOLIGHT_ORIENTATION_VIEWNORMAL);
+ } else {
+ wpd->studio_light = BKE_studiolight_find(wpd->shading.studio_light, STUDIOLIGHT_ORIENTATION_CAMERA | STUDIOLIGHT_ORIENTATION_WORLD);
+ }
}
else {
memset(&wpd->shading, 0, sizeof(wpd->shading));
@@ -23,7 +27,7 @@ void workbench_private_data_init(WORKBENCH_PrivateData *wpd)
wpd->shading.shadow_intensity = 0.5;
copy_v3_fl(wpd->shading.single_color, 0.8f);
wpd->drawtype = OB_SOLID;
- wpd->studio_light = BKE_studiolight_findindex(0);
+ wpd->studio_light = BKE_studiolight_find_first(STUDIOLIGHT_INTERNAL);
}
wpd->shadow_multiplier = 1.0 - wpd->shading.shadow_intensity;
@@ -71,7 +75,7 @@ void workbench_private_data_get_light_direction(WORKBENCH_PrivateData *wpd, floa
wd->num_lights = 1;
}
- if (STUDIOLIGHT_ORIENTATION_CAMERA_ENABLED(wpd)) {
+ if (!STUDIOLIGHT_ORIENTATION_WORLD_ENABLED(wpd)) {
int light_index = 0;
for (int index = 0 ; index < 3; index++) {
SolidLight *sl = &U.light[index];
diff --git a/source/blender/draw/engines/workbench/workbench_deferred.c b/source/blender/draw/engines/workbench/workbench_deferred.c
index ba5ab7f1cc3..285551abb12 100644
--- a/source/blender/draw/engines/workbench/workbench_deferred.c
+++ b/source/blender/draw/engines/workbench/workbench_deferred.c
@@ -313,7 +313,7 @@ static void workbench_composite_uniforms(WORKBENCH_PrivateData *wpd, DRWShadingG
if (NORMAL_VIEWPORT_PASS_ENABLED(wpd)) {
DRW_shgroup_uniform_texture_ref(grp, "normalBuffer", &e_data.normal_buffer_tx);
}
- if (SPECULAR_HIGHLIGHT_ENABLED(wpd)) {
+ if (SPECULAR_HIGHLIGHT_ENABLED(wpd) || MATCAP_ENABLED(wpd)) {
DRW_shgroup_uniform_texture_ref(grp, "specularBuffer", &e_data.specular_buffer_tx);
#if 0
@@ -338,6 +338,11 @@ static void workbench_composite_uniforms(WORKBENCH_PrivateData *wpd, DRWShadingG
DRW_shgroup_uniform_block(grp, "world_block", wpd->world_ubo);
DRW_shgroup_uniform_vec2(grp, "invertedViewportSize", DRW_viewport_invert_size_get(), 1);
+ if (STUDIOLIGHT_ORIENTATION_VIEWNORMAL_ENABLED(wpd)) {
+ BKE_studiolight_ensure_flag(wpd->studio_light, STUDIOLIGHT_EQUIRECTANGULAR_RADIANCE_GPUTEXTURE);
+ DRW_shgroup_uniform_texture(grp, "matcapImage", wpd->studio_light->equirectangular_radiance_gputexture);
+ }
+
workbench_material_set_normal_world_matrix(grp, wpd, e_data.normal_world_matrix);
}
diff --git a/source/blender/draw/engines/workbench/workbench_forward.c b/source/blender/draw/engines/workbench/workbench_forward.c
index 3ed0c207bec..931ffc61810 100644
--- a/source/blender/draw/engines/workbench/workbench_forward.c
+++ b/source/blender/draw/engines/workbench/workbench_forward.c
@@ -202,7 +202,13 @@ static WORKBENCH_MaterialData *get_or_create_material_data(
material->material_data.roughness = material_template.material_data.roughness;
switch (drawtype) {
case OB_SOLID:
+ {
+ if (STUDIOLIGHT_ORIENTATION_VIEWNORMAL_ENABLED(wpd)) {
+ BKE_studiolight_ensure_flag(wpd->studio_light, STUDIOLIGHT_EQUIRECTANGULAR_RADIANCE_GPUTEXTURE);
+ DRW_shgroup_uniform_texture(grp, "matcapImage", wpd->studio_light->equirectangular_radiance_gputexture);
+ }
break;
+ }
case OB_TEXTURE:
{
diff --git a/source/blender/draw/engines/workbench/workbench_materials.c b/source/blender/draw/engines/workbench/workbench_materials.c
index 7c9c7b96b7b..2e2e6f8127a 100644
--- a/source/blender/draw/engines/workbench/workbench_materials.c
+++ b/source/blender/draw/engines/workbench/workbench_materials.c
@@ -52,17 +52,26 @@ char *workbench_material_build_defines(WORKBENCH_PrivateData *wpd, int drawtype,
if (wpd->shading.flag & V3D_SHADING_SHADOW) {
BLI_dynstr_appendf(ds, "#define V3D_SHADING_SHADOW\n");
}
- if (wpd->shading.flag & V3D_SHADING_SPECULAR_HIGHLIGHT) {
+ if (SPECULAR_HIGHLIGHT_ENABLED(wpd)) {
BLI_dynstr_appendf(ds, "#define V3D_SHADING_SPECULAR_HIGHLIGHT\n");
}
- if (wpd->shading.light & V3D_LIGHTING_STUDIO) {
+ if (STUDIOLIGHT_ENABLED(wpd)) {
BLI_dynstr_appendf(ds, "#define V3D_LIGHTING_STUDIO\n");
- if (STUDIOLIGHT_ORIENTATION_WORLD_ENABLED(wpd)) {
- BLI_dynstr_appendf(ds, "#define STUDIOLIGHT_ORIENTATION_WORLD\n");
- }
- else {
- BLI_dynstr_appendf(ds, "#define STUDIOLIGHT_ORIENTATION_CAMERA\n");
- }
+ }
+ if (FLAT_ENABLED(wpd)) {
+ BLI_dynstr_appendf(ds, "#define V3D_LIGHTING_FLAT\n");
+ }
+ if (MATCAP_ENABLED(wpd)) {
+ BLI_dynstr_appendf(ds, "#define V3D_LIGHTING_MATCAP\n");
+ }
+ if (STUDIOLIGHT_ORIENTATION_WORLD_ENABLED(wpd)) {
+ BLI_dynstr_appendf(ds, "#define STUDIOLIGHT_ORIENTATION_WORLD\n");
+ }
+ if (STUDIOLIGHT_ORIENTATION_CAMERA_ENABLED(wpd)) {
+ BLI_dynstr_appendf(ds, "#define STUDIOLIGHT_ORIENTATION_CAMERA\n");
+ }
+ if (STUDIOLIGHT_ORIENTATION_VIEWNORMAL_ENABLED(wpd)) {
+ BLI_dynstr_appendf(ds, "#define STUDIOLIGHT_ORIENTATION_VIEWNORMAL\n");
}
if (NORMAL_VIEWPORT_PASS_ENABLED(wpd)) {
BLI_dynstr_appendf(ds, "#define NORMAL_VIEWPORT_PASS_ENABLED\n");
@@ -94,7 +103,6 @@ char *workbench_material_build_defines(WORKBENCH_PrivateData *wpd, int drawtype,
uint workbench_material_get_hash(WORKBENCH_MaterialData *material_template)
{
- /* TODO: make a C-string with settings and hash the string */
uint input[4];
uint result;
float *color = material_template->material_data.diffuse_color;
@@ -121,18 +129,20 @@ uint workbench_material_get_hash(WORKBENCH_MaterialData *material_template)
int workbench_material_get_shader_index(WORKBENCH_PrivateData *wpd, int drawtype, bool is_hair)
{
/* NOTE: change MAX_SHADERS accordingly when modifying this function. */
- const int DRAWOPTIONS_MASK = V3D_SHADING_OBJECT_OUTLINE | V3D_SHADING_SHADOW | V3D_SHADING_SPECULAR_HIGHLIGHT;
- int index = (wpd->shading.flag & DRAWOPTIONS_MASK);
- index = (index << 2) + wpd->shading.light;
- index = (index << 3);
- /* set the drawtype flag
- 0 = OB_SOLID,
- 1 = OB_TEXTURE
- 2 = STUDIOLIGHT_ORIENTATION_WORLD
- */
- SET_FLAG_FROM_TEST(index, wpd->studio_light->flag & STUDIOLIGHT_ORIENTATION_WORLD, 2);
- SET_FLAG_FROM_TEST(index, drawtype == OB_TEXTURE, 1);
- SET_FLAG_FROM_TEST(index, is_hair, 4);
+ int index = 0;
+ /* 1 bit OB_SOLID and OB_TEXTURE */
+ SET_FLAG_FROM_TEST(index, drawtype == OB_TEXTURE, 1 << 0);
+ /* 2 bits FLAT/STUDIO/MATCAP/SCENE */
+ SET_FLAG_FROM_TEST(index, wpd->shading.light, wpd->shading.light << 1);
+ /* 1 bit V3D_SHADING_SPECULAR_HIGHLIGHT */
+ SET_FLAG_FROM_TEST(index, wpd->shading.flag & V3D_SHADING_SPECULAR_HIGHLIGHT, 1 << 3);
+ SET_FLAG_FROM_TEST(index, wpd->shading.flag & V3D_SHADING_SHADOW, 1 << 4);
+ SET_FLAG_FROM_TEST(index, wpd->shading.flag & V3D_SHADING_OBJECT_OUTLINE, 1 << 5);
+ /* 2 bits STUDIOLIGHT_ORIENTATION */
+ SET_FLAG_FROM_TEST(index, wpd->studio_light->flag & STUDIOLIGHT_ORIENTATION_WORLD, 1 << 6);
+ SET_FLAG_FROM_TEST(index, wpd->studio_light->flag & STUDIOLIGHT_ORIENTATION_VIEWNORMAL, 1 << 7);
+ /* 1 bit for hair */
+ SET_FLAG_FROM_TEST(index, is_hair, 1 << 8);
return index;
}
diff --git a/source/blender/draw/engines/workbench/workbench_private.h b/source/blender/draw/engines/workbench/workbench_private.h
index 00cb6666430..ac85f4c5296 100644
--- a/source/blender/draw/engines/workbench/workbench_private.h
+++ b/source/blender/draw/engines/workbench/workbench_private.h
@@ -38,17 +38,22 @@
#define WORKBENCH_ENGINE "BLENDER_WORKBENCH"
#define M_GOLDEN_RATION_CONJUGATE 0.618033988749895
-#define MAX_SHADERS (1 << 10)
-
-
+#define MAX_SHADERS (1 << 9)
+
+#define OB_SOLID_ENABLED(wpd) (wpd->drawtype & OB_SOLID)
+#define OB_TEXTURE_ENABLED(wpd) (wpd->drawtype & OB_TEXTURE)
+#define FLAT_ENABLED(wpd) (wpd->shading.light == V3D_LIGHTING_FLAT)
+#define STUDIOLIGHT_ENABLED(wpd) (wpd->shading.light == V3D_LIGHTING_STUDIO)
+#define MATCAP_ENABLED(wpd) (wpd->shading.light == V3D_LIGHTING_MATCAP && OB_SOLID_ENABLED(wpd))
+#define STUDIOLIGHT_ORIENTATION_WORLD_ENABLED(wpd) (STUDIOLIGHT_ENABLED(wpd) && (wpd->studio_light->flag & STUDIOLIGHT_ORIENTATION_WORLD))
+#define STUDIOLIGHT_ORIENTATION_CAMERA_ENABLED(wpd) (STUDIOLIGHT_ENABLED(wpd) && (wpd->studio_light->flag & STUDIOLIGHT_ORIENTATION_CAMERA))
+#define STUDIOLIGHT_ORIENTATION_VIEWNORMAL_ENABLED(wpd) (MATCAP_ENABLED(wpd) && (wpd->studio_light->flag & STUDIOLIGHT_ORIENTATION_VIEWNORMAL))
#define OBJECT_ID_PASS_ENABLED(wpd) (wpd->shading.flag & V3D_SHADING_OBJECT_OUTLINE)
#define SHADOW_ENABLED(wpd) (wpd->shading.flag & V3D_SHADING_SHADOW)
-#define SPECULAR_HIGHLIGHT_ENABLED(wpd) (wpd->shading.flag & V3D_SHADING_SPECULAR_HIGHLIGHT)
-#define NORMAL_VIEWPORT_PASS_ENABLED(wpd) (wpd->shading.light & V3D_LIGHTING_STUDIO || SHADOW_ENABLED(wpd) || SPECULAR_HIGHLIGHT_ENABLED (wpd))
+#define SPECULAR_HIGHLIGHT_ENABLED(wpd) ((wpd->shading.flag & V3D_SHADING_SPECULAR_HIGHLIGHT) && (!STUDIOLIGHT_ORIENTATION_VIEWNORMAL_ENABLED(wpd)))
+#define NORMAL_VIEWPORT_PASS_ENABLED(wpd) (MATCAP_ENABLED(wpd) || STUDIOLIGHT_ENABLED(wpd) || SHADOW_ENABLED(wpd) || SPECULAR_HIGHLIGHT_ENABLED(wpd))
#define NORMAL_ENCODING_ENABLED() (true)
#define WORKBENCH_REVEALAGE_ENABLED
-#define STUDIOLIGHT_ORIENTATION_WORLD_ENABLED(wpd) (wpd->studio_light->flag & STUDIOLIGHT_ORIENTATION_WORLD)
-#define STUDIOLIGHT_ORIENTATION_CAMERA_ENABLED(wpd) (wpd->studio_light->flag & STUDIOLIGHT_ORIENTATION_CAMERA)
typedef struct WORKBENCH_FramebufferList {
@@ -127,7 +132,8 @@ typedef struct WORKBENCH_UBO_Material {
float diffuse_color[4];
float specular_color[4];
float roughness;
- float pad[3];
+ int matcap_texture_index;
+ float pad[2];
} WORKBENCH_UBO_Material;
BLI_STATIC_ASSERT_ALIGN(WORKBENCH_UBO_Material, 16)