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