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-07 17:55:41 +0300
committerClément Foucault <foucault.clem@gmail.com>2018-06-07 19:01:36 +0300
commitf9ca750bdf5e071eb240b55ee1e701e04dd7423c (patch)
tree873329d9ea6a02ef9de965848374329de89a8879 /source/blender/draw/modes/shaders/overlay_face_wireframe_vert.glsl
parent38232871791e88eb8294441c013171113cb61012 (diff)
Wireframe: Change / Optimize the limited wireframe visibility option.
This make the limited wireframe not a performance problem anymore. However, this does change the number of edges displayed as the threshold is now computed per vertex instead of per edges. For this reason we extended (internaly) the range of the slider so that the users can hide more edge.
Diffstat (limited to 'source/blender/draw/modes/shaders/overlay_face_wireframe_vert.glsl')
-rw-r--r--source/blender/draw/modes/shaders/overlay_face_wireframe_vert.glsl56
1 files changed, 12 insertions, 44 deletions
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 96afb8748b6..eca2e6bf530 100644
--- a/source/blender/draw/modes/shaders/overlay_face_wireframe_vert.glsl
+++ b/source/blender/draw/modes/shaders/overlay_face_wireframe_vert.glsl
@@ -24,9 +24,9 @@ out float facing;
#ifdef LIGHT_EDGES
#ifdef USE_GEOM_SHADER
out vec3 obPos;
-out vec3 edgeAdj;
+out vec3 vNor;
#else
-flat out vec3 edgeSharpness;
+out float edgeSharpness;
#endif
#endif
@@ -79,11 +79,10 @@ vec3 get_vertex_pos(int v_id)
return pos;
}
-float get_edge_sharpness(vec3 e0, vec3 e1, vec3 e2)
+float get_edge_sharpness(vec3 fnor, vec3 vnor)
{
- vec3 n0 = normalize(cross(e0, e1));
- vec3 n1 = normalize(cross(e1, e2));
- return dot(n0, n1);
+ float sharpness = abs(dot(fnor, vnor));
+ return smoothstep(wireStepParam.x, wireStepParam.y, sharpness);
}
#define NO_EDGE vec3(10000.0);
@@ -91,12 +90,7 @@ float get_edge_sharpness(vec3 e0, vec3 e1, vec3 e2)
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;
@@ -110,27 +104,19 @@ void main()
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);
+ vNor = nor;
# 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 + ofs.x).r;
- v_id.z = texelFetch(faceIds, v_0 + ofs.y).r;
+ v_id.y = texelFetch(faceIds, v_0 + 1).r;
+ v_id.z = texelFetch(faceIds, v_0 + 2).r;
bvec3 do_edge = lessThan(v_id, ivec3(0));
v_id = abs(v_id) - 1;
@@ -158,30 +144,12 @@ void main()
gl_Position = p_pos[v_n];
vec3 nor = get_vertex_nor(v_id[v_n]);
- facing = normalize(NormalMatrix * nor).z;
+ vec3 vnor = normalize(NormalMatrix * nor);
+ facing = vnor.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);
+ vec3 fnor = normalize(cross(pos[1] - pos[0], pos[2] - pos[0]));
+ edgeSharpness = get_edge_sharpness(fnor, nor);
# endif
#endif