diff options
Diffstat (limited to 'source/blender/draw/modes/shaders/overlay_face_wireframe_geom.glsl')
-rw-r--r-- | source/blender/draw/modes/shaders/overlay_face_wireframe_geom.glsl | 93 |
1 files changed, 34 insertions, 59 deletions
diff --git a/source/blender/draw/modes/shaders/overlay_face_wireframe_geom.glsl b/source/blender/draw/modes/shaders/overlay_face_wireframe_geom.glsl index d4d53b7d24d..8f52c4fdf95 100644 --- a/source/blender/draw/modes/shaders/overlay_face_wireframe_geom.glsl +++ b/source/blender/draw/modes/shaders/overlay_face_wireframe_geom.glsl @@ -1,85 +1,60 @@ -/* This shader is only used for edge selection & sculpt mode wires (because of indexed drawing). */ +/* This shader is only used for edge selection and OSX workaround for large wires. */ -layout(triangles) in; -#ifdef SELECT_EDGES -layout(line_strip, max_vertices = 6) out; -#else -layout(triangle_strip, max_vertices = 3) out; -#endif +uniform float wireSize; +uniform vec2 viewportSize; +uniform vec2 viewportSizeInv; + +layout(lines) in; +layout(triangle_strip, max_vertices = 4) out; in float facing_g[]; in float edgeSharpness_g[]; #ifndef SELECT_EDGES out float facing; -out vec3 barycentric; -flat out vec3 edgeSharpness; +flat out float edgeSharpness; #endif -void vert_from_gl_in(int v) +void do_vertex(const int i, float coord, vec2 offset) { - gl_Position = gl_in[v].gl_Position; +#ifndef SELECT_EDGES + edgeSharpness = edgeSharpness_g[i]; + facing = facing_g[i]; +#endif + gl_Position = gl_in[i].gl_Position; + /* Multiply offset by 2 because gl_Position range is [-1..1]. */ + gl_Position.xy += offset * 2.0 * gl_Position.w; #ifdef USE_WORLD_CLIP_PLANES - world_clip_planes_set_clip_distance(gl_in[v].gl_ClipDistance); + world_clip_planes_set_clip_distance(gl_in[i].gl_ClipDistance); #endif + EmitVertex(); } -void main(void) +void main() { -#ifdef SELECT_EDGES - const float edge_select_threshold = 0.3; - if (edgeSharpness_g[0] > edge_select_threshold) { - vert_from_gl_in(0); - EmitVertex(); - vert_from_gl_in(1); - EmitVertex(); + vec2 ss_pos[2]; + ss_pos[0] = gl_in[0].gl_Position.xy / gl_in[0].gl_Position.w; + ss_pos[1] = gl_in[1].gl_Position.xy / gl_in[1].gl_Position.w; - EndPrimitive(); - } + vec2 line = ss_pos[0] - ss_pos[1]; + line = abs(line) * viewportSize; - if (edgeSharpness_g[1] > edge_select_threshold) { - vert_from_gl_in(1); - EmitVertex(); - vert_from_gl_in(2); - EmitVertex(); + float half_size = wireSize; - EndPrimitive(); - } + vec3 edge_ofs = half_size * viewportSizeInv.xyy * vec3(1.0, 1.0, 0.0); - if (edgeSharpness_g[2] > edge_select_threshold) { - vert_from_gl_in(2); - EmitVertex(); - vert_from_gl_in(0); - EmitVertex(); + bool horizontal = line.x > line.y; + edge_ofs = (horizontal) ? edge_ofs.zyz : edge_ofs.xzz; - EndPrimitive(); + if (edgeSharpness_g[0] < 0.0) { + return; } -#else - /* Originally was: - * edgeSharpness = vec3(edgeSharpness_g[0], edgeSharpness_g[1], edgeSharpness_g[2]); - * - * But that strangely does not work for some AMD GPUs. - * However since this code is currently only used for sculpt mode - * and in this mode the `edgeSharpness_g` is not calculated, - * let's simply set all to 1.0. - */ - edgeSharpness = vec3(1.0); - barycentric = vec3(1.0, 0.0, 0.0); - vert_from_gl_in(0); - facing = facing_g[0]; - EmitVertex(); + do_vertex(0, half_size, edge_ofs.xy); + do_vertex(0, -half_size, -edge_ofs.xy); + do_vertex(1, half_size, edge_ofs.xy); + do_vertex(1, -half_size, -edge_ofs.xy); - barycentric = vec3(0.0, 1.0, 0.0); - vert_from_gl_in(1); - facing = facing_g[1]; - EmitVertex(); - - barycentric = vec3(0.0, 0.0, 1.0); - vert_from_gl_in(2); - facing = facing_g[2]; - EmitVertex(); EndPrimitive(); -#endif /* SELECT_EDGES */ } |