Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
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.glsl93
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 */
}