[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