Commit: 3f95daa31fa98b1bd67fc71835f0011287c1d136
Author: Jeroen Bakker
Date:   Fri May 4 14:07:00 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB3f95daa31fa98b1bd67fc71835f0011287c1d136

Workbench: Shadows

Initial review of the shard shadows in the workbench engine.

Speed optimizations like transform feedback are not implemented yet. I first 
want this part to be reviewed and merged.

@fclem please check the note in drw_stencil_set it was holding back nequal == 0 
as by default DST.stencil_mask was set to 0. questioin is should we remove the 
whole check or not.

Also I am still looking for a better name (or split the enum) for 
DRW_STATE_STENCIL_DEPTH_FAIL_INCR_DECR_WRAP

Reviewers: fclem

Reviewed By: fclem

Tags: #code_quest

Differential Revision: https://developer.blender.org/D3198

===================================================================

M       release/scripts/startup/bl_ui/properties_render.py
M       release/scripts/startup/bl_ui/space_view3d.py
M       source/blender/blenloader/intern/versioning_280.c
M       source/blender/draw/CMakeLists.txt
M       
source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl
A       source/blender/draw/engines/workbench/shaders/workbench_shadow_geom.glsl
A       source/blender/draw/engines/workbench/shaders/workbench_shadow_vert.glsl
M       source/blender/draw/engines/workbench/solid_mode.c
M       source/blender/draw/engines/workbench/workbench_engine.c
M       source/blender/draw/engines/workbench/workbench_materials.c
M       source/blender/draw/engines/workbench/workbench_private.h
M       source/blender/draw/intern/DRW_render.h
M       source/blender/draw/intern/draw_manager.h
M       source/blender/draw/intern/draw_manager_exec.c
M       source/blender/editors/space_view3d/space_view3d.c
M       source/blender/makesdna/DNA_view3d_types.h
M       source/blender/makesrna/intern/rna_layer.c
M       source/blender/makesrna/intern/rna_space.c

===================================================================

diff --git a/release/scripts/startup/bl_ui/properties_render.py 
b/release/scripts/startup/bl_ui/properties_render.py
index 9a9b973650c..08f19a02ecc 100644
--- a/release/scripts/startup/bl_ui/properties_render.py
+++ b/release/scripts/startup/bl_ui/properties_render.py
@@ -755,17 +755,7 @@ class 
RENDER_PT_workbench_environment_light(RenderButtonsPanel, Panel):
         layout = self.layout
         scene = context.scene
         props = scene.layer_properties['BLENDER_WORKBENCH']
-
-        row = layout.row(align=True)
-        col = row.column(align=True)
-        col.prop(props, "diffuse_light_x_neg", text="Left/Right")
-        col.prop(props, "diffuse_light_x_pos", text="")
-        col = row.column(align=True)
-        col.prop(props, "diffuse_light_y_pos", text="Up/Down")
-        col.prop(props, "diffuse_light_y_neg", text="")
-        col = row.column(align=True)
-        col.prop(props, "diffuse_light_z_pos", text="Front/Back")
-        col.prop(props, "diffuse_light_z_neg", text="")
+        layout.prop(props, "light_direction", text="")
 
 
 classes = (
diff --git a/release/scripts/startup/bl_ui/space_view3d.py 
b/release/scripts/startup/bl_ui/space_view3d.py
index 16448c2ad0e..bba39867079 100644
--- a/release/scripts/startup/bl_ui/space_view3d.py
+++ b/release/scripts/startup/bl_ui/space_view3d.py
@@ -3552,8 +3552,13 @@ class VIEW3D_PT_shading(Panel):
             col.row().prop(shading, "light", expand=True)
             if shading.light == 'STUDIO':
                 col.row().template_icon_view(shading, "studiolight")
+                col.separator()
+
+            col.prop(shading, "show_shadows")
+            if shading.show_shadows:
+                col.prop(shading, "ambient_light_intensity")
+                col.separator()
 
-            col.separator()
             col.prop(shading, "show_object_overlap")
 
 
diff --git a/source/blender/blenloader/intern/versioning_280.c 
b/source/blender/blenloader/intern/versioning_280.c
index 07f51dfbc2f..b0cfadacb2c 100644
--- a/source/blender/blenloader/intern/versioning_280.c
+++ b/source/blender/blenloader/intern/versioning_280.c
@@ -1068,6 +1068,11 @@ void blo_do_versions_280(FileData *fd, Library 
*UNUSED(lib), Main *main)
                                                        }
                                                }
                                        }
+                                       if (sl->spacetype == SPACE_VIEW3D) {
+                                               View3D *v3d = (View3D *)sl;
+                                               v3d->drawtype_ambient_intensity 
= 0.5;
+                                               v3d->overlays |= 
V3D_OVERLAY_HIDE_CURSOR;
+                                       }
                                }
                        }
                }
