UVEdit: Add back uv angle stretch aspect correction
[blender.git] / source / blender / gpu / shaders / gpu_shader_2D_edituvs_stretch_vert.glsl
1
2 uniform mat4 ModelViewProjectionMatrix;
3 uniform vec2 aspect;
4
5 in vec2 pos;
6
7 #ifndef STRETCH_ANGLE
8 in float stretch;
9 #else
10
11 in vec4 uv_adj;
12 in float angle;
13 #endif
14
15 noperspective out vec4 finalColor;
16
17 vec3 weight_to_rgb(float weight)
18 {
19         vec3 r_rgb;
20         float blend = ((weight / 2.0) + 0.5);
21
22         if (weight <= 0.25) {    /* blue->cyan */
23                 r_rgb[0] = 0.0;
24                 r_rgb[1] = blend * weight * 4.0;
25                 r_rgb[2] = blend;
26         }
27         else if (weight <= 0.50) {  /* cyan->green */
28                 r_rgb[0] = 0.0;
29                 r_rgb[1] = blend;
30                 r_rgb[2] = blend * (1.0 - ((weight - 0.25) * 4.0));
31         }
32         else if (weight <= 0.75) {  /* green->yellow */
33                 r_rgb[0] = blend * ((weight - 0.50) * 4.0);
34                 r_rgb[1] = blend;
35                 r_rgb[2] = 0.0;
36         }
37         else if (weight <= 1.0) {  /* yellow->red */
38                 r_rgb[0] = blend;
39                 r_rgb[1] = blend * (1.0 - ((weight - 0.75) * 4.0));
40                 r_rgb[2] = 0.0;
41         }
42         else {
43                 /* exceptional value, unclamped or nan,
44                  * avoid uninitialized memory use */
45                 r_rgb[0] = 1.0;
46                 r_rgb[1] = 0.0;
47                 r_rgb[2] = 1.0;
48         }
49
50         return r_rgb;
51 }
52
53 #define M_PI       3.1415926535897932
54
55 /* Adapted from BLI_math_vector.h */
56 float angle_normalized_v2v2(vec2 v1, vec2 v2)
57 {
58         v1 = normalize(v1 * aspect);
59         v2 = normalize(v2 * aspect);
60         /* this is the same as acos(dot_v3v3(v1, v2)), but more accurate */
61         bool q = (dot(v1, v2) >= 0.0);
62         vec2 v = (q) ? (v1 - v2) : (v1 + v2);
63         float a = 2.0 * asin(length(v) / 2.0);
64         return (q) ? a : M_PI - a;
65 }
66
67 void main()
68 {
69         gl_Position = ModelViewProjectionMatrix * vec4(pos, 0.0, 1.0);
70
71 #ifdef STRETCH_ANGLE
72         float uv_angle = angle_normalized_v2v2(uv_adj.xy, uv_adj.zw) / M_PI;
73         float stretch = 1.0 - abs(uv_angle - angle);
74         stretch = stretch;
75         stretch = 1.0 - stretch * stretch;
76 #endif
77
78         finalColor = vec4(weight_to_rgb(stretch), 1.0);
79 }