diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2018-06-24 01:01:02 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2018-06-24 01:01:02 +0300 |
commit | a3cb9c8238072285c0c15c1f0a00aca6c0d5b746 (patch) | |
tree | 7da92f3abfde7400792651b216b40929f9839388 /source/blender/draw | |
parent | 12bd80fefd0208ad5836572ba41f291c21020159 (diff) |
Wireframe Overlay: Add back the per edge hiding
This method is a bit more optimized than the very first one
because it does not rely on the adjacent faces properties.
That said it's still a bit slower than the per vertex method.
Diffstat (limited to 'source/blender/draw')
3 files changed, 53 insertions, 31 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 00ababc624d..5dfbb4352e4 100644 --- a/source/blender/draw/modes/shaders/overlay_face_wireframe_frag.glsl +++ b/source/blender/draw/modes/shaders/overlay_face_wireframe_frag.glsl @@ -7,7 +7,7 @@ flat in vec3 ssVec2; in float facing; #ifdef LIGHT_EDGES -in float edgeSharpness; +flat in vec3 edgeSharpness; #endif out vec4 fragColor; 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 6e833a4e16b..eb69af92435 100644 --- a/source/blender/draw/modes/shaders/overlay_face_wireframe_geom.glsl +++ b/source/blender/draw/modes/shaders/overlay_face_wireframe_geom.glsl @@ -20,7 +20,7 @@ in vec3 obPos[]; in vec3 vNor[]; in float forceEdge[]; -out float edgeSharpness; +flat out vec3 edgeSharpness; #endif #define NO_EDGE vec3(10000.0); @@ -33,6 +33,14 @@ vec3 compute_vec(vec2 v0, vec2 v1) return vec3(v, -dot(v, v0)); } +vec3 get_edge_normal(vec3 n1, vec3 n2, vec3 edge) +{ + edge = normalize(edge); + vec3 n = n1 + n2; + float p = dot(edge, n); + return normalize(n - p * edge); +} + float get_edge_sharpness(vec3 fnor, vec3 vnor) { float sharpness = abs(dot(fnor, vnor)); @@ -50,27 +58,27 @@ void main(void) ssVec2 = do_edge.z ? compute_vec(ssPos[2], ssPos[0]) : NO_EDGE; #ifdef LIGHT_EDGES - vec3 fnor = normalize(cross(obPos[1] - obPos[0], obPos[2] - obPos[0])); - - edgeSharpness = get_edge_sharpness(fnor, vNor[0]); - edgeSharpness = (forceEdge[0] == 1.0 || forceEdge[2] == 1.0) ? 1.0 : edgeSharpness; + vec3 edges[3]; + edges[0] = obPos[1] - obPos[0]; + edges[1] = obPos[2] - obPos[1]; + edges[2] = obPos[0] - obPos[2]; + vec3 fnor = normalize(cross(edges[0], -edges[2])); + + edgeSharpness.x = get_edge_sharpness(fnor, get_edge_normal(vNor[0], vNor[1], edges[0])); + edgeSharpness.y = get_edge_sharpness(fnor, get_edge_normal(vNor[1], vNor[2], edges[1])); + edgeSharpness.z = get_edge_sharpness(fnor, get_edge_normal(vNor[2], vNor[0], edges[2])); + edgeSharpness.x = (forceEdge[0] == 1.0) ? 1.0 : edgeSharpness.x; + edgeSharpness.y = (forceEdge[1] == 1.0) ? 1.0 : edgeSharpness.y; + edgeSharpness.z = (forceEdge[2] == 1.0) ? 1.0 : edgeSharpness.z; #endif gl_Position = gl_in[0].gl_Position; facing = facings.x; EmitVertex(); -#ifdef LIGHT_EDGES - edgeSharpness = get_edge_sharpness(fnor, vNor[1]); - edgeSharpness = (forceEdge[1] == 1.0 || forceEdge[0] == 1.0) ? 1.0 : edgeSharpness; -#endif gl_Position = gl_in[1].gl_Position; facing = facings.y; EmitVertex(); -#ifdef LIGHT_EDGES - edgeSharpness = get_edge_sharpness(fnor, vNor[2]); - edgeSharpness = (forceEdge[2] == 1.0 || forceEdge[1] == 1.0) ? 1.0 : edgeSharpness; -#endif gl_Position = gl_in[2].gl_Position; facing = facings.z; 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 616cd5379e9..fe3c2021b7e 100644 --- a/source/blender/draw/modes/shaders/overlay_face_wireframe_vert.glsl +++ b/source/blender/draw/modes/shaders/overlay_face_wireframe_vert.glsl @@ -27,7 +27,7 @@ out vec3 obPos; out vec3 vNor; out float forceEdge; #else -out float edgeSharpness; +flat out vec3 edgeSharpness; #endif #endif @@ -80,6 +80,14 @@ vec3 get_vertex_pos(uint id) return pos; } +vec3 get_edge_normal(vec3 n1, vec3 n2, vec3 edge) +{ + edge = normalize(edge); + vec3 n = n1 + n2; + float p = dot(edge, n); + return normalize(n - p * edge); +} + float get_edge_sharpness(vec3 fnor, vec3 vnor) { float sharpness = abs(dot(fnor, vnor)); @@ -152,24 +160,30 @@ void main() gl_Position = p_pos[v_n]; +# ifndef LIGHT_EDGES vec3 nor = get_vertex_nor(v_id[v_n]); - facing = normalize(NormalMatrix * nor).z; - -# ifdef LIGHT_EDGES - vec3 fnor = normalize(cross(pos[1] - pos[0], pos[2] - pos[0])); - edgeSharpness = get_edge_sharpness(fnor, nor); - - /* Fix disapearing edges. */ - if (v_n == 0) { - force_edge.xy = force_edge.xz; - } - else if (v_n == 2) { - force_edge.xy = force_edge.yz; - } - if (any(force_edge.xy)) { - edgeSharpness = 1.0; - } +# else + vec3 edges[3]; + edges[0] = pos[1] - pos[0]; + edges[1] = pos[2] - pos[1]; + edges[2] = pos[0] - pos[2]; + vec3 fnor = normalize(cross(edges[0], -edges[2])); + + vec3 nors[3]; + nors[0] = get_vertex_nor(v_id.x); + nors[1] = get_vertex_nor(v_id.y); + nors[2] = get_vertex_nor(v_id.z); + edgeSharpness.x = get_edge_sharpness(fnor, get_edge_normal(nors[0], nors[1], edges[0])); + edgeSharpness.y = get_edge_sharpness(fnor, get_edge_normal(nors[1], nors[2], edges[1])); + edgeSharpness.z = get_edge_sharpness(fnor, get_edge_normal(nors[2], nors[0], edges[2])); + edgeSharpness.x = force_edge.x ? 1.0 : edgeSharpness.x; + edgeSharpness.y = force_edge.y ? 1.0 : edgeSharpness.y; + edgeSharpness.z = force_edge.z ? 1.0 : edgeSharpness.z; + + vec3 nor = nors[v_n]; # endif + facing = normalize(NormalMatrix * nor).z; + #endif } |