diff --git a/source/blender/draw/CMakeLists.txt 
b/source/blender/draw/CMakeLists.txt
index e3b6e6fb1f9..3c4d7da29fb 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -212,6 +212,8 @@ 
data_to_c_simple(engines/eevee/shaders/volumetric_integration_frag.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_prepass_vert.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_prepass_frag.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_composite_frag.glsl SRC)
+data_to_c_simple(engines/workbench/shaders/workbench_shadow_vert.glsl SRC)
+data_to_c_simple(engines/workbench/shaders/workbench_shadow_geom.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_background_lib.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_common_lib.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_data_lib.glsl SRC)
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 38211239d01..b032bb6a7b5 100644
--- 
a/source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl
+++ 
b/source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl
@@ -6,8 +6,8 @@ uniform sampler2D colorBuffer;
 uniform sampler2D normalBuffer;
 /* normalBuffer contains viewport normals */
 uniform vec2 invertedViewportSize;
-
 uniform vec3 objectOverlapColor = vec3(0.0);
+uniform float lightMultiplier;
 
 layout(std140) uniform world_block {
        WorldData world_data;
@@ -52,11 +52,11 @@ void main()
        vec3 normal_viewport = texelFetch(normalBuffer, texel, 0).rgb;
 #endif /* WORKBENCH_ENCODE_NORMALS */
        vec3 diffuse_light = get_world_diffuse_light(world_data, 
normal_viewport);
-       vec3 shaded_color = diffuse_light * diffuse_color.rgb;
+       vec3 shaded_color = diffuse_light * diffuse_color.rgb * lightMultiplier;
 
 #else /* V3D_LIGHTING_STUDIO */
        vec3 diffuse_color = texelFetch(colorBuffer, texel, 0).rgb;
-       vec3 shaded_color = diffuse_color;
+       vec3 shaded_color = diffuse_color * lightMultiplier;
 #endif /* V3D_LIGHTING_STUDIO */
 
 
diff --git 
a/source/blender/draw/engines/workbench/shaders/workbench_shadow_geom.glsl 
b/source/blender/draw/engines/workbench/shaders/workbench_shadow_geom.glsl
new file mode 100644
index 00000000000..a1abfb3fe1c
--- /dev/null
+++ b/source/blender/draw/engines/workbench/shaders/workbench_shadow_geom.glsl
@@ -0,0 +1,51 @@
+layout(triangles) in;
+layout(triangle_strip, max_vertices=9) out;
+
+uniform mat4 ModelMatrix;
+uniform mat4 ModelViewProjectionMatrix;
+
+uniform vec3 lightDirection = vec3(0.57, 0.57, -0.57);
+
+in VertexData {
+       flat vec4 lightDirectionMS;
+       vec4 frontPosition;
+       vec4 backPosition;
+} vertexData[];
+
+vec3 face_normal(vec3 v1, vec3 v2, vec3 v3) {
+       return normalize(cross(v2 - v1, v3 - v1));
+}
+void main()
+{
+       vec4 light_direction = vertexData[0].lightDirectionMS;
+       vec4 v1 = gl_in[0].gl_Position;
+       vec4 v2 = gl_in[1].gl_Position;
+       vec4 v3 = gl_in[2].gl_Position;
+       bool backface = dot(face_normal(v1.xyz, v2.xyz, v3.xyz), 
light_direction.xyz) > 0.0;
+       
+       int index0 = backface?0:2;
+       int index2 = backface?2:0;
+       
+       /* back cap */
+       gl_Position = vertexData[index0].backPosition;
+       EmitVertex();
+       gl_Position = vertexData[1].backPosition;
+       EmitVertex();
+       gl_Position = vertexData[index2].backPosition;
+       EmitVertex();
+
+       /* sides */
+       gl_Position = vertexData[index2].frontPosition;
+       EmitVertex();
+       gl_Position = vertexData[index0].backPosition;
+       EmitVertex();
+       gl_Position = vertexData[index0].frontPosition;
+       EmitVertex();
+       gl_Position = vertexData[1].backPosition;
+       EmitVertex();
+       gl_Position = vertexData[1].frontPosition;
+       EmitVertex();
+       gl_Position = vertexData[index2].frontPosition;
+       EmitVertex();
+       EndPrimitive();
+}
diff --git 
a/source/blender/draw/engines/workbench/shaders/workbench_shadow_vert.glsl 
b/source/blender/draw/engines/workbench/shaders/workbench_shadow_vert.glsl
new file mode 100644
index 00000000000..7322266a956
--- /dev/null
+++ b/source/blender/draw/engines/workbench/shaders/workbench_shadow_vert.glsl
@@ -0,0 +1,23 @@
+#define EPSILON 0.000001
+#define INFINITE 100.0
+
+uniform mat4 ModelMatrixInverse;
+uniform mat4 ModelViewProjectionMatrix;
+uniform vec3 lightDirection = vec3(0.57, 0.57, -0.57);
+
+in vec4 pos;
+
+out VertexData {
+       flat vec4 lightDirectionMS;
+       vec4 frontPosition;
+       vec4 backPosition;
+} vertexData;
+
+void main()
+{
+       gl_Position = pos;
+       vertexData.lightDirectionMS = normalize(ModelMatrixInverse * 
vec4(lightDirection, 0.0));
+       vertexData.lightDirectionMS.w = 0.0;
+       vertexData.frontPosition = ModelViewProjectionMatrix * (pos + 
vertexData.lightDirectionMS * EPSILON);
+       vertexData.backPosition = ModelViewProjectionMatrix * (pos + 
vertexData.lightDirectionMS * INFINITE);
+}
diff --git a/source/blender/draw/engines/workbench/solid_mode.c 
b/source/blender/draw/engines/workbench/solid_mode.c
index 2a1b5eecc27..c001cd13bb8 100644
--- a/source/blender/draw/engines/workbench/solid_mode.c
+++ b/source/blender/draw/engines/workbench/solid_mode.c
@@ -59,8 +59,10 @@ static void workbench_solid_cache_finish(void *vedata)
        workbench_materials_cache_finish(data);
 }
 
