DRW: Remove the use of GPUTexture buffers for edit wire rendering
[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 in vec3 pos;
14 #ifdef VERTEX_FACING
15 in vec3 vnor;
16 #endif
17
18 #ifdef EDGE_FIX
19 in ivec4 data;
20
21 out vec4 pPos;
22 out ivec4 vData;
23 #  ifdef VERTEX_FACING
24 out float vFacing;
25 #  endif
26
27 void main()
28 {
29         pPos = ModelViewProjectionMatrix * vec4(pos, 1.0);
30         pPos.z -= ofs * ((ProjectionMatrix[3][3] == 0.0) ? 1.0 : 0.0);
31         vData = data & dataMask;
32 #  ifdef VERTEX_FACING
33         vec4 vpos = ModelViewMatrix * vec4(pos, 1.0);
34         vec3 view_normal = normalize(NormalMatrix * vnor);
35         vec3 view_vec = (ProjectionMatrix[3][3] == 0.0)
36                 ? normalize(vpos.xyz)
37                 : vec3(0.0, 0.0, 1.0);
38         vFacing = dot(view_vec, view_normal);
39 #  endif
40 }
41
42 #else /* EDGE_FIX */
43
44 /* Consecutive data of the nth vertex.
45  * Only valid for first vertex in the triangle.
46  * Assuming GL_FRIST_VERTEX_CONVENTION. */
47 in ivec4 data0;
48 in ivec4 data1;
49 in ivec4 data2;
50
51 flat out vec3 edgesCrease;
52 flat out vec3 edgesBweight;
53 flat out vec4 faceColor;
54 flat out ivec3 flag;
55 #  ifdef VERTEX_SELECTION
56 out vec3 vertexColor;
57 #  endif
58 #  ifdef VERTEX_FACING
59 out float facing;
60 #  endif
61
62 out vec3 barycentric;
63
64 void main()
65 {
66         gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0);
67         gl_Position.z -= ofs * ((ProjectionMatrix[3][3] == 0.0) ? 1.0 : 0.0);
68
69         int v_0 = (gl_VertexID / 3) * 3;
70         int vidx = gl_VertexID % 3;
71         barycentric = vec3(equal(ivec3(0, 1, 2), ivec3(vidx)));
72
73         /* Edge */
74         ivec4 vData[3] = ivec4[3](data0, data1, data2);
75         ivec3 eflag;
76         for (int v = 0; v < 3; ++v) {
77                 vData[v] = vData[v] & dataMask;
78                 flag[v] = eflag[v] = vData[v].y | (vData[v].x << 8);
79                 edgesCrease[v] = vData[v].z / 255.0;
80                 edgesBweight[v] = vData[v].w / 255.0;
81         }
82
83         /* Face */
84         if ((vData[0].x & FACE_ACTIVE) != 0)
85                 faceColor = colorFaceSelect;
86         else if ((vData[0].x & FACE_SELECTED) != 0)
87                 faceColor = colorFaceSelect;
88         else if ((vData[0].x & FACE_FREESTYLE) != 0)
89                 faceColor = colorFaceFreestyle;
90         else
91                 faceColor = colorFace;
92
93 #  ifdef VERTEX_SELECTION
94         vertexColor = EDIT_MESH_vertex_color(data0.x).rgb;
95 #  endif
96 #  ifdef VERTEX_FACING
97         vec4 vPos = ModelViewMatrix * vec4(pos, 1.0);
98         vec3 view_normal = normalize(NormalMatrix * vnor);
99         vec3 view_vec = (ProjectionMatrix[3][3] == 0.0)
100                 ? normalize(vPos.xyz)
101                 : vec3(0.0, 0.0, 1.0);
102         facing = dot(view_vec, view_normal);
103 #  endif
104 }
105
106 #endif