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:
-rw-r--r--release/scripts/startup/bl_ui/properties_scene.py1
-rw-r--r--source/blender/blenkernel/intern/scene.c1
-rw-r--r--source/blender/blenloader/intern/versioning_280.c5
-rw-r--r--source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl31
-rw-r--r--source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl28
-rw-r--r--source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl16
-rw-r--r--source/blender/draw/engines/workbench/shaders/workbench_shadow_vert.glsl2
-rw-r--r--source/blender/draw/engines/workbench/workbench_materials.c123
-rw-r--r--source/blender/draw/engines/workbench/workbench_private.h2
-rw-r--r--source/blender/draw/engines/workbench/workbench_studiolight.c2
-rw-r--r--source/blender/gpu/intern/gpu_texture.c7
-rw-r--r--source/blender/makesdna/DNA_scene_types.h2
-rw-r--r--source/blender/makesrna/intern/rna_scene.c10
13 files changed, 151 insertions, 79 deletions
diff --git a/release/scripts/startup/bl_ui/properties_scene.py b/release/scripts/startup/bl_ui/properties_scene.py
index cf17adfe5c1..545d0d696dc 100644
--- a/release/scripts/startup/bl_ui/properties_scene.py
+++ b/release/scripts/startup/bl_ui/properties_scene.py
@@ -441,6 +441,7 @@ class SCENE_PT_viewport_display(SceneButtonsPanel, Panel):
layout = self.layout
scene = context.scene
layout.prop(scene.display, "light_direction", text="")
+ layout.prop(scene.display, "shadow_shift")
class SCENE_PT_custom_props(SceneButtonsPanel, PropertyPanel, Panel):
diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c
index f95da4f723f..5fde2db0d15 100644
--- a/source/blender/blenkernel/intern/scene.c
+++ b/source/blender/blenkernel/intern/scene.c
@@ -824,6 +824,7 @@ void BKE_scene_init(Scene *sce)
/* SceneDisplay */
copy_v3_v3(sce->display.light_direction, (float[3]){-M_SQRT1_3, -M_SQRT1_3, M_SQRT1_3});
+ sce->display.shadow_shift = 0.1;
}
Scene *BKE_scene_add(Main *bmain, const char *name)
diff --git a/source/blender/blenloader/intern/versioning_280.c b/source/blender/blenloader/intern/versioning_280.c
index 08cb81bb357..2af10d3faf6 100644
--- a/source/blender/blenloader/intern/versioning_280.c
+++ b/source/blender/blenloader/intern/versioning_280.c
@@ -1085,6 +1085,11 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *main)
copy_v3_v3(scene->display.light_direction, (float[3]){-M_SQRT1_3, -M_SQRT1_3, M_SQRT1_3});
}
}
+ if (!DNA_struct_elem_find(fd->filesdna, "SceneDisplay", "float", "shadow_shift")) {
+ for (Scene *scene = main->scene.first; scene; scene = scene->id.next) {
+ scene->display.shadow_shift = 0.1;
+ }
+ }
if (!DNA_struct_elem_find(fd->filesdna, "Object", "ObjectDisplay", "display")) {
/* Initialize new object.ObjectDisplay */
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl
index 7f7e8f9c69c..09bdffe3299 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl
@@ -7,6 +7,10 @@ uniform sampler2D normalBuffer;
uniform vec2 invertedViewportSize;
uniform vec3 objectOverlapColor = vec3(0.0);
uniform float shadowMultiplier;
+uniform float lightMultiplier;
+uniform float shadowShift = 0.1;
+
+uniform vec3 lightDirection; /* light direction in view space */
layout(std140) uniform world_block {
WorldData world_data;
@@ -38,29 +42,42 @@ void main()
}
#endif /* !V3D_SHADING_OBJECT_OVERLAP */
-
-#ifdef V3D_LIGHTING_STUDIO
vec4 diffuse_color = texelFetch(colorBuffer, texel, 0);
+/* Do we need normals */
+#ifdef NORMAL_VIEWPORT_PASS_ENABLED
#ifdef WORKBENCH_ENCODE_NORMALS
vec3 normal_viewport = normal_decode(texelFetch(normalBuffer, texel, 0).rg);
if (diffuse_color.a == 1.0) {
- normal_viewport = - normal_viewport;
+ normal_viewport = -normal_viewport;
}
#else /* WORKBENCH_ENCODE_NORMALS */
vec3 normal_viewport = texelFetch(normalBuffer, texel, 0).rgb;
#endif /* WORKBENCH_ENCODE_NORMALS */
+#endif
+
+
+#ifdef V3D_LIGHTING_STUDIO
vec3 diffuse_light = get_world_diffuse_light(world_data, normal_viewport);
- vec3 shaded_color = diffuse_light * diffuse_color.rgb * (1.0 - shadowMultiplier);
+ vec3 shaded_color = diffuse_light * diffuse_color.rgb;
#else /* V3D_LIGHTING_STUDIO */
- vec3 diffuse_color = texelFetch(colorBuffer, texel, 0).rgb;
- vec3 shaded_color = diffuse_color * (1.0 - shadowMultiplier);
+ vec3 shaded_color = diffuse_color.rgb;
+
#endif /* V3D_LIGHTING_STUDIO */
+#ifdef V3D_SHADING_SHADOW
+ float shadow_mix = step(-shadowShift, dot(normal_viewport, lightDirection));
+ float light_multiplier;
+ light_multiplier = mix(lightMultiplier, shadowMultiplier, shadow_mix);
+
+#else /* V3D_SHADING_SHADOW */
+ float light_multiplier = 1.0;
+#endif /* V3D_SHADING_SHADOW */
+
+ shaded_color *= light_multiplier;
#ifdef V3D_SHADING_OBJECT_OVERLAP
shaded_color = mix(objectOverlapColor, shaded_color, object_overlap);
#endif /* V3D_SHADING_OBJECT_OVERLAP */
-
fragColor = vec4(shaded_color, 1.0);
}
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 54c5bce4271..2cc0ff3723d 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
@@ -4,22 +4,22 @@ uniform vec3 object_color = vec3(1.0, 0.0, 1.0);
uniform sampler2D image;
#endif
-#ifdef V3D_LIGHTING_STUDIO
+#ifdef NORMAL_VIEWPORT_PASS_ENABLED
in vec3 normal_viewport;
-#endif /* V3D_LIGHTING_STUDIO */
+#endif /* NORMAL_VIEWPORT_PASS_ENABLED */
#ifdef OB_TEXTURE
in vec2 uv_interp;
#endif /* OB_TEXTURE */
layout(location=0) out uint objectId;
layout(location=1) out vec4 diffuseColor;
-#ifdef V3D_LIGHTING_STUDIO
-#ifdef WORKBENCH_ENCODE_NORMALS
+#ifdef NORMAL_VIEWPORT_PASS_ENABLED
+ #ifdef WORKBENCH_ENCODE_NORMALS
layout(location=2) out vec2 normalViewport;
-#else /* WORKBENCH_ENCODE_NORMALS */
+ #else /* WORKBENCH_ENCODE_NORMALS */
layout(location=2) out vec3 normalViewport;
-#endif /* WORKBENCH_ENCODE_NORMALS */
-#endif /* V3D_LIGHTING_STUDIO */
+ #endif /* WORKBENCH_ENCODE_NORMALS */
+#endif /* NORMAL_VIEWPORT_PASS_ENABLED */
void main()
{
@@ -31,18 +31,18 @@ void main()
diffuseColor = texture(image, uv_interp);
#endif /* OB_TEXTURE */
-#ifdef V3D_LIGHTING_STUDIO
-#ifdef WORKBENCH_ENCODE_NORMALS
+#ifdef NORMAL_VIEWPORT_PASS_ENABLED
+ #ifdef WORKBENCH_ENCODE_NORMALS
if (!gl_FrontFacing) {
- normalViewport = normal_encode(-normal_viewport);
+ normalViewport = normal_encode(normalize(-normal_viewport));
diffuseColor.a = 1.0;
}
else {
- normalViewport = normal_encode(normal_viewport);
+ normalViewport = normal_encode(normalize(normal_viewport));
diffuseColor.a = 0.0;
}
-#else /* WORKBENCH_ENCODE_NORMALS */
+ #else /* WORKBENCH_ENCODE_NORMALS */
normalViewport = normal_viewport;
-#endif /* WORKBENCH_ENCODE_NORMALS */
-#endif /* V3D_LIGHTING_STUDIO */
+ #endif /* WORKBENCH_ENCODE_NORMALS */
+#endif /* NORMAL_VIEWPORT_PASS_ENABLED */
}
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 22b16bf1d6a..f2df117d897 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl
@@ -1,19 +1,19 @@
uniform mat4 ModelViewProjectionMatrix;
-#ifdef V3D_LIGHTING_STUDIO
+#ifdef NORMAL_VIEWPORT_PASS_ENABLED
uniform mat3 NormalMatrix;
-#endif /* V3D_LIGHTING_STUDIO */
+#endif /* NORMAL_VIEWPORT_PASS_ENABLED */
in vec3 pos;
-#ifdef V3D_LIGHTING_STUDIO
+#ifdef NORMAL_VIEWPORT_PASS_ENABLED
in vec3 nor;
-#endif /* V3D_LIGHTING_STUDIO */
+#endif /* NORMAL_VIEWPORT_PASS_ENABLED */
#ifdef OB_TEXTURE
in vec2 uv;
#endif
-#ifdef V3D_LIGHTING_STUDIO
+#ifdef NORMAL_VIEWPORT_PASS_ENABLED
out vec3 normal_viewport;
-#endif /* V3D_LIGHTING_STUDIO */
+#endif /* NORMAL_VIEWPORT_PASS_ENABLED */
#ifdef OB_TEXTURE
out vec2 uv_interp;
#endif
@@ -23,8 +23,8 @@ void main()
#ifdef OB_TEXTURE
uv_interp = uv;
#endif
-#ifdef V3D_LIGHTING_STUDIO
+#ifdef NORMAL_VIEWPORT_PASS_ENABLED
normal_viewport = normalize(NormalMatrix * nor);
-#endif /* V3D_LIGHTING_STUDIO */
+#endif /* NORMAL_VIEWPORT_PASS_ENABLED */
gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0);
}
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_shadow_vert.glsl b/source/blender/draw/engines/workbench/shaders/workbench_shadow_vert.glsl
index 7322266a956..8ef1a8b589b 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_shadow_vert.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_shadow_vert.glsl
@@ -1,4 +1,4 @@
-#define EPSILON 0.000001
+#define EPSILON 0.0001
#define INFINITE 100.0
uniform mat4 ModelMatrixInverse;
diff --git a/source/blender/draw/engines/workbench/workbench_materials.c b/source/blender/draw/engines/workbench/workbench_materials.c
index f4b9a0a3e53..0f21b76b4d2 100644
--- a/source/blender/draw/engines/workbench/workbench_materials.c
+++ b/source/blender/draw/engines/workbench/workbench_materials.c
@@ -61,7 +61,8 @@ static struct {
struct GPUTexture *normal_buffer_tx; /* ref only, not alloced */
struct GPUTexture *composite_buffer_tx; /* ref only, not alloced */
- float light_direction[3]; /* world light direction for shadows */
+ SceneDisplay display; /* world light direction for shadows */
+ float light_direction_vs[3];
int next_object_id;
} e_data = {{NULL}};
@@ -82,8 +83,12 @@ extern char datatoc_workbench_world_light_lib_glsl[];
extern DrawEngineType draw_engine_workbench_solid;
#define OBJECT_ID_PASS_ENABLED(wpd) (wpd->shading.flag & V3D_SHADING_OBJECT_OVERLAP)
-#define NORMAL_VIEWPORT_PASS_ENABLED(wpd) (wpd->shading.light & V3D_LIGHTING_STUDIO)
+#define NORMAL_VIEWPORT_PASS_ENABLED(wpd) (wpd->shading.light & V3D_LIGHTING_STUDIO || wpd->shading.flag & V3D_SHADING_SHADOW)
#define SHADOW_ENABLED(wpd) (wpd->shading.flag & V3D_SHADING_SHADOW)
+#define NORMAL_ENCODING_ENABLED() (true)
+//(!SHADOW_ENABLED(wpd))
+
+
static char *workbench_build_defines(WORKBENCH_PrivateData *wpd, int drawtype)
{
char *str = NULL;
@@ -93,9 +98,15 @@ static char *workbench_build_defines(WORKBENCH_PrivateData *wpd, int drawtype)
if (wpd->shading.flag & V3D_SHADING_OBJECT_OVERLAP) {
BLI_dynstr_appendf(ds, "#define V3D_SHADING_OBJECT_OVERLAP\n");
}
+ if (wpd->shading.flag & V3D_SHADING_SHADOW) {
+ BLI_dynstr_appendf(ds, "#define V3D_SHADING_SHADOW\n");
+ }
if (wpd->shading.light & V3D_LIGHTING_STUDIO) {
BLI_dynstr_appendf(ds, "#define V3D_LIGHTING_STUDIO\n");
}
+ 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");
@@ -105,9 +116,9 @@ static char *workbench_build_defines(WORKBENCH_PrivateData *wpd, int drawtype)
break;
}
-#ifdef WORKBENCH_ENCODE_NORMALS
- BLI_dynstr_appendf(ds, "#define WORKBENCH_ENCODE_NORMALS\n");
-#endif
+ if (NORMAL_ENCODING_ENABLED()) {
+ BLI_dynstr_appendf(ds, "#define WORKBENCH_ENCODE_NORMALS\n");
+ }
str = BLI_dynstr_get_cstring(ds);
BLI_dynstr_free(ds);
@@ -154,7 +165,7 @@ static char *workbench_build_prepass_frag(void)
static int get_shader_index(WORKBENCH_PrivateData *wpd, int drawtype)
{
- const int DRAWOPTIONS_MASK = V3D_SHADING_OBJECT_OVERLAP;
+ const int DRAWOPTIONS_MASK = V3D_SHADING_OBJECT_OVERLAP | V3D_SHADING_SHADOW;
int index = (wpd->shading.flag & DRAWOPTIONS_MASK);
index = (index << 2) + wpd->shading.light;
/* set the drawtype flag
@@ -251,7 +262,41 @@ static void get_material_solid_color(WORKBENCH_PrivateData *wpd, Object *ob, Mat
}
}
}
+static void workbench_private_data_init(WORKBENCH_Data *vedata)
+{
+ WORKBENCH_StorageList *stl = vedata->stl;
+ WORKBENCH_PrivateData *wpd = stl->g_data;
+ const DRWContextState *draw_ctx = DRW_context_state_get();
+
+ View3D *v3d = draw_ctx->v3d;
+ if (v3d) {
+ wpd->shading = v3d->shading;
+ wpd->drawtype = v3d->drawtype;
+ wpd->studio_light = BKE_studiolight_find(wpd->shading.studio_light);
+ }
+ else {
+ /* XXX: We should get the default shading from the view layer, after we implemented the render callback */
+ memset(&wpd->shading, 0, sizeof(wpd->shading));
+ 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_findindex(0);
+ }
+ wpd->shadow_multiplier = 1.0 - wpd->shading.shadow_intensity;
+ WORKBENCH_UBO_World *wd = &wpd->world_data;
+ UI_GetThemeColor3fv(UI_GetThemeValue(TH_SHOW_BACK_GRAD) ? TH_LOW_GRAD : TH_HIGH_GRAD, wd->background_color_low);
+ UI_GetThemeColor3fv(TH_HIGH_GRAD, wd->background_color_high);
+
+ /* XXX: Really quick conversion to avoid washed out background.
+ * Needs to be adressed properly (color managed using ocio). */
+ srgb_to_linearrgb_v3_v3(wd->background_color_high, wd->background_color_high);
+ srgb_to_linearrgb_v3_v3(wd->background_color_low, wd->background_color_low);
+
+ studiolight_update_world(wpd->studio_light, wd);
+
+}
void workbench_materials_engine_init(WORKBENCH_Data *vedata)
{
WORKBENCH_FramebufferList *fbl = vedata->fbl;
@@ -271,17 +316,20 @@ void workbench_materials_engine_init(WORKBENCH_Data *vedata)
stl->g_data = MEM_mallocN(sizeof(*stl->g_data), __func__);
}
+ workbench_private_data_init(vedata);
+
{
const float *viewport_size = DRW_viewport_size_get();
const int size[2] = {(int)viewport_size[0], (int)viewport_size[1]};
e_data.object_id_tx = DRW_texture_pool_query_2D(size[0], size[1], GPU_R32UI, &draw_engine_workbench_solid);
e_data.color_buffer_tx = DRW_texture_pool_query_2D(size[0], size[1], GPU_RGBA8, &draw_engine_workbench_solid);
e_data.composite_buffer_tx = DRW_texture_pool_query_2D(size[0], size[1], GPU_RGBA16F, &draw_engine_workbench_solid);
-#ifdef WORKBENCH_ENCODE_NORMALS
- e_data.normal_buffer_tx = DRW_texture_pool_query_2D(size[0], size[1], GPU_RG8, &draw_engine_workbench_solid);
-#else
- e_data.normal_buffer_tx = DRW_texture_pool_query_2D(size[0], size[1], GPU_RGBA32F, &draw_engine_workbench_solid);
-#endif
+
+ if (NORMAL_ENCODING_ENABLED()) {
+ e_data.normal_buffer_tx = DRW_texture_pool_query_2D(size[0], size[1], GPU_RG16, &draw_engine_workbench_solid);
+ } else {
+ e_data.normal_buffer_tx = DRW_texture_pool_query_2D(size[0], size[1], GPU_RGBA32F, &draw_engine_workbench_solid);
+ }
GPU_framebuffer_ensure_config(&fbl->prepass_fb, {
GPU_ATTACHMENT_TEXTURE(dtxl->depth),
@@ -329,66 +377,49 @@ void workbench_materials_cache_init(WORKBENCH_Data *vedata)
WORKBENCH_PrivateData *wpd = stl->g_data;
DRWShadingGroup *grp;
const DRWContextState *draw_ctx = DRW_context_state_get();
- static float shadow_multiplier = 0.0f;
+ static float light_multiplier = 1.0f;
wpd->material_hash = BLI_ghash_ptr_new(__func__);
- View3D *v3d = draw_ctx->v3d;
Scene *scene = draw_ctx->scene;
- if (v3d) {
- wpd->shading = v3d->shading;
- wpd->drawtype = v3d->drawtype;
- wpd->studio_light = BKE_studiolight_find(wpd->shading.studio_light);
- }
- else {
- /* XXX: We should get the default shading from the view layer, after we implemented the render callback */
- memset(&wpd->shading, 0, sizeof(wpd->shading));
- 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_findindex(0);
- }
- BKE_studiolight_ensure_flag(wpd->studio_light, STUDIOLIGHT_DIFFUSE_LIGHT_CALCULATED);
select_deferred_shaders(wpd);
/* Deferred Mix Pass */
{
- WORKBENCH_UBO_World *wd = &wpd->world_data;
- UI_GetThemeColor3fv(UI_GetThemeValue(TH_SHOW_BACK_GRAD) ? TH_LOW_GRAD : TH_HIGH_GRAD, wd->background_color_low);
- UI_GetThemeColor3fv(TH_HIGH_GRAD, wd->background_color_high);
-
- /* XXX: Really quick conversion to avoid washed out background.
- * Needs to be adressed properly (color managed using ocio). */
- srgb_to_linearrgb_v3_v3(wd->background_color_high, wd->background_color_high);
- srgb_to_linearrgb_v3_v3(wd->background_color_low, wd->background_color_low);
-
- studiolight_update_world(wpd->studio_light, wd);
wpd->world_ubo = DRW_uniformbuffer_create(sizeof(WORKBENCH_UBO_World), NULL);
DRW_uniformbuffer_update(wpd->world_ubo, &wpd->world_data);
- copy_v3_v3(e_data.light_direction, scene->display.light_direction);
- negate_v3(e_data.light_direction);
+ copy_v3_v3(e_data.display.light_direction, scene->display.light_direction);
+ negate_v3(e_data.display.light_direction);
+ e_data.display.shadow_shift = scene->display.shadow_shift;
+ float view_matrix[4][4];
+ DRW_viewport_matrix_get(view_matrix, DRW_MAT_VIEW);
+ mul_v3_mat3_m4v3(e_data.light_direction_vs, view_matrix, e_data.display.light_direction);
+
+ e_data.display.shadow_shift = scene->display.shadow_shift;
if (SHADOW_ENABLED(wpd)) {
psl->composite_pass = DRW_pass_create("Composite", DRW_STATE_WRITE_COLOR | DRW_STATE_STENCIL_EQUAL);
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, "shadowMultiplier", &shadow_multiplier, 1);
+ DRW_shgroup_uniform_vec3(grp, "lightDirection", e_data.light_direction_vs, 1);
+ DRW_shgroup_uniform_float(grp, "lightMultiplier", &light_multiplier, 1);
+ 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);
#ifdef DEBUG_SHADOW_VOLUME
psl->shadow_pass = DRW_pass_create("Shadow", DRW_STATE_DEPTH_LESS | DRW_STATE_CULL_BACK | DRW_STATE_WRITE_COLOR);
grp = DRW_shgroup_create(e_data.shadow_sh, psl->shadow_pass);
- DRW_shgroup_uniform_vec3(grp, "lightDirection", e_data.light_direction, 1);
+ DRW_shgroup_uniform_vec3(grp, "lightDirection", e_data.display.light_direction, 1);
DRW_shgroup_stencil_mask(grp, 0xFF);
wpd->shadow_shgrp = grp;
#else
psl->shadow_pass = DRW_pass_create("Shadow", DRW_STATE_DEPTH_GREATER | DRW_STATE_WRITE_STENCIL_SHADOW);
grp = DRW_shgroup_create(e_data.shadow_sh, psl->shadow_pass);
- DRW_shgroup_uniform_vec3(grp, "lightDirection", e_data.light_direction, 1);
+ DRW_shgroup_uniform_vec3(grp, "lightDirection", e_data.display.light_direction, 1);
DRW_shgroup_stencil_mask(grp, 0xFF);
wpd->shadow_shgrp = grp;
@@ -396,7 +427,10 @@ void workbench_materials_cache_init(WORKBENCH_Data *vedata)
grp = DRW_shgroup_create(wpd->composite_sh, psl->composite_shadow_pass);
DRW_shgroup_stencil_mask(grp, 0x00);
workbench_composite_uniforms(wpd, grp);
- DRW_shgroup_uniform_float(grp, "shadowMultiplier", &wpd->shading.shadow_intensity, 1);
+ DRW_shgroup_uniform_vec3(grp, "lightDirection", e_data.light_direction_vs, 1);
+ DRW_shgroup_uniform_float(grp, "lightMultiplier", &wpd->shadow_multiplier, 1);
+ 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);
#endif
}
@@ -404,7 +438,6 @@ void workbench_materials_cache_init(WORKBENCH_Data *vedata)
psl->composite_pass = DRW_pass_create("Composite", DRW_STATE_WRITE_COLOR);
grp = DRW_shgroup_create(wpd->composite_sh, psl->composite_pass);
workbench_composite_uniforms(wpd, grp);
- DRW_shgroup_uniform_float(grp, "shadowMultiplier", &shadow_multiplier, 1);
DRW_shgroup_call_add(grp, DRW_cache_fullscreen_quad_get(), NULL);
}
}
diff --git a/source/blender/draw/engines/workbench/workbench_private.h b/source/blender/draw/engines/workbench/workbench_private.h
index dde62302f62..7b0aa157e07 100644
--- a/source/blender/draw/engines/workbench/workbench_private.h
+++ b/source/blender/draw/engines/workbench/workbench_private.h
@@ -37,7 +37,6 @@
#define WORKBENCH_ENGINE "BLENDER_WORKBENCH"
#define M_GOLDEN_RATION_CONJUGATE 0.618033988749895
-#define WORKBENCH_ENCODE_NORMALS
typedef struct WORKBENCH_FramebufferList {
@@ -88,6 +87,7 @@ typedef struct WORKBENCH_PrivateData {
struct GPUUniformBuffer *world_ubo;
struct DRWShadingGroup *shadow_shgrp;
WORKBENCH_UBO_World world_data;
+ float shadow_multiplier;
} WORKBENCH_PrivateData; /* Transient data */
typedef struct WORKBENCH_MaterialData {
diff --git a/source/blender/draw/engines/workbench/workbench_studiolight.c b/source/blender/draw/engines/workbench/workbench_studiolight.c
index f7d107ea403..2142be3eaf4 100644
--- a/source/blender/draw/engines/workbench/workbench_studiolight.c
+++ b/source/blender/draw/engines/workbench/workbench_studiolight.c
@@ -31,6 +31,8 @@
void studiolight_update_world(StudioLight *sl, WORKBENCH_UBO_World *wd)
{
+ BKE_studiolight_ensure_flag(sl, STUDIOLIGHT_DIFFUSE_LIGHT_CALCULATED);
+
copy_v3_v3(wd->diffuse_light_x_pos, sl->diffuse_light[STUDIOLIGHT_X_POS]);
copy_v3_v3(wd->diffuse_light_x_neg, sl->diffuse_light[STUDIOLIGHT_X_NEG]);
copy_v3_v3(wd->diffuse_light_y_pos, sl->diffuse_light[STUDIOLIGHT_Y_POS]);
diff --git a/source/blender/gpu/intern/gpu_texture.c b/source/blender/gpu/intern/gpu_texture.c
index 3961278ad1a..5c8edfb2a33 100644
--- a/source/blender/gpu/intern/gpu_texture.c
+++ b/source/blender/gpu/intern/gpu_texture.c
@@ -149,8 +149,8 @@ static GLenum gpu_texture_get_format(
}
else {
/* Integer formats */
- if (ELEM(data_type, GPU_RG16I, GPU_R16I, GPU_R16UI, GPU_R32UI)) {
- if (ELEM(data_type, GPU_R16UI, GPU_R32UI)) {
+ if (ELEM(data_type, GPU_RG16I, GPU_R16I, GPU_RG16UI, GPU_R16UI, GPU_R32UI)) {
+ if (ELEM(data_type, GPU_R16UI, GPU_RG16UI, GPU_R32UI)) {
*data_format = GL_UNSIGNED_INT;
}
else {
@@ -194,6 +194,7 @@ static GLenum gpu_texture_get_format(
break;
case GPU_RG16F:
case GPU_RG16I:
+ case GPU_RG16UI:
case GPU_RG16:
case GPU_DEPTH24_STENCIL8:
case GPU_DEPTH_COMPONENT32F:
@@ -238,6 +239,7 @@ static GLenum gpu_texture_get_format(
case GPU_R16I: return GL_R16I;
case GPU_R16UI: return GL_R16UI;
case GPU_RG8: return GL_RG8;
+ case GPU_RG16UI: return GL_RG16UI;
case GPU_R8: return GL_R8;
/* Special formats texture & renderbuffer */
case GPU_R11F_G11F_B10F: return GL_R11F_G11F_B10F;
@@ -270,6 +272,7 @@ static int gpu_texture_get_component_count(GPUTextureFormat format)
case GPU_RG16:
case GPU_RG16F:
case GPU_RG16I:
+ case GPU_RG16UI:
case GPU_RG32F:
return 2;
default:
diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h
index c14ab28ad62..03cab034ec1 100644
--- a/source/blender/makesdna/DNA_scene_types.h
+++ b/source/blender/makesdna/DNA_scene_types.h
@@ -1360,7 +1360,7 @@ typedef struct DisplaySafeAreas {
/* Scene Display - used for store scene specific display settings for the 3d view */
typedef struct SceneDisplay {
float light_direction[3]; /* light direction for shadows/highlight */
- int pad;
+ float shadow_shift;
} SceneDisplay;
/* *************************************************************** */
diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c
index b487a08dccd..4c43fb50248 100644
--- a/source/blender/makesrna/intern/rna_scene.c
+++ b/source/blender/makesrna/intern/rna_scene.c
@@ -5687,6 +5687,16 @@ static void rna_def_scene_display(BlenderRNA *brna)
RNA_def_property_float_array_default(prop, default_light_direction);
RNA_def_property_ui_text(prop, "Light Direction", "Direction of the light for shadows and highlights");
RNA_def_property_update(prop, NC_SCENE | NA_EDITED, "rna_Scene_set_update");
+
+ prop = RNA_def_property(srna, "shadow_shift", PROP_FLOAT, PROP_ANGLE);
+ RNA_def_property_float_sdna(prop, NULL, "shadow_shift");
+ RNA_def_property_float_default(prop, 0.1);
+ RNA_def_property_ui_text(prop, "Shadow Shift", "Shadow termination angle");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_ui_range(prop, 0.00f, 1.0f, 1, 2);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+ RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
+
}
void RNA_def_scene(BlenderRNA *brna)