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>2018-06-05 20:35:08 +0300
committerClément Foucault <foucault.clem@gmail.com>2018-06-05 20:35:36 +0300
commitd5ce40a5ed627e9fd37ab094094b2ff5ef286dd2 (patch)
tree9a9044a73e916eedba2f3ddb2e31048e9babba1a /source/blender/draw/modes/shaders
parent7ff07ddd01af7923f32cfff087ec1f566cb4a0a8 (diff)
Wireframe: Add slider to hide edges from coplanar faces
The default behaviour is to show the same amount of edges as 2.7. The slider makes it possible to show all edges or even less.
Diffstat (limited to 'source/blender/draw/modes/shaders')
-rw-r--r--source/blender/draw/modes/shaders/overlay_face_wireframe_frag.glsl21
-rw-r--r--source/blender/draw/modes/shaders/overlay_face_wireframe_geom.glsl34
-rw-r--r--source/blender/draw/modes/shaders/overlay_face_wireframe_vert.glsl68
3 files changed, 115 insertions, 8 deletions
diff --git a/source/blender/draw/modes/shaders/overlay_face_wireframe_frag.glsl b/source/blender/draw/modes/shaders/overlay_face_wireframe_frag.glsl
index a714de9579a..5dfbb4352e4 100644
--- a/source/blender/draw/modes/shaders/overlay_face_wireframe_frag.glsl
+++ b/source/blender/draw/modes/shaders/overlay_face_wireframe_frag.glsl
@@ -6,9 +6,14 @@ flat in vec3 ssVec1;
flat in vec3 ssVec2;
in float facing;
+#ifdef LIGHT_EDGES
+flat in vec3 edgeSharpness;
+#endif
+
out vec4 fragColor;
float min_v3(vec3 v) { return min(v.x, min(v.y, v.z)); }
+float max_v3(vec3 v) { return max(v.x, max(v.y, v.z)); }
/* In pixels */
const float wire_size = 0.0; /* Expands the core of the wire (part that is 100% wire color) */
@@ -27,10 +32,22 @@ void main()
dot(ss_pos, ssVec2)
);
- float fac = smoothstep(wire_size, wire_size + wire_smooth, min_v3(abs(dist_to_edge)));
+#ifdef LIGHT_EDGES
+ vec3 fac = abs(dist_to_edge);
+#else
+ float fac = min_v3(abs(dist_to_edge));
+#endif
+
+ fac = smoothstep(wire_size + wire_smooth, wire_size, fac);
+
float facing_clamped = clamp((gl_FrontFacing) ? facing : -facing, 0.0, 1.0);
vec3 final_front_col = mix(rimColor, wireColor, 0.05);
fragColor = mix(vec4(rimColor, rim_alpha), vec4(final_front_col, front_alpha), facing_clamped);
- fragColor.a *= (1.0 - fac);
+
+#ifdef LIGHT_EDGES
+ fragColor.a *= max_v3(fac * edgeSharpness);
+#else
+ fragColor.a *= fac;
+#endif
}
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 1cea418419e..8f5712cca03 100644
--- a/source/blender/draw/modes/shaders/overlay_face_wireframe_geom.glsl
+++ b/source/blender/draw/modes/shaders/overlay_face_wireframe_geom.glsl
@@ -1,7 +1,12 @@
+/* This shader is only used for intel GPU where the Geom shader is faster
+ * than doing everything thrice in the vertex shader. */
+
layout(triangles) in;
layout(triangle_strip, max_vertices = 3) out;
+uniform vec2 wireStepParam;
+
in vec2 ssPos[];
in float facingOut[];
@@ -10,8 +15,16 @@ flat out vec3 ssVec1;
flat out vec3 ssVec2;
out float facing;
+#ifdef LIGHT_EDGES
+in vec3 obPos[];
+in vec3 edgeAdj[];
+
+flat out vec3 edgeSharpness;
+#endif
+
#define NO_EDGE vec3(10000.0);
+/* TODO(fclem) remove code duplication. */
vec3 compute_vec(vec2 v0, vec2 v1)
{
vec2 v = normalize(v1 - v0);
@@ -19,6 +32,13 @@ vec3 compute_vec(vec2 v0, vec2 v1)
return vec3(v, -dot(v, v0));
}
+float get_edge_sharpness(vec3 e0, vec3 e1, vec3 e2)
+{
+ vec3 n0 = normalize(cross(e0, e1));
+ vec3 n1 = normalize(cross(e1, e2));
+ return dot(n0, n1);
+}
+
void main(void)
{
vec3 facings = vec3(facingOut[0], facingOut[1], facingOut[2]);
@@ -29,6 +49,20 @@ void main(void)
ssVec1 = do_edge.y ? compute_vec(ssPos[1], ssPos[2]) : NO_EDGE;
ssVec2 = do_edge.z ? compute_vec(ssPos[2], ssPos[0]) : NO_EDGE;
+#ifdef LIGHT_EDGES
+ vec3 edges[3];
+ edges[0] = obPos[1] - obPos[0];
+ edges[1] = obPos[2] - obPos[1];
+ edges[2] = obPos[0] - obPos[2];
+
+ edgeSharpness.x = get_edge_sharpness(edgeAdj[0] - obPos[0], edges[0], -edges[2]);
+ edgeSharpness.y = get_edge_sharpness(edgeAdj[1] - obPos[1], edges[1], -edges[0]);
+ edgeSharpness.z = get_edge_sharpness(edgeAdj[2] - obPos[2], edges[2], -edges[1]);
+
+ /* Easy to adjust parameters. */
+ edgeSharpness = smoothstep(wireStepParam.xxx, wireStepParam.yyy, edgeSharpness);
+#endif
+
gl_Position = gl_in[0].gl_Position;
facing = facings.x;
EmitVertex();
diff --git a/source/blender/draw/modes/shaders/overlay_face_wireframe_vert.glsl b/source/blender/draw/modes/shaders/overlay_face_wireframe_vert.glsl
index 2cd888e7537..96afb8748b6 100644
--- a/source/blender/draw/modes/shaders/overlay_face_wireframe_vert.glsl
+++ b/source/blender/draw/modes/shaders/overlay_face_wireframe_vert.glsl
@@ -1,13 +1,10 @@
-#ifdef GPU_INTEL
-#define USE_GEOM_SHADER
-#endif
-
uniform mat4 ModelViewProjectionMatrix;
uniform mat4 ModelViewMatrix;
uniform mat4 ProjectionMatrix;
uniform mat3 NormalMatrix;
+uniform vec2 wireStepParam;
uniform vec2 viewportSize;
uniform float nearDist;
@@ -24,6 +21,15 @@ flat out vec3 ssVec2;
out float facing;
#endif
+#ifdef LIGHT_EDGES
+#ifdef USE_GEOM_SHADER
+out vec3 obPos;
+out vec3 edgeAdj;
+#else
+flat out vec3 edgeSharpness;
+#endif
+#endif
+
/* project to screen space */
vec2 proj(vec4 pos)
{
@@ -73,12 +79,24 @@ vec3 get_vertex_pos(int v_id)
return pos;
}
+float get_edge_sharpness(vec3 e0, vec3 e1, vec3 e2)
+{
+ vec3 n0 = normalize(cross(e0, e1));
+ vec3 n1 = normalize(cross(e1, e2));
+ return dot(n0, n1);
+}
+
#define NO_EDGE vec3(10000.0);
void main()
{
#ifdef USE_GEOM_SHADER
+
+# ifdef LIGHT_EDGES
+ int v_id = texelFetch(faceIds, gl_VertexID * 2).r;
+# else
int v_id = texelFetch(faceIds, gl_VertexID).r;
+# endif
bool do_edge = v_id < 0;
v_id = abs(v_id) - 1;
@@ -91,15 +109,28 @@ void main()
gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0);
ssPos = proj(gl_Position);
+# ifdef LIGHT_EDGES
+ int adj_id = texelFetch(faceIds, gl_VertexID * 2 + 1).r;
+ obPos = pos;
+ edgeAdj = get_vertex_pos(adj_id);
+# endif
+
#else
+# ifdef LIGHT_EDGES
+ int v_0 = (gl_VertexID / 3) * 6;
+ ivec2 ofs = ivec2(2, 4); /* GL_TRIANGLE_ADJACENCY */
+# else
int v_0 = (gl_VertexID / 3) * 3;
+ ivec2 ofs = ivec2(1, 2); /* GL_TRIANGLES */
+# endif
int v_n = gl_VertexID % 3;
+
/* Getting the same positions for each of the 3 verts. */
ivec3 v_id;
v_id.x = texelFetch(faceIds, v_0).r;
- v_id.y = texelFetch(faceIds, v_0 + 1).r;
- v_id.z = texelFetch(faceIds, v_0 + 2).r;
+ v_id.y = texelFetch(faceIds, v_0 + ofs.x).r;
+ v_id.z = texelFetch(faceIds, v_0 + ofs.y).r;
bvec3 do_edge = lessThan(v_id, ivec3(0));
v_id = abs(v_id) - 1;
@@ -128,5 +159,30 @@ void main()
vec3 nor = get_vertex_nor(v_id[v_n]);
facing = normalize(NormalMatrix * nor).z;
+
+# ifdef LIGHT_EDGES
+ ivec3 adj_id;
+ adj_id.x = texelFetch(faceIds, v_0 + 1).r;
+ adj_id.y = texelFetch(faceIds, v_0 + 3).r;
+ adj_id.z = texelFetch(faceIds, v_0 + 5).r;
+
+ vec3 adj_pos[3];
+ adj_pos[0] = get_vertex_pos(adj_id.x);
+ adj_pos[1] = get_vertex_pos(adj_id.y);
+ adj_pos[2] = get_vertex_pos(adj_id.z);
+
+ vec3 edges[3];
+ edges[0] = pos[1] - pos[0];
+ edges[1] = pos[2] - pos[1];
+ edges[2] = pos[0] - pos[2];
+
+ edgeSharpness.x = get_edge_sharpness(adj_pos[0] - pos[0], edges[0], -edges[2]);
+ edgeSharpness.y = get_edge_sharpness(adj_pos[1] - pos[1], edges[1], -edges[0]);
+ edgeSharpness.z = get_edge_sharpness(adj_pos[2] - pos[2], edges[2], -edges[1]);
+
+ /* Easy to adjust parameters. */
+ edgeSharpness = smoothstep(wireStepParam.xxx, wireStepParam.yyy, edgeSharpness);
+# endif
+
#endif
}