Fix T86293: crash undoing after executing the python console in certain
[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 #ifdef STRETCH_ANGLE
8 in vec2 uv_angles;
9 in float angle;
10
11 #else
12 in float ratio;
13 uniform float totalAreaRatio;
14 uniform float totalAreaRatioInv;
15
16 #endif
17
18 noperspective out vec4 finalColor;
19
20 vec3 weight_to_rgb(float weight)
21 {
22   vec3 r_rgb;
23   float blend = ((weight / 2.0) + 0.5);
24
25   if (weight <= 0.25) { /* blue->cyan */
26     r_rgb[0] = 0.0;
27     r_rgb[1] = blend * weight * 4.0;
28     r_rgb[2] = blend;
29   }
30   else if (weight <= 0.50) { /* cyan->green */
31     r_rgb[0] = 0.0;
32     r_rgb[1] = blend;
33     r_rgb[2] = blend * (1.0 - ((weight - 0.25) * 4.0));
34   }
35   else if (weight <= 0.75) { /* green->yellow */
36     r_rgb[0] = blend * ((weight - 0.50) * 4.0);
37     r_rgb[1] = blend;
38     r_rgb[2] = 0.0;
39   }
40   else if (weight <= 1.0) { /* yellow->red */
41     r_rgb[0] = blend;
42     r_rgb[1] = blend * (1.0 - ((weight - 0.75) * 4.0));
43     r_rgb[2] = 0.0;
44   }
45   else {
46     /* exceptional value, unclamped or nan,
47      * avoid uninitialized memory use */
48     r_rgb[0] = 1.0;
49     r_rgb[1] = 0.0;
50     r_rgb[2] = 1.0;
51   }
52
53   return r_rgb;
54 }
55
56 #define M_PI 3.1415926535897932
57
58 vec2 angle_to_v2(float angle)
59 {
60   return vec2(cos(angle), sin(angle));
61 }
62
63 /* Adapted from BLI_math_vector.h */
64 float angle_normalized_v2v2(vec2 v1, vec2 v2)
65 {
66   v1 = normalize(v1 * aspect);
67   v2 = normalize(v2 * aspect);
68   /* this is the same as acos(dot_v3v3(v1, v2)), but more accurate */
69   bool q = (dot(v1, v2) >= 0.0);
70   vec2 v = (q) ? (v1 - v2) : (v1 + v2);
71   float a = 2.0 * asin(length(v) / 2.0);
72   return (q) ? a : M_PI - a;
73 }
74
75 float area_ratio_to_stretch(float ratio, float tot_ratio, float inv_tot_ratio)
76 {
77   ratio *= (ratio > 0.0f) ? tot_ratio : -inv_tot_ratio;
78   return (ratio > 1.0f) ? (1.0f / ratio) : ratio;
79 }
80
81 void main()
82 {
83   gl_Position = ModelViewProjectionMatrix * vec4(pos, 0.0, 1.0);
84
85 #ifdef STRETCH_ANGLE
86   vec2 v1 = angle_to_v2(uv_angles.x * M_PI);
87   vec2 v2 = angle_to_v2(uv_angles.y * M_PI);
88   float uv_angle = angle_normalized_v2v2(v1, v2) / M_PI;
89   float stretch = 1.0 - abs(uv_angle - angle);
90   stretch = stretch;
91   stretch = 1.0 - stretch * stretch;
92 #else
93   float stretch = 1.0 - area_ratio_to_stretch(ratio, totalAreaRatio, totalAreaRatioInv);
94
95 #endif
96
97   finalColor = vec4(weight_to_rgb(stretch), 1.0);
98 }