|
17 | 17 | // Algorithm using fma for faster dd multimplication
|
18 | 18 | // More information: https://github.com/munrocket/double.js
|
19 | 19 |
|
| 20 | +// MIT License. © 2022 munrocket |
| 21 | +// |
| 22 | +// Emulated double precision lib with mandelbrot set |
| 23 | +// Bottom is always pixelated, top is smooth with double |
| 24 | +// Algorithm using fma for faster dd multimplication |
| 25 | +// Additional information: https://github.com/munrocket/double.js |
| 26 | +
|
20 | 27 | float add(float a, float b) { return (b != 0.) ? a + b : a; }
|
21 | 28 | float sub(float a, float b) { return (b != 0.) ? a - b : a; }
|
22 | 29 | float mul(float a, float b) { return (b != 1.) ? a * b : a; }
|
|
47 | 54 | }
|
48 | 55 |
|
49 | 56 | vec2 sub22(vec2 X, vec2 Y) {
|
50 |
| - return add22(X, -Y); |
| 57 | + vec2 S = twoSum(X[0], -Y[0]); |
| 58 | + vec2 T = twoSum(X[1], -Y[1]); |
| 59 | + vec2 V = fastTwoSum(S[0], add(S[1], T[0])); |
| 60 | + return fastTwoSum(V[0], add(T[1], V[1])); |
51 | 61 | }
|
52 | 62 |
|
53 | 63 | vec2 mul22(vec2 X, vec2 Y) {
|
|
58 | 68 | }
|
59 | 69 |
|
60 | 70 | vec2 div22(vec2 X, vec2 Y) {
|
61 |
| - float s = X[0] / Y[0]; |
| 71 | + float s = div(X[0], Y[0]); |
62 | 72 | vec2 T = twoProd(s, Y[0]);
|
63 |
| - float e = ((((X[0] - T[0]) - T[1]) + X[1]) - s * Y[1]) / Y[0]; |
64 |
| - return fastTwoSum(s, e); |
| 73 | + float c = add(sub(sub(X[0], T[0]), T[1]), X[1]); |
| 74 | + return fastTwoSum(s, div(sub(c, mul(s, Y[1])), Y[0])); |
65 | 75 | }
|
66 | 76 |
|
67 | 77 | //////// end of the library, begin mandelbrot example /////////
|
68 | 78 |
|
| 79 | +//////// end of the library, begin mandelbrot example ///////// |
| 80 | +
|
69 | 81 | vec4 dcadd(vec4 a, vec4 b){
|
70 | 82 | return vec4(add22(a.xy, b.xy), add22(a.zw, b.zw));
|
71 | 83 | }
|
|
87 | 99 | return vec4(mul22(c.xy, k), mul22(c.zw, k));
|
88 | 100 | }
|
89 | 101 |
|
90 |
| -const float zoom = 7.4e5; |
| 102 | +#define zoom 7.4e5 |
91 | 103 | const vec4 p0 = vec4(-0.2351255, -1e-8, 0.8272157, -1e-9);
|
92 |
| -const vec4 color = vec4(1, 2, 2.9,0); |
93 | 104 | vec2 d(float a) { return vec2(a, 0); }
|
94 | 105 | vec4 dc(vec2 c) { return vec4(c.x, 0, c.y, 0); }
|
| 106 | +vec4 col(float i) { |
| 107 | + return .1+.9*cos(log(i*i)*vec4(1, 2, 2.9,0)); |
| 108 | +} |
95 | 109 |
|
96 | 110 | vec4 single_fractal(vec4 o) {
|
97 | 111 | vec2 c = iResolution.xy, z = gl_FragCoord.xy;
|
98 |
| - c = z = (z-.5*c)/c.y/zoom + p0.xz; |
| 112 | + c = z = (z-.5*c)/(zoom)/c.y + p0.xz; |
99 | 113 | for (float i; i < 1.; i += 1e-3) {
|
100 |
| - dot(z = mat2(z,-z.y,z.x)*z + c, z) > 4. ? o = cos(color*log(i*i)) : o; |
| 114 | + if(dot(z = mat2(z,-z.y,z.x)*z + c, z) > 4.) |
| 115 | + o = col(i); |
101 | 116 | }
|
102 | 117 | return o;
|
103 | 118 | }
|
104 | 119 |
|
105 | 120 | vec4 double_fractal(vec4 o) {
|
106 | 121 | vec2 c0 = iResolution.xy, z0 = gl_FragCoord.xy;
|
107 |
| - vec4 z, c = z = dcadd( |
108 |
| - fcmul(dcsub(dc(z0), dc(.5*c0)), div22(d(1.), twoProd(c0.y, zoom))), p0); |
| 122 | + vec4 z, c = z = dcadd(fcmul(dcsub(dc(z0), dc(.5*c0)), |
| 123 | + div22(d(1.), twoProd(c0.y, zoom))), p0); |
109 | 124 | for (float i; i < 1.; i += 1e-3) {
|
110 |
| - dclen(z = dcadd(dcmul(z, z), c)).x > 4. ? o = cos(color*log(i*i)) : o; |
| 125 | + if(dclen(z = dcadd(dcmul(z, z), c)).x > 4.) |
| 126 | + o = col(i); |
111 | 127 | }
|
112 | 128 | return o;
|
113 | 129 | }
|
114 | 130 |
|
115 | 131 | void mainImage( out vec4 o, in vec2 fc ) {
|
116 |
| - if (fc.y / iResolution.y + fc.x / iResolution.x < 1.) { |
| 132 | + vec2 uv = fc / iResolution.xy; |
| 133 | + if (uv.x + uv.y < 1.) { |
117 | 134 | o = single_fractal(o);
|
118 | 135 | } else {
|
119 | 136 | o = double_fractal(o);
|
120 | 137 | }
|
121 |
| - o += .02; |
| 138 | + o -= smoothstep(.0025, .001, abs(uv.x+uv.y-1.)) |
122 | 139 | }
|
123 | 140 | `);
|
124 | 141 | </script>
|
|
0 commit comments