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/engines/overlay/shaders/overlay_edit_mesh_frag.glsl')
-rw-r--r--source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_frag.glsl44
1 files changed, 44 insertions, 0 deletions
diff --git a/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_frag.glsl b/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_frag.glsl
new file mode 100644
index 00000000000..2fd155f715c
--- /dev/null
+++ b/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_frag.glsl
@@ -0,0 +1,44 @@
+
+#define M_1_SQRTPI 0.5641895835477563 /* 1/sqrt(pi) */
+
+/**
+ * We want to know how much a pixel is covered by a line.
+ * We replace the square pixel with acircle of the same area and try to find the intersection area.
+ * The area we search is the circular segment. https://en.wikipedia.org/wiki/Circular_segment
+ * The formula for the area uses inverse trig function and is quite complexe. Instead,
+ * we approximate it by using the smoothstep function and a 1.05 factor to the disc radius.
+ */
+#define DISC_RADIUS (M_1_SQRTPI * 1.05)
+#define GRID_LINE_SMOOTH_START (0.5 - DISC_RADIUS)
+#define GRID_LINE_SMOOTH_END (0.5 + DISC_RADIUS)
+
+bool test_occlusion()
+{
+ return gl_FragCoord.z > texelFetch(depthTex, ivec2(gl_FragCoord.xy), 0).r;
+}
+
+float edge_step(float dist)
+{
+ if (do_smooth_wire) {
+ return smoothstep(GRID_LINE_SMOOTH_START, GRID_LINE_SMOOTH_END, dist);
+ }
+ else {
+ return step(0.5, dist);
+ }
+}
+
+void main()
+{
+ float dist = abs(geometry_out.edgeCoord) - max(sizeEdge - 0.5, 0.0);
+ float dist_outer = dist - max(sizeEdge, 1.0);
+ float mix_w = edge_step(dist);
+ float mix_w_outer = edge_step(dist_outer);
+ /* Line color & alpha. */
+ fragColor = mix(geometry_out.finalColorOuter,
+ geometry_out.finalColor,
+ 1.0 - mix_w * geometry_out.finalColorOuter.a);
+ /* Line edges shape. */
+ fragColor.a *= 1.0 - (geometry_out.finalColorOuter.a > 0.0 ? mix_w_outer : mix_w);
+
+ fragColor.a *= test_occlusion() ? alpha : 1.0;
+}