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:
Diffstat (limited to 'source/blender/draw/engines')
-rw-r--r--source/blender/draw/engines/eevee/eevee_engine.c9
-rw-r--r--source/blender/draw/engines/eevee/eevee_lookdev.c13
-rw-r--r--source/blender/draw/engines/eevee/eevee_materials.c2
-rw-r--r--source/blender/draw/engines/eevee/eevee_render.c2
-rw-r--r--source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl2
-rw-r--r--source/blender/draw/engines/workbench/shaders/workbench_deferred_composite_frag.glsl2
-rw-r--r--source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl14
-rw-r--r--source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl17
-rw-r--r--source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl8
-rw-r--r--source/blender/draw/engines/workbench/shaders/workbench_world_light_lib.glsl10
-rw-r--r--source/blender/draw/engines/workbench/workbench_data.c5
-rw-r--r--source/blender/draw/engines/workbench/workbench_deferred.c83
-rw-r--r--source/blender/draw/engines/workbench/workbench_forward.c101
-rw-r--r--source/blender/draw/engines/workbench/workbench_materials.c46
-rw-r--r--source/blender/draw/engines/workbench/workbench_private.h18
-rw-r--r--source/blender/draw/engines/workbench/workbench_studiolight.c8
16 files changed, 164 insertions, 176 deletions
diff --git a/source/blender/draw/engines/eevee/eevee_engine.c b/source/blender/draw/engines/eevee/eevee_engine.c
index d7c6684f086..d2400b8b651 100644
--- a/source/blender/draw/engines/eevee/eevee_engine.c
+++ b/source/blender/draw/engines/eevee/eevee_engine.c
@@ -128,16 +128,9 @@ static void eevee_cache_populate(void *vedata, Object *ob)
EEVEE_ViewLayerData *sldata = EEVEE_view_layer_data_ensure();
const DRWContextState *draw_ctx = DRW_context_state_get();
- const bool is_active = (ob == draw_ctx->obact);
bool cast_shadow = false;
- if (is_active) {
- if (DRW_object_is_mode_shade(ob) == true) {
- return;
- }
- }
-
- if (ob->base_flag & BASE_VISIBLED) {
+ if (ob->base_flag & BASE_VISIBLE) {
EEVEE_hair_cache_populate(vedata, sldata, ob, &cast_shadow);
}
diff --git a/source/blender/draw/engines/eevee/eevee_lookdev.c b/source/blender/draw/engines/eevee/eevee_lookdev.c
index 806fb65b8e8..e083c9b5eb5 100644
--- a/source/blender/draw/engines/eevee/eevee_lookdev.c
+++ b/source/blender/draw/engines/eevee/eevee_lookdev.c
@@ -45,7 +45,7 @@ void EEVEE_lookdev_cache_init(
StudioLight *sl = BKE_studiolight_find(v3d->shading.studio_light, STUDIOLIGHT_INTERNAL | STUDIOLIGHT_ORIENTATION_WORLD);
if ((sl->flag & STUDIOLIGHT_ORIENTATION_WORLD)) {
struct Gwn_Batch *geom = DRW_cache_fullscreen_quad_get();
- GPUTexture *tex;
+ GPUTexture *tex = NULL;
*grp = DRW_shgroup_create(shader, pass);
axis_angle_to_mat3_single(stl->g_data->studiolight_matrix, 'Z', v3d->shading.studiolight_rot_z);
@@ -59,15 +59,18 @@ void EEVEE_lookdev_cache_init(
if (!pinfo) {
/* Do not fadeout when doing probe rendering, only when drawing the background */
DRW_shgroup_uniform_float(*grp, "studioLightBackground", &v3d->shading.studiolight_background, 1);
-
- BKE_studiolight_ensure_flag(sl, STUDIOLIGHT_EQUIRECTANGULAR_IRRADIANCE_GPUTEXTURE);
- tex = sl->equirectangular_irradiance_gputexture;
+ if (v3d->shading.studiolight_background > 0.0f) {
+ BKE_studiolight_ensure_flag(sl, STUDIOLIGHT_EQUIRECTANGULAR_IRRADIANCE_GPUTEXTURE);
+ tex = sl->equirectangular_irradiance_gputexture;
+ }
}
else {
BKE_studiolight_ensure_flag(sl, STUDIOLIGHT_EQUIRECTANGULAR_RADIANCE_GPUTEXTURE);
tex = sl->equirectangular_radiance_gputexture;
}
- DRW_shgroup_uniform_texture(*grp, "image", tex);
+ if (tex != NULL) {
+ DRW_shgroup_uniform_texture(*grp, "image", tex);
+ }
/* Do we need to recalc the lightprobes? */
if (pinfo &&
diff --git a/source/blender/draw/engines/eevee/eevee_materials.c b/source/blender/draw/engines/eevee/eevee_materials.c
index 1a5c26f1c31..5cc20adf961 100644
--- a/source/blender/draw/engines/eevee/eevee_materials.c
+++ b/source/blender/draw/engines/eevee/eevee_materials.c
@@ -1014,7 +1014,7 @@ void EEVEE_materials_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
}
{
- DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_LESS_EQUAL | DRW_STATE_CLIP_PLANES | DRW_STATE_WIRE;
+ DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_EQUAL | DRW_STATE_CLIP_PLANES | DRW_STATE_WIRE;
psl->material_pass = DRW_pass_create("Material Shader Pass", state);
}
diff --git a/source/blender/draw/engines/eevee/eevee_render.c b/source/blender/draw/engines/eevee/eevee_render.c
index d24551976f9..c650a6945ac 100644
--- a/source/blender/draw/engines/eevee/eevee_render.c
+++ b/source/blender/draw/engines/eevee/eevee_render.c
@@ -145,7 +145,7 @@ void EEVEE_render_cache(
RE_engine_update_stats(engine, NULL, info);
bool cast_shadow = false;
- if (ob->base_flag & BASE_VISIBLED) {
+ if (ob->base_flag & BASE_VISIBLE) {
EEVEE_hair_cache_populate(vedata, sldata, ob, &cast_shadow);
}
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 2ba6e0e8e55..2d913c63b00 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl
@@ -4,7 +4,7 @@ struct LightData {
};
struct WorldData {
- vec3 spherical_harmonics_coefs[9];
+ vec3 spherical_harmonics_coefs[STUDIOLIGHT_SPHERICAL_HARMONICS_MAX_COMPONENTS];
vec4 background_color_low;
vec4 background_color_high;
vec4 object_outline_color;
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 4a1d88c29c1..c72df6b677d 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
@@ -106,7 +106,7 @@ void main()
#endif
#ifdef V3D_SHADING_SHADOW
- float light_factor = -dot(normal_viewport, world_data.light_direction_vs.xyz);
+ float light_factor = -dot(normal_viewport, world_data.lights[0].light_direction_vs.xyz);
/* The step function might be ok for meshes but it's
* clearly not the case for hairs. Do smoothstep in this case. */
float shadow_mix = (diffuse_color.a == 1.0 || diffuse_color.a == 0.0)
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 4a7d195a56a..1b3737193b0 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
@@ -1,4 +1,4 @@
-#ifdef OB_TEXTURE
+#ifdef V3D_SHADING_TEXTURE_COLOR
uniform sampler2D image;
#endif
uniform mat4 ProjectionMatrix;
@@ -10,7 +10,7 @@ uniform vec4 viewvecs[3];
#ifdef NORMAL_VIEWPORT_PASS_ENABLED
in vec3 normal_viewport;
#endif /* NORMAL_VIEWPORT_PASS_ENABLED */
-#ifdef OB_TEXTURE
+#ifdef V3D_SHADING_TEXTURE_COLOR
in vec2 uv_interp;
#endif
#ifdef STUDIOLIGHT_ORIENTATION_VIEWNORMAL
@@ -32,12 +32,12 @@ void main()
{
vec4 diffuse_color;
vec3 diffuse_light = vec3(1.0);
-#ifdef OB_SOLID
- diffuse_color = material_data.diffuse_color;
-#endif /* OB_SOLID */
-#ifdef OB_TEXTURE
+
+#ifdef V3D_SHADING_TEXTURE_COLOR
diffuse_color = texture(image, uv_interp);
-#endif /* OB_TEXTURE */
+#else
+ diffuse_color = material_data.diffuse_color;
+#endif /* V3D_SHADING_TEXTURE_COLOR */
vec2 uv_viewport = gl_FragCoord.xy * invertedViewportSize;
vec3 I_vs = view_vector_from_screen_uv(uv_viewport, viewvecs, ProjectionMatrix);
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 200850e3036..6aeb912377c 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
@@ -4,7 +4,7 @@ layout(std140) uniform material_block {
MaterialData material_data;
};
-#ifdef OB_TEXTURE
+#ifdef V3D_SHADING_TEXTURE_COLOR
uniform sampler2D image;
#endif
@@ -12,9 +12,9 @@ uniform sampler2D image;
in vec3 normal_viewport;
#endif /* NORMAL_VIEWPORT_PASS_ENABLED */
-#ifdef OB_TEXTURE
+#ifdef V3D_SHADING_TEXTURE_COLOR
in vec2 uv_interp;
-#endif /* OB_TEXTURE */
+#endif /* V3D_SHADING_TEXTURE_COLOR */
#ifdef HAIR_SHADER
flat in float hair_rand;
@@ -40,17 +40,16 @@ void main()
n = normalize(n);
#endif
-#ifdef OB_SOLID
+#ifdef V3D_SHADING_TEXTURE_COLOR
+ diffuseColor = texture(image, uv_interp);
+#else
diffuseColor = vec4(material_data.diffuse_color.rgb, 0.0);
# ifdef STUDIOLIGHT_ORIENTATION_VIEWNORMAL
-
specularColor = vec4(material_data.diffuse_color.rgb, 0.0);
+
# endif
-#endif /* OB_SOLID */
+#endif /* V3D_SHADING_TEXTURE_COLOR */
-#ifdef OB_TEXTURE
- diffuseColor = texture(image, uv_interp);
-#endif /* OB_TEXTURE */
#ifdef HAIR_SHADER
float hair_color_variation = hair_rand * 0.1;
diffuseColor.rgb = clamp(diffuseColor.rgb - hair_color_variation, 0.0, 1.0);
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl b/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl
index 82443e7336b..66b529fcf5e 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl
@@ -9,7 +9,7 @@ in vec3 pos;
in vec3 nor;
in vec2 uv;
#else /* HAIR_SHADER */
-# ifdef OB_TEXTURE
+# ifdef V3D_SHADING_TEXTURE_COLOR
uniform samplerBuffer u; /* active texture layer */
# endif
flat out float hair_rand;
@@ -19,7 +19,7 @@ flat out float hair_rand;
out vec3 normal_viewport;
#endif
-#ifdef OB_TEXTURE
+#ifdef V3D_SHADING_TEXTURE_COLOR
out vec2 uv_interp;
#endif
@@ -34,7 +34,7 @@ float integer_noise(int n)
void main()
{
#ifdef HAIR_SHADER
-# ifdef OB_TEXTURE
+# ifdef V3D_SHADING_TEXTURE_COLOR
vec2 uv = hair_get_customdata_vec2(u);
# endif
float time, thick_time, thickness;
@@ -55,7 +55,7 @@ void main()
#else
gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0);
#endif
-#ifdef OB_TEXTURE
+#ifdef V3D_SHADING_TEXTURE_COLOR
uv_interp = uv;
#endif
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 71adc751f0a..b13c4f1b43b 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
@@ -1,32 +1,36 @@
#define BLINN
-vec3 spherical_harmonics_L2(vec3 N, vec3 spherical_harmonics_coefs[9])
+vec3 spherical_harmonics(vec3 N, vec3 spherical_harmonics_coefs[STUDIOLIGHT_SPHERICAL_HARMONICS_MAX_COMPONENTS])
{
vec3 sh = vec3(0.0);
sh += 0.282095 * spherical_harmonics_coefs[0];
+#if STUDIOLIGHT_SPHERICAL_HARMONICS_LEVEL > 0
sh += -0.488603 * N.z * spherical_harmonics_coefs[1];
sh += 0.488603 * N.y * spherical_harmonics_coefs[2];
sh += -0.488603 * N.x * spherical_harmonics_coefs[3];
+#endif
+#if STUDIOLIGHT_SPHERICAL_HARMONICS_LEVEL > 1
sh += 1.092548 * N.x * N.z * spherical_harmonics_coefs[4];
sh += -1.092548 * N.z * N.y * spherical_harmonics_coefs[5];
sh += 0.315392 * (3.0 * N.y * N.y - 1.0) * spherical_harmonics_coefs[6];
sh += -1.092548 * N.x * N.y * spherical_harmonics_coefs[7];
sh += 0.546274 * (N.x * N.x - N.z * N.z) * spherical_harmonics_coefs[8];
+#endif
return sh;
}
vec3 get_world_diffuse_light(WorldData world_data, vec3 N)
{
- return (spherical_harmonics_L2(vec3(N.x, N.y, -N.z), world_data.spherical_harmonics_coefs));
+ return (spherical_harmonics(vec3(N.x, N.y, -N.z), world_data.spherical_harmonics_coefs));
}
vec3 get_camera_diffuse_light(WorldData world_data, vec3 N)
{
- return (spherical_harmonics_L2(vec3(N.x, -N.z, -N.y), world_data.spherical_harmonics_coefs));
+ return (spherical_harmonics(vec3(N.x, -N.z, -N.y), world_data.spherical_harmonics_coefs));
}
/* N And I are in View Space. */
diff --git a/source/blender/draw/engines/workbench/workbench_data.c b/source/blender/draw/engines/workbench/workbench_data.c
index b4a2330f173..d544e7614ab 100644
--- a/source/blender/draw/engines/workbench/workbench_data.c
+++ b/source/blender/draw/engines/workbench/workbench_data.c
@@ -15,7 +15,6 @@ void workbench_private_data_init(WORKBENCH_PrivateData *wpd)
View3D *v3d = draw_ctx->v3d;
if (v3d) {
wpd->shading = v3d->shading;
- wpd->drawtype = v3d->drawtype;
if (wpd->shading.light == V3D_LIGHTING_MATCAP) {
wpd->studio_light = BKE_studiolight_find(
wpd->shading.matcap, STUDIOLIGHT_ORIENTATION_VIEWNORMAL);
@@ -30,7 +29,6 @@ void workbench_private_data_init(WORKBENCH_PrivateData *wpd)
wpd->shading.light = V3D_LIGHTING_STUDIO;
wpd->shading.shadow_intensity = 0.5;
copy_v3_fl(wpd->shading.single_color, 0.8f);
- wpd->drawtype = OB_SOLID;
wpd->studio_light = BKE_studiolight_find_first(STUDIOLIGHT_INTERNAL);
}
wpd->shadow_multiplier = 1.0 - wpd->shading.shadow_intensity;
@@ -155,8 +153,7 @@ void workbench_private_data_get_light_direction(WORKBENCH_PrivateData *wpd, floa
copy_v3_v3(light_direction, scene->display.light_direction);
negate_v3(light_direction);
-
- DRW_uniformbuffer_update(wpd->world_ubo, &wpd->world_data);
+ DRW_uniformbuffer_update(wpd->world_ubo, wd);
}
static void workbench_private_material_free(void *data)
diff --git a/source/blender/draw/engines/workbench/workbench_deferred.c b/source/blender/draw/engines/workbench/workbench_deferred.c
index 3bf7c34d5eb..4fe3e92f10c 100644
--- a/source/blender/draw/engines/workbench/workbench_deferred.c
+++ b/source/blender/draw/engines/workbench/workbench_deferred.c
@@ -49,7 +49,7 @@
/* *********** STATIC *********** */
-// #define DEBUG_SHADOW_VOLUME
+/* #define DEBUG_SHADOW_VOLUME */
#ifdef DEBUG_SHADOW_VOLUME
# include "draw_debug.h"
@@ -76,7 +76,6 @@ static struct {
struct GPUTexture *effect_buffer_tx; /* ref only, not alloced */
SceneDisplay display; /* world light direction for shadows */
- float light_direction_vs[3];
int next_object_id;
float normal_world_matrix[3][3];
@@ -176,17 +175,17 @@ static char *workbench_build_cavity_frag(void)
return str;
}
-static void ensure_deferred_shaders(WORKBENCH_PrivateData *wpd, int index, int drawtype, bool is_hair)
+static void ensure_deferred_shaders(WORKBENCH_PrivateData *wpd, int index, bool use_textures, bool is_hair)
{
if (e_data.prepass_sh_cache[index] == NULL) {
- char *defines = workbench_material_build_defines(wpd, drawtype, is_hair);
+ char *defines = workbench_material_build_defines(wpd, use_textures, is_hair);
char *composite_frag = workbench_build_composite_frag(wpd);
char *prepass_vert = workbench_build_prepass_vert();
char *prepass_frag = workbench_build_prepass_frag();
e_data.prepass_sh_cache[index] = DRW_shader_create(
prepass_vert, NULL,
prepass_frag, defines);
- if (drawtype == OB_SOLID && !is_hair) {
+ if (!use_textures && !is_hair) {
e_data.composite_sh_cache[index] = DRW_shader_create_fullscreen(composite_frag, defines);
}
MEM_freeN(prepass_vert);
@@ -198,15 +197,15 @@ static void ensure_deferred_shaders(WORKBENCH_PrivateData *wpd, int index, int d
static void select_deferred_shaders(WORKBENCH_PrivateData *wpd)
{
- int index_solid = workbench_material_get_shader_index(wpd, OB_SOLID, false);
- int index_solid_hair = workbench_material_get_shader_index(wpd, OB_SOLID, true);
- int index_texture = workbench_material_get_shader_index(wpd, OB_TEXTURE, false);
- int index_texture_hair = workbench_material_get_shader_index(wpd, OB_TEXTURE, true);
+ int index_solid = workbench_material_get_shader_index(wpd, false, false);
+ int index_solid_hair = workbench_material_get_shader_index(wpd, false, true);
+ int index_texture = workbench_material_get_shader_index(wpd, true, false);
+ int index_texture_hair = workbench_material_get_shader_index(wpd, true, true);
- ensure_deferred_shaders(wpd, index_solid, OB_SOLID, false);
- ensure_deferred_shaders(wpd, index_solid_hair, OB_SOLID, true);
- ensure_deferred_shaders(wpd, index_texture, OB_TEXTURE, false);
- ensure_deferred_shaders(wpd, index_texture_hair, OB_TEXTURE, true);
+ ensure_deferred_shaders(wpd, index_solid, false, false);
+ ensure_deferred_shaders(wpd, index_solid_hair, false, true);
+ ensure_deferred_shaders(wpd, index_texture, true, false);
+ ensure_deferred_shaders(wpd, index_texture_hair, true, true);
wpd->prepass_solid_sh = e_data.prepass_sh_cache[index_solid];
wpd->prepass_solid_hair_sh = e_data.prepass_sh_cache[index_solid_hair];
@@ -485,8 +484,6 @@ void workbench_deferred_cache_init(WORKBENCH_Data *vedata)
WORKBENCH_PrivateData *wpd = stl->g_data;
DRWShadingGroup *grp;
const DRWContextState *draw_ctx = DRW_context_state_get();
- static float light_multiplier = 1.0f;
-
Scene *scene = draw_ctx->scene;
@@ -494,9 +491,9 @@ void workbench_deferred_cache_init(WORKBENCH_Data *vedata)
/* Deferred Mix Pass */
{
workbench_private_data_get_light_direction(wpd, e_data.display.light_direction);
+ studiolight_update_light(wpd, e_data.display.light_direction);
e_data.display.shadow_shift = scene->display.shadow_shift;
- copy_v3_v3(e_data.light_direction_vs, wpd->world_data.lights[0].light_direction_vs);
if (SHADOW_ENABLED(wpd)) {
psl->composite_pass = DRW_pass_create(
@@ -504,7 +501,7 @@ void workbench_deferred_cache_init(WORKBENCH_Data *vedata)
grp = DRW_shgroup_create(wpd->composite_sh, psl->composite_pass);
workbench_composite_uniforms(wpd, grp);
DRW_shgroup_stencil_mask(grp, 0x00);
- DRW_shgroup_uniform_float(grp, "lightMultiplier", &light_multiplier, 1);
+ DRW_shgroup_uniform_float_copy(grp, "lightMultiplier", 1.0f);
DRW_shgroup_uniform_float(grp, "shadowMultiplier", &wpd->shadow_multiplier, 1);
DRW_shgroup_uniform_float(grp, "shadowShift", &scene->display.shadow_shift, 1);
DRW_shgroup_call_add(grp, DRW_cache_fullscreen_quad_get(), NULL);
@@ -548,7 +545,6 @@ void workbench_deferred_cache_init(WORKBENCH_Data *vedata)
DRW_shgroup_call_add(grp, DRW_cache_fullscreen_quad_get(), NULL);
#endif
- studiolight_update_light(wpd, e_data.display.light_direction);
}
else {
psl->composite_pass = DRW_pass_create(
@@ -561,7 +557,7 @@ void workbench_deferred_cache_init(WORKBENCH_Data *vedata)
}
static WORKBENCH_MaterialData *get_or_create_material_data(
- WORKBENCH_Data *vedata, Object *ob, Material *mat, Image *ima, int drawtype)
+ WORKBENCH_Data *vedata, Object *ob, Material *mat, Image *ima, int color_type)
{
WORKBENCH_StorageList *stl = vedata->stl;
WORKBENCH_PassList *psl = vedata->psl;
@@ -574,7 +570,7 @@ static WORKBENCH_MaterialData *get_or_create_material_data(
/* Solid */
workbench_material_update_data(wpd, ob, mat, &material_template);
material_template.object_id = OBJECT_ID_PASS_ENABLED(wpd) ? engine_object_data->object_id : 1;
- material_template.drawtype = drawtype;
+ material_template.color_type = color_type;
material_template.ima = ima;
uint hash = workbench_material_get_hash(&material_template);
@@ -582,22 +578,15 @@ static WORKBENCH_MaterialData *get_or_create_material_data(
if (material == NULL) {
material = MEM_mallocN(sizeof(WORKBENCH_MaterialData), __func__);
material->shgrp = DRW_shgroup_create(
- drawtype == OB_SOLID ? wpd->prepass_solid_sh : wpd->prepass_texture_sh, psl->prepass_pass);
+ color_type == V3D_SHADING_TEXTURE_COLOR ? wpd->prepass_texture_sh: wpd->prepass_solid_sh, psl->prepass_pass);
DRW_shgroup_stencil_mask(material->shgrp, 0xFF);
material->object_id = material_template.object_id;
copy_v4_v4(material->material_data.diffuse_color, material_template.material_data.diffuse_color);
copy_v4_v4(material->material_data.specular_color, material_template.material_data.specular_color);
material->material_data.roughness = material_template.material_data.roughness;
- switch (drawtype) {
- case OB_SOLID:
- break;
-
- case OB_TEXTURE:
- {
- GPUTexture *tex = GPU_texture_from_blender(ima, NULL, GL_TEXTURE_2D, false, 0.0);
- DRW_shgroup_uniform_texture(material->shgrp, "image", tex);
- break;
- }
+ if (color_type == V3D_SHADING_TEXTURE_COLOR) {
+ GPUTexture *tex = GPU_texture_from_blender(ima, NULL, GL_TEXTURE_2D, false, 0.0);
+ DRW_shgroup_uniform_texture(material->shgrp, "image", tex);
}
DRW_shgroup_uniform_int(material->shgrp, "object_id", &material->object_id, 1);
material->material_ubo = DRW_uniformbuffer_create(sizeof(WORKBENCH_UBO_Material), &material->material_data);
@@ -634,19 +623,11 @@ static void workbench_cache_populate_particles(WORKBENCH_Data *vedata, Object *o
if (draw_as == PART_DRAW_PATH) {
Image *image = NULL;
Material *mat = give_current_material(ob, part->omat);
- int mat_drawtype = OB_SOLID;
+ ED_object_get_active_image(ob, part->omat, &image, NULL, NULL, NULL);
+ int color_type = workbench_material_determine_color_type(wpd, image);
+ WORKBENCH_MaterialData *material = get_or_create_material_data(vedata, ob, mat, image, color_type);
- if (wpd->drawtype == OB_TEXTURE) {
- ED_object_get_active_image(ob, part->omat, &image, NULL, NULL, NULL);
- /* use OB_SOLID when no texture could be determined */
- if (image) {
- mat_drawtype = OB_TEXTURE;
- }
- }
-
- WORKBENCH_MaterialData *material = get_or_create_material_data(vedata, ob, mat, image, mat_drawtype);
-
- struct GPUShader *shader = (mat_drawtype == OB_SOLID)
+ struct GPUShader *shader = (color_type != V3D_SHADING_TEXTURE_COLOR)
? wpd->prepass_solid_hair_sh
: wpd->prepass_texture_hair_sh;
DRWShadingGroup *shgrp = DRW_shgroup_hair_create(
@@ -686,7 +667,7 @@ void workbench_deferred_solid_cache_populate(WORKBENCH_Data *vedata, Object *ob)
const bool is_active = (ob == draw_ctx->obact);
const bool is_sculpt_mode = is_active && (draw_ctx->object_mode & OB_MODE_SCULPT) != 0;
bool is_drawn = false;
- if (!is_sculpt_mode && wpd->drawtype == OB_TEXTURE && ELEM(ob->type, OB_MESH)) {
+ if (!is_sculpt_mode && TEXTURE_DRAWING_ENABLED(wpd) && ELEM(ob->type, OB_MESH)) {
const Mesh *me = ob->data;
if (me->mloopuv) {
const int materials_len = MAX2(1, (is_sculpt_mode ? 1 : ob->totcol));
@@ -701,12 +682,8 @@ void workbench_deferred_solid_cache_populate(WORKBENCH_Data *vedata, Object *ob)
Material *mat = give_current_material(ob, i + 1);
Image *image;
ED_object_get_active_image(ob, i + 1, &image, NULL, NULL, NULL);
- /* use OB_SOLID when no texture could be determined */
- int mat_drawtype = OB_SOLID;
- if (image) {
- mat_drawtype = OB_TEXTURE;
- }
- material = get_or_create_material_data(vedata, ob, mat, image, mat_drawtype);
+ int color_type = workbench_material_determine_color_type(wpd, image);
+ material = get_or_create_material_data(vedata, ob, mat, image, color_type);
DRW_shgroup_call_object_add(material->shgrp, geom_array[i], ob);
}
is_drawn = true;
@@ -716,11 +693,11 @@ void workbench_deferred_solid_cache_populate(WORKBENCH_Data *vedata, Object *ob)
/* Fallback from not drawn OB_TEXTURE mode or just OB_SOLID mode */
if (!is_drawn) {
- if ((wpd->shading.color_type != V3D_SHADING_MATERIAL_COLOR)) {
+ if (ELEM(wpd->shading.color_type, V3D_SHADING_SINGLE_COLOR, V3D_SHADING_RANDOM_COLOR)) {
/* No material split needed */
struct Gwn_Batch *geom = DRW_cache_object_surface_get(ob);
if (geom) {
- material = get_or_create_material_data(vedata, ob, NULL, NULL, OB_SOLID);
+ material = get_or_create_material_data(vedata, ob, NULL, NULL, wpd->shading.color_type);
if (is_sculpt_mode) {
DRW_shgroup_call_sculpt_add(material->shgrp, ob, ob->obmat);
}
@@ -745,7 +722,7 @@ void workbench_deferred_solid_cache_populate(WORKBENCH_Data *vedata, Object *ob)
}
Material *mat = give_current_material(ob, i + 1);
- material = get_or_create_material_data(vedata, ob, mat, NULL, OB_SOLID);
+ material = get_or_create_material_data(vedata, ob, mat, NULL, V3D_SHADING_MATERIAL_COLOR);
if (is_sculpt_mode) {
DRW_shgroup_call_sculpt_add(material->shgrp, ob, ob->obmat);
}
diff --git a/source/blender/draw/engines/workbench/workbench_forward.c b/source/blender/draw/engines/workbench/workbench_forward.c
index db07f9bb6f5..9f23cd5b43b 100644
--- a/source/blender/draw/engines/workbench/workbench_forward.c
+++ b/source/blender/draw/engines/workbench/workbench_forward.c
@@ -144,7 +144,7 @@ static void workbench_init_object_data(ObjectEngineData *engine_data)
}
static WORKBENCH_MaterialData *get_or_create_material_data(
- WORKBENCH_Data *vedata, Object *ob, Material *mat, Image *ima, int drawtype)
+ WORKBENCH_Data *vedata, Object *ob, Material *mat, Image *ima, int color_type)
{
WORKBENCH_StorageList *stl = vedata->stl;
WORKBENCH_PassList *psl = vedata->psl;
@@ -158,7 +158,7 @@ static WORKBENCH_MaterialData *get_or_create_material_data(
/* Solid */
workbench_material_update_data(wpd, ob, mat, &material_template);
material_template.object_id = OBJECT_ID_PASS_ENABLED(wpd) ? engine_object_data->object_id : 1;
- material_template.drawtype = drawtype;
+ material_template.color_type = color_type;
material_template.ima = ima;
uint hash = workbench_material_get_hash(&material_template);
@@ -168,7 +168,7 @@ static WORKBENCH_MaterialData *get_or_create_material_data(
/* transparent accum */
grp = DRW_shgroup_create(
- drawtype == OB_SOLID ? wpd->transparent_accum_sh : wpd->transparent_accum_texture_sh,
+ color_type == V3D_SHADING_TEXTURE_COLOR ? wpd->transparent_accum_texture_sh: wpd->transparent_accum_sh,
psl->transparent_accum_pass);
DRW_shgroup_uniform_block(grp, "world_block", wpd->world_ubo);
DRW_shgroup_uniform_float(grp, "alpha", &wpd->shading.xray_alpha, 1);
@@ -178,26 +178,19 @@ static WORKBENCH_MaterialData *get_or_create_material_data(
copy_v4_v4(material->material_data.diffuse_color, material_template.material_data.diffuse_color);
copy_v4_v4(material->material_data.specular_color, material_template.material_data.specular_color);
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);
- }
- if (SPECULAR_HIGHLIGHT_ENABLED(wpd) || MATCAP_ENABLED(wpd)) {
- DRW_shgroup_uniform_vec2(grp, "invertedViewportSize", DRW_viewport_invert_size_get(), 1);
- }
- break;
- }
- case OB_TEXTURE:
- {
- GPUTexture *tex = GPU_texture_from_blender(ima, NULL, GL_TEXTURE_2D, false, 0.0f);
- DRW_shgroup_uniform_texture(grp, "image", tex);
- break;
- }
+ if (color_type == V3D_SHADING_TEXTURE_COLOR) {
+ GPUTexture *tex = GPU_texture_from_blender(ima, NULL, GL_TEXTURE_2D, false, 0.0f);
+ DRW_shgroup_uniform_texture(grp, "image", tex);
}
+ 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);
+ }
+ if (SPECULAR_HIGHLIGHT_ENABLED(wpd) || MATCAP_ENABLED(wpd)) {
+ DRW_shgroup_uniform_vec2(grp, "invertedViewportSize", DRW_viewport_invert_size_get(), 1);
+ }
+
material->material_ubo = DRW_uniformbuffer_create(sizeof(WORKBENCH_UBO_Material), &material->material_data);
DRW_shgroup_uniform_block(grp, "material_block", material->material_ubo);
material->shgrp = grp;
@@ -211,10 +204,10 @@ static WORKBENCH_MaterialData *get_or_create_material_data(
return material;
}
-static void ensure_forward_shaders(WORKBENCH_PrivateData *wpd, int index, int drawtype, bool is_hair)
+static void ensure_forward_shaders(WORKBENCH_PrivateData *wpd, int index, bool use_textures, bool is_hair)
{
- if (e_data.composite_sh_cache[index] == NULL && drawtype == OB_SOLID && !is_hair) {
- char *defines = workbench_material_build_defines(wpd, drawtype, is_hair);
+ if (e_data.composite_sh_cache[index] == NULL && !use_textures && !is_hair) {
+ char *defines = workbench_material_build_defines(wpd, use_textures, is_hair);
char *composite_frag = workbench_build_forward_composite_frag();
e_data.composite_sh_cache[index] = DRW_shader_create_fullscreen(composite_frag, defines);
MEM_freeN(composite_frag);
@@ -222,7 +215,7 @@ static void ensure_forward_shaders(WORKBENCH_PrivateData *wpd, int index, int dr
}
if (e_data.transparent_accum_sh_cache[index] == NULL) {
- char *defines = workbench_material_build_defines(wpd, drawtype, is_hair);
+ char *defines = workbench_material_build_defines(wpd, use_textures, is_hair);
char *transparent_accum_vert = workbench_build_forward_vert();
char *transparent_accum_frag = workbench_build_forward_transparent_accum_frag();
e_data.transparent_accum_sh_cache[index] = DRW_shader_create(
@@ -236,15 +229,15 @@ static void ensure_forward_shaders(WORKBENCH_PrivateData *wpd, int index, int dr
static void select_forward_shaders(WORKBENCH_PrivateData *wpd)
{
- int index_solid = workbench_material_get_shader_index(wpd, OB_SOLID, false);
- int index_solid_hair = workbench_material_get_shader_index(wpd, OB_SOLID, true);
- int index_texture = workbench_material_get_shader_index(wpd, OB_TEXTURE, false);
- int index_texture_hair = workbench_material_get_shader_index(wpd, OB_TEXTURE, true);
+ int index_solid = workbench_material_get_shader_index(wpd, false, false);
+ int index_solid_hair = workbench_material_get_shader_index(wpd, false, true);
+ int index_texture = workbench_material_get_shader_index(wpd, true, false);
+ int index_texture_hair = workbench_material_get_shader_index(wpd, true, true);
- ensure_forward_shaders(wpd, index_solid, OB_SOLID, false);
- ensure_forward_shaders(wpd, index_solid_hair, OB_SOLID, true);
- ensure_forward_shaders(wpd, index_texture, OB_TEXTURE, false);
- ensure_forward_shaders(wpd, index_texture_hair, OB_TEXTURE, true);
+ ensure_forward_shaders(wpd, index_solid, false, false);
+ ensure_forward_shaders(wpd, index_solid_hair, false, true);
+ ensure_forward_shaders(wpd, index_texture, true, false);
+ ensure_forward_shaders(wpd, index_texture_hair, true, true);
wpd->composite_sh = e_data.composite_sh_cache[index_solid];
wpd->transparent_accum_sh = e_data.transparent_accum_sh_cache[index_solid];
@@ -340,7 +333,9 @@ void workbench_forward_engine_init(WORKBENCH_Data *vedata)
psl->composite_pass = DRW_pass_create("Composite", state);
grp = DRW_shgroup_create(wpd->composite_sh, psl->composite_pass);
- DRW_shgroup_uniform_texture_ref(grp, "objectId", &e_data.object_id_tx);
+ if (OBJECT_ID_PASS_ENABLED(wpd)) {
+ DRW_shgroup_uniform_texture_ref(grp, "objectId", &e_data.object_id_tx);
+ }
DRW_shgroup_uniform_texture_ref(grp, "transparentAccum", &e_data.transparent_accum_tx);
DRW_shgroup_uniform_texture_ref(grp, "transparentRevealage", &e_data.transparent_revealage_tx);
DRW_shgroup_uniform_block(grp, "world_block", wpd->world_ubo);
@@ -399,19 +394,11 @@ static void workbench_forward_cache_populate_particles(WORKBENCH_Data *vedata, O
if (draw_as == PART_DRAW_PATH) {
Image *image = NULL;
Material *mat = give_current_material(ob, part->omat);
- int mat_drawtype = OB_SOLID;
+ ED_object_get_active_image(ob, part->omat, &image, NULL, NULL, NULL);
+ int color_type = workbench_material_determine_color_type(wpd, image);
+ WORKBENCH_MaterialData *material = get_or_create_material_data(vedata, ob, mat, image, color_type);
- if (wpd->drawtype == OB_TEXTURE) {
- ED_object_get_active_image(ob, part->omat, &image, NULL, NULL, NULL);
- /* use OB_SOLID when no texture could be determined */
- if (image) {
- mat_drawtype = OB_TEXTURE;
- }
- }
-
- WORKBENCH_MaterialData *material = get_or_create_material_data(vedata, ob, mat, image, mat_drawtype);
-
- struct GPUShader *shader = (mat_drawtype == OB_SOLID)
+ struct GPUShader *shader = (color_type != V3D_SHADING_TEXTURE_COLOR)
? wpd->transparent_accum_hair_sh
: wpd->transparent_accum_texture_hair_sh;
DRWShadingGroup *shgrp = DRW_shgroup_hair_create(
@@ -461,14 +448,14 @@ void workbench_forward_cache_populate(WORKBENCH_Data *vedata, Object *ob)
return;
}
+ WORKBENCH_MaterialData *material;
if (ELEM(ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT, OB_MBALL)) {
const DRWContextState *draw_ctx = DRW_context_state_get();
const bool is_active = (ob == draw_ctx->obact);
const bool is_sculpt_mode = is_active && (draw_ctx->object_mode & OB_MODE_SCULPT) != 0;
bool is_drawn = false;
- WORKBENCH_MaterialData *material = get_or_create_material_data(vedata, ob, NULL, NULL, OB_SOLID);
- if (!is_sculpt_mode && wpd->drawtype == OB_TEXTURE && ELEM(ob->type, OB_MESH)) {
+ if (!is_sculpt_mode && TEXTURE_DRAWING_ENABLED(wpd) && ELEM(ob->type, OB_MESH)) {
const Mesh *me = ob->data;
if (me->mloopuv) {
const int materials_len = MAX2(1, (is_sculpt_mode ? 1 : ob->totcol));
@@ -484,11 +471,16 @@ void workbench_forward_cache_populate(WORKBENCH_Data *vedata, Object *ob)
Image *image;
ED_object_get_active_image(ob, i + 1, &image, NULL, NULL, NULL);
/* use OB_SOLID when no texture could be determined */
- int mat_drawtype = OB_SOLID;
- if (image) {
- mat_drawtype = OB_TEXTURE;
+
+ int color_type = wpd->shading.color_type;
+ if (color_type == V3D_SHADING_TEXTURE_COLOR) {
+ /* use OB_SOLID when no texture could be determined */
+ if (image == NULL) {
+ color_type = V3D_SHADING_MATERIAL_COLOR;
+ }
}
- material = get_or_create_material_data(vedata, ob, mat, image, mat_drawtype);
+
+ material = get_or_create_material_data(vedata, ob, mat, image, color_type);
DRW_shgroup_call_object_add(material->shgrp_object_outline, geom_array[i], ob);
DRW_shgroup_call_object_add(material->shgrp, geom_array[i], ob);
}
@@ -499,10 +491,11 @@ void workbench_forward_cache_populate(WORKBENCH_Data *vedata, Object *ob)
/* Fallback from not drawn OB_TEXTURE mode or just OB_SOLID mode */
if (!is_drawn) {
- if ((wpd->shading.color_type != V3D_SHADING_MATERIAL_COLOR)) {
+ if (ELEM(wpd->shading.color_type, V3D_SHADING_SINGLE_COLOR, V3D_SHADING_RANDOM_COLOR)) {
/* No material split needed */
struct Gwn_Batch *geom = DRW_cache_object_surface_get(ob);
if (geom) {
+ material = get_or_create_material_data(vedata, ob, NULL, NULL, wpd->shading.color_type);
if (is_sculpt_mode) {
DRW_shgroup_call_sculpt_add(material->shgrp_object_outline, ob, ob->obmat);
DRW_shgroup_call_sculpt_add(material->shgrp, ob, ob->obmat);
@@ -529,7 +522,7 @@ void workbench_forward_cache_populate(WORKBENCH_Data *vedata, Object *ob)
}
Material *mat = give_current_material(ob, i + 1);
- material = get_or_create_material_data(vedata, ob, mat, NULL, OB_SOLID);
+ material = get_or_create_material_data(vedata, ob, mat, NULL, V3D_SHADING_MATERIAL_COLOR);
if (is_sculpt_mode) {
DRW_shgroup_call_sculpt_add(material->shgrp_object_outline, ob, ob->obmat);
DRW_shgroup_call_sculpt_add(material->shgrp, ob, ob->obmat);
diff --git a/source/blender/draw/engines/workbench/workbench_materials.c b/source/blender/draw/engines/workbench/workbench_materials.c
index 231d9a9582a..76599fdce99 100644
--- a/source/blender/draw/engines/workbench/workbench_materials.c
+++ b/source/blender/draw/engines/workbench/workbench_materials.c
@@ -9,15 +9,15 @@
void workbench_material_update_data(WORKBENCH_PrivateData *wpd, Object *ob, Material *mat, WORKBENCH_MaterialData *data)
{
- /* When in OB_TEXTURE always uyse V3D_SHADING_MATERIAL_COLOR as fallback when no texture could be determined */
- int color_type = wpd->drawtype == OB_SOLID ? wpd->shading.color_type : V3D_SHADING_MATERIAL_COLOR;
+ /* When V3D_SHADING_TEXTURE_COLOR is active, use V3D_SHADING_MATERIAL_COLOR as fallback when no texture could be determined */
+ int color_type = wpd->shading.color_type == V3D_SHADING_TEXTURE_COLOR ? V3D_SHADING_MATERIAL_COLOR : wpd->shading.color_type;
static float default_diffuse_color[] = {0.8f, 0.8f, 0.8f, 1.0f};
static float default_specular_color[] = {0.5f, 0.5f, 0.5f, 0.5f};
copy_v4_v4(data->material_data.diffuse_color, default_diffuse_color);
copy_v4_v4(data->material_data.specular_color, default_specular_color);
data->material_data.roughness = 0.5f;
- if (DRW_object_is_paint_mode(ob) || color_type == V3D_SHADING_SINGLE_COLOR) {
+ if (color_type == V3D_SHADING_SINGLE_COLOR) {
copy_v3_v3(data->material_data.diffuse_color, wpd->shading.single_color);
}
else if (color_type == V3D_SHADING_RANDOM_COLOR) {
@@ -40,7 +40,7 @@ void workbench_material_update_data(WORKBENCH_PrivateData *wpd, Object *ob, Mate
}
}
-char *workbench_material_build_defines(WORKBENCH_PrivateData *wpd, int drawtype, bool is_hair)
+char *workbench_material_build_defines(WORKBENCH_PrivateData *wpd, bool use_textures, bool is_hair)
{
char *str = NULL;
@@ -79,15 +79,9 @@ char *workbench_material_build_defines(WORKBENCH_PrivateData *wpd, int drawtype,
if (NORMAL_VIEWPORT_PASS_ENABLED(wpd)) {
BLI_dynstr_appendf(ds, "#define NORMAL_VIEWPORT_PASS_ENABLED\n");
}
- switch (drawtype) {
- case OB_SOLID:
- BLI_dynstr_appendf(ds, "#define OB_SOLID\n");
- break;
- case OB_TEXTURE:
- BLI_dynstr_appendf(ds, "#define OB_TEXTURE\n");
- break;
+ if (use_textures) {
+ BLI_dynstr_appendf(ds, "#define V3D_SHADING_TEXTURE_COLOR\n");
}
-
if (NORMAL_ENCODING_ENABLED()) {
BLI_dynstr_appendf(ds, "#define WORKBENCH_ENCODE_NORMALS\n");
}
@@ -95,6 +89,17 @@ char *workbench_material_build_defines(WORKBENCH_PrivateData *wpd, int drawtype,
BLI_dynstr_appendf(ds, "#define HAIR_SHADER\n");
}
+#if STUDIOLIGHT_SPHERICAL_HARMONICS_LEVEL == 0
+ BLI_dynstr_appendf(ds, "#define STUDIOLIGHT_SPHERICAL_HARMONICS_LEVEL 0\n");
+#endif
+#if STUDIOLIGHT_SPHERICAL_HARMONICS_LEVEL == 1
+ BLI_dynstr_appendf(ds, "#define STUDIOLIGHT_SPHERICAL_HARMONICS_LEVEL 1\n");
+#endif
+#if STUDIOLIGHT_SPHERICAL_HARMONICS_LEVEL == 2
+ BLI_dynstr_appendf(ds, "#define STUDIOLIGHT_SPHERICAL_HARMONICS_LEVEL 2\n");
+#endif
+ BLI_dynstr_appendf(ds, "#define STUDIOLIGHT_SPHERICAL_HARMONICS_MAX_COMPONENTS 9\n");
+
str = BLI_dynstr_get_cstring(ds);
BLI_dynstr_free(ds);
return str;
@@ -118,19 +123,19 @@ uint workbench_material_get_hash(WORKBENCH_MaterialData *material_template)
input[3] = (uint)(material_template->material_data.roughness * 512);
result += BLI_ghashutil_uinthash_v4_murmur(input);
- if (material_template->drawtype == OB_TEXTURE) {
+ if (material_template->color_type == V3D_SHADING_TEXTURE_COLOR) {
/* add texture reference */
result += BLI_ghashutil_inthash_p_murmur(material_template->ima);
}
return result;
}
-int workbench_material_get_shader_index(WORKBENCH_PrivateData *wpd, int drawtype, bool is_hair)
+int workbench_material_get_shader_index(WORKBENCH_PrivateData *wpd, bool use_textures, bool is_hair)
{
/* NOTE: change MAX_SHADERS accordingly when modifying this function. */
int index = 0;
- /* 1 bit OB_SOLID and OB_TEXTURE */
- SET_FLAG_FROM_TEST(index, drawtype == OB_TEXTURE, 1 << 0);
+ /* 1 bit V3D_SHADING_TEXTURE_COLOR */
+ SET_FLAG_FROM_TEST(index, use_textures, 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 */
@@ -160,3 +165,12 @@ void workbench_material_set_normal_world_matrix(
DRW_shgroup_uniform_mat3(grp, "normalWorldMatrix", persistent_matrix);
}
}
+
+int workbench_material_determine_color_type(WORKBENCH_PrivateData *wpd, Image *ima)
+{
+ int color_type = wpd->shading.color_type;
+ if (color_type == V3D_SHADING_TEXTURE_COLOR && ima == NULL) {
+ color_type = V3D_SHADING_MATERIAL_COLOR;
+ }
+ return color_type;
+}
diff --git a/source/blender/draw/engines/workbench/workbench_private.h b/source/blender/draw/engines/workbench/workbench_private.h
index 9e43a5c4a48..57cfd6b4718 100644
--- a/source/blender/draw/engines/workbench/workbench_private.h
+++ b/source/blender/draw/engines/workbench/workbench_private.h
@@ -41,11 +41,10 @@
#define M_GOLDEN_RATION_CONJUGATE 0.618033988749895
#define MAX_SHADERS (1 << 10)
-#define OB_SOLID_ENABLED(wpd) (wpd->drawtype & OB_SOLID)
-#define OB_TEXTURE_ENABLED(wpd) (wpd->drawtype & OB_TEXTURE)
+#define TEXTURE_DRAWING_ENABLED(wpd) (wpd->color_type & V3D_SHADING_TEXTURE_COLOR)
#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 MATCAP_ENABLED(wpd) (wpd->shading.light == V3D_LIGHTING_MATCAP)
#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))
@@ -57,6 +56,8 @@
#define NORMAL_VIEWPORT_COMP_PASS_ENABLED(wpd) (MATCAP_ENABLED(wpd) || STUDIOLIGHT_ENABLED(wpd) || SHADOW_ENABLED(wpd) || SPECULAR_HIGHLIGHT_ENABLED(wpd))
#define NORMAL_VIEWPORT_PASS_ENABLED(wpd) (NORMAL_VIEWPORT_COMP_PASS_ENABLED(wpd) || CAVITY_ENABLED(wpd))
#define NORMAL_ENCODING_ENABLED() (true)
+#define TEXTURE_DRAWING_ENABLED(wpd) (wpd->color_type & V3D_SHADING_TEXTURE_COLOR)
+
typedef struct WORKBENCH_FramebufferList {
/* Deferred render buffers */
@@ -112,7 +113,7 @@ typedef struct WORKBENCH_UBO_Light {
} WORKBENCH_UBO_Light;
typedef struct WORKBENCH_UBO_World {
- float spherical_harmonics_coefs[9][4];
+ float spherical_harmonics_coefs[STUDIOLIGHT_SPHERICAL_HARMONICS_MAX_COMPONENTS][4];
float background_color_low[4];
float background_color_high[4];
float object_outline_color[4];
@@ -147,7 +148,7 @@ typedef struct WORKBENCH_PrivateData {
View3DShading shading;
StudioLight *studio_light;
UserDef *user_preferences;
- int drawtype;
+ int color_type;
struct GPUUniformBuffer *world_ubo;
struct DRWShadingGroup *shadow_shgrp;
struct DRWShadingGroup *depth_shgrp;
@@ -176,7 +177,7 @@ typedef struct WORKBENCH_MaterialData {
struct GPUUniformBuffer *material_ubo;
int object_id;
- int drawtype;
+ int color_type;
Image *ima;
/* Linked shgroup for drawing */
@@ -228,10 +229,11 @@ void workbench_forward_cache_populate(WORKBENCH_Data *vedata, Object *ob);
void workbench_forward_cache_finish(WORKBENCH_Data *vedata);
/* workbench_materials.c */
-char *workbench_material_build_defines(WORKBENCH_PrivateData *wpd, int drawtype, bool is_hair);
+int workbench_material_determine_color_type(WORKBENCH_PrivateData *wpd, Image *ima);
+char *workbench_material_build_defines(WORKBENCH_PrivateData *wpd, bool use_textures, bool is_hair);
void workbench_material_update_data(WORKBENCH_PrivateData *wpd, Object *ob, Material *mat, WORKBENCH_MaterialData *data);
uint workbench_material_get_hash(WORKBENCH_MaterialData *material_template);
-int workbench_material_get_shader_index(WORKBENCH_PrivateData *wpd, int drawtype, bool is_hair);
+int workbench_material_get_shader_index(WORKBENCH_PrivateData *wpd, bool use_textures, bool is_hair);
void workbench_material_set_normal_world_matrix(
DRWShadingGroup *grp, WORKBENCH_PrivateData *wpd, float persistent_matrix[3][3]);
diff --git a/source/blender/draw/engines/workbench/workbench_studiolight.c b/source/blender/draw/engines/workbench/workbench_studiolight.c
index e5e24cbb88a..f9e5df91388 100644
--- a/source/blender/draw/engines/workbench/workbench_studiolight.c
+++ b/source/blender/draw/engines/workbench/workbench_studiolight.c
@@ -34,10 +34,15 @@
void studiolight_update_world(StudioLight *sl, WORKBENCH_UBO_World *wd)
{
+ int i;
BKE_studiolight_ensure_flag(sl, STUDIOLIGHT_SPHERICAL_HARMONICS_COEFFICIENTS_CALCULATED);
- for (int i = 0; i < 9; i++) {
+
+ for (i = 0; i < STUDIOLIGHT_SPHERICAL_HARMONICS_COMPONENTS; i++) {
copy_v3_v3(wd->spherical_harmonics_coefs[i], sl->spherical_harmonics_coefs[i]);
}
+ for (; i < STUDIOLIGHT_SPHERICAL_HARMONICS_MAX_COMPONENTS; i++) {
+ copy_v3_fl(wd->spherical_harmonics_coefs[i], 0.0);
+ }
}
static void compute_parallel_lines_nor_and_dist(const float v1[2], const float v2[2], const float v3[2], float r_line[2])
@@ -121,6 +126,7 @@ static BoundBox *studiolight_object_shadow_bbox_get(WORKBENCH_PrivateData *wpd,
for (int i = 0; i < 8; ++i) {
mul_m4_v3(wpd->shadow_mat, oed->shadow_bbox.vec[i]);
}
+ oed->shadow_bbox_dirty = false;
}
return &oed->shadow_bbox;