GPencil: Changes in Fill and new 3D Cursor View Plane
[blender.git] / source / blender / gpu / shaders / gpu_shader_edges_front_back_persp_legacy_vert.glsl
1
2 // Draw "fancy" wireframe, displaying front-facing, back-facing and
3 // silhouette lines differently.
4 // Mike Erwin, April 2015
5
6 // After working with this shader a while, convinced we should make
7 // separate shaders for perpective & ortho. (Oct 2016)
8
9 // This shader is an imperfect stepping stone until all platforms are
10 // ready for geometry shaders.
11
12 // Due to perspective, the line segment's endpoints might disagree on
13 // whether the adjacent faces are front facing. Need to use a geometry
14 // shader or pass in an extra position attribute (the other endpoint)
15 // to do this properly.
16
17 uniform bool drawFront = true;
18 uniform bool drawBack = true;
19 uniform bool drawSilhouette = true;
20
21 uniform vec4 frontColor;
22 uniform vec4 backColor;
23 uniform vec4 silhouetteColor;
24
25 uniform mat4 ModelViewMatrix;
26 uniform mat4 ModelViewProjectionMatrix;
27 uniform mat3 NormalMatrix;
28
29 in vec3 pos;
30
31 // normals of faces this edge joins (object coords)
32 in vec3 N1;
33 in vec3 N2;
34
35 flat out vec4 finalColor;
36
37 // TODO: in float angle; // [-pi .. +pi], + peak, 0 flat, - valley
38
39 // to discard an entire line, set its color to invisible
40 // (must have GL_BLEND enabled, or discard in fragment shader)
41 const vec4 invisible = vec4(0.0);
42
43 bool front(vec3 N)
44 {
45         vec4 xformed = ModelViewMatrix * vec4(pos, 1.0);
46         return dot(NormalMatrix * N, normalize(-xformed.xyz)) > 0.0;
47 }
48
49 void main()
50 {
51         bool face_1_front = front(N1);
52         bool face_2_front = front(N2);
53
54         gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0);
55
56         if (face_1_front && face_2_front) {
57                 // front-facing edge
58                 finalColor = drawFront ? frontColor : invisible;
59         }
60         else if (face_1_front || face_2_front) {
61                 // exactly one face is front-facing, silhouette edge
62                 finalColor = drawSilhouette ? silhouetteColor : invisible;
63         }
64         else {
65                 // back-facing edge
66                 finalColor = drawBack ? backColor : invisible;
67         }
68 }