Fix clipping shaders with some AMD/Intel drivers
[blender.git] / source / blender / draw / modes / shaders / edit_mesh_overlay_points_vert.glsl
1
2 uniform mat3 NormalMatrix;
3 uniform mat4 ProjectionMatrix;
4 uniform mat4 ModelViewMatrix;
5 uniform mat4 ModelViewProjectionMatrix;
6 uniform mat4 ModelMatrix;
7 uniform float ofs = 3e-5;
8
9 in vec3 pos;
10 in ivec4 data;
11 #ifdef VERTEX_FACING
12 in vec3 vnor;
13 #endif
14
15 out vec4 finalColor;
16
17 void main()
18 {
19         finalColor = colorVertex;
20         finalColor = ((data.x & VERTEX_SELECTED) != 0) ? colorVertexSelect : finalColor;
21         finalColor = ((data.x & VERTEX_ACTIVE) != 0) ? vec4(colorEditMeshActive.xyz, 1.0) : finalColor;
22
23         gl_PointSize = sizeVertex * 2.0;
24         gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0);
25         gl_Position.z -= ofs * ((ProjectionMatrix[3][3] == 0.0) ? 1.0 : 0.0);
26
27         /* Make selected and active vertex always on top. */
28         if ((data.x & VERTEX_SELECTED) != 0) {
29                 gl_Position.z -= 1e-7;
30         }
31         if ((data.x & VERTEX_ACTIVE) != 0) {
32                 gl_Position.z -= 1e-7;
33         }
34
35 #ifdef VERTEX_FACING
36         vec4 vPos = ModelViewMatrix * vec4(pos, 1.0);
37         vec3 view_normal = normalize(NormalMatrix * vnor);
38         vec3 view_vec = (ProjectionMatrix[3][3] == 0.0)
39                 ? normalize(vPos.xyz)
40                 : vec3(0.0, 0.0, 1.0);
41         float facing = dot(view_vec, view_normal);
42         facing = 1.0 - abs(facing) * 0.4;
43
44         finalColor = mix(colorEditMeshMiddle, finalColor, facing);
45         finalColor.a = 1.0;
46 #endif
47
48         if ((data.x & VERTEX_EXISTS) == 0) {
49                 gl_Position = vec4(0.0);
50                 gl_PointSize = 0.0;
51         }
52
53 #ifdef USE_WORLD_CLIP_PLANES
54         world_clip_planes_calc_clip_distance((ModelMatrix * vec4(pos, 1.0)).xyz);
55 #endif
56 }