Fix related to T55961: Glitch in selecting loose edges on some AMD drives.
[blender.git] / source / blender / draw / modes / shaders / edit_mesh_overlay_geom_edge.glsl
1
2 /* Solid Wirefram implementation
3  * Mike Erwin, ClĂ©ment Foucault */
4
5 layout(lines) in;
6 layout(triangle_strip, max_vertices=4) out;
7
8 uniform mat4 ProjectionMatrix;
9 uniform vec2 viewportSize;
10
11 in vec4 pPos[];
12 in ivec4 vData[];
13 #ifdef VERTEX_FACING
14 in float vFacing[];
15 #endif
16
17 /* these are the same for all vertices
18  * and does not need interpolation */
19 flat out vec3 edgesCrease;
20 flat out vec3 edgesBweight;
21 flat out vec4 faceColor;
22 flat out ivec3 flag;
23 #ifdef VERTEX_SELECTION
24 out vec3 vertexColor;
25 #endif
26 #ifdef VERTEX_FACING
27 out float facing;
28 #endif
29
30 /* See fragment shader */
31 flat out vec2 ssPos[3];
32
33 /* Some bugged AMD drivers need these global variables. See T55961 */
34 #ifdef VERTEX_SELECTION
35 vec3 vertex_color[3];
36 #endif
37
38 #ifdef VERTEX_FACING
39 float v_facing[3];
40 #endif
41
42 /* project to screen space */
43 vec2 proj(vec4 pos)
44 {
45         return (0.5 * (pos.xy / pos.w) + 0.5) * viewportSize;
46 }
47
48 void doVertex(int v, vec4 pos)
49 {
50 #ifdef VERTEX_SELECTION
51         vertexColor = vertex_color[v];
52 #endif
53
54 #ifdef VERTEX_FACING
55         facing = v_facing[v];
56 #endif
57
58         gl_Position = pos;
59
60         EmitVertex();
61 }
62
63 void main()
64 {
65         /* Face */
66         faceColor = vec4(0.0);
67
68         /* Proj Vertex */
69         vec2 pos[2] = vec2[2](proj(pPos[0]), proj(pPos[1]));
70
71         /* little optimization use a vec4 to vectorize
72          * following operations */
73         vec4 dirs1, dirs2;
74
75         /* Edge normalized vector */
76         dirs1.xy = normalize(pos[1] - pos[0]);
77
78         /* perpendicular to dir */
79         dirs1.zw = vec2(-dirs1.y, dirs1.x);
80
81         /* Make it view independent */
82         dirs1 *= sizeEdgeFix / viewportSize.xyxy;
83
84         dirs2 = dirs1;
85
86         /* Perspective */
87         if (ProjectionMatrix[3][3] == 0.0) {
88                 dirs1 *= pPos[0].w;
89                 dirs2 *= pPos[1].w;
90         }
91
92 #ifdef VERTEX_SELECTION
93         vertex_color[0] = EDIT_MESH_vertex_color(vData[0].x).rgb;
94         vertex_color[1] = EDIT_MESH_vertex_color(vData[1].x).rgb;
95 #endif
96
97 #ifdef VERTEX_FACING
98         /* Weird but some buggy AMD drivers need this. */
99         v_facing[0] = vFacing[0];
100         v_facing[1] = vFacing[1];
101 #endif
102
103         /* Edge / Vert data */
104         ssPos[0] = ssPos[2] = pos[0];
105         ssPos[1] = pos[1];
106         flag[0] = flag[2] = (vData[0].x << 8);
107         flag[1] = (vData[1].x << 8);
108         doVertex(0, pPos[0] + vec4( dirs1.zw, 0.0, 0.0));
109         doVertex(0, pPos[0] + vec4(-dirs1.zw, 0.0, 0.0));
110
111         flag[2] |= vData[0].y;
112         edgesCrease[2] = vData[0].z / 255.0;
113         edgesBweight[2] = vData[0].w / 255.0;
114
115         doVertex(1, pPos[1] + vec4( dirs2.zw, 0.0, 0.0));
116         doVertex(1, pPos[1] + vec4(-dirs2.zw, 0.0, 0.0));
117
118         EndPrimitive();
119 }