[Bf-blender-cvs] [ff5e24b808f] blender2.8-workbench: Workbench: Shadows from outlines
Jeroen Bakker
noreply at git.blender.org
Sat Apr 28 16:17:58 CEST 2018
Commit: ff5e24b808fe60886bb4acd2aa0037ac5e89b4ca
Author: Jeroen Bakker
Date: Sat Apr 28 16:17:34 2018 +0200
Branches: blender2.8-workbench
https://developer.blender.org/rBff5e24b808fe60886bb4acd2aa0037ac5e89b4ca
Workbench: Shadows from outlines
===================================================================
M source/blender/draw/engines/workbench/shaders/workbench_shadow_geom.glsl
M source/blender/draw/engines/workbench/shaders/workbench_shadow_vert.glsl
M source/blender/draw/engines/workbench/workbench_materials.c
===================================================================
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_shadow_geom.glsl b/source/blender/draw/engines/workbench/shaders/workbench_shadow_geom.glsl
index a3bab32af67..6312ca20bcf 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_shadow_geom.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_shadow_geom.glsl
@@ -1,37 +1,25 @@
-layout(triangles) in;
-layout(triangle_strip, max_vertices=12) out;
+layout(lines) in;
+layout(triangle_strip, max_vertices=4) out;
uniform vec4 lightDirection = vec4(-4.0, -25.0, 0.0, 0.0);
+uniform vec3 lightDirection2 = vec3(0.57, 0.57, 0.57);
+in vec3 faceNormal1[];
+in vec3 faceNormal2[];
void main()
{
- gl_Position = gl_in[0].gl_Position;
- EmitVertex();
- gl_Position = gl_in[1].gl_Position;
- EmitVertex();
- gl_Position = gl_in[0].gl_Position + lightDirection;
- EmitVertex();
- gl_Position = gl_in[1].gl_Position + lightDirection;
- EmitVertex();
- EndPrimitive();
+ bool front1 = dot(faceNormal1[0], lightDirection2) >= 0;
+ bool front2 = dot(faceNormal2[1], lightDirection2) >= 0;
- gl_Position = gl_in[1].gl_Position;
- EmitVertex();
- gl_Position = gl_in[2].gl_Position;
- EmitVertex();
- gl_Position = gl_in[1].gl_Position + lightDirection;
- EmitVertex();
- gl_Position = gl_in[2].gl_Position + lightDirection;
- EmitVertex();
- EndPrimitive();
-
- gl_Position = gl_in[2].gl_Position;
- EmitVertex();
- gl_Position = gl_in[0].gl_Position;
- EmitVertex();
- gl_Position = gl_in[2].gl_Position + lightDirection;
- EmitVertex();
- gl_Position = gl_in[0].gl_Position + lightDirection;
- EmitVertex();
- EndPrimitive();
+ if (front1 != front2) {
+ gl_Position = gl_in[0].gl_Position;
+ EmitVertex();
+ gl_Position = gl_in[1].gl_Position;
+ EmitVertex();
+ gl_Position = gl_in[0].gl_Position + lightDirection;
+ EmitVertex();
+ gl_Position = gl_in[1].gl_Position + lightDirection;
+ EmitVertex();
+ EndPrimitive();
+ }
}
\ No newline at end of file
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 97639f03734..3e8812a4431 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_shadow_vert.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_shadow_vert.glsl
@@ -1,8 +1,13 @@
uniform mat4 ModelViewProjectionMatrix;
-
+uniform mat3 NormalMatrix;
in vec3 pos;
-
+in vec3 N1;
+in vec3 N2;
+out vec3 faceNormal1;
+out vec3 faceNormal2;
void main()
{
gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0);
+ faceNormal1 = NormalMatrix * N1;
+ faceNormal2 = NormalMatrix * N2;
}
diff --git a/source/blender/draw/engines/workbench/workbench_materials.c b/source/blender/draw/engines/workbench/workbench_materials.c
index a2c74e20b1c..0e39dd065e2 100644
--- a/source/blender/draw/engines/workbench/workbench_materials.c
+++ b/source/blender/draw/engines/workbench/workbench_materials.c
@@ -315,7 +315,7 @@ void workbench_materials_cache_init(WORKBENCH_Data *vedata)
grp = DRW_shgroup_create(e_data.shadow_sh, psl->shadow_pass);
DRW_shgroup_stencil_mask(grp, 0x01);
wpd->shadow_shgrp = grp;
- DRW_shgroup_call_add(grp, DRW_cache_quad_get(), NULL);
+ // DRW_shgroup_call_add(grp, DRW_cache_quad_get(), NULL);
psl->composite_shadow_pass = DRW_pass_create("Composite Shadow", DRW_STATE_WRITE_COLOR | DRW_STATE_STENCIL_EQUAL);
grp = DRW_shgroup_create(wpd->composite_sh, psl->composite_shadow_pass);
@@ -419,7 +419,10 @@ void workbench_materials_solid_cache_populate(WORKBENCH_Data *vedata, Object *ob
}
if (SHADOW_ENABLED(wpd)) {
- /* TODO: DRW_shgroup_call_object_add(wpd->shadow_shgrp, DRW_cache_sphere_get(), ob); */
+ struct Gwn_Batch *geom_shadow = DRW_cache_mesh_wire_outline_get(ob);
+ if (geom_shadow) {
+ DRW_shgroup_call_object_add(wpd->shadow_shgrp, geom_shadow, ob);
+ }
}
}
}
More information about the Bf-blender-cvs
mailing list