diff options
Diffstat (limited to 'source/blender/draw/engines/workbench/shaders/workbench_shadow_geom.glsl')
-rw-r--r-- | source/blender/draw/engines/workbench/shaders/workbench_shadow_geom.glsl | 116 |
1 files changed, 60 insertions, 56 deletions
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 00213260df0..5373648d4e4 100644 --- a/source/blender/draw/engines/workbench/shaders/workbench_shadow_geom.glsl +++ b/source/blender/draw/engines/workbench/shaders/workbench_shadow_geom.glsl @@ -1,7 +1,7 @@ #extension GL_ARB_gpu_shader5 : enable #ifdef GL_ARB_gpu_shader5 -#define USE_INVOC_EXT +# define USE_INVOC_EXT #endif #ifdef DOUBLE_MANIFOLD @@ -28,11 +28,13 @@ layout(triangle_strip, max_vertices = vert_len) out; uniform vec3 lightDirection = vec3(0.57, 0.57, -0.57); -in VertexData { - vec3 pos; /* local position */ - vec4 frontPosition; /* final ndc position */ - vec4 backPosition; -} vData[]; +in VertexData +{ + vec3 pos; /* local position */ + vec4 frontPosition; /* final ndc position */ + vec4 backPosition; +} +vData[]; #define DEGENERATE_TRIS_WORKAROUND @@ -40,80 +42,82 @@ in VertexData { void extrude_edge(bool invert) { - /* Reverse order if backfacing the light. */ - ivec2 idx = (invert) ? ivec2(1, 2) : ivec2(2, 1); - gl_Position = vData[idx.x].frontPosition; EmitVertex(); - gl_Position = vData[idx.y].frontPosition; EmitVertex(); - gl_Position = vData[idx.x].backPosition; EmitVertex(); - gl_Position = vData[idx.y].backPosition; EmitVertex(); - EndPrimitive(); + /* Reverse order if backfacing the light. */ + ivec2 idx = (invert) ? ivec2(1, 2) : ivec2(2, 1); + gl_Position = vData[idx.x].frontPosition; + EmitVertex(); + gl_Position = vData[idx.y].frontPosition; + EmitVertex(); + gl_Position = vData[idx.x].backPosition; + EmitVertex(); + gl_Position = vData[idx.y].backPosition; + EmitVertex(); + EndPrimitive(); } void main() { - vec3 v10 = vData[0].pos - vData[1].pos; - vec3 v12 = vData[2].pos - vData[1].pos; - vec3 v13 = vData[3].pos - vData[1].pos; + vec3 v10 = vData[0].pos - vData[1].pos; + vec3 v12 = vData[2].pos - vData[1].pos; + vec3 v13 = vData[3].pos - vData[1].pos; - vec3 n1 = cross(v12, v10); - vec3 n2 = cross(v13, v12); + vec3 n1 = cross(v12, v10); + vec3 n2 = cross(v13, v12); #ifdef DEGENERATE_TRIS_WORKAROUND - /* Check if area is null */ - vec2 faces_area = vec2(len_sqr(n1), len_sqr(n2)); - bvec2 degen_faces = equal(abs(faces_area), vec2(0.0)); - - /* Both triangles are degenerate, abort. */ - if (all(degen_faces)) { - return; - } + /* Check if area is null */ + vec2 faces_area = vec2(len_sqr(n1), len_sqr(n2)); + bvec2 degen_faces = equal(abs(faces_area), vec2(0.0)); + + /* Both triangles are degenerate, abort. */ + if (all(degen_faces)) { + return; + } #endif - vec2 facing = vec2(dot(n1, lightDirection), - dot(n2, lightDirection)); + vec2 facing = vec2(dot(n1, lightDirection), dot(n2, lightDirection)); - /* WATCH: maybe unpredictable in some cases. */ - bool is_manifold = any(notEqual(vData[0].pos, vData[3].pos)); + /* WATCH: maybe unpredictable in some cases. */ + bool is_manifold = any(notEqual(vData[0].pos, vData[3].pos)); - bvec2 backface = greaterThan(facing, vec2(0.0)); + bvec2 backface = greaterThan(facing, vec2(0.0)); #ifdef DEGENERATE_TRIS_WORKAROUND # ifndef DOUBLE_MANIFOLD - /* If the mesh is known to be manifold and we don't use double count, - * only create an quad if the we encounter a facing geom. */ - if ((degen_faces.x && backface.y) || - (degen_faces.y && backface.x)) - return; + /* If the mesh is known to be manifold and we don't use double count, + * only create an quad if the we encounter a facing geom. */ + if ((degen_faces.x && backface.y) || (degen_faces.y && backface.x)) + return; # endif - /* If one of the 2 triangles is degenerate, replace edge by a non-manifold one. */ - backface.x = (degen_faces.x) ? !backface.y : backface.x; - backface.y = (degen_faces.y) ? !backface.x : backface.y; - is_manifold = (any(degen_faces)) ? false : is_manifold; + /* If one of the 2 triangles is degenerate, replace edge by a non-manifold one. */ + backface.x = (degen_faces.x) ? !backface.y : backface.x; + backface.y = (degen_faces.y) ? !backface.x : backface.y; + is_manifold = (any(degen_faces)) ? false : is_manifold; #endif - /* If both faces face the same direction it's not an outline edge. */ - if (backface.x == backface.y) { - return; - } + /* If both faces face the same direction it's not an outline edge. */ + if (backface.x == backface.y) { + return; + } #ifdef USE_INVOC_EXT - if (gl_InvocationID == 0) { - extrude_edge(backface.x); - } - else if (is_manifold) { + if (gl_InvocationID == 0) { + extrude_edge(backface.x); + } + else if (is_manifold) { # ifdef DOUBLE_MANIFOLD - /* Increment/Decrement twice for manifold edges. */ - extrude_edge(backface.x); + /* Increment/Decrement twice for manifold edges. */ + extrude_edge(backface.x); # endif - } + } #else - extrude_edge(backface.x); - if (is_manifold) { + extrude_edge(backface.x); + if (is_manifold) { # ifdef DOUBLE_MANIFOLD - /* Increment/Decrement twice for manifold edges. */ - extrude_edge(backface.x); + /* Increment/Decrement twice for manifold edges. */ + extrude_edge(backface.x); # endif - } + } #endif } |