1+ // Copied from surface/frag.glsl
2+
3+ #version 330
4+
5+ uniform vec3 light_source_position;
6+ uniform float gloss;
7+ uniform float shadow;
8+ uniform float focal_distance;
9+
10+ uniform vec4 color0;
11+ uniform vec4 color1;
12+ uniform vec4 color2;
13+ uniform vec4 color3;
14+ uniform vec4 color4;
15+
16+ uniform vec2 coef0;
17+ uniform vec2 coef1;
18+ uniform vec2 coef2;
19+ uniform vec2 coef3;
20+ uniform vec2 coef4;
21+ uniform vec2 coef5;
22+
23+ uniform vec2 root0;
24+ uniform vec2 root1;
25+ uniform vec2 root2;
26+ uniform vec2 root3;
27+ uniform vec2 root4;
28+
29+ uniform float n_roots;
30+ uniform float n_steps;
31+
32+ uniform vec2 frame_shape;
33+
34+ in vec3 xyz_coords;
35+
36+ out vec4 frag_color;
37+
38+ #INSERT finalize_color.glsl
39+
40+ vec2 complex_mult(vec2 z, vec2 w){
41+ return vec2 (z.x * w.x - z.y * w.y, z.x * w.y + z.y * w.x);
42+ }
43+
44+ vec2 complex_div(vec2 z, vec2 w){
45+ float w_norm_squared = w.x * w.x + w.y * w.y;
46+ return complex_mult(z, vec2 (w.x, - w.y)) / w_norm_squared;
47+ }
48+
49+ vec2 complex_pow(vec2 z, int n){
50+ vec2 result = vec2 (1.0 , 0.0 );
51+ for (int i = 0 ; i < n; i++ ){
52+ result = complex_mult(result, z);
53+ }
54+ return result;
55+ }
56+
57+ vec2 poly(vec2 z, vec2 [6 ] coefs){
58+ vec2 result = vec2 (0.0 );
59+ for (int n = 0 ; n < 6 ; n++ ){
60+ result += complex_mult(coefs[n], complex_pow(z, n));
61+ }
62+ return result;
63+ }
64+
65+ vec2 dpoly(vec2 z, vec2 [6 ] coefs){
66+ vec2 result = vec2 (0.0 );
67+ for (int n = 1 ; n < 6 ; n++ ){
68+ result += n * complex_mult(coefs[n], complex_pow(z, n - 1 ));
69+ }
70+ return result;
71+ }
72+
73+ vec2 seek_root(vec2 z, vec2 [6 ] coefs){
74+ for (int i = 0 ; i < int (n_steps); i++ ){
75+ vec2 step = complex_div(poly(z, coefs), dpoly(z, coefs));
76+ if (length (step ) < 1e-2 ){
77+ break ;
78+ }
79+ z = z - step ;
80+ }
81+
82+ return z;
83+ }
84+
85+
86+ void main() {
87+ vec2 [6 ] coefs = vec2 [6 ](coef0, coef1, coef2, coef3, coef4, coef5);
88+ vec2 [5 ] roots = vec2 [5 ](root0, root1, root2, root3, root4);
89+ vec4 [5 ] colors = vec4 [5 ](color0, color1, color2, color3, color4);
90+
91+ vec2 z = xyz_coords.xy;
92+ vec2 found_root = seek_root(z, coefs);
93+
94+ vec4 color = vec4 (0.0 );
95+ float curr_min = 1e10 ;
96+ for (int i = 0 ; i < 5 ; i++ ){
97+ float dist = distance (roots[i], found_root);
98+ if (dist < curr_min){
99+ curr_min = dist;
100+ color = colors[i];
101+ }
102+ }
103+
104+ frag_color = finalize_color(
105+ color,
106+ xyz_coords,
107+ vec3 (0.0 , 0.0 , 1.0 ),
108+ light_source_position,
109+ gloss,
110+ shadow
111+ );
112+ }
0 commit comments