Edit Mode: Change face mode edges display
[blender.git] / source / blender / draw / modes / shaders / edit_mesh_overlay_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 faceAlphaMod;
8 uniform ivec4 dataMask = ivec4(0xFF);
9 uniform float ofs;
10
11 in ivec4 data;
12 in vec3 pos;
13 #ifndef FACEDOT
14 in vec3 vnor;
15 #else
16 in vec4 norAndFlag;
17 #  define vnor norAndFlag.xyz
18 #endif
19
20 out vec4 finalColor;
21 out vec4 finalColorOuter;
22 #ifdef USE_GEOM_SHADER
23 out int selectOveride;
24 #endif
25
26 void main()
27 {
28 #if !defined(FACE)
29   mat4 projmat = ProjectionMatrix;
30   projmat[3][2] -= ofs;
31
32   gl_Position = projmat * (ModelViewMatrix * vec4(pos, 1.0));
33 #else
34
35   gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0);
36 #endif
37
38   ivec4 m_data = data & dataMask;
39
40 #if defined(VERT)
41   finalColor = EDIT_MESH_vertex_color(m_data.y);
42   gl_PointSize = sizeVertex * 2.0;
43   gl_Position.z -= 3e-5 * ((ProjectionMatrix[3][3] == 0.0) ? 1.0 : 0.0);
44   /* Make selected and active vertex always on top. */
45   if ((data.x & VERT_SELECTED) != 0) {
46     gl_Position.z -= 1e-7;
47   }
48   if ((data.x & VERT_ACTIVE) != 0) {
49     gl_Position.z -= 1e-7;
50   }
51
52 #elif defined(EDGE)
53 #  ifdef FLAT
54   finalColor = EDIT_MESH_edge_color_inner(m_data.y);
55   selectOveride = 1;
56 #  else
57   finalColor = EDIT_MESH_edge_vertex_color(m_data.y);
58   selectOveride = (m_data.y & EDGE_SELECTED);
59 #  endif
60
61   float crease = float(m_data.z) / 255.0;
62   float bweight = float(m_data.w) / 255.0;
63   finalColorOuter = EDIT_MESH_edge_color_outer(m_data.y, m_data.x, crease, bweight);
64
65 #elif defined(FACE)
66   finalColor = EDIT_MESH_face_color(m_data.x);
67   finalColor.a *= faceAlphaMod;
68
69 #elif defined(FACEDOT)
70   finalColor = EDIT_MESH_facedot_color(norAndFlag.w);
71   /* Bias Facedot Z position in clipspace. */
72   gl_Position.z -= 0.00035;
73   gl_PointSize = sizeFaceDot;
74
75 #endif
76
77 #if !defined(FACE)
78   /* Facing based color blend */
79   vec4 vpos = ModelViewMatrix * vec4(pos, 1.0);
80   vec3 view_normal = normalize(NormalMatrix * vnor + 1e-4);
81   vec3 view_vec = (ProjectionMatrix[3][3] == 0.0) ? normalize(vpos.xyz) : vec3(0.0, 0.0, 1.0);
82   float facing = dot(view_vec, view_normal);
83   facing = 1.0 - abs(facing) * 0.2;
84
85   finalColor.rgb = mix(colorEditMeshMiddle.rgb, finalColor.rgb, facing);
86
87 #endif
88
89 #ifdef USE_WORLD_CLIP_PLANES
90   world_clip_planes_calc_clip_distance((ModelMatrix * vec4(pos, 1.0)).xyz);
91 #endif
92 }