Edit Mesh: Simplify the overlay shader.
[blender.git] / source / blender / draw / modes / shaders / edit_mesh_overlay_geom_edge.glsl
1
2 /* Solid Wirefram implementation
3  * Mike Erwin, ClĂ©ment Foucault */
4
5 /* This shader follows the principles of
6  * http://developer.download.nvidia.com/SDK/10/direct3d/Source/SolidWireframe/Doc/SolidWireframe.pdf */
7
8 layout(lines) in;
9 layout(triangle_strip, max_vertices=6) out;
10
11 uniform mat4 ProjectionMatrix;
12 uniform vec2 viewportSize;
13
14 in vec4 vPos[];
15 in vec4 pPos[];
16 in ivec4 vData[];
17 #ifdef VERTEX_FACING
18 in float vFacing[];
19 #endif
20
21 /* these are the same for all vertices
22  * and does not need interpolation */
23 flat out vec3 edgesCrease;
24 flat out vec3 edgesBweight;
25 flat out vec4 faceColor;
26 flat out ivec3 flag;
27 #ifdef VERTEX_SELECTION
28 out vec3 vertexColor;
29 #endif
30 #ifdef VERTEX_FACING
31 out float facing;
32 #endif
33
34 /* See fragment shader */
35 flat out vec2 ssPos[3];
36
37 #define FACE_ACTIVE     (1 << 2)
38 #define FACE_SELECTED   (1 << 3)
39
40 /* project to screen space */
41 vec2 proj(vec4 pos)
42 {
43         return (0.5 * (pos.xy / pos.w) + 0.5) * viewportSize;
44 }
45
46 void doVertex(int v, vec4 pos)
47 {
48 #ifdef VERTEX_SELECTION
49         vertexColor = EDIT_MESH_vertex_color(vData[v].x).rgb;
50 #endif
51
52 #ifdef VERTEX_FACING
53         facing = vFacing[v];
54 #endif
55
56         gl_Position = pos;
57
58         EmitVertex();
59 }
60
61 void main()
62 {
63         /* Face */
64         faceColor = vec4(0.0);
65
66         /* Proj Vertex */
67         vec2 pos[2] = vec2[2](proj(pPos[0]), proj(pPos[1]));
68
69         /* little optimization use a vec4 to vectorize
70          * following operations */
71         vec4 dirs1, dirs2;
72
73         /* Edge normalized vector */
74         dirs1.xy = normalize(pos[1] - pos[0]);
75
76         /* perpendicular to dir */
77         dirs1.zw = vec2(-dirs1.y, dirs1.x);
78
79         /* Make it view independent */
80         dirs1 *= sizeEdgeFix / viewportSize.xyxy;
81
82         dirs2 = dirs1;
83
84         /* Perspective */
85         if (ProjectionMatrix[3][3] == 0.0) {
86                 /* vPos[i].z is negative and we don't want
87                  * our fixvec to be flipped */
88                 dirs1 *= -vPos[0].z;
89                 dirs2 *= -vPos[1].z;
90         }
91
92         /* Edge / Vert data */
93         ssPos[0] = ssPos[2] = pos[0];
94         ssPos[1] = pos[1];
95         flag[0] = flag[2] = (vData[0].x << 8);
96         flag[1] = (vData[1].x << 8);
97
98         doVertex(0, pPos[0] + vec4(-dirs1.xy, 0.0, 0.0));
99         doVertex(0, pPos[0] + vec4( dirs1.zw, 0.0, 0.0));
100         doVertex(0, pPos[0] + vec4(-dirs1.zw, 0.0, 0.0));
101
102         flag[2] |= vData[0].y;
103         edgesCrease[2] = vData[0].z / 255.0;
104         edgesBweight[2] = vData[0].w / 255.0;
105
106         doVertex(1, pPos[1] + vec4( dirs2.zw, 0.0, 0.0));
107         doVertex(1, pPos[1] + vec4(-dirs2.zw, 0.0, 0.0));
108
109         flag[2] = 0;
110         doVertex(1, pPos[1] + vec4( dirs2.xy, 0.0, 0.0));
111
112         EndPrimitive();
113 }