-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathComplexCurves.js
115 lines (112 loc) · 59 KB
/
ComplexCurves.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
/**
* @license
*
* Complex Curves
*
* Copyright 2016-2018 Stefan Kranich
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
(function(){
'use strict';var l,aa="function"==typeof Object.create?Object.create:function(a){function b(){}b.prototype=a;return new b},ba;if("function"==typeof Object.setPrototypeOf)ba=Object.setPrototypeOf;else{var ca;a:{var da={H:!0},ea={};try{ea.__proto__=da;ca=ea.H;break a}catch(a){}ca=!1}ba=ca?function(a,b){a.__proto__=b;if(a.__proto__!==b)throw new TypeError(a+" is not extensible");return a}:null}var fa=ba;
function ha(a,b){a.prototype=aa(b.prototype);a.prototype.constructor=a;if(fa)fa(a,b);else for(var c in b)if("prototype"!=c)if(Object.defineProperties){var d=Object.getOwnPropertyDescriptor(b,c);d&&Object.defineProperty(a,c,d)}else a[c]=b[c];a.ia=b.prototype}var ia="function"==typeof Object.defineProperties?Object.defineProperty:function(a,b,c){a!=Array.prototype&&a!=Object.prototype&&(a[b]=c.value)},n="undefined"!=typeof window&&window===this?this:"undefined"!=typeof global&&null!=global?global:this;
function ja(){ja=function(){};n.Symbol||(n.Symbol=ka)}var ka=function(){var a=0;return function(b){return"jscomp_symbol_"+(b||"")+a++}}();function la(){ja();var a=n.Symbol.iterator;a||(a=n.Symbol.iterator=n.Symbol("iterator"));"function"!=typeof Array.prototype[a]&&ia(Array.prototype,a,{configurable:!0,writable:!0,value:function(){return ma(this)}});la=function(){}}function ma(a){var b=0;return na(function(){return b<a.length?{done:!1,value:a[b++]}:{done:!0}})}
function na(a){la();a={next:a};a[n.Symbol.iterator]=function(){return this};return a}function oa(a){la();var b=a[Symbol.iterator];return b?b.call(a):ma(a)}function pa(a){for(var b,c=[];!(b=a.next()).done;)c.push(b.value);return c}
var qa={"Assembly.vert":"#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\nin float index;\nuniform float numIndices;\nuniform sampler2D samplers[1 + N/2];\nuniform float sheet;\nout vec4 posValue;\nvec2 texCoord[3];\n\n#define W 2048.0\n#define H 2048.0\nvec2 uvPosition (in float i) {\n return vec2 (mod (i, W) / W + 0.5 / W, floor (i / W) / H + 0.5 / H);\n}\n\nvoid readTex (out vec2 pos[3], out float delta[3], out vec2 values[3*N]) {\n vec4 s;\n for (int i = 0; i < 3; i++) {\n s = texture (samplers[0], texCoord[i]);\n pos[i] = s.xy;\n delta[i] = s.z;\n for (int j = 1; j < N/2; j++) {\n s = texture (samplers[j], texCoord[i]);\n values[i*N+2*j-2] = s.xy;\n values[i*N+2*j-1] = s.zw;\n }\n }\n}\n\nbool valid (in vec2 position[3], in float delta[3]) {\n return distance (position[0], position[1]) < min (delta[0], delta[1])\n && distance (position[1], position[2]) < min (delta[1], delta[2])\n && distance (position[2], position[0]) < min (delta[2], delta[0]);\n}\n\nvoid main(void) {\n float which = mod (index, 3.0);\n texCoord[0] = uvPosition (index - which);\n texCoord[1] = uvPosition (index - which + 1.0);\n texCoord[2] = uvPosition (index - which + 2.0);\n\n int isheet = int(sheet);\n if (isheet < sheets) {\n vec2 pos[3];\n float delta[3];\n vec2 values[3*N];\n readTex (pos, delta, values);\n if (valid (pos, delta)) {\n for (int s = 0; s < sheets; s++) {\n if (s == isheet) {\n vec2 valueA = values[s];\n int iwhich = int(which);\n for (int w = 0; w < 3; w++) {\n if (w == iwhich) {\n vec2 valueWhich = values[w*N];\n float dist, minDist = distance (valueA, valueWhich);\n for (int i = 1; i < sheets; i++) {\n dist = distance (valueA, values[w*N+i]);\n if (dist < minDist)\n {\n valueWhich = values[w*N+i];\n minDist = dist;\n }\n }\n posValue = vec4(pos[w], valueWhich);\n }\n }\n }\n }\n return;\n }\n }\n posValue = vec4(-10.0, -10.0, -10.0, 1.0);\n}\n","CachedSurface.frag":"#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\nuniform bool clipping;\nvarying vec4 vPos;\nvarying vec2 vValue;\nvec3 hue_to_rgb (in float hue)\n{\n hue = mod (degrees (hue), 360.0) / 60.0;\n int h = int (floor (hue));\n float f = fract (hue);\n if (h == 0)\n return vec3 (1.0, f, 0.0);\n else if (h == 1)\n return vec3 (1.0 - f, 1.0, 0.0);\n else if (h == 2)\n return vec3 (0.0, 1.0, f);\n else if (h == 3)\n return vec3 (0.0, 1.0 - f, 1.0);\n else if (h == 4)\n return vec3 (f, 0.0, 1.0);\n else if (h == 5)\n return vec3 (1.0, 0.0, 1.0 - f);\n}\nfloat sawfct (float x, float dx, float a, float b)\n{\n return a + (b - a) * fract (x / dx);\n}\nvoid main (void)\n{\n if (clipping && vPos.y < 0.0)\n discard;\n float PI = acos (-1.0);\n float angle = atan (vValue.y, vValue.x);\n float blackp = sawfct (angle, PI / 12.0, 0.7, 1.0);\n float blackm = sawfct (log (length (vValue)), PI / 12.0, 0.7, 1.0);\n float black = blackp * blackm;\n gl_FragColor = vec4 (black * hue_to_rgb (angle), gl_FragCoord.z);\n}\n",
"CachedSurface.vert":"#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\nattribute vec4 position;\nuniform mat4 m, v, p;\nvarying vec4 vPos;\nvarying vec2 vValue;\nvoid main (void)\n{\n vPos = vec4 (position.xyz, 1.0);\n vValue = position.zw;\n gl_Position = p * v * m * vPos;\n}\n","Common.glsl":"#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n#define EPS 5e-3\n\n/* complex division */\nvec2 cd (in vec2 a, in vec2 b) {\n\treturn vec2 (a.x * b.x + a.y * b.y, a.y * b.x - a.x * b.y) / dot (b, b);\n}\n\nvec2 cinv (in vec2 z) {\n return vec2(z.x, -z.y) / dot(z, z);\n}\n\n/* complex square root */\nvec2 csqrt (in vec2 z)\n{\n float r = sqrt (length (z));\n float phi = 0.5 * atan (z.y, z.x);\n return r * vec2 (cos (phi), sin (phi));\n}\n\nvec2 horner (in int n, in vec2 cs[N+1], in vec2 x) {\n vec2 p;\n for (int i = N - 1; i >= 0; i--)\n if (i >= n)\n p = cs[i];\n else if (i < n)\n p = cs[i] + cm(p, x);\n return p;\n}\n\nvoid weierstrass (in vec2 cs[N+1], out vec2 roots2[N]) {\n\t/* polynomial must be monic! */\n vec2 csn = cs[sheets];\n if (csn != vec2 (1.0, 0.0))\n for (int i = 0; i <= sheets; i++)\n cs[i] = cd (cs[i], csn);\n\n float maxabs = length (cs[0]);\n for (int i = 1; i < N; i++)\n if (i < sheets)\n maxabs = max (maxabs, length (cs[i]));\n float upperBound = 1.0 + maxabs; /// length (cs[n]);\n float phi = 2.0 * acos (-1.0) / float (sheets + 1);\n float d = upperBound / float (sheets);\n d = clamp (d, 1.0, 10.0);\n\tfor (int i = 0; i < sheets; i++)\n roots2[i] = float (i) * d * vec2 (cos (float (i) * phi), sin (float (i) * phi));\n\n\tconst int maxiter = 50;\n\tbool changing;\n\tfor (int iter = 0; iter < maxiter; iter++)\n\t{\n\t\tchanging = false;\n\t\tfor (int i = 0; i < sheets; i++)\n {\n vec2 result = vec2 (1.0, 0.0);\n for (int j = 0; j < sheets; j++)\n if (j != i)\n result = cm (result, roots2[i] - roots2[j]);\n vec2 update = cd (horner (sheets, cs, roots2[i]), result);\n ///* safe-guard against large update */\n //if (sheets > 1 && length (update) > 10)\n //\tupdate /= length (update);\n if (length (update) > 1e-2)\n changing = true;\n roots2[i] -= update;\n }\n if (!changing)\n break;\n\t}\n}\n\nvoid quadratic_roots (in vec2 cs[N+1], out vec2 qroots[2]) {\n if (cs[0] == vec2 (0.0, 0.0)) {\n qroots[0] = vec2 (0.0, 0.0);\n qroots[1] = -cd (cs[1], cs[2]);\n }\n else\n {\n vec2 r = csqrt (cm (cs[1], cs[1]) - 4.0 * cm (cs[2], cs[0]));\n if (cs[1].x >= 0.0)\n r = -r;\n qroots[0] = cd (r - cs[1], 2.0 * cs[2]);\n qroots[1] = cd (2.0 * cs[0], r - cs[1]);\n }\n}\n\nvoid roots (in int n, in vec2 cs[N+1], out vec2 roots[N])\n{\n if (n == 1) {\n roots[0] = -cd (cs[0], cs[1]);\n return;\n }\n if (n == 2) {\n vec2 qroots[2];\n quadratic_roots (cs, qroots);\n roots[0] = qroots[0];\n roots[1] = qroots[1];\n return;\n }\n weierstrass (cs, roots);\n /* selection sort by real part */\n /*\n for(int i = 0; i < n - 1; i++)\n {\n int jmin = i;\n for (int j = i + 1; j < n; j++)\n if (roots[j].x < roots[jmin].x)\n jmin = j;\n vec2 z = roots[i];\n roots[i] = roots[jmin];\n roots[jmin] = z;\n }\n */\n}\n\nvoid f (in vec2 x, out vec2 cs[N+1]);\nvec2 fx (in vec2 x, in vec2 y);\nvec2 fy (in vec2 x, in vec2 y);\nfloat rho (in vec2 x);\nfloat M (in vec2 x, in float rho);\n\nfloat epsilon (in vec2 ys[N]) {\n float d = distance (ys[0], ys[1]);\n if (sheets < 2)\n return 1.0 / 0.0;\n for (int j = 0; j < sheets; j++) {\n for (int k = 0; k < sheets; k++) {\n if (k > j)\n d = min (d, distance (ys[j], ys[k]));\n }\n }\n return d / 2.0;\n}\n\nfloat Y (in vec2 x, in vec2 ys[N]) {\n float y = length (cd (fx (x, ys[0]), fy (x, ys[0])));\n for (int j = 0; j < sheets; j++)\n y = max (y, length (cd (fx (x, ys[j]), fy (x, ys[j]))));\n return y;\n}\n\nfloat Delta (in vec2 x, in vec2 ys[N]) {\n float eps = epsilon (ys);\n float r = rho (x);\n float m = M (x, r);\n float y = Y (x, ys);\n return r * (sqrt (pow (r * y - eps, 2.0) + 4.0 * eps * m) -\n (r * y + eps)) / (2.0 * (m - r * y));\n}\n",
"DomainColouring.frag":"uniform int sheet;\nvarying vec2 vPosition;\nvec3 hue_to_rgb (in float hue)\n{\n hue = mod (degrees (hue), 360.0) / 60.0;\n int h = int (floor (hue));\n float f = fract (hue);\n if (h == 0)\n return vec3 (1.0, f, 0.0);\n else if (h == 1)\n return vec3 (1.0 - f, 1.0, 0.0);\n else if (h == 2)\n return vec3 (0.0, 1.0, f);\n else if (h == 3)\n return vec3 (0.0, 1.0 - f, 1.0);\n else if (h == 4)\n return vec3 (f, 0.0, 1.0);\n else if (h == 5)\n return vec3 (1.0, 0.0, 1.0 - f);\n}\nfloat sawfct (float x, float dx, float a, float b)\n{\n return a + (b - a) * fract (x / dx);\n}\nvoid main (void)\n{\n vec2 cs[N+1];\n vec2 ys[N];\n vec2 value;\n f (vPosition, cs);\n roots (sheets, cs, ys);\n int smaller;\n for (int i = 0; i < sheets; i++)\n {\n smaller = 0;\n for (int j = 0; j < sheets; j++)\n if (ys[j].x < ys[i].x)\n smaller++;\n if (smaller == sheet - 1)\n value = ys[i];\n }\n \n float PI = acos (-1.0);\n float angle = atan (value.y, value.x);\n float blackp = sawfct (angle, PI / 12.0, 0.7, 1.0);\n float blackm = sawfct (log (length (value)), PI / 12.0, 0.7, 1.0);\n float black = blackp * blackm;\n gl_FragColor = vec4 (black * hue_to_rgb(angle), 1.0);\n}\n",
"DomainColouring.vert":"#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\nattribute vec2 position;\nvarying vec2 vPosition;\nvoid main () {\n gl_Position = vec4 (position, 0.0, 1.0);\n vPosition = 5.0 * position;\n}\n","Dummy.frag":"#version 300 es\n#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\nout vec4 fColor;\nvoid main(void) {\n fColor = vec4(1.0);\n}\n","Export.frag":"#version 300 es\n#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\nin vec2 vValue;\nout vec4 fColor;\nvec3 hue_to_rgb (in float hue)\n{\n hue = mod (degrees (hue), 360.0) / 60.0;\n int h = int (floor (hue));\n float f = fract (hue);\n if (h == 0)\n return vec3 (1.0, f, 0.0);\n else if (h == 1)\n return vec3 (1.0 - f, 1.0, 0.0);\n else if (h == 2)\n return vec3 (0.0, 1.0, f);\n else if (h == 3)\n return vec3 (0.0, 1.0 - f, 1.0);\n else if (h == 4)\n return vec3 (f, 0.0, 1.0);\n else if (h == 5)\n return vec3 (1.0, 0.0, 1.0 - f);\n}\nfloat sawfct (float x, float dx, float a, float b)\n{\n return a + (b - a) * fract (x / dx);\n}\nvoid main (void)\n{\n float PI = acos (-1.0);\n float angle = atan (vValue.y, vValue.x);\n float blackp = sawfct (angle / (2.0 * PI), 0.05, 0.7, 1.0);\n float blackm = sawfct (log (length (vValue)), 0.1 * PI, 0.7, 1.0);\n float black = blackp * blackm;\n fColor = vec4 (black * hue_to_rgb(angle), 1.0);\n}\n",
"Export.vert":"#version 300 es\nuniform float maxValue;\nuniform float minValue;\nin vec2 vPosition;\nout vec2 vValue;\n\nvoid main()\n{\n gl_Position = vec4(vPosition, 0.0, 1.0);\n vValue = 0.5 * (maxValue - minValue) * (vPosition + vec2 (1.0, 1.0))\n + vec2 (minValue, minValue);\n}\n","FXAA.frag":"#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\nuniform sampler2D u_tex;\nuniform float width;\nuniform float height;\n\n#define FXAA_REDUCE_MIN (1.0/ 128.0)\n#define FXAA_REDUCE_MUL (1.0 / 8.0)\n#define FXAA_SPAN_MAX 8.0\n// from https://github.com/mitsuhiko/webgl-meincraft/blob/master/assets/shaders/fxaa.glsl\nvec4 applyFXAA(in vec2 fragCoord, in sampler2D tex)\n{\n vec4 color;\n vec2 inverseVP = vec2(1.0 / width, 1.0 / height);\n vec3 rgbNW = texture2D(tex, (fragCoord + vec2(-1.0, -1.0)) * inverseVP).xyz;\n vec3 rgbNE = texture2D(tex, (fragCoord + vec2(1.0, -1.0)) * inverseVP).xyz;\n vec3 rgbSW = texture2D(tex, (fragCoord + vec2(-1.0, 1.0)) * inverseVP).xyz;\n vec3 rgbSE = texture2D(tex, (fragCoord + vec2(1.0, 1.0)) * inverseVP).xyz;\n vec3 rgbM = texture2D(tex, fragCoord * inverseVP).xyz;\n vec3 luma = vec3(0.299, 0.587, 0.114);\n float lumaNW = dot(rgbNW, luma);\n float lumaNE = dot(rgbNE, luma);\n float lumaSW = dot(rgbSW, luma);\n float lumaSE = dot(rgbSE, luma);\n float lumaM = dot(rgbM, luma);\n float lumaMin = min(lumaM, min(min(lumaNW, lumaNE), min(lumaSW, lumaSE)));\n float lumaMax = max(lumaM, max(max(lumaNW, lumaNE), max(lumaSW, lumaSE)));\n vec2 dir;\n dir.x = -((lumaNW + lumaNE) - (lumaSW + lumaSE));\n dir.y = ((lumaNW + lumaSW) - (lumaNE + lumaSE));\n float dirReduce = max((lumaNW + lumaNE + lumaSW + lumaSE) *\n (0.25 * FXAA_REDUCE_MUL), FXAA_REDUCE_MIN);\n float rcpDirMin = 1.0 / (min(abs(dir.x), abs(dir.y)) + dirReduce);\n dir = min(vec2(FXAA_SPAN_MAX, FXAA_SPAN_MAX),\n max(vec2(-FXAA_SPAN_MAX, -FXAA_SPAN_MAX),\n dir * rcpDirMin)) * inverseVP;\n vec3 rgbA = 0.5 * (\n texture2D(tex, fragCoord * inverseVP + dir * (1.0 / 3.0 - 0.5)).xyz +\n texture2D(tex, fragCoord * inverseVP + dir * (2.0 / 3.0 - 0.5)).xyz);\n vec3 rgbB = rgbA * 0.5 + 0.25 * (\n texture2D(tex, fragCoord * inverseVP + dir * -0.5).xyz +\n texture2D(tex, fragCoord * inverseVP + dir * 0.5).xyz);\n float lumaB = dot(rgbB, luma);\n if ((lumaB < lumaMin) || (lumaB > lumaMax))\n color = vec4(rgbA, 1.0);\n else\n color = vec4(rgbB, 1.0);\n return color;\n}\n\nvoid main (void)\n{\n gl_FragColor = applyFXAA(gl_FragCoord.xy, u_tex);\n}\n",
"FXAA.vert":"#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\nattribute vec2 vPosition;\nvoid main()\n{\n gl_Position = vec4(vPosition, 0.0, 1.0);\n}\n","Initial.vert":"#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\nin vec2 pos;\nout vec2 position;\nout float delta;\nout float subdivisionFlag;\nout vec2 values[N];\nvoid main (void) {\n position = clamp (pos, -5.0, 5.0);\n vec2 cs[N+1];\n f (position, cs);\n roots (sheets, cs, values);\n delta = Delta (position, values);\n subdivisionFlag = 1.0;\n}\n",
"Subdivision.vert":"#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\nin vec3 barycentric;\nin float indexOffsetIn;\nuniform sampler2D samplers[1 + N/2];\nout vec2 position;\nout float delta;\nout float subdivisionFlag;\nout vec2 values[N];\n\n#define W 2048.0\n#define H 2048.0\nvec2 uvPosition (in float i) {\n return vec2 (mod (i, W) / W + 0.5 / W, floor (i / W) / H + 0.5 / H);\n}\n\nvoid main (void) {\n vec2 texCoord[3];\n texCoord[0] = uvPosition (indexOffsetIn);\n texCoord[1] = uvPosition (indexOffsetIn + 1.0);\n texCoord[2] = uvPosition (indexOffsetIn + 2.0);\n vec4 tmp;\n\n if (barycentric == vec3 (1.0, 0.0, 0.0)) {\n tmp = texture (samplers[0], texCoord[0]);\n position = tmp.xy;\n delta = tmp.z;\n subdivisionFlag = tmp.w;\n for (int j = 1; j < 1 + N/2; j++) {\n tmp = texture (samplers[j], texCoord[0]);\n values[2 * j - 2] = tmp.xy;\n values[2 * j - 1] = tmp.zw;\n }\n } else if (barycentric == vec3 (0.0, 1.0, 0.0)) {\n tmp = texture (samplers[0], texCoord[1]);\n position = tmp.xy;\n delta = tmp.z;\n subdivisionFlag = tmp.w;\n for (int j = 1; j < 1 + N/2; j++) {\n tmp = texture (samplers[j], texCoord[1]);\n values[2 * j - 2] = tmp.xy;\n values[2 * j - 1] = tmp.zw;\n }\n } else if (barycentric == vec3 (0.0, 0.0, 1.0)) {\n tmp = texture (samplers[0], texCoord[2]);\n position = tmp.xy;\n delta = tmp.z;\n subdivisionFlag = tmp.w;\n for (int j = 1; j < 1 + N/2; j++) {\n tmp = texture (samplers[j], texCoord[2]);\n values[2 * j - 2] = tmp.xy;\n values[2 * j - 1] = tmp.zw;\n }\n } else {\n position = barycentric.x * texture (samplers[0], texCoord[0]).xy\n + barycentric.y * texture (samplers[0], texCoord[1]).xy\n + barycentric.z * texture (samplers[0], texCoord[2]).xy;\n vec2 cs[N+1];\n f (position, cs);\n roots (sheets, cs, values);\n delta = Delta (position, values);\n subdivisionFlag = 1.0;\n }\n}\n",
"SubdivisionPre.vert":"#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\nin float index;\nuniform sampler2D samplers[1 + N/2];\nout vec2 position;\nout float delta;\nout float subdivisionFlag;\nout vec2 values[N];\n\n#define W 2048.0\n#define H 2048.0\nvec2 uvPosition (in float i) {\n return vec2 (mod (i, W) / W + 0.5 / W, floor (i / W) / H + 0.5 / H);\n}\n\nvoid main (void) {\n float which = mod (index, 3.0);\n vec2 texCoordWhich = uvPosition (index);\n vec2 texCoord[3];\n texCoord[0] = uvPosition (index - which);\n texCoord[1] = uvPosition (index - which + 1.0);\n texCoord[2] = uvPosition (index - which + 2.0);\n vec4 s = texture (samplers[0], texCoordWhich);\n position = s.xy;\n delta = s.z;\n subdivisionFlag = 0.0;\n vec3 positionDelta[3];\n positionDelta[0] = texture (samplers[0], texCoord[0]).xyz;\n positionDelta[1] = texture (samplers[0], texCoord[1]).xyz;\n positionDelta[2] = texture (samplers[0], texCoord[2]).xyz;\n if (distance (positionDelta[0].xy, positionDelta[1].xy) >= min (positionDelta[0].z, positionDelta[1].z))\n subdivisionFlag += 4.0;\n if (distance (positionDelta[1].xy, positionDelta[2].xy) >= min (positionDelta[1].z, positionDelta[2].z))\n subdivisionFlag += 2.0;\n if (distance (positionDelta[2].xy, positionDelta[0].xy) >= min (positionDelta[2].z, positionDelta[0].z))\n subdivisionFlag += 1.0;\n if (subdivisionFlag == 3.0 && distance (positionDelta[0].xy, 0.5 * (positionDelta[1].xy + positionDelta[2].xy)) < distance (positionDelta[1].xy, 0.5 * (positionDelta[0].xy + positionDelta[2].xy)))\n subdivisionFlag = 8.0;\n if (subdivisionFlag == 5.0 && distance (positionDelta[1].xy, 0.5 * (positionDelta[0].xy + positionDelta[2].xy)) < distance (positionDelta[2].xy, 0.5 * (positionDelta[0].xy + positionDelta[1].xy)))\n subdivisionFlag = 9.0;\n if (subdivisionFlag == 6.0 && distance (positionDelta[2].xy, 0.5 * (positionDelta[0].xy + positionDelta[1].xy)) < distance (positionDelta[0].xy, 0.5 * (positionDelta[1].xy + positionDelta[2].xy)))\n subdivisionFlag = 10.0;\n for (int i = 1; i < N/2; i++) {\n s = texture (samplers[i], texCoordWhich);\n values[2*i-2] = s.xy;\n values[2*i-1] = s.zw;\n }\n}\n",
"Surface.frag":"#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\nuniform bool clipping;\nin vec4 vPos;\nin vec2 v_value;\nout vec4 fColor;\nvec3 hue_to_rgb (in float hue)\n{\n hue = mod (degrees (hue), 360.0) / 60.0;\n int h = int (floor (hue));\n float f = fract (hue);\n if (h == 0)\n return vec3 (1.0, f, 0.0);\n else if (h == 1)\n return vec3 (1.0 - f, 1.0, 0.0);\n else if (h == 2)\n return vec3 (0.0, 1.0, f);\n else if (h == 3)\n return vec3 (0.0, 1.0 - f, 1.0);\n else if (h == 4)\n return vec3 (f, 0.0, 1.0);\n else if (h == 5)\n return vec3 (1.0, 0.0, 1.0 - f);\n}\nfloat sawfct (float x, float dx, float a, float b)\n{\n return a + (b - a) * fract (x / dx);\n}\nvoid main (void)\n{\n if (clipping && vPos.y < 0.0)\n discard;\n float PI = acos (-1.0);\n float angle = atan (v_value.y, v_value.x);\n float blackp = sawfct (angle, PI / 12.0, 0.7, 1.0);\n float blackm = sawfct (log (length (v_value)), PI / 12.0, 0.7, 1.0);\n float black = blackp * blackm;\n fColor = vec4 (black * hue_to_rgb (angle), gl_FragCoord.z);\n}\n",
"Surface.vert":"#version 300 es\n#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\nuniform mat4 m;\nuniform mat4 v;\nuniform mat4 p;\nin vec4 posValue;\nout vec4 vPos;\nout vec2 v_value;\nvoid main (void)\n{\n vPos = vec4 (posValue.xyz, 1.0);\n v_value = posValue.zw;\n gl_Position = p * v * m * vPos;\n}\n"};function r(a,b){this.a=a;this.b=b}r.prototype.abs=function(){return Math.sqrt(this.a*this.a+this.b*this.b)};function t(a,b){return new r(a.a+b.a,a.b+b.b)}r.prototype.add=function(a){return t(this,a)};function w(a,b){var c=b.a*b.a+b.b*b.b;return new r((a.a*b.a+a.b*b.b)/c,(a.b*b.a-a.a*b.b)/c)}function ra(a){return 0===Math.abs(a.a)&&0===Math.abs(a.b)}function x(a,b){return new r(a.a*b.a-a.b*b.b,a.a*b.b+a.b*b.a)}function ta(a){return new r(-a.a,-a.b)}function z(a){return new r(a,0)}
function ua(a){if(ra(a))return A();var b=a.abs();return new r(Math.sqrt(.5*(b+a.a)),(Math.sign(a.b)||1)*Math.sqrt(.5*(b-a.a)))}function B(a,b){return new r(a.a-b.a,a.b-b.b)}function A(){return new r(0,0)};function C(a){for(var b=[],c=0;c<arguments.length;++c)b[c]=arguments[c];b=Error.apply(this,b instanceof Array?b:pa(oa(b)));this.message=b.message;"stack"in b&&(this.stack=b.stack);this.name="CustomError";Error.hasOwnProperty("captureStackTrace")&&Error.captureStackTrace(this,this.constructor)}ha(C,Error);function E(a){for(var b=[],c=0;c<arguments.length;++c)b[c]=arguments[c];C.call(this,b);this.name="ArgumentError"}ha(E,C);function va(a){this.values=a};function F(a){this.value=a}function wa(a){var b={};a=a.value;for(var c in a)a.hasOwnProperty(c)&&(b[c]=a[c]);return new F(b)};function G(a,b){this.b=a;this.a=b}function xa(a,b){var c={},d=a.a.value,e=b.a.value,f;for(f in d)d.hasOwnProperty(f)&&(c[f]=d[f]+(e[f]||0));for(f in e)e.hasOwnProperty(f)&&(c[f]=e[f]+(d[f]||0));return new G(x(a.b,b.b),new F(c))}
function ya(a){function b(a,d){if(0===d.length)return a;if(1===d.length)return a.push(d[0]),a;var c=d.pop(),f=c.b;c=c.a;for(var g=[],h=d.length,m=0;m<h;m++){a:{var k=void 0;var p=d[m].a;for(k in c.value)if(c.value.hasOwnProperty(k)&&!p.value.hasOwnProperty(k)||c.value[k]!==p.value[k]){k=!1;break a}for(k in p.value)if(p.value.hasOwnProperty(k)&&!c.value.hasOwnProperty(k)||c.value[k]!==p.value[k]){k=!1;break a}k=!0}k?f=t(f,d[m].b):g.push(d[m])}a.push(new G(f,c));return b(a,g)}return b([],a)};function H(a){0===a.length?this.a=[new G(A(),new F({}))]:this.a=ya(a)}function za(a,b){return new H(ya(a.a.concat(b.a)))}H.prototype.add=function(a){return za(this,a)};function Aa(a,b,c){a=a.a;for(var d=[],e=a.length,f=0;f<e;f++){var g=a[f];if((g.a.value[b]||0)===c){var h=wa(g.a);delete h.value[b];d.push(new G(g.b,h))}}return new H(d)}function I(a,b){for(var c=J(a,b),d=[],e=0;e<=c;e++)d[e]=Aa(a,b,c-e);return d}
function Ba(a){var b=K(a),c=b.length;if(1<c)throw new E("Polynomial is not univariate");a=I(a,0<c?b[0]:"x");b=[];c=a.length;for(var d=0;d<c;d++)b[d]=Ca(a[d]);return b}function Ca(a){var b=A();a=a.a;for(var c=a.length,d=0;d<c;d++){var e=a[d],f=e.a.value;if(null===f||0===Object.keys(f).length)b=t(b,e.b)}return b}function J(a,b){var c=0;a=a.a;for(var d=a.length,e=0;e<d;e++)c=Math.max(c,a[e].a.value[b]||0);return c}
function Da(a,b){a=a.a;for(var c=[],d=a.length,e=0;e<d;e++){var f=a[e].a,g=f.value[b]||0;if(0<g){var h=x(a[e].b,z(g));f=wa(f);f.value[b]=g-1;c.push(new G(h,f))}}return new H(c)}function Ea(a){return 0===K(a).length&&0!==a.a.length}
function Fa(a,b,c){for(var d=a.length-1,e=[1,.3141,.5926,.5358,.9793,.2385,.6264,.3383,.2795,.0288],f,g,h,m,k=1;k<=c;k++){h=A();f=A();g=a[0];for(m=1;m<=d;m++)h=t(f,x(h,b)),f=t(g,x(f,b)),g=t(a[m],x(g,b));if(1E-14>g.abs())break;f=w(f,g);m=x(f,f);g=B(m,w(x(z(2),h),g));h=ua(x(z(d-1),B(x(z(d),g),m)));g=t(f,h);f=B(f,h);g.abs()<f.abs()&&(g=f);f=1E-14<g.abs()?w(z(d),g):x(z(b.abs()+1),new r(Math.cos(k),Math.sin(k)));if(1E-14>f.abs())break;0===k%20&&k<c-19&&(f=x(f,z(e[Math.floor(k/20)])));b=B(b,f)}return b}
function Ga(a,b){a=a.a;b=b.a;for(var c=[],d=a.length,e=0;e<d;e++)for(var f=b.length,g=0;g<f;g++)c.push(xa(a[e],b[g]));return new H(ya(c))}function M(a){a=a.a;for(var b=[],c=a.length,d=0;d<c;d++){var e=a[d];b.push(new G(ta(e.b),e.a))}return new H(b)}function Ha(a,b){var c=new H([new G(z(1),new F({}))]);if(!Number.isInteger(b))throw new E("exponent is not an integer");for(;0<b;b--)c=Ga(c,a);return c}H.prototype.pow=function(a){return Ha(this,a)};
function Ia(a){var b=a[0],c=a[1];a=a[2];if(0===Math.abs(a.a)&&0===Math.abs(a.b))return[A(),ta(w(c,b))];var d=ua(B(x(c,c),x(z(4),x(b,a))));0<=c.a&&(d=ta(d));return[w(B(d,c),x(z(2),b)),w(x(z(2),a),B(d,c))]}
function Ja(a){var b=[],c=a,d=a.length-1;if(0>=d)return[];if(ra(a[0]))return b=Ja(a.slice(1)),b.push(new r(Infinity,Infinity)),b;if(1===d)b[0]=ta(w(a[1],a[0]));else if(2===d)b=Ia(a);else{for(var e=0;e<d-2;e++){b[e]=Fa(a,A(),200);b[e]=Fa(c,b[e],1);for(var f=b[e],g=[a[0]],h=a.length-1,m=1;m<h;m++)g[m]=t(a[m],x(g[m-1],f));a=g}c=Ia(a);b[d-2]=c[0];b[d-1]=c[1]}return b}
function La(a){if(Ea(a)||1===K(a).length)throw new E("Polynomial is not multivariate");var b=K(a);return J(a,0===b.length?"y":b[b.length-1])}H.prototype.sub=function(a){return za(this,M(a))};function Ma(a,b,c){function d(a){for(var b=[],c=0;c<a;c++)b[c]=new H([]);return b}function e(a,b){return d(b).concat(a).concat(d(f+g-a.length-b))}var f=J(b,a),g=J(c,a);b=I(b,a);a=I(c,a);c=[];for(var h=0;h<g;h++)c.push(e(b,h));for(b=0;b<f;b++)c.push(e(a,b));return new va(c)}
function K(a){a=a.a;for(var b=[],c={},d=a.length,e=0;e<d;e++){var f=a[e].a.value,g;for(g in f)f.hasOwnProperty(g)&&!c[g]&&(b.push(g),c[g]=!0)}b.sort();return b};function Na(a){var b=[],c;if(Ea(a))return[N(Ca(a))];if(1===K(a).length){a=Ba(a);var d=0;for(c=a.length;d<c;d++)b[d]=N(a[d])}else if(2===K(a).length){d=K(a);var e=d[0];a=I(a,d[1]);d=0;for(c=a.length;d<c;d++)b[d]=O(e,Na(a[d]))}return b}function N(a){return"vec2 ("+a.a.toPrecision(8)+", "+a.b.toPrecision(8)+")"}
function Oa(a,b){a=Na(a).reverse();for(var c=P-a.length+1,d=N(A()),e=0;e<c;e++)a.push(d);b=["void f (in vec2 "+b+", out vec2 cs[N+1])","{"];for(c=0;c<=P;c++)b.push("cs["+c+"] = "+a[c]+";");b.push("}");return b.join("\n")}function Pa(a,b,c){a=I(Da(a,b),c);for(var d=[],e=a.length,f=0;f<e;f++)d[f]=O(b,Na(a[f]));return["vec2 fx (in vec2 "+b+", in vec2 "+c+")","{"," return "+O(c,d)+";","}"].join("\n")}
function Qa(a,b,c){a=I(Da(a,c),b);for(var d=[],e=a.length,f=0;f<e;f++)d[f]=O(c,Na(a[f]));return["vec2 fy (in vec2 "+b+", in vec2 "+c+")","{"," return "+O(b,d)+";","}"].join("\n")}function O(a,b){for(var c=b[0],d=b.length,e=1;e<d;e++)c="vec2 (1.0000000, 0.0000000)"===c?a:"vec2 (-1.0000000, 0.0000000)"===c?"-"+a:"cm ("+a+","+c+")","vec2 (0.0000000, 0.0000000)"!==b[e]&&(c+="+"+b[e]);return c}
function Ra(a,b,c){var d,e,f=I(a,c);var g=0;for(d=f.length;g<d;g++){var h=f[g].a;var m=0;for(e=h.length;m<e;m++){var k=h[m];h[m]=new G(z(k.b.abs()),k.a)}f[g]=new H(h)}g=f[0];g=Aa(g,b,J(g,b));a=Aa(a,c,J(a,c));a=Ja(Ba(a));c=["float M (in vec2 "+b+", in float rho)","{"," vec2 r = vec2 (length ("+b+") + rho, 0.0);"," float a["+f.length+"];"," a[0] = length ("+N(Ca(g))+");"];g=0;for(d=a.length;g<d;g++)c.push(" a[0] *= distance ("+b+", "+N(a[g])+") - rho;");g=1;for(d=f.length;g<d;g++)c.push(" a["+
g+"] = length ("+O("r",Na(f[g]))+");");c=c.concat([" float m = a[1] / a[0];"," for (int j = 2; j < "+f.length+"; j++) {"," m = max (m, pow (a[j] / a[0], 1.0 / float (j)));"," }"," return 2.0 * m;","}"]);return c.join("\n")}
function Sa(a,b,c){var d=Aa(a,c,J(a,c)),e=Da(a,c);c=Ma(c,a,e);if(null===c.values||0===c.values.length||0===c.values[0].length)throw new E("matrix must be non-empty");e=c.values;a=e.length;for(var f=0;f<a;f++)if(e[f].length!==a)throw new E("matrix must be square");f=c;for(e=1;e<a;e++){f=f.values;for(var g=new H([]),h=[],m=f.length,k=0;k<m;k++){h[k]=[];for(var p=0;p<m;p++)if(p<k)h[k][p]=g;else if(p===k){for(var q=g,u=p+1;u<m;u++)q=q.add(M(f[u][u]));h[k][p]=q}else h[k][p]=f[k][p]}f=(new va(h)).values;
g=c.values;if(f[0].length!==g.length)throw new E("matrix dimensions must match");h=[];m=f.length;k=g[0].length;p=new H([]);for(q=0;q<m;q++)for(h[q]=[],u=0;u<k;u++){for(var v=p,D=f[0].length,L=0;L<D;L++)v=v.add(Ga(f[q][L],g[L][u]));h[q][u]=v}f=new va(h)}c=f.values[0][0];a=0===a%2?M(c):c;d=Ja(Ba(d));f=Ja(Ba(a));e=[];a=0;for(c=d.length;a<c;a++)isFinite(d[a].abs())&&e.push(d[a]);a=0;for(c=f.length;a<c;a++)isFinite(f[a].abs())&&e.push(f[a]);d=["float rho (in vec2 "+b+") {"," float d = 100.0;"];a=0;
for(c=e.length;a<c;a++)d.push(" d = min (d, distance ("+b+", "+N(e[a])+"));");d=d.concat([" return 0.999 * d;","}"]);return d.join("\n")}
function Ta(a){var b=K(a),c=2>b.length?"x":b[0];b=0===b.length?"y":b[b.length-1];return[["#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif","const int N = "+P+";","const int sheets = "+J(a,b)+";","\n/* complex multiplication */\nvec2 cm (in vec2 a, in vec2 b)\n{\n return vec2 (a.x * b.x - a.y * b.y, a.x * b.y + a.y * b.x);\n}"].join("\n"),Oa(a,c),Pa(a,c,b),Qa(a,c,b),Sa(a,c,b),Ra(a,c,b)].join("\n\n")}var P=8;function Ua(a){for(var b=[],c=0;c<arguments.length;++c)b[c]=arguments[c];C.call(this,b);this.name="ShaderError"}ha(Ua,C);function Va(a){var b=Math.sqrt(a.length/4),c=document.createElement("canvas");c.width=b;c.height=b;var d=c.getContext("2d"),e=d.createImageData(c.width,c.height);e.data.set(a);d.putImageData(e,0,0);a=document.createElement("canvas");a.width=b;a.height=b;b=a.getContext("2d");b.translate(0,a.height-1);b.scale(1,-1);b.drawImage(c,0,0);return a.toDataURL()};function Wa(a,b){b=void 0===b?"webgl2":b;this.m=8192;this.h=!1;this.G=b;this.i=!0;this.c=this.w=this.v=this.f=this.u=this.s=this.g=this.b=this.j=null;this.l=!1;if("webgl"===b){if(a=this.a=a.getContext("webgl",{preserveDrawingBuffer:!0}),!a)throw alert("WebGL not supported. Please try another browser or platform."),Error("WebGL not supported.");}else if(a=this.a=a.getContext("webgl2",{preserveDrawingBuffer:!0}),!a)throw alert("WebGL 2 not supported. Please try another browser or platform."),Error("WebGL 2 not supported.");
a.enable(a.DEPTH_TEST);this.j=Q(this,Xa("FXAA"));a=this.a;this.m=b=Math.min(a.getParameter(a.MAX_TEXTURE_SIZE),8192);this.g=a.createBuffer();a.bindBuffer(a.ARRAY_BUFFER,this.g);a.bufferData(a.ARRAY_BUFFER,new Float32Array([-1,-1,3,-1,-1,3]),a.STATIC_DRAW);a.vertexAttribPointer(0,2,a.FLOAT,!1,0,0);a.enableVertexAttribArray(0);this.s=a.createFramebuffer();a.bindFramebuffer(a.FRAMEBUFFER,this.s);this.u=a.createRenderbuffer();a.bindRenderbuffer(a.RENDERBUFFER,this.u);a.renderbufferStorage(a.RENDERBUFFER,
a.DEPTH_COMPONENT16,b,b);a.framebufferRenderbuffer(a.FRAMEBUFFER,a.DEPTH_ATTACHMENT,a.RENDERBUFFER,this.u);this.f=a.createTexture();a.bindTexture(a.TEXTURE_2D,this.f);a.texParameteri(a.TEXTURE_2D,a.TEXTURE_MAG_FILTER,a.NEAREST);a.texParameteri(a.TEXTURE_2D,a.TEXTURE_MIN_FILTER,a.NEAREST);a.texImage2D(a.TEXTURE_2D,0,a.RGBA,b,b,0,a.RGBA,a.UNSIGNED_BYTE,null);a.framebufferTexture2D(a.FRAMEBUFFER,a.COLOR_ATTACHMENT0,a.TEXTURE_2D,this.f,0);this.v=a.createFramebuffer();a.bindFramebuffer(a.FRAMEBUFFER,this.v);
this.w=a.createRenderbuffer();a.bindRenderbuffer(a.RENDERBUFFER,this.w);a.renderbufferStorage(a.RENDERBUFFER,a.DEPTH_COMPONENT16,2048,2048);a.framebufferRenderbuffer(a.FRAMEBUFFER,a.DEPTH_ATTACHMENT,a.RENDERBUFFER,this.w);this.c=a.createTexture();a.bindTexture(a.TEXTURE_2D,this.c);a.texParameteri(a.TEXTURE_2D,a.TEXTURE_MAG_FILTER,a.NEAREST);a.texParameteri(a.TEXTURE_2D,a.TEXTURE_MIN_FILTER,a.NEAREST);a.texImage2D(a.TEXTURE_2D,0,a.RGBA,2048,2048,0,a.RGBA,a.UNSIGNED_BYTE,null);a.framebufferTexture2D(a.FRAMEBUFFER,
a.COLOR_ATTACHMENT0,a.TEXTURE_2D,this.c,0);a.bindTexture(a.TEXTURE_2D,null);a.bindRenderbuffer(a.RENDERBUFFER,null);a.bindFramebuffer(a.FRAMEBUFFER,null);a.bindBuffer(a.ARRAY_BUFFER,null)}function R(a){return qa[a].trim()}function Xa(a){return[R(a+".vert"),R(a+".frag")]}
function Q(a,b,c){var d=a.a,e=b[1],f=d.createShader(d.VERTEX_SHADER);d.shaderSource(f,b[0]);d.compileShader(f);if(!d.getShaderParameter(f,d.COMPILE_STATUS))throw new Ua(d.getShaderInfoLog(f));var g=d.createProgram();d.attachShader(g,f);if(b[1]){b=d.createShader(d.FRAGMENT_SHADER);d.shaderSource(b,e);d.compileShader(b);if(!d.getShaderParameter(b,d.COMPILE_STATUS))throw new Ua(d.getShaderInfoLog(b));d.attachShader(g,b)}c?(d.transformFeedbackVaryings(g,c,d.INTERLEAVED_ATTRIBS),d.enable(d.RASTERIZER_DISCARD)):
"webgl2"===a.G&&d.disable(d.RASTERIZER_DISCARD);d.linkProgram(g);if(!d.getProgramParameter(g,d.LINK_STATUS))throw new Ua(d.getProgramInfoLog(g));d.useProgram(g);return g}
function Ya(a,b){var c=a.a,d=c.getParameter(c.FRAMEBUFFER_BINDING),e=c.createFramebuffer();c.bindFramebuffer(c.FRAMEBUFFER,e);c.bindTexture(c.TEXTURE_2D,b);c.texParameteri(c.TEXTURE_2D,c.TEXTURE_MAG_FILTER,c.NEAREST);c.texParameteri(c.TEXTURE_2D,c.TEXTURE_MIN_FILTER,c.NEAREST);c.texParameteri(c.TEXTURE_2D,c.TEXTURE_WRAP_S,c.CLAMP_TO_EDGE);c.texParameteri(c.TEXTURE_2D,c.TEXTURE_WRAP_T,c.CLAMP_TO_EDGE);c.framebufferTexture2D(c.FRAMEBUFFER,c.COLOR_ATTACHMENT0,c.TEXTURE_2D,b,0);if(c.checkFramebufferStatus(c.FRAMEBUFFER)!==
c.FRAMEBUFFER_COMPLETE)return c.bindTexture(c.TEXTURE_2D,null),c.framebufferTexture2D(c.FRAMEBUFFER,c.COLOR_ATTACHMENT0,c.TEXTURE_2D,null,0),c.bindFramebuffer(c.FRAMEBUFFER,d),c.deleteFramebuffer(e),null;b===a.c?(a=new Uint8Array(16777216),c.readPixels(0,0,2048,2048,c.RGBA,c.UNSIGNED_BYTE,a)):b===a.f?(b=a.m,a=new Uint8Array(4*b*b),c.readPixels(0,0,b,b,c.RGBA,c.UNSIGNED_BYTE,a)):(a=new Float32Array(16777216),c.readPixels(0,0,2048,2048,c.RGBA,c.FLOAT,a));b=c.getError();c.bindTexture(c.TEXTURE_2D,null);
c.framebufferTexture2D(c.FRAMEBUFFER,c.COLOR_ATTACHMENT0,c.TEXTURE_2D,null,0);c.bindFramebuffer(c.FRAMEBUFFER,d);c.deleteFramebuffer(e);return b!==c.NO_ERROR?null:a}function Za(a,b){var c=a.a;$a(a,function(){a.b.F(a,c,b)})}function ab(a){var b=a.a;b.uniform1f(b.getUniformLocation(b.getParameter(b.CURRENT_PROGRAM),"clipping"),a.h?1:0)}
function bb(a,b){var c=a.a,d=c.getParameter(c.VIEWPORT);c=d[2];d=d[3];if(b.f){var e=b.h;b=-7.5*e;var f=-7.5*e,g=7.5*e;e*=7.5;var h=Math.min(d/c,1);c=Math.min(c/d,1);c=[2*h/(g-f),0,0,0,0,2*c/(e-b),0,0,0,0,-.01,0,-h*(g+f)/(g-f),-c*(e+b)/(e-b),-0,1]}else b=1/Math.tan(45*b.h/2*Math.PI/180),c=[b/(0<d?c/d:c),0,0,0,0,b,0,0,0,0,101/-99,-1,0,0,200/-99,0];cb(a,"p",c)}
function db(a,b){var c=a.a;a.l&&!1!==b?(c.blendFunc(c.SRC_ALPHA,c.ONE),c.enable(c.BLEND),c.disable(c.DEPTH_TEST)):(c.disable(c.BLEND),c.enable(c.DEPTH_TEST),c.depthFunc(c.LESS))}function cb(a,b,c){a=a.a;a.uniformMatrix4fv(a.getUniformLocation(a.getParameter(a.CURRENT_PROGRAM),b),!1,c)}function eb(a,b){cb(a,"v",b.f?[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]:[1,0,0,0,0,1,0,0,0,0,1,0,0,0,-20,1])}
function $a(a,b){if(a.i&&null!==a.j){if(null!==a.j){fb(a,b);b=a.a;var c=a.j;b.useProgram(c);var d=b.getUniformLocation(c,"width");b.uniform1f(d,b.canvas.width);d=b.getUniformLocation(c,"height");b.uniform1f(d,b.canvas.height);b.bindBuffer(b.ARRAY_BUFFER,a.g);b.vertexAttribPointer(0,2,b.FLOAT,!1,0,0);b.activeTexture(b.TEXTURE0);b.bindTexture(b.TEXTURE_2D,a.c);b.clear(b.COLOR_BUFFER_BIT|b.DEPTH_BUFFER_BIT);b.drawArrays(b.TRIANGLES,0,3)}}else b()}
function fb(a,b,c){var d=a.a;(void 0===c?0:c)?(c=a.m,d.bindFramebuffer(d.FRAMEBUFFER,a.s),d.viewport(0,0,c,c)):(d.bindFramebuffer(d.FRAMEBUFFER,a.v),d.viewport(0,0,2048,2048));b();d.viewport(0,0,d.canvas.width,d.canvas.height);d.bindFramebuffer(d.FRAMEBUFFER,null)};function gb(a,b,c){function d(a){e.useProgram(h);e.bindBuffer(e.ARRAY_BUFFER,b.g);e.vertexAttribPointer(0,2,e.FLOAT,!1,0,0);m=e.getUniformLocation(h,"sheet");e.uniform1i(m,a);e.clear(e.COLOR_BUFFER_BIT|e.DEPTH_BUFFER_BIT);e.drawArrays(e.TRIANGLES,0,3)}c=void 0===c?!1:c;var e=b.a,f=Xa("DomainColouring"),g=Ta(a);f[1]=[g,qa["Common.glsl"],f[1]].join("\n");var h=Q(b,f),m;f=K(a);a=J(a,0===f.length?"y":f[f.length-1]);f=[];for(var k=1;k<=a;k++)fb(b,d.bind(null,k),c),g=Ya(b,c?b.f:b.c),f[k-1]=Va(g);return f}
function S(a,b){var c=document.createElement("a");c.href=b;c.download=a;c.style.display="none";document.body.appendChild(c);c.click();document.body.removeChild(c)}function hb(a,b,c,d){c=void 0===c?"sheet":c;a=gb(a,b,void 0===d?!0:d);b=a.length;for(d=0;d<b;d++)S(c+(d+1)+".png",a[d])}
function ib(a,b,c,d){c=void 0===c?"surface":c;d=void 0===d?!0:d;var e,f=-Infinity,g=Infinity;var h=b.byteLength/b.BYTES_PER_ELEMENT/4;var m=[];for(e=0;e<4*h;e+=4){var k=b[e];var p=b[e+1];var q=b[e+2];var u=b[e+3];m.push([k,p,q]);g=Math.min(g,Math.min(q,u));f=Math.max(f,Math.max(q,u))}k=f-g;var v=[];for(e=2;e<4*h;e+=4)p=(b[e]-g)/k,q=(b[e+1]-g)/k,v.push([p,q]);b=[];for(e=1;e<=h;e+=3)k=e+1,p=e+2,b.push([e,k,p]);var D=m.map(function(a,b){var c=v[b];return m.findIndex(function(b,d){d=v[d];return a[0]===
b[0]&&a[1]===b[1]&&a[2]===b[2]&&c[0]===d[0]&&c[1]===d[1]})});var L=Array.from(new Set(D));m=L.map(function(a){return m[a]});v=L.map(function(a){return v[a]});b=b.map(function(a){return a.map(function(a){return L.findIndex(function(b){return b===D[a-1]})+1})});e=m.map(function(a){return"v "+a[0]+" "+a[1]+" "+a[2]});h=v.map(function(a){return"vt "+a[0]+" "+a[1]});b=b.map(function(a){var b=a[0],c=a[1];a=a[2];return"f "+b+"/"+b+" "+c+"/"+c+" "+a+"/"+a});k=["mtllib "+c+".mtl","usemtl surface","s 1"];k=
k.concat(e,h,b);k="data:text/plain,"+encodeURIComponent(k.join("\n"));S(c+".obj",k);var y=a.a,Ka=Q(a,Xa("Export")),sa;fb(a,function(){y.useProgram(Ka);y.bindBuffer(y.ARRAY_BUFFER,a.g);y.vertexAttribPointer(0,2,y.FLOAT,!1,0,0);sa=y.getUniformLocation(Ka,"minValue");y.uniform1f(sa,g);sa=y.getUniformLocation(Ka,"maxValue");y.uniform1f(sa,f);y.clear(y.COLOR_BUFFER_BIT|y.DEPTH_BUFFER_BIT);y.drawArrays(y.TRIANGLES,0,3)},d);d=Ya(a,d?a.f:a.c);S(c+".png",Va(d));d=["newmtl surface","map_Kd "+c+".png","illum 0"];
d="data:text/plain,"+encodeURIComponent(d.join("\n"));S(c+".mtl",d)};function jb(a,b,c,d){d=void 0===d?function(){}:d;this.g=b;this.a=void 0===c?null:c;this.b=this.f=this.c=null;this.h=0;var e=this;kb(this,b,function(){var b=e.c,c=a.a;e.h=b.byteLength/16;c.enableVertexAttribArray(0);e.f=c.createBuffer();c.bindBuffer(c.ARRAY_BUFFER,e.f);c.bufferData(c.ARRAY_BUFFER,new Float32Array(b),c.STATIC_DRAW);e.b=Q(a,Xa("CachedSurface"));d()})}l=jb.prototype;l.A=function(a,b){return this.a?gb(this.a,a,void 0===b?!1:b):[]};l.B=function(a,b){S(void 0===b?"surface.bin":b,this.g)};
l.C=function(a,b,c){this.a&&hb(this.a,a,void 0===b?"sheet":b,void 0===c?!0:c)};l.D=function(a,b,c){b=void 0===b?"surface":b;c=void 0===c?!0:c;ib(a,new Float32Array(this.c),b,c)};function kb(a,b,c){a.g=b;var d=new XMLHttpRequest;d.open("GET",b,!0);d.responseType="arraybuffer";d.onload=function(){a.c=d.response;c()};d.send()}
l.F=function(a,b,c){this.b&&(b.useProgram(this.b),ab(a),cb(a,"m",lb(c)),eb(a,c),bb(a,c),db(a),b.bindBuffer(b.ARRAY_BUFFER,this.f),b.vertexAttribPointer(0,4,b.FLOAT,!1,0,0),b.clear(b.COLOR_BUFFER_BIT|b.DEPTH_BUFFER_BIT),b.drawArrays(b.TRIANGLES,0,this.h),db(a,!1))};function mb(a){for(var b=[],c=0;c<arguments.length;++c)b[c]=arguments[c];C.call(this,b);this.name="ParseError"}ha(mb,C);function T(a){var b=arguments;return function(a){for(var c,e=[],f=0,g=b.length;f<g;f++)if(c=(0,b[f])(a))e.push(c);else return Array.prototype.unshift.apply(a,e),null;return e}}function nb(a){var b=U("("),c=U(")");return function(d){return(d=T(b,a,c)(d))?d[1]:null}}function ob(a){return 0===a.length?!0:null}function pb(a){return function(b){return(b[0]||{}).type===a?b.shift():null}}function qb(a){return function(b){for(var c=a(b),d=[];null!==c;)d.push(c),c=a(b);return d}}
function rb(a){var b=arguments;return function(a){for(var c,e=b.length,f=0;f<e;f++)if(c=(0,b[f])(a))return c;return null}}function sb(a,b){return function(c){c=T(a,b)(c);return null===c?null:{type:"prefix",value:c[0].value,first:c[1]}}}function U(a){return function(b){return(b[0]||{}).value===a?b.shift():null}};function tb(){this.a=[["\\d*\\.\\d*","number"],["\\d+","number"],["i","imaginary"],["[a-hj-z]","variable"],["[\\+\\*\\^-]","operator"],["[\\(\\)]","parenthesis"]]}function ub(a){for(var b=(new tb).a,c="(?:",d=0,e=b.length;d<e;d++)c+=(0<d?"|(":"(")+b[d][0]+")";c=new RegExp(c+")","g");for(d=[];null!==(e=c.exec(a));){var f=e[0];d.push({type:b[e.slice(1).indexOf(f)][1],value:f})}return d};function vb(){}
function V(a){if(null===a)return null;var b=a.type,c=a.value;if("infix"===b){b=V(a.first);a=V(a.second);if("+"===c)return za(b,a);if("-"===c)return za(b,M(a));if("*"===c)return Ga(b,a);if("^"===c){if(Ea(a)&&(c=Ca(a),0<=c.a&&0===c.b))return Ha(b,c.a);throw new mb("Illegal exponent");}throw new mb("Infix operator '"+c+"' not implemented");}if("prefix"===b){b=V(a.first);if("+"===c)return b;if("-"===c)return M(b);throw new mb("Prefix operator '"+c+"' not implemented");}if("number"===b)c=new H([new G(z(parseFloat(c)),
new F({}))]);else if("variable"===b)a={},a[c]=1,c=new H([new G(new r(1,0),new F(a))]);else{var d;"imaginary"===b?d=new H([new G(new r(0,1),new F({}))]):d=null;c=d}return c}
function wb(a){function b(a,b){function c(a,b){return{type:"infix",value:b[0].value,first:a,second:b[1]}}return b===[]?a:b.reduce(c,a)}function c(a){a=T(rb(sb(k,d),d),qb(T(k,d)))(a);return null===a?null:b(a[0],a[1])}function d(a){a=T(e,qb(T(p,e)))(a);return null===a?null:b(a[0],a[1])}function e(a){var b=rb(nb(c),g,h,m)(a);if(null===b)return null;a=f(a);return null===a?b:{type:"infix",value:"^",first:b,second:a}}function f(a){var b=T(q,g)(a);if(null===b)return null;a=f(a);return null===a?b[1]:{type:"infix",
value:"^",first:b[1],second:a}}a=ub(a);var g=pb("number"),h=pb("imaginary"),m=pb("variable"),k=rb(U("+"),U("-")),p=U("*"),q=U("^");return function(a){a=T(c,ob)(a);return null===a?null:a[0]}(a)};function xb(a,b,c){return a+c*(b-a)};function W(a,b,c,d){this.f=a;this.a=b;this.b=c;this.c=d}W.prototype.abs=function(){return Math.sqrt(this.f*this.f+this.a*this.a+this.b*this.b+this.c*this.c)};function X(a,b){a=-a/2;b=-b/2;return yb(new W(Math.cos(a),Math.sin(a),0,0),new W(Math.cos(b),0,0,Math.sin(b)))}function zb(a,b,c){return new W(xb(a.f,b.f,c),xb(a.a,b.a,c),xb(a.b,b.b,c),xb(a.c,b.c,c))}
function yb(a,b){return new W(a.f*b.f-a.a*b.a-a.b*b.b-a.c*b.c,a.f*b.a+a.a*b.f+a.b*b.c-a.c*b.b,a.f*b.b-a.a*b.c+a.b*b.f+a.c*b.a,a.f*b.c+a.a*b.b-a.b*b.a+a.c*b.f)}function Ab(a){var b=a.abs();return new W(a.f/b,a.a/b,a.b/b,a.c/b)}function Bb(a,b){return new W(a.f-b.f,a.a-b.a,a.b-b.b,a.c-b.c)};function Cb(a,b,c){this.i=qa["Common.glsl"].trim();this.j=Ta(b);this.m=c;this.l=a.a.createBuffer();this.a=0;this.h=b;this.f=La(b);this.c=this.g=this.b=null;b=a.a;c=[];for(var d=0;5>d;d++)c[d]=b.createTexture(),b.bindTexture(b.TEXTURE_2D,c[d]),b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MAG_FILTER,b.NEAREST),b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MIN_FILTER,b.NEAREST),b.texImage2D(b.TEXTURE_2D,0,b.RGBA16F,2048,2048,0,b.RGBA,b.FLOAT,null);b.bindTexture(b.TEXTURE_2D,null);this.b=c;a=a.a;this.g=a.createTransformFeedback();
this.c=a.createBuffer()}function Db(a,b){b=b.a;for(var c=[],d=0;d<a.a;d++)c[d]=d;b.bindBuffer(b.ARRAY_BUFFER,a.l);b.bufferData(b.ARRAY_BUFFER,new Float32Array(c),b.STATIC_DRAW)}function Eb(a,b){return["#version 300 es",a.j,a.i,b].join("\n")};function Fb(a,b,c){c=void 0===c?4+2*P:c;c=new Float32Array(c*b.a);a.bindTransformFeedback(a.TRANSFORM_FEEDBACK,b.g);a.bindBufferBase(a.TRANSFORM_FEEDBACK_BUFFER,0,b.c);a.getBufferSubData(a.TRANSFORM_FEEDBACK_BUFFER,0,c);a.bindBufferBase(a.TRANSFORM_FEEDBACK_BUFFER,0,null);a.bindTransformFeedback(a.TRANSFORM_FEEDBACK,null);return c}
function Gb(a,b){var c=void 0===c?4+2*P:c;for(var d=b.b,e=Fb(a,b,c),f=new Float32Array(16777216),g=0;g<=P/2;g++){a.bindTexture(a.TEXTURE_2D,d[g]);a.texParameteri(a.TEXTURE_2D,a.TEXTURE_MAG_FILTER,a.NEAREST);a.texParameteri(a.TEXTURE_2D,a.TEXTURE_MIN_FILTER,a.NEAREST);a.texParameteri(a.TEXTURE_2D,a.TEXTURE_WRAP_S,a.CLAMP_TO_EDGE);a.texParameteri(a.TEXTURE_2D,a.TEXTURE_WRAP_T,a.CLAMP_TO_EDGE);for(var h=0;h<b.a;h++)for(var m=0;4>m;m++)f[4*h+m]=e[c*h+4*g+m];a.texImage2D(a.TEXTURE_2D,0,a.RGBA16F,2048,
2048,0,a.RGBA,a.FLOAT,f)}}function Hb(a,b,c,d){a.bindTransformFeedback(a.TRANSFORM_FEEDBACK,b.g);a.bindBufferBase(a.TRANSFORM_FEEDBACK_BUFFER,0,b.c);a.bufferData(a.TRANSFORM_FEEDBACK_BUFFER,c*Float32Array.BYTES_PER_ELEMENT,a.STATIC_COPY);a.beginTransformFeedback(a.TRIANGLES);d();a.endTransformFeedback();a.bindBufferBase(a.TRANSFORM_FEEDBACK_BUFFER,0,null);a.bindTransformFeedback(a.TRANSFORM_FEEDBACK,null)};function Ib(a,b){this.a=null;var c=[R("Assembly.vert"),R("Dummy.frag")];c[0]=Eb(b,c[0]);this.a=Q(a,c,["posValue"])}
function Jb(a,b,c,d){var e=c.b;d.useProgram(a.a);var f=c.a;d.uniform1f(d.getUniformLocation(a.a,"numIndices"),f);Db(c,b);d.vertexAttribPointer(0,1,d.FLOAT,!1,0,0);var g=c.f;b=4*f*g;for(var h=[],m=e.length,k=0;k<m;k++)d.activeTexture(d.TEXTURE0+k),d.bindTexture(d.TEXTURE_2D,e[k]),d.texParameteri(d.TEXTURE_2D,d.TEXTURE_MAG_FILTER,d.NEAREST),d.texParameteri(d.TEXTURE_2D,d.TEXTURE_MIN_FILTER,d.NEAREST),d.texParameteri(d.TEXTURE_2D,d.TEXTURE_WRAP_S,d.CLAMP_TO_EDGE),d.texParameteri(d.TEXTURE_2D,d.TEXTURE_WRAP_T,
d.CLAMP_TO_EDGE),h[k]=k;d.uniform1iv(d.getUniformLocation(a.a,"samplers"),h);d.disable(d.DEPTH_TEST);var p=d.getUniformLocation(a.a,"sheet");Hb(d,c,b,function(){for(var a=0;a<g;a++)d.uniform1f(p,a),d.drawArrays(d.TRIANGLES,0,f)});c.a*=g;d.enable(d.DEPTH_TEST)};function Kb(){for(var a=[],b=-10;10>b;b++)for(var c=-10;10>c;c++)a=0===(b+c)%2?a.concat([b,c,b+1,c,b,c+1,b+1,c,b+1,c+1,b,c+1]):a.concat([b,c,b+1,c+1,b,c+1,b,c,b+1,c,b+1,c+1]);return a.map(function(a){return a/2})};function Lb(a,b){this.b=this.a=null;var c=Kb(),d=a.a;b.a=c.length/2;d.enableVertexAttribArray(0);this.a=d.createBuffer();d.bindBuffer(d.ARRAY_BUFFER,this.a);d.bufferData(d.ARRAY_BUFFER,new Float32Array(c),d.STATIC_DRAW);c=[R("Initial.vert"),R("Dummy.frag")];c[0]=Eb(b,c[0]);this.b=Q(a,c,["position","delta","subdivisionFlag","values"])}
function Mb(a,b,c){c.useProgram(a.b);var d=(4+2*P)*b.a;c.enableVertexAttribArray(0);c.bindBuffer(c.ARRAY_BUFFER,a.a);c.vertexAttribPointer(0,2,c.FLOAT,!1,0,0);Hb(c,b,d,function(){c.drawArrays(c.TRIANGLES,0,b.a)});Gb(c,b);c.bindBuffer(c.ARRAY_BUFFER,null)};function Nb(a,b){this.a=null;var c=[R("Subdivision.vert"),R("Dummy.frag")];c[0]=Eb(b,c[0]);this.a=Q(a,c,["position","delta","subdivisionFlag","values"])}
function Ob(a,b,c){var d,e=b.b,f=a.a;c.useProgram(f);var g=new Float32Array(b.a),h=Fb(c,b),m=4+2*P,k=m*b.a;a=3;for(d=0;a<k;a+=m,d++)g[d]=h[a];k=[1,0,0,0,1,0,0,0,1,1,0,0,0,1,0,.5,0,.5,0,1,0,0,0,1,.5,0,.5,1,0,0,0,1,0,0,.5,.5,0,.5,.5,0,0,1,1,0,0,1,0,0,0,1,0,.5,0,.5,0,.5,.5,0,0,1,.5,0,.5,.5,0,.5,0,1,0,0,.5,.5,1,0,0,.5,.5,0,0,0,1,0,0,1,.5,.5,0,0,1,0,1,0,0,.5,.5,0,.5,0,.5,.5,0,.5,.5,.5,0,0,0,1,0,1,0,0,0,1,.5,.5,0,1,0,0,.5,.5,0,0,.5,.5,0,0,1,1,0,0,0,.5,.5,0,.5,.5,.5,.5,0,0,1,0,1,0,0,.5,.5,0,.5,0,.5,.5,.5,
0,0,1,0,0,.5,.5,0,.5,.5,0,0,1,.5,0,.5,.5,.5,0,0,.5,.5,.5,0,.5,1,0,0,0,1,0,0,.5,.5,0,.5,.5,.5,0,.5,1,0,0,.5,0,.5,0,.5,.5,0,0,1,1,0,0,.5,.5,0,.5,0,.5,.5,0,.5,.5,.5,0,0,1,0,0,1,0,0,0,1,.5,0,.5,1,0,0,.5,.5,0,0,0,1,0,0,1,.5,.5,0,0,.5,.5,0,.5,.5,.5,.5,0,0,1,0];h=[0,3,9,15,24,30,39,48,60,69,78];var p=[3,6,6,9,6,9,9,12,9,9,9],q=[];a=0;for(d=e.length;a<d;a++)c.activeTexture(c.TEXTURE0+a),c.bindTexture(c.TEXTURE_2D,e[a]),c.texParameteri(c.TEXTURE_2D,c.TEXTURE_MAG_FILTER,c.NEAREST),c.texParameteri(c.TEXTURE_2D,
c.TEXTURE_MIN_FILTER,c.NEAREST),c.texParameteri(c.TEXTURE_2D,c.TEXTURE_WRAP_S,c.CLAMP_TO_EDGE),c.texParameteri(c.TEXTURE_2D,c.TEXTURE_WRAP_T,c.CLAMP_TO_EDGE),q[a]=a;c.uniform1iv(c.getUniformLocation(f,"samplers"),q);f=[];q=[];var u=0;a=0;for(d=b.a/3;a<d;a++){var v=g[3*a],D=h[v];v=p[v];q.push(k.slice(3*D,3*(D+v)));for(D=0;D<v;D++)f.push(3*a);u+=v}q=Array.prototype.concat.apply([],q);k=m*u;g=c.createBuffer();c.enableVertexAttribArray(0);c.bindBuffer(c.ARRAY_BUFFER,g);c.bufferData(c.ARRAY_BUFFER,new Float32Array(q),
c.STATIC_DRAW);c.vertexAttribPointer(0,3,c.FLOAT,!1,0,0);m=c.createBuffer();c.enableVertexAttribArray(1);c.bindBuffer(c.ARRAY_BUFFER,m);c.bufferData(c.ARRAY_BUFFER,new Float32Array(f),c.STATIC_DRAW);c.vertexAttribPointer(1,1,c.FLOAT,!1,0,0);Hb(c,b,k,function(){c.drawArrays(c.TRIANGLES,0,u)});b.a=u;Gb(c,b);a=0;for(d=e.length+1;a<d;a++)c.activeTexture(c.TEXTURE0+a),c.bindTexture(c.TEXTURE_2D,null);c.bindBuffer(c.ARRAY_BUFFER,null);c.deleteBuffer(m);c.deleteBuffer(g);c.disableVertexAttribArray(1)};function Pb(a,b){this.a=null;var c=[R("SubdivisionPre.vert"),R("Dummy.frag")];c[0]=Eb(b,c[0]);this.a=Q(a,c,["position","delta","subdivisionFlag","values"])}
function Qb(a,b,c,d){var e=c.b;a=a.a;d.useProgram(a);Db(c,b);d.vertexAttribPointer(0,1,d.FLOAT,!1,0,0);b=(4+2*P)*c.a;for(var f=[],g=e.length,h=0;h<g;h++)d.activeTexture(d.TEXTURE0+h),d.bindTexture(d.TEXTURE_2D,e[h]),d.texParameteri(d.TEXTURE_2D,d.TEXTURE_MAG_FILTER,d.NEAREST),d.texParameteri(d.TEXTURE_2D,d.TEXTURE_MIN_FILTER,d.NEAREST),d.texParameteri(d.TEXTURE_2D,d.TEXTURE_WRAP_S,d.CLAMP_TO_EDGE),d.texParameteri(d.TEXTURE_2D,d.TEXTURE_WRAP_T,d.CLAMP_TO_EDGE),f[h]=h;d.uniform1iv(d.getUniformLocation(a,
"samplers"),f);Hb(d,c,b,function(){d.drawArrays(d.TRIANGLES,0,c.a)});Gb(d,c);d.bindBuffer(d.ARRAY_BUFFER,null)};function Rb(a,b,c){c=this.a=new Cb(a,b,c);if(2!==K(b).length)throw new E("Equation must be bivariate!");if(2>c.f)throw new E("There must be at least two sheets!");b=a.a;this.f=new Lb(a,c);Mb(this.f,c,b);this.h=new Pb(a,c);this.g=new Nb(a,c);for(var d=0;d<c.m;d++)Qb(this.h,a,c,b),Ob(this.g,c,b);this.c=new Ib(a,c);Jb(this.c,a,c,b);this.b=null;c=Xa("Surface");c[1]=Eb(this.a,c[1]);this.b=Q(a,c);a=b.canvas;b.viewport(0,0,a.width,a.height)}l=Rb.prototype;
l.A=function(a,b){return gb(this.a.h,a,void 0===b?!1:b)};l.B=function(a,b){b=void 0===b?"surface.bin":b;var c=4;c=void 0===c?4+2*P:c;a=Fb(a.a,this.a,c);a=URL.createObjectURL(new Blob([a],{type:"application/octet-binary"}));S(b,a)};l.C=function(a,b,c){hb(this.a.h,a,void 0===b?"sheet":b,void 0===c?!0:c)};l.D=function(a,b,c){b=void 0===b?"surface":b;c=void 0===c?!0:c;var d=Fb(a.a,this.a,4);ib(a,d,b,c)};
l.F=function(a,b,c){this.b&&(b.useProgram(this.b),ab(a),cb(a,"m",lb(c)),eb(a,c),bb(a,c),db(a),b.bindBuffer(b.ARRAY_BUFFER,this.a.c),b.vertexAttribPointer(0,4,b.FLOAT,!1,0,0),b.clear(b.COLOR_BUFFER_BIT|b.DEPTH_BUFFER_BIT),b.drawArrays(b.TRIANGLES,0,this.a.a),db(a,!1))};function Sb(){this.a=!1;this.i=[0,0];this.g=this.f=!1;this.b=X(0,0);this.j=X(0,0);this.c=X(0,0);this.h=1}function lb(a){var b=a.b;a=b.f;var c=b.a,d=b.b;b=b.c;return[a*a+c*c-d*d-b*b,2*c*d+2*a*b,2*c*b-2*a*d,0,2*c*d-2*a*b,a*a-c*c+d*d-b*b,2*d*b+2*a*c,0,2*c*b+2*a*d,2*d*b-2*a*c,a*a-c*c-d*d+b*b,0,0,0,0,a*a+c*c+d*d+b*b]}function Tb(a,b){a.a||(a.i=b,a.g=!0,a.j=a.c)}
function Ub(a,b,c){if(a.g){var d=a.i;b-=d[0];c=d[1]-c;d=Math.sqrt(b*b+c*c);var e=a.j,f=d/Math.sqrt(1E4+d*d);a.c=Ab(zb(e,yb(new W(100/Math.sqrt(1E4+d*d),-f*c,f*b,0),e),.05))}}function Vb(a){if(a.a){var b=Ab(new W(.01,0,0,1));b=yb(b,b);a.b=a.c=yb(a.b,b)}else a.b=Ab(zb(a.b,a.c,.1))};var Wb=5/12*Math.PI,Xb=Math.PI/6;function Y(a,b,c,d,e){b=void 0===b?Wb:b;c=void 0===c?Xb:c;this.c=a;d=void 0===d?!1:d;b=X(b,c);c=new Sb;c.f=void 0===d?!1:d;c.b=c.j=c.c=b;this.a=c;this.b=new Wa(a,void 0===e?"webgl2":e);Yb(this)}function Zb(a,b,c,d,e,f){d=void 0===d?Wb:d;e=void 0===e?Xb:e;a=new Y(a,d,e,void 0===f?!1:f);d=a.b;d.b=new Rb(d,b,c);if(2!==K(b).length||2>d.b.a.f)return null;Z(a);return a}l=Y.prototype;l.J=function(a){var b=this.b;return b.b.A(b,void 0===a?!1:a)};
l.K=function(a){var b=this.b;b.b.B(b,void 0===a?"surface.bin":a)};l.L=function(a,b){var c=this.b;c.b.C(c,void 0===a?"sheet":a,void 0===b?!0:b)};l.I=function(a,b){a=void 0===a?"surface.png":a;b=void 0===b?!1:b;var c=this,d=this.b;fb(d,function(){Z(c)},b);b=Ya(d,b?d.f:d.c);S(a,Va(b))};l.M=function(a,b){var c=this.b;c.b.D(c,void 0===a?"surface":a,void 0===b?!0:b)};
function Yb(a){var b=a.c,c=a.a;a.f=function(b){b.preventDefault();c.a||(Tb(c,[b.clientX,b.clientY]),Z(a))};a.g=function(a){a.preventDefault();Ub(c,a.clientX,a.clientY)};a.h=function(a){a.preventDefault();c.i=[0,0];c.g=!1};a.l=function(b){b.preventDefault();b=b.touches[0];Tb(c,[b.clientX,b.clientY]);Z(a)};a.j=function(a){a.preventDefault();a=a.touches[0];Ub(c,a.clientX,a.clientY)};a.i=function(a){a.preventDefault();c.i=[0,0];c.g=!1};a.m=function(b){b.preventDefault();c.h=0<b.deltaY?Math.min(4,c.h+
.1):Math.max(.5,c.h-.1);Z(a)};b.addEventListener("mousedown",a.f);b.addEventListener("mousemove",a.g);b.addEventListener("mouseup",a.h);b.addEventListener("touchstart",a.l);b.addEventListener("touchmove",a.j);b.addEventListener("touchend",a.i);b.addEventListener("wheel",a.m)}function Z(a){var b=a.a;Za(a.b,b);if(b.a||b.g||1E-6<Bb(b.b,b.c).abs())Vb(b),requestAnimationFrame(function(){Z(a)})}l.Y=function(){this.o(Math.PI/2,Math.PI)};l.Z=function(){this.o(Math.PI,0)};l.$=function(){this.o(Wb,Xb)};
l.aa=function(){this.o(Math.PI/2,0)};l.o=function(a,b){this.a.a=!1;this.a.c=this.a.j=this.a.b;this.a.c=X(a,b);Z(this)};l.ba=function(){this.o(Math.PI/2,-Math.PI/2)};l.ca=function(){this.o(Math.PI/2,Math.PI/2)};l.da=function(){this.o(0,0)};l.N=function(a){this.b.i=a;Z(this)};l.O=function(a){this.a.a=a;Z(this)};l.ea=function(a,b,c,d){this.b.a.clearColor(a,b,c,d);Z(this)};l.P=function(a){this.b.h=a;Z(this)};l.fa=function(a,b){a=X(a,b);this.a.a=!1;this.a.g=!1;this.a.b=this.a.c=a;Z(this)};
l.R=function(a){this.a.f=a;Z(this)};l.S=function(a){this.b.l=a;Z(this)};l.ga=function(a){this.a.h=a||1;Z(this)};l.T=function(){var a=this.b;a.i=!a.i;Z(this)};l.U=function(){var a=this.a;a.a=!a.a;Z(this)};l.V=function(){var a=this.b;a.h=!a.h;Z(this)};l.W=function(){var a=this.a;a.f=!a.f;Z(this)};l.X=function(){var a=this.b;a.l=!a.l;Z(this)};
l.ha=function(){var a=this.c;a.removeEventListener("mousedown",this.f);a.removeEventListener("mousemove",this.g);a.removeEventListener("mouseup",this.h);a.removeEventListener("touchstart",this.l);a.removeEventListener("touchmove",this.j);a.removeEventListener("touchend",this.i);a.removeEventListener("wheel",this.m)};window.ComplexCurves=Y;Y.fromEquation=function(a,b,c,d,e,f){d=void 0===d?Wb:d;e=void 0===e?Xb:e;f=void 0===f?!1:f;b=V(wb(b));return Zb(a,b,c,d,e,f)};Y.fromFile=function(a,b,c,d,e,f,g){d=void 0===d?Wb:d;e=void 0===e?Xb:e;f=void 0===f?!1:f;g=void 0===g?function(){}:g;c=V(wb(void 0===c?"":c));var h=new Y(a,d,e,f,"webgl");a=h.b;a.b=new jb(a,b,c,function(){Z(h);g()});return h};Y.fromPolynomial=Zb;Y.prototype.domainColouring=Y.prototype.J;Y.prototype.exportBinary=Y.prototype.K;
Y.prototype.exportDomainColouring=Y.prototype.L;Y.prototype.exportScreenshot=Y.prototype.I;Y.prototype.exportSurface=Y.prototype.M;Y.prototype.rotateBack=Y.prototype.Y;Y.prototype.rotateBottom=Y.prototype.Z;Y.prototype.rotateDefault=Y.prototype.$;Y.prototype.rotateFront=Y.prototype.aa;Y.prototype.rotateLatLong=Y.prototype.o;Y.prototype.rotateLeft=Y.prototype.ba;Y.prototype.rotateRight=Y.prototype.ca;Y.prototype.rotateTop=Y.prototype.da;Y.prototype.setAntialiasing=Y.prototype.N;
Y.prototype.setAutorotate=Y.prototype.O;Y.prototype.setBackground=Y.prototype.ea;Y.prototype.setClipping=Y.prototype.P;Y.prototype.setLatLong=Y.prototype.fa;Y.prototype.setOrtho=Y.prototype.R;Y.prototype.setTransparency=Y.prototype.S;Y.prototype.setZoom=Y.prototype.ga;Y.prototype.toggleAntialiasing=Y.prototype.T;Y.prototype.toggleAutorotate=Y.prototype.U;Y.prototype.toggleClipping=Y.prototype.V;Y.prototype.toggleOrtho=Y.prototype.W;Y.prototype.toggleTransparency=Y.prototype.X;
Y.prototype.unregisterEventHandlers=Y.prototype.ha;window.PolynomialParser=vb;vb.eval=V;vb.isBivariate=function(a){return 2===K(a).length};vb.parse=wb;vb.sheets=function(a){return La(a)};
})();//# sourceMappingURL=ComplexCurves.js.map
//# sourceMappingURL=ComplexCurves.js.map
(function(){
CindyJS.registerPlugin(1,"ComplexCurves",function(a){function c(e,h){let b,f;for(b in e)(f=h[b])?f(r(e[b])):console.log("Modifier "+b+" not supported")}function g(e,h){e=m.toString(e[0],"CSCanvas");let b=l[e];if(!b)return console.log("Unknown instance '"+e+"'"),p;let f=1,k=[0,0,0];c(h,{alpha:function(d){f=n(d,f)},autorotate:function(d){b.setAutorotate(q(d))},background:function(d){k=t(d,k)},clip:function(d){b.setClipping(q(d))},ortho:function(d){b.setOrtho(q(d))},transparency:function(d){b.setTransparency(q(d))},
view:function(d){switch(m.toString(d)){case "Back":b.rotateBack();break;case "Bottom":b.rotateBottom();break;case "Default":b.rotateDefault();break;case "Front":b.rotateFront();break;case "Left":b.rotateLeft();break;case "Right":b.rotateRight();break;case "Top":b.rotateTop()}},zoom:function(d){b.setZoom(u(d,1))}});b.setBackground(k[0],k[1],k[2],f);return p}let p=a.nada,r=a.evaluate;a=a.defineFunction;let l={};a("ComplexCurves",1,g);a("ComplexCurves",2,function(e,h){let b=m.toString(e[0],"CSCanvas");
var f=document.getElementById(b);let k=m.toString(e[1],"y^2-x"),d=12;void 0!==h.depth&&(d=v(r(h.depth)));delete h.depth;l[b]&&l[b].g&&l[b].g();if(".bin"===k.substr(-4,4)){let w=ComplexCurves.fromFile(f,k,"",void 0,void 0,void 0,function(){l[b]=w;g([e[0]],h)})}else if(f=ComplexCurves.fromEquation(f,k,d))l[b]=f,g([e[0]],h);return p})});let m={};function x(a){return"list"!==a.ctype?(console.log("argument is not a list"),null):a.value}function t(a,c=[.5,.5,.5]){if("number"===a.ctype){let g=n(a);if(!isNaN(g))return[g,g,g]}a=x(a);return null===a?c:3!=a.length?(console.log("Not an RGB color vector"),c):a.map(g=>n(g))}function u(a,c=Number.NaN){if("number"!==a.ctype)return console.log("argument is not a number"),c;a=a.value;c=a.real;0!==a.imag&&console.log("complex number is not real");return c}
function v(a){if("number"!==a.ctype)return console.log("argument is not a number"),12;var c=a.value;a=c.real;c=c.imag;0!==c&&console.log("complex number is not real");c=Math.round(a);c!==a&&console.log("number is not an integer");return c}function n(a,c=Number.NaN){a=u(a,c);return 0>a?0:1<a?1:a}m.toString=function(a,c=null){if("string"===a.ctype)return a.value;console.log("argument is not a string");return c};
function q(a){if("boolean"===a.ctype)return a.value;console.log("argument is not boolean");return!1};
})();
//# sourceMappingURL=ComplexCurves.js.map