diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2017-03-02 03:07:03 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2017-03-02 03:08:32 +0300 |
commit | b463cd2ab8f1a48200e6b348002ac88d3a8507ca (patch) | |
tree | 0dc31f194e4ab344657651484dc2f65054ed2faa /source/blender/gpu | |
parent | aa102283daf0fd7a6a59d241c0b353f3e0ecfffc (diff) |
Edit Mode overlay: Moved Shaders to draw modules and resolved some draw issue.
We don't want to clutter gpu_shader.c with engine specific code
Added face's center dot
Simplified loose vert shader
Diffstat (limited to 'source/blender/gpu')
-rw-r--r-- | source/blender/gpu/CMakeLists.txt | 5 | ||||
-rw-r--r-- | source/blender/gpu/GPU_shader.h | 4 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_shader.c | 18 | ||||
-rw-r--r-- | source/blender/gpu/shaders/gpu_shader_edit_overlay_frag.glsl | 220 | ||||
-rw-r--r-- | source/blender/gpu/shaders/gpu_shader_edit_overlay_geom_edge.glsl | 188 | ||||
-rw-r--r-- | source/blender/gpu/shaders/gpu_shader_edit_overlay_geom_tri.glsl | 317 | ||||
-rw-r--r-- | source/blender/gpu/shaders/gpu_shader_edit_overlay_geom_vert.glsl | 113 | ||||
-rw-r--r-- | source/blender/gpu/shaders/gpu_shader_edit_overlay_vert.glsl | 23 |
8 files changed, 0 insertions, 888 deletions
diff --git a/source/blender/gpu/CMakeLists.txt b/source/blender/gpu/CMakeLists.txt index 95b15d664ab..b6ec702403a 100644 --- a/source/blender/gpu/CMakeLists.txt +++ b/source/blender/gpu/CMakeLists.txt @@ -191,11 +191,6 @@ data_to_c_simple(shaders/gpu_shader_edges_overlay_vert.glsl SRC) data_to_c_simple(shaders/gpu_shader_edges_overlay_geom.glsl SRC) data_to_c_simple(shaders/gpu_shader_edges_overlay_simple_geom.glsl SRC) data_to_c_simple(shaders/gpu_shader_edges_overlay_frag.glsl SRC) -data_to_c_simple(shaders/gpu_shader_edit_overlay_frag.glsl SRC) -data_to_c_simple(shaders/gpu_shader_edit_overlay_geom_tri.glsl SRC) -data_to_c_simple(shaders/gpu_shader_edit_overlay_geom_edge.glsl SRC) -data_to_c_simple(shaders/gpu_shader_edit_overlay_geom_vert.glsl SRC) -data_to_c_simple(shaders/gpu_shader_edit_overlay_vert.glsl SRC) data_to_c_simple(shaders/gpu_shader_text_vert.glsl SRC) data_to_c_simple(shaders/gpu_shader_text_frag.glsl SRC) data_to_c_simple(shaders/gpu_shader_keyframe_diamond_vert.glsl SRC) diff --git a/source/blender/gpu/GPU_shader.h b/source/blender/gpu/GPU_shader.h index 2488d265834..fe29b1edc58 100644 --- a/source/blender/gpu/GPU_shader.h +++ b/source/blender/gpu/GPU_shader.h @@ -100,10 +100,6 @@ typedef enum GPUBuiltinShader { GPU_SHADER_EDGES_FRONT_BACK_PERSP, GPU_SHADER_EDGES_FRONT_BACK_ORTHO, GPU_SHADER_EDGES_OVERLAY_SIMPLE, - GPU_SHADER_EDGES_OVERLAY_EDIT_TRI, - GPU_SHADER_EDGES_OVERLAY_EDIT_TRI_FAST, - GPU_SHADER_EDGES_OVERLAY_EDIT_VERT, - GPU_SHADER_EDGES_OVERLAY_EDIT_EDGE, GPU_SHADER_EDGES_OVERLAY, GPU_SHADER_KEYFRAME_DIAMOND, GPU_SHADER_SIMPLE_LIGHTING, diff --git a/source/blender/gpu/intern/gpu_shader.c b/source/blender/gpu/intern/gpu_shader.c index 2e590302227..aeec2af8d0c 100644 --- a/source/blender/gpu/intern/gpu_shader.c +++ b/source/blender/gpu/intern/gpu_shader.c @@ -109,11 +109,6 @@ extern char datatoc_gpu_shader_edges_overlay_vert_glsl[]; extern char datatoc_gpu_shader_edges_overlay_geom_glsl[]; extern char datatoc_gpu_shader_edges_overlay_simple_geom_glsl[]; extern char datatoc_gpu_shader_edges_overlay_frag_glsl[]; -extern char datatoc_gpu_shader_edit_overlay_frag_glsl[]; -extern char datatoc_gpu_shader_edit_overlay_geom_tri_glsl[]; -extern char datatoc_gpu_shader_edit_overlay_geom_edge_glsl[]; -extern char datatoc_gpu_shader_edit_overlay_geom_vert_glsl[]; -extern char datatoc_gpu_shader_edit_overlay_vert_glsl[]; extern char datatoc_gpu_shader_text_vert_glsl[]; extern char datatoc_gpu_shader_text_frag_glsl[]; extern char datatoc_gpu_shader_keyframe_diamond_vert_glsl[]; @@ -672,18 +667,6 @@ GPUShader *GPU_shader_get_builtin_shader(GPUBuiltinShader shader) datatoc_gpu_shader_flat_color_frag_glsl }, [GPU_SHADER_EDGES_OVERLAY_SIMPLE] = { datatoc_gpu_shader_3D_vert_glsl, datatoc_gpu_shader_edges_overlay_frag_glsl, datatoc_gpu_shader_edges_overlay_simple_geom_glsl }, - [GPU_SHADER_EDGES_OVERLAY_EDIT_TRI] = { datatoc_gpu_shader_edit_overlay_vert_glsl, - datatoc_gpu_shader_edit_overlay_frag_glsl, - datatoc_gpu_shader_edit_overlay_geom_tri_glsl }, - [GPU_SHADER_EDGES_OVERLAY_EDIT_TRI_FAST] = { datatoc_gpu_shader_edit_overlay_vert_glsl, - datatoc_gpu_shader_edit_overlay_frag_glsl, - datatoc_gpu_shader_edit_overlay_geom_tri_glsl }, - [GPU_SHADER_EDGES_OVERLAY_EDIT_EDGE] = { datatoc_gpu_shader_edit_overlay_vert_glsl, - datatoc_gpu_shader_edit_overlay_frag_glsl, - datatoc_gpu_shader_edit_overlay_geom_edge_glsl }, - [GPU_SHADER_EDGES_OVERLAY_EDIT_VERT] = { datatoc_gpu_shader_edit_overlay_vert_glsl, - datatoc_gpu_shader_edit_overlay_frag_glsl, - datatoc_gpu_shader_edit_overlay_geom_vert_glsl }, [GPU_SHADER_EDGES_OVERLAY] = { datatoc_gpu_shader_edges_overlay_vert_glsl, datatoc_gpu_shader_edges_overlay_frag_glsl, datatoc_gpu_shader_edges_overlay_geom_glsl }, @@ -778,7 +761,6 @@ GPUShader *GPU_shader_get_builtin_shader(GPUBuiltinShader shader) /* just a few special cases */ const char *defines = (shader == GPU_SHADER_SMOKE_COBA) ? "#define USE_COBA;\n" : (shader == GPU_SHADER_SIMPLE_LIGHTING) ? "#define USE_NORMALS;\n" : - (shader == GPU_SHADER_EDGES_OVERLAY_EDIT_TRI) ? "#define EDGE_FIX;\n" : (shader == GPU_SHADER_3D_OBJECTSPACE_SIMPLE_LIGHTING_VARIYING_COLOR) ? "#define USE_INSTANCE_COLOR;\n" : NULL; const GPUShaderStages *stages = builtin_shader_stages + shader; diff --git a/source/blender/gpu/shaders/gpu_shader_edit_overlay_frag.glsl b/source/blender/gpu/shaders/gpu_shader_edit_overlay_frag.glsl deleted file mode 100644 index 96f65bd5836..00000000000 --- a/source/blender/gpu/shaders/gpu_shader_edit_overlay_frag.glsl +++ /dev/null @@ -1,220 +0,0 @@ - -/* 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 */ - -/* keep in sync with GlobalsUboStorage */ -layout(std140) uniform globalsBlock { - vec4 colorWire; - vec4 colorWireEdit; - vec4 colorActive; - vec4 colorSelect; - vec4 colorTransform; - vec4 colorGroupActive; - vec4 colorGroup; - vec4 colorLamp; - vec4 colorSpeaker; - vec4 colorCamera; - vec4 colorEmpty; - vec4 colorVertex; - vec4 colorVertexSelect; - vec4 colorEditMeshActive; - vec4 colorEdgeSelect; - vec4 colorEdgeSeam; - vec4 colorEdgeSharp; - vec4 colorEdgeCrease; - vec4 colorEdgeBWeight; - vec4 colorEdgeFaceSelect; - vec4 colorFace; - vec4 colorFaceSelect; - vec4 colorNormal; - vec4 colorVNormal; - vec4 colorLNormal; - vec4 colorFaceDot; - - vec4 colorDeselect; - vec4 colorOutline; - vec4 colorLampNoAlpha; - - float sizeLampCenter; - float sizeLampCircle; - float sizeLampCircleShadow; - float sizeVertex; - float sizeEdge; - float sizeEdgeFix; - float sizeNormal; - float sizeFaceDot; -}; - -flat in vec3 edgesCrease; -flat in vec3 edgesBweight; -flat in ivec3 flag; -flat in vec4 faceColor; -flat in int clipCase; -#ifdef VERTEX_SELECTION -smooth in vec3 vertexColor; -#endif - -/* We use a vec4[2] interface to pass edge data - * (without fragmenting memory accesses) - * - * There is 2 cases : - * - * - Simple case : geometry shader return edge distances - * in the first 2 components of the first vec4. - * This needs noperspective interpolation. - * The rest is filled with vertex screen positions. - * eData1.zw actually contain v2 - * eData2.xy actually contain v1 - * eData2.zw actually contain v0 - * - * - Hard case : two 2d edge corner are described by each - * vec4 as origin and direction. This is constant over - * the triangle and use to detect the correct case. */ - -noperspective in vec4 eData1; -flat in vec4 eData2; - -out vec4 FragColor; - -#define EDGE_EXISTS (1 << 0) -#define EDGE_ACTIVE (1 << 1) -#define EDGE_SELECTED (1 << 2) -#define EDGE_SEAM (1 << 3) -#define EDGE_SHARP (1 << 4) -/* Vertex flag is shifted and combined with the edge flag */ -#define VERTEX_ACTIVE (1 << (0 + 8)) -#define VERTEX_SELECTED (1 << (1 + 8)) -#define FACE_ACTIVE (1 << (2 + 8)) - -/* Style Parameters in pixel */ - -/* Array to retreive vert/edge indices */ -const ivec3 clipEdgeIdx[6] = ivec3[6]( - ivec3(1, 0, 2), - ivec3(2, 0, 1), - ivec3(2, 1, 0), - ivec3(2, 1, 0), - ivec3(2, 0, 1), - ivec3(1, 0, 2) -); - -const ivec3 clipPointIdx[6] = ivec3[6]( - ivec3(0, 1, 2), - ivec3(0, 2, 1), - ivec3(0, 2, 1), - ivec3(1, 2, 0), - ivec3(1, 2, 0), - ivec3(2, 1, 0) -); - -const mat4 stipple_matrix = mat4(vec4(1.0, 0.0, 0.0, 0.0), - vec4(0.0, 0.0, 0.0, 0.0), - vec4(0.0, 0.0, 1.0, 0.0), - vec4(0.0, 0.0, 0.0, 0.0)); - -void colorDist(vec4 color, float dist) -{ - FragColor = (dist < 0) ? color : FragColor; -} - -float distToEdge(vec2 o, vec2 dir) -{ - vec2 af = gl_FragCoord.xy - o; - float daf = dot(dir, af); - return sqrt(abs(dot(af, af) - daf * daf)); -} - -void main() -{ - vec3 e, p; - - /* Step 1 : Computing Distances */ - - if (clipCase == 0) { - e.xy = eData1.xy; - - /* computing missing distance */ - vec2 dir = normalize(eData2.zw - eData2.xy); - e.z = distToEdge(eData2.zw, dir); - - p.x = distance(eData2.zw, gl_FragCoord.xy); - p.y = distance(eData2.xy, gl_FragCoord.xy); - p.z = distance(eData1.zw, gl_FragCoord.xy); - } - else { - ivec3 eidxs = clipEdgeIdx[clipCase - 1]; - ivec3 pidxs = clipPointIdx[clipCase - 1]; - - e[eidxs.x] = distToEdge(eData1.xy, eData1.zw); - e[eidxs.y] = distToEdge(eData2.xy, eData2.zw); - - /* Three edges visible cases */ - if (clipCase == 1 || clipCase == 2 || clipCase == 4) { - e[eidxs.z] = distToEdge(eData1.xy, normalize(eData2.xy - eData1.xy)); - p[pidxs.y] = distance(eData2.xy, gl_FragCoord.xy); - } - else { - e[eidxs.z] = 1e10; /* off screen */ - p[pidxs.y] = 1e10; /* off screen */ - } - - p[pidxs.x] = distance(eData1.xy, gl_FragCoord.xy); - p[pidxs.z] = 1e10; /* off screen */ - } - - /* Step 2 : coloring (order dependant) */ - - /* First */ - FragColor = faceColor; - - if ((flag[0] & FACE_ACTIVE) != 0) { - int x = int(gl_FragCoord.x) & 0x3; /* mod 4 */ - int y = int(gl_FragCoord.y) & 0x3; /* mod 4 */ - FragColor *= stipple_matrix[x][y]; - } - - /* Edges */ - for (int v = 0; v < 3; ++v) { - if ((flag[v] & EDGE_EXISTS) != 0) { - float largeEdge = e[v] - sizeEdge * 2.0; - float innerEdge = e[v] - sizeEdge; - - if ((flag[v] & EDGE_SEAM) != 0) - colorDist(colorEdgeSeam, largeEdge); - else if (edgesBweight[v] > 0.0) - colorDist(vec4(colorEdgeBWeight.rgb, edgesBweight[v]), largeEdge); - else if (edgesCrease[v] > 0.0) - colorDist(vec4(colorEdgeCrease.rgb, edgesCrease[v]), largeEdge); - else if ((flag[v] & EDGE_SHARP) != 0) - colorDist(colorEdgeSharp, largeEdge); - else -#ifdef VERTEX_SELECTION - colorDist(vertexColor, innerEdge); -#else - colorDist(colorWireEdit, innerEdge); - if ((flag[v] & EDGE_ACTIVE) != 0) - colorDist(vec4(colorEditMeshActive.xyz, 1.0), innerEdge); - else if ((flag[v] & EDGE_SELECTED) != 0) - colorDist(colorEdgeSelect, innerEdge); -#endif - } - } - - /* Points */ - for (int v = 0; v < 3; ++v) { - float size = p[v] - sizeVertex; - - if ((flag[v] & VERTEX_ACTIVE) != 0) - colorDist(vec4(colorEditMeshActive.xyz, 1.0), size); - else if ((flag[v] & VERTEX_SELECTED) != 0) - colorDist(colorVertexSelect, size); - else - colorDist(colorVertex, size); - } - - /* don't write depth if not opaque */ - if (FragColor.a == 0.0) discard; -} diff --git a/source/blender/gpu/shaders/gpu_shader_edit_overlay_geom_edge.glsl b/source/blender/gpu/shaders/gpu_shader_edit_overlay_geom_edge.glsl deleted file mode 100644 index 7ebaea59133..00000000000 --- a/source/blender/gpu/shaders/gpu_shader_edit_overlay_geom_edge.glsl +++ /dev/null @@ -1,188 +0,0 @@ - -/* 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 */ - -/* keep in sync with GlobalsUboStorage */ -layout(std140) uniform globalsBlock { - vec4 colorWire; - vec4 colorWireEdit; - vec4 colorActive; - vec4 colorSelect; - vec4 colorTransform; - vec4 colorGroupActive; - vec4 colorGroup; - vec4 colorLamp; - vec4 colorSpeaker; - vec4 colorCamera; - vec4 colorEmpty; - vec4 colorVertex; - vec4 colorVertexSelect; - vec4 colorEditMeshActive; - vec4 colorEdgeSelect; - vec4 colorEdgeSeam; - vec4 colorEdgeSharp; - vec4 colorEdgeCrease; - vec4 colorEdgeBWeight; - vec4 colorEdgeFaceSelect; - vec4 colorFace; - vec4 colorFaceSelect; - vec4 colorNormal; - vec4 colorVNormal; - vec4 colorLNormal; - vec4 colorFaceDot; - - vec4 colorDeselect; - vec4 colorOutline; - vec4 colorLampNoAlpha; - - float sizeLampCenter; - float sizeLampCircle; - float sizeLampCircleShadow; - float sizeVertex; - float sizeEdge; - float sizeEdgeFix; - float sizeNormal; - float sizeFaceDot; -}; - -layout(lines) in; -layout(triangle_strip, max_vertices=6) out; - -uniform mat4 ProjectionMatrix; -uniform vec2 viewportSize; - -in vec4 vPos[]; -in vec4 pPos[]; -in ivec4 vData[]; - -/* these are the same for all vertices - * and does not need interpolation */ -flat out vec3 edgesCrease; -flat out vec3 edgesSharp; -flat out ivec3 flag; -flat out vec4 faceColor; -flat out int clipCase; -#ifdef VERTEX_SELECTION -smooth out vec3 vertexColor; -#endif - -/* See fragment shader */ -noperspective out vec4 eData1; -flat out vec4 eData2; - -#define VERTEX_ACTIVE (1 << 0) -#define VERTEX_SELECTED (1 << 1) - -#define FACE_ACTIVE (1 << 2) -#define FACE_SELECTED (1 << 3) - -/* Table 1. Triangle Projection Cases */ -const ivec4 clipPointsIdx[6] = ivec4[6]( - ivec4(0, 1, 2, 2), - ivec4(0, 2, 1, 1), - ivec4(0, 0, 1, 2), - ivec4(1, 2, 0, 0), - ivec4(1, 1, 0, 2), - ivec4(2, 2, 0, 1) -); - -/* project to screen space */ -vec2 proj(vec4 pos) -{ - return (0.5 * (pos.xy / pos.w) + 0.5) * viewportSize; -} - -float dist(vec2 pos[3], vec2 vpos, int v) -{ - /* endpoints of opposite edge */ - vec2 e1 = pos[(v + 1) % 3]; - vec2 e2 = pos[(v + 2) % 3]; - /* Edge normalized vector */ - vec2 dir = normalize(e2 - e1); - /* perpendicular to dir */ - vec2 orthogonal = vec2(-dir.y, dir.x); - - return abs(dot(vpos - e1, orthogonal)); -} - -vec3 getVertexColor(int v) -{ - if ((vData[v].x & VERTEX_ACTIVE) != 0) - return colorEditMeshActive; - else if ((vData[v].x & VERTEX_SELECTED) != 0) - return colorEdgeSelect; - else - return colorWireEdit; -} - -void doVertex(int v, vec4 pos) -{ -#ifdef VERTEX_SELECTION - vertexColor = getVertexColor(v); -#endif - - gl_Position = pos; - - EmitVertex(); -} - -void main() -{ - clipCase = 0; - - /* Face */ - faceColor = vec4(0.0); - - /* Proj Vertex */ - vec2 pos[2] = vec2[2](proj(pPos[0]), proj(pPos[1])); - - /* little optimization use a vec4 to vectorize - * following operations */ - vec4 dirs1, dirs2; - - /* Edge normalized vector */ - dirs1.xy = normalize(pos[1] - pos[0]); - - /* perpendicular to dir */ - dirs1.zw = vec2(-dirs1.y, dirs1.x); - - /* Make it view independant */ - dirs1 *= sizeEdgeFix / viewportSize.xyxy; - - dirs2 = dirs1; - - /* Perspective */ - if (ProjectionMatrix[3][3] == 0.0) { - /* vPos[i].z is negative and we don't want - * our fixvec to be flipped */ - dirs1 *= -vPos[0].z; - dirs2 *= -vPos[1].z; - } - - /* Edge / Vert data */ - eData1 = vec4(1e10); - eData2.zw = pos[0]; - eData2.xy = pos[1]; - flag[0] = (vData[0].x << 8); - flag[1] = (vData[1].x << 8); - flag[2] = 0; - - doVertex(0, pPos[0] + vec4(-dirs1.xy, 0.0, 0.0)); - doVertex(0, pPos[0] + vec4( dirs1.zw, 0.0, 0.0)); - doVertex(0, pPos[0] + vec4(-dirs1.zw, 0.0, 0.0)); - - flag[2] = vData[0].y | (vData[0].x << 8); - edgesCrease[2] = vData[0].z / 255.0; - edgesSharp[2] = vData[0].w / 255.0; - - doVertex(1, pPos[1] + vec4( dirs2.zw, 0.0, 0.0)); - doVertex(1, pPos[1] + vec4(-dirs2.zw, 0.0, 0.0)); - - flag[2] = 0; - doVertex(1, pPos[1] + vec4( dirs2.xy, 0.0, 0.0)); - - EndPrimitive(); -} diff --git a/source/blender/gpu/shaders/gpu_shader_edit_overlay_geom_tri.glsl b/source/blender/gpu/shaders/gpu_shader_edit_overlay_geom_tri.glsl deleted file mode 100644 index 0f847c28ded..00000000000 --- a/source/blender/gpu/shaders/gpu_shader_edit_overlay_geom_tri.glsl +++ /dev/null @@ -1,317 +0,0 @@ - -/* 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 */ - -/* keep in sync with GlobalsUboStorage */ -layout(std140) uniform globalsBlock { - vec4 colorWire; - vec4 colorWireEdit; - vec4 colorActive; - vec4 colorSelect; - vec4 colorTransform; - vec4 colorGroupActive; - vec4 colorGroup; - vec4 colorLamp; - vec4 colorSpeaker; - vec4 colorCamera; - vec4 colorEmpty; - vec4 colorVertex; - vec4 colorVertexSelect; - vec4 colorEditMeshActive; - vec4 colorEdgeSelect; - vec4 colorEdgeSeam; - vec4 colorEdgeSharp; - vec4 colorEdgeCrease; - vec4 colorEdgeBWeight; - vec4 colorEdgeFaceSelect; - vec4 colorFace; - vec4 colorFaceSelect; - vec4 colorNormal; - vec4 colorVNormal; - vec4 colorLNormal; - vec4 colorFaceDot; - - vec4 colorDeselect; - vec4 colorOutline; - vec4 colorLampNoAlpha; - - float sizeLampCenter; - float sizeLampCircle; - float sizeLampCircleShadow; - float sizeVertex; - float sizeEdge; - float sizeEdgeFix; - float sizeNormal; - float sizeFaceDot; -}; - -layout(triangles) in; - -#ifdef EDGE_FIX -/* To fix the edge artifacts, we render - * an outline strip around the screenspace - * triangle. Order is important. - * TODO diagram - */ - -layout(triangle_strip, max_vertices=23) out; -#else -layout(triangle_strip, max_vertices=3) out; -#endif - -uniform mat4 ProjectionMatrix; -uniform vec2 viewportSize; - -in vec4 vPos[]; -in vec4 pPos[]; -in ivec4 vData[]; - -/* these are the same for all vertices - * and does not need interpolation */ -flat out vec3 edgesCrease; -flat out vec3 edgesSharp; -flat out ivec3 flag; -flat out vec4 faceColor; -flat out int clipCase; -#ifdef VERTEX_SELECTION -smooth out vec3 vertexColor; -#endif - -/* See fragment shader */ -noperspective out vec4 eData1; -flat out vec4 eData2; - - -#define VERTEX_ACTIVE (1 << 0) -#define VERTEX_SELECTED (1 << 1) - -#define FACE_ACTIVE (1 << 2) -#define FACE_SELECTED (1 << 3) - -/* Table 1. Triangle Projection Cases */ -const ivec4 clipPointsIdx[6] = ivec4[6]( - ivec4(0, 1, 2, 2), - ivec4(0, 2, 1, 1), - ivec4(0, 0, 1, 2), - ivec4(1, 2, 0, 0), - ivec4(1, 1, 0, 2), - ivec4(2, 2, 0, 1) -); - -/* project to screen space */ -vec2 proj(vec4 pos) -{ - return (0.5 * (pos.xy / pos.w) + 0.5) * viewportSize; -} - -float dist(vec2 pos[3], vec2 vpos, int v) -{ - /* endpoints of opposite edge */ - vec2 e1 = pos[(v + 1) % 3]; - vec2 e2 = pos[(v + 2) % 3]; - /* Edge normalized vector */ - vec2 dir = normalize(e2 - e1); - /* perpendicular to dir */ - vec2 orthogonal = vec2(-dir.y, dir.x); - - return abs(dot(vpos - e1, orthogonal)); -} - -vec3 getVertexColor(int v) -{ - if ((vData[v].x & VERTEX_ACTIVE) != 0) - return colorEditMeshActive; - else if ((vData[v].x & VERTEX_SELECTED) != 0) - return colorEdgeSelect; - else - return colorWireEdit; -} - -vec4 getClipData(vec2 pos[3], ivec2 vidx) -{ - vec2 A = pos[vidx.x]; - vec2 Adir = normalize(A - pos[vidx.y]); - - return vec4(A, Adir); -} - -void doVertex(int v, vec4 pos) -{ -#ifdef VERTEX_SELECTION - vertexColor = getVertexColor(v); -#endif - - gl_Position = pos; - - EmitVertex(); -} - -void main() -{ - /* First we detect which case we are in */ - clipCase = 0; - - /* if perspective */ - if (ProjectionMatrix[3][3] == 0.0) { - /* See Table 1. Triangle Projection Cases */ - clipCase += int(pPos[0].z / pPos[0].w < -1 || vPos[0].z > 0.0) * 4; - clipCase += int(pPos[1].z / pPos[1].w < -1 || vPos[1].z > 0.0) * 2; - clipCase += int(pPos[2].z / pPos[2].w < -1 || vPos[2].z > 0.0) * 1; - } - - /* If triangle is behind nearplane, early out */ - if (clipCase == 7) - return; - - /* Edge */ - ivec3 eflag; vec3 ecrease, esharp; - for (int v = 0; v < 3; ++v) { - flag[v] = eflag[v] = vData[v].y | (vData[v].x << 8); - edgesCrease[v] = ecrease[v] = vData[v].z / 255.0; - edgesSharp[v] = esharp[v] = vData[v].w / 255.0; - } - - /* Face */ - if ((vData[0].x & FACE_ACTIVE) != 0) - faceColor = colorEditMeshActive; - else if ((vData[0].x & FACE_SELECTED) != 0) - faceColor = colorFaceSelect; - else - faceColor = colorFace; - - /* Vertex */ - vec2 pos[3] = vec2[3](proj(pPos[0]), proj(pPos[1]), proj(pPos[2])); - - /* Simple case : compute edge distances in geometry shader */ - if (clipCase == 0) { - - /* Packing screen positions and 2 distances */ - eData1 = vec4(0.0, 0.0, pos[2]); - eData2 = vec4(pos[1], pos[0]); - - /* Only pass the first 2 distances */ - for (int v = 0; v < 2; ++v) { - eData1[v] = dist(pos, pos[v], v); - doVertex(v, pPos[v]); - eData1[v] = 0.0; - } - - /* and the last vertex */ - doVertex(2, pPos[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. - * ie: length(cornervec[i]) == 0 */ - const float epsilon = 1e-2; /* in pixel so not that much */ - const vec2 bias[3] = vec2[3]( - vec2( epsilon, epsilon), - vec2(-epsilon, epsilon), - vec2( 0.0, -epsilon) - ); - - for (int i = 0; i < 3; ++i) { - int i1 = (i + 1) % 3; - int i2 = (i + 2) % 3; - - vec2 v1 = pos[i] + bias[i]; - vec2 v2 = pos[i1] + bias[i1]; - vec2 v3 = pos[i2] + bias[i2]; - - /* Edge normalized vector */ - 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); - - /* Backface case */ - if (dot(perp, dir2) > 0) { - perp = -perp; - } - - /* Make it view independant */ - perp *= sizeEdgeFix / viewportSize; - cornervec[i] *= sizeEdgeFix / viewportSize; - fixvec[i] = fixvecaf[i] = perp; - - /* Perspective */ - if (ProjectionMatrix[3][3] == 0.0) { - /* vPos[i].z is negative and we don't want - * our fixvec to be flipped */ - fixvec[i] *= -vPos[i].z; - fixvecaf[i] *= -vPos[i1].z; - cornervec[i] *= -vPos[i].z; - } - } - - /* to not let face color bleed */ - faceColor = vec4(0.0, 0.0, 0.0, 0.0); - - /* we don't want other edges : make them far*/ - eData1 = vec4(1e10); - - /* Start with the same last vertex to create a - * degenerate triangle in order to "create" - * a new triangle strip */ - for (int i = 2; i < 5; ++i) { - int vbe = (i - 1) % 3; - int vaf = (i + 1) % 3; - int v = i % 3; - - /* Position of the "hidden" thrid vertex - * we set it early because it has*/ - eData1.zw = pos[vbe]; - - doVertex(vaf, pPos[v]); - doVertex(vaf, pPos[v] + vec4(fixvec[v], 0.0, 0.0)); - - /* Now one triangle only shade one edge - * so we use the edge distance calculated - * in the fragment shader, the third edge; - * we do this because we need flat interp to - * draw a continuous triangle strip */ - eData2.xy = pos[vaf]; - eData2.zw = pos[v]; - flag[0] = (vData[v].x << 8); - flag[1] = (vData[vaf].x << 8); - flag[2] = eflag[vbe]; - edgesCrease[2] = ecrease[vbe]; - edgesSharp[2] = esharp[vbe]; - - doVertex(v, pPos[vaf]); - doVertex(v, pPos[vaf] + vec4(fixvecaf[v], 0.0, 0.0)); - - /* corner vertices should not drax edges but draw point only */ - flag[2] = (vData[vbe].x << 8); - doVertex(v, pPos[vaf]); - doVertex(v, pPos[vaf] + vec4(cornervec[vaf], 0.0, 0.0)); - } - - /* finish the loop strip */ - doVertex(0, pPos[2]); - doVertex(0, pPos[2] + vec4(fixvec[2], 0.0, 0.0)); -#endif - } - /* Harder case : compute visible edges vectors */ - else { - ivec4 vindices = clipPointsIdx[clipCase - 1]; - - eData1 = getClipData(pos, vindices.xz); - eData2 = getClipData(pos, vindices.yw); - - for (int v = 0; v < 3; ++v) - doVertex(v, pPos[v]); - } - - EndPrimitive(); -} diff --git a/source/blender/gpu/shaders/gpu_shader_edit_overlay_geom_vert.glsl b/source/blender/gpu/shaders/gpu_shader_edit_overlay_geom_vert.glsl deleted file mode 100644 index 1dc7f7aa389..00000000000 --- a/source/blender/gpu/shaders/gpu_shader_edit_overlay_geom_vert.glsl +++ /dev/null @@ -1,113 +0,0 @@ - -/* 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 */ - -/* keep in sync with GlobalsUboStorage */ -layout(std140) uniform globalsBlock { - vec4 colorWire; - vec4 colorWireEdit; - vec4 colorActive; - vec4 colorSelect; - vec4 colorTransform; - vec4 colorGroupActive; - vec4 colorGroup; - vec4 colorLamp; - vec4 colorSpeaker; - vec4 colorCamera; - vec4 colorEmpty; - vec4 colorVertex; - vec4 colorVertexSelect; - vec4 colorEditMeshActive; - vec4 colorEdgeSelect; - vec4 colorEdgeSeam; - vec4 colorEdgeSharp; - vec4 colorEdgeCrease; - vec4 colorEdgeBWeight; - vec4 colorEdgeFaceSelect; - vec4 colorFace; - vec4 colorFaceSelect; - vec4 colorNormal; - vec4 colorVNormal; - vec4 colorLNormal; - vec4 colorFaceDot; - - vec4 colorDeselect; - vec4 colorOutline; - vec4 colorLampNoAlpha; - - float sizeLampCenter; - float sizeLampCircle; - float sizeLampCircleShadow; - float sizeVertex; - float sizeEdge; - float sizeEdgeFix; - float sizeNormal; - float sizeFaceDot; -}; - -layout(points) in; -layout(triangle_strip, max_vertices=4) out; - -uniform mat4 ProjectionMatrix; -uniform vec2 viewportSize; - -in vec4 vPos[]; -in vec4 pPos[]; -in ivec4 vData[]; - -/* these are the same for all vertices - * and does not need interpolation */ -flat out ivec3 flag; -flat out vec4 faceColor; -flat out int clipCase; - -/* See fragment shader */ -noperspective out vec4 eData1; -flat out vec4 eData2; - -/* project to screen space */ -vec2 proj(vec4 pos) -{ - return (0.5 * (pos.xy / pos.w) + 0.5) * viewportSize; -} - -void doVertex(vec4 pos) -{ - gl_Position = pos; - EmitVertex(); -} - -void main() -{ - clipCase = 0; - - /* there is no face */ - faceColor = vec4(0.0); - - /* only verterx position 0 is used */ - eData1 = eData2 = vec4(1e10); - flag = ivec3(0); - - vec2 dir = vec2(1.0) * sizeEdgeFix; - /* Make it view independant */ - dir /= viewportSize; - - if (ProjectionMatrix[3][3] == 0.0) { - dir *= -vPos[0].z; - } - - eData2.zw = proj(pPos[0]); - - flag[0] = (vData[0].x << 8); - - /* Quad */ - doVertex(pPos[0] + vec4( dir.x, dir.y, 0.0, 0.0)); - doVertex(pPos[0] + vec4(-dir.x, dir.y, 0.0, 0.0)); - doVertex(pPos[0] + vec4( dir.x, -dir.y, 0.0, 0.0)); - doVertex(pPos[0] + vec4(-dir.x, -dir.y, 0.0, 0.0)); - - EndPrimitive(); -} diff --git a/source/blender/gpu/shaders/gpu_shader_edit_overlay_vert.glsl b/source/blender/gpu/shaders/gpu_shader_edit_overlay_vert.glsl deleted file mode 100644 index 5bc9a8bef85..00000000000 --- a/source/blender/gpu/shaders/gpu_shader_edit_overlay_vert.glsl +++ /dev/null @@ -1,23 +0,0 @@ - -/* 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 */ - -uniform mat4 ModelViewMatrix; -uniform mat4 ModelViewProjectionMatrix; - -in vec3 pos; -in ivec4 data; - -out vec4 vPos; -out vec4 pPos; -out ivec4 vData; - -void main() -{ - vPos = ModelViewMatrix * vec4(pos, 1.0); - pPos = ModelViewProjectionMatrix * vec4(pos, 1.0); - vData = data; -} |