-static void workbench_solid_draw_background(void *UNUSED(vedata))
+static void workbench_solid_draw_background(void *vedata)
 {
+       WORKBENCH_Data * data = (WORKBENCH_Data *)vedata;
+       workbench_materials_draw_background(data);
 }
 
 static void workbench_solid_draw_scene(void *vedata)
diff --git a/source/blender/draw/engines/workbench/workbench_engine.c 
b/source/blender/draw/engines/workbench/workbench_engine.c
index f758918d577..40d5c2b12f9 100644
--- a/source/blender/draw/engines/workbench/workbench_engine.c
+++ b/source/blender/draw/engines/workbench/workbench_engine.c
@@ -58,7 +58,9 @@ static void workbench_view_layer_settings_create(RenderEngine 
*UNUSED(engine), I
        BLI_assert(props &&
                   props->type == IDP_GROUP &&
                   props->subtype == IDP_GROUP_SUB_ENGINE_RENDER);
-       UNUSED_VARS_NDEBUG(props);
+
+       const float light_direction[3] = {-0.577350269, -0.577350269, 
0.577350269};
+       BKE_collection_engine_property_add_float_array(props, 
"light_direction", light_direction, 3);   UNUSED_VARS_NDEBUG(props);
 }
 
 /* Note: currently unused, we may want to register so we can see this when 
debugging the view. */
diff --git a/source/blender/draw/engines/workbench/workbench_materials.c 
b/source/blender/draw/engines/workbench/workbench_materials.c
index 69d983b96c7..04a12d992b3 100644
--- a/source/blender/draw/engines/workbench/workbench_materials.c
+++ b/source/blender/draw/engines/workbench/workbench_materials.c
@@ -25,8 +25,9 @@
 
 #include "workbench_private.h"
 
-#include "BLI_dynstr.h"
 #include "BLI_alloca.h"
+#include "BLI_dynstr.h"
+#include "BLI_utildefines.h"
 
 #include "BKE_particle.h"
 
@@ -37,23 +38,31 @@
 #include "UI_resources.h"
 
 /* *********** STATIC *********** */
+
+// #define DEBUG_SHADOW_VOLUME
 #define MAX_SHADERS 255
+
 static struct {
        struct GPUShader *prepass_sh_cache[MAX_SHADERS];
        struct GPUShader *composite_sh_cache[MAX_SHADERS];
+       struct GPUShader *shadow_sh;
 
        struct GPUTexture *object_id_tx; /* ref only, not alloced */
        struct GPUTexture *color_buffer_tx; /* ref only, not alloced */
        struct GPUTexture *normal_buffer_tx; /* ref only, not alloced */
 
+       float light_direction[3]; /* world light direction for shadows */
        int next_object_id;
-} e_data = {{NULL}};
+} e_data = {NULL};
 
 /* Shaders */
 extern char datatoc_workbench_prepass_vert_glsl[];
 extern char datatoc_workbench_prepass_frag_glsl[];
 extern char datatoc_workbench_composite_frag_glsl[];
 
+extern char datatoc_workbench_shadow_vert_glsl[];
+extern char datatoc_workbench_shadow_geom_glsl[];
+
 extern 

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to