e4268188e09c5c4822424c95ec712a9df2eb17ea
[blender.git] / source / blender / draw / modes / shaders / edit_mesh_overlay_vert.glsl
1
2 /* Solid Wirefram implementation
3  * Mike Erwin, ClĂ©ment Foucault */
4
5 uniform mat3 NormalMatrix;
6 uniform mat4 ProjectionMatrix;
7 uniform mat4 ModelViewMatrix;
8 uniform mat4 ModelViewProjectionMatrix;
9 uniform ivec4 dataMask = ivec4(0xFF);
10
11 uniform float ofs = 1e-5;
12
13 uniform isamplerBuffer dataBuffer;
14
15 in vec3 pos;
16 #ifdef VERTEX_FACING
17 in vec3 vnor;
18 #endif
19
20 #ifdef EDGE_FIX
21 in ivec4 data;
22
23 out vec4 pPos;
24 out ivec4 vData;
25 #  ifdef VERTEX_FACING
26 out float vFacing;
27 #  endif
28
29 void main()
30 {
31         pPos = ModelViewProjectionMatrix * vec4(pos, 1.0);
32         pPos.z -= ofs * ((ProjectionMatrix[3][3] == 0.0) ? 1.0 : 0.0);
33         vData = data & dataMask;
34 #  ifdef VERTEX_FACING
35         vec4 vpos = ModelViewMatrix * vec4(pos, 1.0);
36         vec3 view_normal = normalize(NormalMatrix * vnor);
37         vec3 view_vec = (ProjectionMatrix[3][3] == 0.0)
38                 ? normalize(vpos.xyz)
39                 : vec3(0.0, 0.0, 1.0);
40         vFacing = dot(view_vec, view_normal);
41 #  endif
42 }
43
44 #else /* EDGE_FIX */
45
46 flat out vec3 edgesCrease;
47 flat out vec3 edgesBweight;
48 flat out vec4 faceColor;
49 flat out ivec3 flag;
50 #  ifdef VERTEX_SELECTION
51 out vec3 vertexColor;
52 #  endif
53 #  ifdef VERTEX_FACING
54 out float facing;
55 #  endif
56
57 out vec3 barycentric;
58
59 void main()
60 {
61         gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0);
62         gl_Position.z -= ofs * ((ProjectionMatrix[3][3] == 0.0) ? 1.0 : 0.0);
63
64         int v_0 = (gl_VertexID / 3) * 3;
65         int vidx = gl_VertexID % 3;
66         barycentric = vec3(equal(ivec3(0, 1, 2), ivec3(vidx)));
67
68         /* Edge */
69         ivec4 vData[3], data = ivec4(0);
70         ivec3 eflag;
71         for (int v = 0; v < 3; ++v) {
72                 data = texelFetch(dataBuffer, v_0 + v);
73                 vData[v] = data & dataMask;
74                 flag[v] = eflag[v] = vData[v].y | (vData[v].x << 8);
75                 edgesCrease[v] = vData[v].z / 255.0;
76                 edgesBweight[v] = vData[v].w / 255.0;
77         }
78
79         /* Face */
80         if ((vData[0].x & FACE_ACTIVE) != 0)
81                 faceColor = colorFaceSelect;
82         else if ((vData[0].x & FACE_SELECTED) != 0)
83                 faceColor = colorFaceSelect;
84         else if ((vData[0].x & FACE_FREESTYLE) != 0)
85                 faceColor = colorFaceFreestyle;
86         else
87                 faceColor = colorFace;
88
89 #  ifdef VERTEX_SELECTION
90         vertexColor = EDIT_MESH_vertex_color(vData[vidx].x).rgb;
91 #  endif
92 #  ifdef VERTEX_FACING
93         vec4 vPos = ModelViewMatrix * vec4(pos, 1.0);
94         vec3 view_normal = normalize(NormalMatrix * vnor);
95         vec3 view_vec = (ProjectionMatrix[3][3] == 0.0)
96                 ? normalize(vPos.xyz)
97                 : vec3(0.0, 0.0, 1.0);
98         facing = dot(view_vec, view_normal);
99 #  endif
100 }
101
102 #endif