diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2018-10-12 16:09:43 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2018-10-12 17:43:40 +0300 |
commit | 03d0219d7ae5916500a45b157bd7a637310ef494 (patch) | |
tree | cf8da7335316267ab5141c466c6db27f06deaa06 /source/blender/draw/modes/shaders/edit_mesh_overlay_geom_tri.glsl | |
parent | fe4840ed4d7bc002586c5f11d04558edfdf996fe (diff) |
Edit Mesh: Refactor edit mesh drawing
This decouple the vertex display from the face+edges.
This is to reduce the number of triangles required to fix the edges
artifacts (aliasing) and increase viewport reactivity when not actively
navigating (ie. mouse scroll).
Also it makes all vertices visible (not cut-off) even when navigating.
However it makes the navigation drawing a bit slower because it has to
render twice.
Also add a depth bias to the wires to avoid depth fighting when previewing
final mesh (modifiers applied).
Diffstat (limited to 'source/blender/draw/modes/shaders/edit_mesh_overlay_geom_tri.glsl')
-rw-r--r-- | source/blender/draw/modes/shaders/edit_mesh_overlay_geom_tri.glsl | 51 |
1 files changed, 8 insertions, 43 deletions
diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_geom_tri.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_geom_tri.glsl index d020bcc6951..ccdf81bff7d 100644 --- a/source/blender/draw/modes/shaders/edit_mesh_overlay_geom_tri.glsl +++ b/source/blender/draw/modes/shaders/edit_mesh_overlay_geom_tri.glsl @@ -2,30 +2,14 @@ /* Solid Wirefram implementation * Mike Erwin, Clément Foucault */ -/* This shader follows the principles of - * http://developer.download.nvidia.com/SDK/10/direct3d/Source/SolidWireframe/Doc/SolidWireframe.pdf */ - layout(triangles) in; -/* This is not perfect. Only a subset of intel gpus are affected. - * This fix have some performance impact. - * TODO Refine the range to only affect GPUs. */ - -#ifdef EDGE_FIX /* To fix the edge artifacts, we render * an outline strip around the screenspace * triangle. Order is important. * TODO diagram */ - -#ifdef VERTEX_SELECTION -layout(triangle_strip, max_vertices=23) out; -#else -layout(triangle_strip, max_vertices=17) out; -#endif -#else -layout(triangle_strip, max_vertices=3) out; -#endif +layout(triangle_strip, max_vertices=15) out; uniform mat4 ProjectionMatrix; uniform vec2 viewportSize; @@ -43,7 +27,8 @@ flat out vec3 edgesCrease; flat out vec3 edgesBweight; flat out vec4 faceColor; flat out ivec3 flag; -flat out int clipCase; + +out vec3 barycentric; #ifdef VERTEX_SELECTION out vec3 vertexColor; #endif @@ -51,13 +36,6 @@ out vec3 vertexColor; out float facing; #endif -/* See fragment shader */ -flat out vec2 ssPos[3]; - -#define FACE_ACTIVE (1 << 3) -#define FACE_SELECTED (1 << 4) -#define FACE_FREESTYLE (1 << 5) - /* project to screen space */ vec2 proj(vec4 pos) { @@ -73,8 +51,9 @@ void doVertex(int v) #ifdef VERTEX_FACING facing = vFacing[v]; #endif - gl_Position = pPos[v]; + barycentric = vec3(0.0); + barycentric[v % 3] = 1.0; EmitVertex(); } @@ -84,6 +63,7 @@ void doLoopStrip(int v, vec3 offset) doVertex(v); gl_Position.xyz += offset; + barycentric = vec3(1.0); EmitVertex(); } @@ -115,6 +95,7 @@ void main() faceColor = colorFace; /* Vertex */ + vec2 ssPos[3]; ssPos[0] = proj(pPos[0]); ssPos[1] = proj(pPos[1]); ssPos[2] = proj(pPos[2]); @@ -123,10 +104,8 @@ void main() doVertex(1); doVertex(2); -#ifdef EDGE_FIX vec2 fixvec[6]; vec2 fixvecaf[6]; - vec2 cornervec[3]; /* This fix the case when 2 vertices are perfectly aligned * and corner vectors have nowhere to go. @@ -150,8 +129,6 @@ void main() vec2 dir = normalize(v2 - v1); vec2 dir2 = normalize(v3 - v1); - cornervec[i] = -normalize(dir + dir2); - /* perpendicular to dir */ vec2 perp = vec2(-dir.y, dir.x); @@ -162,7 +139,6 @@ void main() /* Make it view independent */ perp *= sizeEdgeFix / viewportSize; - cornervec[i] *= sizeEdgeFix / viewportSize; fixvec[i] = fixvecaf[i] = perp; /* Perspective */ @@ -171,7 +147,6 @@ void main() * our fixvec to be flipped */ fixvec[i] *= -vPos[i].z; fixvecaf[i] *= -vPos[i1].z; - cornervec[i] *= -vPos[i].z; } } @@ -195,16 +170,6 @@ void main() flag[v] &= ~EDGE_EXISTS; doLoopStrip(vaf, vec3(fixvecaf[v], Z_OFFSET)); - /* corner vertices should not draw edges but draw point only */ - flag[vbe] &= ~EDGE_EXISTS; -#ifdef VERTEX_SELECTION - doLoopStrip(vaf, vec3(cornervec[vaf], Z_OFFSET)); -#endif + EndPrimitive(); } - - /* finish the loop strip */ - doLoopStrip(2, vec3(fixvec[2], Z_OFFSET)); -#endif - - EndPrimitive(); } |