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:
authorClément Foucault <foucault.clem@gmail.com>2019-02-05 00:28:39 +0300
committerClément Foucault <foucault.clem@gmail.com>2019-02-05 17:02:15 +0300
commit773f3428cfc5212641c59536f56179a58acf318a (patch)
treee51550f7ec5cccc86fed37303e38acddcdce999c /source/blender/draw/modes/shaders/edit_mesh_overlay_geom.glsl
parenta131514d0f79f7b82be526438c125e35beab9f8f (diff)
Edit Mesh: Add workaround for system that does not support wide lines
This adds a new geometry shader (specific to edit mesh for now) that reproduces the effect of glLineWidth > 1.0, since this is not supported on all platform. This fix could be generalized to other shaders later.
Diffstat (limited to 'source/blender/draw/modes/shaders/edit_mesh_overlay_geom.glsl')
-rw-r--r--source/blender/draw/modes/shaders/edit_mesh_overlay_geom.glsl64
1 files changed, 64 insertions, 0 deletions
diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_geom.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_geom.glsl
new file mode 100644
index 00000000000..66792b61fb7
--- /dev/null
+++ b/source/blender/draw/modes/shaders/edit_mesh_overlay_geom.glsl
@@ -0,0 +1,64 @@
+
+layout(lines) in;
+layout(triangle_strip, max_vertices = 4) out;
+
+uniform vec2 viewportSize;
+uniform vec2 viewportSizeInv;
+
+in VertexData {
+ vec4 finalColor;
+#if defined(EDGE) && !defined(FLAT)
+ int selectOveride;
+#endif
+} v[];
+
+#ifdef FLAT
+# define interp_col flat
+#else
+# define interp_col
+#endif
+
+interp_col out vec4 finalColor;
+#if defined(EDGE) && !defined(FLAT)
+flat out int selectOveride;
+#endif
+
+void do_vertex(const int i, vec2 offset)
+{
+ finalColor = v[i].finalColor;
+#if defined(EDGE) && !defined(FLAT)
+ selectOveride = v[0].selectOveride;
+#endif
+ gl_Position = gl_in[i].gl_Position;
+ gl_Position.xy += offset * gl_Position.w;
+ EmitVertex();
+}
+
+void main()
+{
+ 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;
+
+ vec2 line = ss_pos[0] - ss_pos[1];
+
+ vec3 edge_ofs = sizeEdge * 2.0 * viewportSizeInv.xyy * vec3(1.0, 1.0, 0.0);
+
+#ifdef EDGE_DECORATION
+ edge_ofs *= 3.0;
+
+ if (finalColor.a == 0.0) {
+ return;
+ }
+#endif
+
+ bool horizontal = abs(line.x) > abs(line.y);
+ edge_ofs = (horizontal) ? edge_ofs.zyz : edge_ofs.xzz;
+
+ do_vertex(0, edge_ofs.xy);
+ do_vertex(0, -edge_ofs.xy);
+ do_vertex(1, edge_ofs.xy);
+ do_vertex(1, -edge_ofs.xy);
+
+ EndPrimitive();
+}