-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCindyGL.js
165 lines (163 loc) · 59 KB
/
CindyGL.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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
(function(){
var aa={addc:"vec2 addc(vec2 a,vec2 b){\nreturn a+b;\n}\n",addpoints:"vec2 addpoints(vec3 a,vec3 b){\nreturn dehomogenize(a) +dehomogenize(b);\n}\n",arccosc:"vec2 arccosc(vec2 a){\nvec2 t2=multc(a,negc(a));\nvec2 tmp=sqrtc(addc(vec2(1.0,0.0),t2));\nvec2 tmp1=addc(multc(a,vec2(0.0,1.0)),tmp);\nvec2 erg=addc(multc(logc(tmp1),vec2(0.0,1.0)),vec2(pi*0.5,0.0));\nreturn erg;\n}\n",arccosf:"vec2 arccosf(float z){\nif(abs(z)<=1.)return vec2(acos(z),0.);\nelse if(z>1.)return vec2(0,log(z+sqrt(z*z-1.)));\nelse return vec2(pi, -log(-z+sqrt(z*z-1.)));\n}\n",
arcsinc:"vec2 arcsinc(vec2 a){\nvec2 t2=multc(a,negc(a));\nvec2 tmp=sqrtc(addc(vec2(1.0,0.0),t2));\nvec2 tmp1=addc(multc(a,vec2(0.0,1.0)),tmp);\nvec2 erg=multc(logc(tmp1),vec2(0.0,-1.0));\nreturn erg;\n}\n",arcsinf:"vec2 arcsinf(float z){\nif(abs(z)<=1.)return vec2(asin(z),0.);\nelse if(z>1.)return vec2(pi*.5, -log(z+sqrt(z*z-1.)));\nelse return vec2(-pi*.5,log(-z+sqrt(z*z-1.)));\n}\n",arctan2c:"\n\n\n\nvec2 arctan2c(vec2 x,vec2 y){\nvec2 r=logc(divc(x+vec2(-y.y,y.x),sqrtc(multc(x,x)+multc(y,y))));\nreturn vec2(r.y, -r.x);\n}\n",
arctan2cvec2:"vec2 arctan2cvec2(cvec2 v){\nreturn arctan2c(v.real,v.imag);\n}\n",arctan2vec2:"float arctan2vec2(vec2 v){\nreturn atan(v.y,v.x);\n}\n",arctanc:"vec2 arctanc(vec2 a){\nvec2 t1=logc(addc(multc(a,vec2(0.0,-1.0)),vec2(1.0,0.0)));\nvec2 t2=logc(addc(multc(a,vec2(0.0,1.0)),vec2(1.0,0.0)));\nvec2 erg=multc(subc(t1,t2),vec2(0.0,0.5));\nreturn erg;\n}\n",blue:"vec3 blue(float f)\n{\nreturn vec3(0.,0.,clamp(f,0.,1.));\n}\n",cimag:"float imagc(vec2 a){\nreturn a.y;\n}\n",conjugate:"vec2 conjugate(vec2 a){\nreturn vec2(a.x, -a.y);\n}\n",
copytexture_f:"#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform sampler2D sampler;\nvarying vec2 cgl_pixel;\n\nvoid main(void){\ngl_FragColor=texture2D(sampler,cgl_pixel);\n}\n",copytexture_v:"attribute vec3 aPos;\nattribute vec2 aTexCoord;\nvarying vec2 cgl_pixel;\n\nvoid main(void){\ngl_Position=vec4(aPos,1.);\ncgl_pixel=aTexCoord;\n}\n",cosc:"vec2 cosc(vec2 a){\n\nfloat n=exp(a.y);\nfloat imag1=n*sin(-a.x);\nfloat real1=n*cos(-a.x);\nn=exp(-a.y);\nfloat imag2=n*sin(a.x);\nfloat real2=n*cos(a.x);\nfloat i= (imag1+imag2) /2.0;\nfloat r= (real1+real2) /2.0;\n\nreturn vec2(r,i);\n}\n",
creal:"float realc(vec2 a){\nreturn a.x;\n}\n",dehomogenize:"vec2 dehomogenize(vec3 z){\nreturn vec2(z.x,z.y)/z.z;\n}\n",dehomogenizex:"float dehomogenizex(vec3 z){\nreturn z.x/z.z;\n}\n",dehomogenizey:"float dehomogenizey(vec3 z){\nreturn z.y/z.z;\n}\n",det2:"float det2(mat2 a){\nreturn a[0][0]*a[1][1] -a[0][1]*a[1][0];\n}\n",det3:"float det3(mat3 a){\nreturn dot(cross(a[0],a[1]),a[2]);\n}\n",det3v:"float det3v(vec3 a,vec3 b,vec3 c){\nreturn dot(cross(a,b),c);\n}\n",det4:"float det4(mat4 a){\nfloat s00=a[0][0]*a[1][1] -a[0][1]*a[1][0],\ns01=a[0][0]*a[1][2] -a[0][2]*a[1][0],\ns02=a[0][0]*a[1][3] -a[0][3]*a[1][0],\ns03=a[0][1]*a[1][2] -a[0][2]*a[1][1],\ns04=a[0][1]*a[1][3] -a[0][3]*a[1][1],\ns05=a[0][2]*a[1][3] -a[0][3]*a[1][2],\ns06=a[2][0]*a[3][1] -a[2][1]*a[3][0],\ns07=a[2][0]*a[3][2] -a[2][2]*a[3][0],\ns08=a[2][0]*a[3][3] -a[2][3]*a[3][0],\ns09=a[2][1]*a[3][2] -a[2][2]*a[3][1],\ns10=a[2][1]*a[3][3] -a[2][3]*a[3][1],\ns11=a[2][2]*a[3][3] -a[2][3]*a[3][2];\nreturn s00*s11-s01*s10+s02*s09+s03*s08-s04*s07+s05*s06;\n}\n",
divc:"vec2 divc(vec2 a,vec2 b){\nreturn vec2(dot(a,b),dot(a,vec2(-b.y,b.x)))/dot(b,b);\n}\n",divfc:"vec2 divfc(float a,vec2 b){\nreturn a*vec2(b.x,-b.y)/dot(b,b);\n}\n",expc:"vec2 expc(vec2 a){\nfloat n=exp(a.x);\nfloat r=n*cos(a.y);\nfloat i=n*sin(a.y);\nreturn vec2(r,i);\n}\n",float2color:"vec4 float2color(float f)\n{\nreturn vec4(f,f,f,1.);\n}\n",gray:"vec3 gray(float f)\n{\nf=clamp(f,0.,1.);\nreturn vec3(f,f,f);\n}\n",green:"vec3 green(float f)\n{\nreturn vec3(0.,clamp(f,0.,1.),0.);\n}\n",hsv2rgb:"vec3 hsv2rgb(vec3 c)\n{\nvec4 K=vec4(1.0,2.0/3.0,1.0/3.0,3.0);\nvec3 p=abs(fract(c.xxx+K.xyz) *6.0-K.www);\nreturn c.z*mix(K.xxx,clamp(p-K.xxx,0.0,1.0),c.y);\n}\n",
hue:"vec3 hue(float a){\nreturn hsv2rgb(vec3(a,1.,1.));\n}\n",imagc:"float imagc(vec2 a){\nreturn a.y;\n}\n",invc:"vec2 invc(vec2 a){\nfloat n=a.x*a.x+a.y*a.y;\nreturn vec2(a.x/n,-a.y/n);\n}\n",logc:"vec2 logc(vec2 a){\nfloat re=a.x;\nfloat im=a.y;\nfloat s=sqrt(re*re+im*im);\nfloat i=im;\nfloat imag=atan(im,re);\nif(i<0.0){\nimag+= (2.0*pi);\n}\nif(i==0.0&&re<0.0){\nimag=pi;\n}\nif(imag>pi){\nimag-= (2.0*pi);\n};\nfloat real=log(s);\n\nreturn vec2(real,imag);\n}\n",logr:"vec2 logr(float a){\nif(a>=0.)return vec2(log(a),0);\nelse return vec2(log(-a),pi);\n}\n",
mat2complex:"mat4 mat2complex(mat2 a)\n{\nreturn mat4(\nvec4(a[0][0],0,a[0][1],0),\nvec4(0,a[0][0],0,a[0][1]),\nvec4(a[1][0],0,a[1][1],0),\nvec4(0,a[1][0],0,a[1][1])\n);\n}\n",multc:"vec2 multc(vec2 a,vec2 b){\nreturn vec2(dot(a,vec2(b.x,-b.y)),dot(a,b.yx));\n}\n",negc:"vec2 negc(vec2 a){\nreturn vec2(-a.x,-a.y);\n}\n",powc:"vec2 powc(vec2 a,vec2 b){\nreturn(b.x==0. &&b.y==0.) ?vec2(1.,0.) : ((a.x==0. &&a.y==0.) ?vec2(0.) :expc(multc(logc(a),b)));\n}\n",powi:"float powi(float a,int b){\nif(mod(float(b),2.) < .5)\nreturn pow(abs(a),float(b));\nelse\nreturn sign(a)*pow(abs(a),float(b));\n}\n",
random:"uniform float rnd_;\n\nfloat last_rnd= .1231;\nfloat random(){\nfloat a=fract(132422.21*sin(dot(plain_pixel,343433.671228*vec2(.176574+last_rnd, .1131+rnd_))));\nfloat b=fract(last_rnd*2321.2312*sin(dot(plain_pixel+vec2(rnd_,last_rnd),plain_pixel) *43758.5453));\nlast_rnd=fract(rnd_ +last_rnd+a+b);\nreturn last_rnd;\n}\n",randomnormal:"float randomnormal(){\nreturn sqrt(-2. *log(random())) *cos(6.283185307179586*random());\n}\n",realc:"float realc(vec2 a){\nreturn a.x;\n}\n",red:"vec3 red(float f)\n{\nreturn vec3(clamp(f,0.,1.),0.,0.);\n}\n",
rgb2hsv:"vec3 rgb2hsv(vec3 c)\n{\nvec4 K=vec4(0.0, -1.0/3.0,2.0/3.0, -1.0);\nvec4 p=mix(vec4(c.bg,K.wz),vec4(c.gb,K.xy),step(c.b,c.g));\nvec4 q=mix(vec4(p.xyw,c.r),vec4(c.r,p.yzx),step(p.x,c.r));\n\nfloat d=q.x-min(q.w,q.y);\nfloat e=1.0e-10;\nreturn vec3(abs(q.z+ (q.w-q.y) / (6.0*d+e)),d/ (q.x+e),q.x);\n}\n",sinc:"\n\nvec2 sinc(vec2 a){\n\nfloat n=exp(a.y);\nfloat imag1=n*sin(-a.x);\nfloat real1=n*cos(-a.x);\nn=exp(-a.y);\nfloat imag2=n*sin(a.x);\nfloat real2=n*cos(a.x);\nfloat r= -(imag1-imag2) /2.0;\nfloat i= (real1-real2) /2.0;\n\nreturn vec2(r,i);\n}\n",
sqrtc:"vec2 sqrtc(vec2 a){\nreturn expc(multc(logc(a),vec2(0.5,0.0)));\n}\n",sqrtf:"vec2 sqrtf(float a){\nif(a>=0.)return vec2(sqrt(a),0.);\nelse return vec2(0.,sqrt(-a));\n}\n",standardFragmentHeader:"#ifdef GL_ES\nprecision highp float;\nprecision highp int;\n#endif\n\n#define pi 3.141592653589793\n\nvarying vec2 cgl_pixel;\nvarying vec2 plain_pixel;\n",subc:"vec2 subc(vec2 a,vec2 b){\nreturn a-b;\n}\n",subpoints:"vec2 subpoints(vec3 a,vec3 b){\nreturn dehomogenize(a) -dehomogenize(b);\n}\n",tanc:"vec2 tanc(vec2 a){\nvec2 s=sinc(a);\nvec2 c=cosc(a);\nreturn divc(s,c);\n}\n",
vec2complex:"vec4 vec2complex(vec2 a)\n{\nreturn vec4(a.x,0.,a.y,0);\n}\n",vshader:"attribute vec3 aPos;\nattribute vec2 aTexCoord;\nvarying vec2 cgl_pixel;\nvarying vec2 plain_pixel;\nuniform mat3 transformMatrix;\nvoid main(void){\ngl_Position=vec4(aPos,1.);\nplain_pixel=aTexCoord;\nvec3 r=transformMatrix*vec3(plain_pixel,1);\ncgl_pixel=r.xy/r.z;\n}\n"};var ba=!1,d,h,q,ca,r,u,v=!1,da,x=!1,ea=!1,fa=1;
function ha(){function a(e){d.removeEventListener("webglcontextcreationerror",a,!1);e.statusMessage&&(b=e.statusMessage)}if(!ba){d=document.createElement("canvas");d.id="glcanvas";d.style.display="none";d.width=d.height=0;document.body.appendChild(d);h=document.createElement("canvas");h.id="tmpcanvas";h.style.display="none";h.width=h.height=0;document.body.appendChild(h);q=document.createElement("canvas");q.id="dummycanvas";q.style.display="none";q.width=q.height=1;document.body.appendChild(q);ca=
{ctype:"image",value:{img:q,width:1,height:1,ready:!0,live:!1,generation:0,whenReady:function(){}}};var b="Unknown";d.addEventListener("webglcontextcreationerror",a,!1);var c={};"undefined"!==typeof CindyJS._pluginRegistry.CindyXR&&(c.xrCompatible=!0);(r=d.getContext("webgl",c))||(r=d.getContext("experimental-webgl",c));if(!r)throw new ia(`Could not obtain a WebGL context.\nReason: ${b}`);ja.gl=r;d.removeEventListener("webglcontextcreationerror",a,!1);ea||(x=r.getExtension("OES_texture_float")&&r.getExtension("OES_texture_float_linear"),
x||(console.error("Your browser does not suppert OES_texture_float, trying OES_texture_half_float..."),(v=(da=r.getExtension("OES_texture_half_float"))&&r.getExtension("OES_texture_half_float_linear"))||console.error("Your browser does not suppert OES_texture_half_float, will use 8-bit textures.")),navigator.userAgent.match(/(iPad|iPhone)/i)&&(console.log("You are using an iPhone/iPad."),x=v=!1,r.getExtension("OES_texture_half_float")&&r.getExtension("OES_texture_half_float_linear")&&r.getExtension("EXT_color_buffer_half_float")?
v=!0:console.error("Your browser does not suppert writing to half_float textures, we will use 8-bit textures.")));ba=!0}};function ka(a){if(null==a||"object"!=typeof a)return a;if(a instanceof Array){var b=[];for(var c=0,e=a.length;c<e;c++)b[c]=ka(a[c]);return b}if(a instanceof Object){b={};for(c in a)a.hasOwnProperty(c)&&(0<="oper impl args ctype stack name arglist value real imag key obj body".split(" ").indexOf(c)&&(b[c]=ka(a[c])),a.modifs&&(b.modifs=a.modifs));return b}}
function la(a,b){if(null==a||"object"!=typeof a)return a===b;if(a instanceof Array&&b instanceof Array){if(a.length!=b.length)return!1;for(var c=0,e=a.length;c<e;c++)if(!la(a[c],b[c]))return!1;return!0}if(a instanceof Object&&b instanceof Object){c="oper impl args ctype stack name modifs arglist value real imag key obj body".split(" ");for(e=0;e<c.length;e++){let f=c[e];if(!la(a[f],b[f]))return!1}return!0}return!1}function y(a){return-1===a.indexOf("$")?a:a.substr(0,a.indexOf("$"))}
function A(a){if("boolean"===a.ctype)return B.C;if("number"===a.ctype)return a=a.value,1E-5>Math.abs(a.imag)?(a.real|0)===a.real?B.v:B.h:B.i;if("list"===a.ctype){let b=a.value;if(3===b.length){if("Point"===a.usage)return B.B;if("Line"===a.usage)return B.line}if(0<b.length){let c=A(b[0]);for(let e=1;e<b.length;e++)c=C(c,A(b[e]));if(c)return{type:"list",length:b.length,parameters:c}}}else{if("string"===a.ctype||"image"===a.ctype)return B.image;if("geo"===a.ctype&&"L"===a.value.kind)return B.line}console.error("Cannot guess type of the following type:");
console.log(a);return!1}var ma=0;function na(){ma++;return`_h${ma}`}function oa(a,b){if(a>d.width||b>d.height)d.width=Math.ceil(a),d.height=Math.ceil(b)}function qa(a,b){a.instance.fa||(a.instance.fa={});a.instance.fa[b]||(a.instance.fa[b]=a.instance.parse(b));a=a.evaluate(a.instance.fa[b]);return a.ctype&&"number"===a.ctype?a.value.real:0}function ra(a){return{x:qa(a,"(screenbounds()_4).x"),y:qa(a,"(screenbounds()_4).y")}}
function sa(a){return{x:qa(a,"(screenbounds()_3).x"),y:qa(a,"(screenbounds()_3).y")}}var ta=new Float32Array(1),ua=new Int32Array(ta.buffer);function va(a){ta[0]=a;a=ua[0];var b=a>>16&32768,c=(a&2147483647)+4096;if(1199570944<=c)return 1199570944<=(a&2147483647)?2139095040>c?b|31744:b|31744|(a&8388607)>>13:b|31743;if(947912704<=c)return b|c-939524096>>13;if(855638016>c)return b;c=(a&2147483647)>>23;return b|(a&8388607|8388608)+(8388608>>>c-102)>>126-c}
function wa(a){return x?new Float32Array(a):v?new Uint16Array(a):new Uint8Array(a)}function xa(){return x?r.FLOAT:v?da.HALF_FLOAT_OES:r.UNSIGNED_BYTE}function ya(a){let b=1;for(;b<a;)b<<=1;return b};function za(a,b,c){if(a.canvaswrapper){if(!a.ready||a.canvaswrapper.canvas!=ca&&a.canvaswrapper.M==a.width&&a.canvaswrapper.I==a.height||(delete a.canvaswrapper,a.canvaswrapper=za(a,b,c)),c){b=a.canvaswrapper;var e=b.l;if(c&&(c.repeat!=e.repeat||c.clamptoedge!=e.clamptoedge||c.mipmap!=e.mipmap||c.interpolate!=e.interpolate))for(b.l=c,e=0;2>e;e++)r.bindTexture(r.TEXTURE_2D,b.textures[e]),c.mipmap?r.texParameteri(r.TEXTURE_2D,r.TEXTURE_MIN_FILTER,c.interpolate?r.LINEAR_MIPMAP_LINEAR:r.NEAREST_MIPMAP_LINEAR):
r.texParameteri(r.TEXTURE_2D,r.TEXTURE_MIN_FILTER,c.interpolate?r.LINEAR:r.NEAREST),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_MAG_FILTER,c.interpolate?r.LINEAR:r.NEAREST),c.clamptoedge&&(r.texParameteri(r.TEXTURE_2D,r.TEXTURE_WRAP_S,r.CLAMP_TO_EDGE),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_WRAP_T,r.CLAMP_TO_EDGE))}}else a.canvaswrapper=new Aa(a.ready?a:ca,c||{interpolate:!0,mipmap:!1,repeat:!1,clamptoedge:!1}),a.ready||console.log("Image is not ready yet.");return a.canvaswrapper}
function Aa(a,b){this.canvas=a;this.l=b;this.M=a.width;this.I=a.height;Ba(this);this.it=0;this.textures=[];this.X=[];this.generation=-1;this.bindTexture();a.drawTo=this.drawTo.bind(this);a.readPixels=this.ja.bind(this);a.cdyUpdate=this.na.bind(this);a=wa(this.R*this.N*4);for(var c=0;2>c;c++)this.textures[c]=r.createTexture(),r.bindTexture(r.TEXTURE_2D,this.textures[c]),r.pixelStorei(r.UNPACK_ALIGNMENT,1),r.texImage2D(r.TEXTURE_2D,0,r.RGBA,this.R,this.N,0,r.RGBA,xa(),a),b.mipmap?r.texParameteri(r.TEXTURE_2D,
r.TEXTURE_MIN_FILTER,b.interpolate?r.LINEAR_MIPMAP_LINEAR:r.NEAREST_MIPMAP_LINEAR):r.texParameteri(r.TEXTURE_2D,r.TEXTURE_MIN_FILTER,b.interpolate?r.LINEAR:r.NEAREST),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_MAG_FILTER,b.interpolate?r.LINEAR:r.NEAREST),b.clamptoedge&&(r.texParameteri(r.TEXTURE_2D,r.TEXTURE_WRAP_S,r.CLAMP_TO_EDGE),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_WRAP_T,r.CLAMP_TO_EDGE)),this.X[c]=r.createFramebuffer(),r.bindFramebuffer(r.FRAMEBUFFER,this.X[c]),r.framebufferTexture2D(r.FRAMEBUFFER,
r.COLOR_ATTACHMENT0,r.TEXTURE_2D,this.textures[c],0);this.D=new Ca(aa.copytexture_v,aa.copytexture_f);b=r.createBuffer();r.bindBuffer(r.ARRAY_BUFFER,b);b=new Float32Array([-1,-1,0,1,-1,0,-1,1,0,1,1,0]);a=r.getAttribLocation(this.D.handle,"aPos");r.enableVertexAttribArray(a);c=r.getAttribLocation(this.D.handle,"aTexCoord");r.enableVertexAttribArray(c);var e=new Float32Array([0,0,1,0,0,1,1,1]),f=b.byteLength;r.bufferData(r.ARRAY_BUFFER,f+e.byteLength,r.STATIC_DRAW);r.bufferSubData(r.ARRAY_BUFFER,0,
b);r.bufferSubData(r.ARRAY_BUFFER,f,e);r.vertexAttribPointer(a,3,r.FLOAT,!1,0,0);r.vertexAttribPointer(c,2,r.FLOAT,!1,0,f)}function Ba(a){a.l.clamptoedge&&a.l.interpolate&&!a.l.repeat&&!a.l.mipmap?(a.R=a.M,a.N=a.I):(a.R=ya(a.M+a.M/2*(a.l.mipmap&&a.l.repeat)),a.N=ya(a.I+a.I/2*(a.l.mipmap&&a.l.repeat)))}Aa.prototype.bindTexture=function(){r.bindTexture(r.TEXTURE_2D,this.textures[this.it])};Aa.prototype.bindFramebuffer=function(){r.bindFramebuffer(r.FRAMEBUFFER,this.X[this.it^1]);this.it^=1};
Aa.prototype.na=function(){let a;this.canvas.img.hasOwnProperty("getContext")?a=this.canvas.img.getContext("2d"):(this.canvas.img=document.createElement("canvas"),this.canvas.img.style.display="none",this.canvas.img.width=this.M,this.canvas.img.height=this.I,a=this.canvas.img.getContext("2d"));a.clearRect(0,0,this.M,this.I);this.drawTo(a,0,0);this.canvas.img.generation++};
Aa.prototype.reloadIfRequired=function(){if(!(this.canvas.live&&(this.canvas.img.webkitDecodedFrameCount||this.canvas.img.l)&&this.da>=(this.canvas.img.webkitDecodedFrameCount||this.canvas.img.l)||!this.canvas.live&&(!this.canvas.ready||this.generation>=this.canvas.generation))){if(this.M!=this.canvas.width||this.I!=this.canvas.height){this.M=this.canvas.width;this.I=this.canvas.height;Ba(this);var a=wa(this.R*this.N*4);for(let b=0;2>b;b++)r.bindTexture(r.TEXTURE_2D,this.textures[b]),r.texImage2D(r.TEXTURE_2D,
0,r.RGBA,this.R,this.N,0,r.RGBA,xa(),a)}this.bindTexture();r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,1);this.l.repeat?(h.width=this.R,h.height=this.N,a=h.getContext("2d"),a.drawImage(this.canvas.img,0,this.N-this.I),a.drawImage(this.canvas.img,this.M,this.N-this.I),a.drawImage(this.canvas.img,0,this.N-2*this.I),a.drawImage(this.canvas.img,this.M,this.N-2*this.I),r.texSubImage2D(r.TEXTURE_2D,0,0,0,r.RGBA,xa(),h)):r.texSubImage2D(r.TEXTURE_2D,0,0,0,r.RGBA,xa(),this.canvas.img);this.l.mipmap&&r.generateMipmap(r.TEXTURE_2D);
r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,0);this.generation=this.canvas.generation;this.da=Math.min(this.da+1,this.canvas.img.webkitDecodedFrameCount||this.canvas.img.l)}};
Aa.prototype.drawTo=function(a,b,c){oa(this.R,this.N);r.viewport(0,0,this.R,this.N);this.D.use(r);r.activeTexture(r.TEXTURE0);r.bindTexture(r.TEXTURE_2D,this.textures[this.it]);this.D.uniform.sampler([0]);r.bindFramebuffer(r.FRAMEBUFFER,null);r.drawArrays(r.TRIANGLE_STRIP,0,4);r.flush();a.drawImage(d,0,d.height-this.I,this.M,this.I,b,c,this.M,this.I)};
Aa.prototype.ja=function(a,b,c,e){r.bindFramebuffer(r.FRAMEBUFFER,this.X[this.it]);r.framebufferTexture2D(r.FRAMEBUFFER,r.COLOR_ATTACHMENT0,r.TEXTURE_2D,this.textures[this.it],0);var f=wa(c*e*4);r.readPixels(a,this.I-b-e,c,e,r.RGBA,xa(),f);a=[];for(--e;0<=e;e--){b=a.concat;var g=f.slice(e*c*4,(e+1)*c*4);let l=[];for(let m=0;m<g.length;m++)if(x)l.push(g[m]);else if(v){var k=g[m];let n=(k&31744)>>10,p=k&1023;l.push((k>>15?-1:1)*(n?31===n?p?NaN:Infinity:Math.pow(2,n-15)*(1+p/1024):p/1024*6.103515625E-5))}else l.push(g[m]/
255);a=b.call(a,l)}return a};function Da(a,b){this.F=a;this.X=b;Ea(this)}
function Ea(a){var b=Fa(new Ga(a.F),a.X);a.D=b.G;a.O=b.O;a.ca=b.ca;a.da=aa.standardFragmentHeader+b.code;a.ja=aa.vshader;a.l=new Ca(a.ja,a.da);b=r.createBuffer();r.bindBuffer(r.ARRAY_BUFFER,b);b=new Float32Array([-1,-1,0,1,-1,0,-1,1,0,1,1,0]);var c=r.getAttribLocation(a.l.handle,"aPos");r.enableVertexAttribArray(c);a=r.getAttribLocation(a.l.handle,"aTexCoord");r.enableVertexAttribArray(a);var e=new Float32Array([0,0,1,0,0,1,1,1]),f=b.byteLength;r.bufferData(r.ARRAY_BUFFER,f+e.byteLength,r.STATIC_DRAW);
r.bufferSubData(r.ARRAY_BUFFER,0,b);r.bufferSubData(r.ARRAY_BUFFER,f,e);r.vertexAttribPointer(c,3,r.FLOAT,!1,0,0);r.vertexAttribPointer(a,2,r.FLOAT,!1,0,f)}function Ha(a,b,c,e){b=[c.x-b.x,e.x-b.x,b.x,c.y-b.y,e.y-b.y,b.y,0,0,1];a.l.uniform.hasOwnProperty("transformMatrix")&&a.l.uniform.transformMatrix([b[0],b[3],b[6],b[1],b[4],b[7],b[2],b[5],b[8]])}
function Ia(a){function b(c,e,f){if(c)if("function"===typeof c)switch(e){case B.i:c([f.value.real,f.value.imag]);break;case B.C:f.value?c([1]):c([0]);break;case B.v:case B.h:c([f.value.real]);break;case B.B:case B.line:"geo"===f.ctype?c(f.value.homog.value.map(l=>l.value.real)):"list"===f.ctype&&2===f.value.length?c(f.value.map(l=>l.value.real).concat([1])):"list"===f.ctype&&3===f.value.length&&c(f.value.map(l=>l.value.real));break;default:if("list"===e.type&&e.parameters===B.h)c(f.value.map(l=>l.value.real));
else if("list"===e.type&&"list"===e.parameters.type&&e.parameters.parameters===B.h){var g=[];for(var k=0;k<e.length;k++)for(let l=0;l<e.parameters.length;l++)g.push(f.value[k].value[l].value.real);c(g)}else console.error(`Don't know how to set uniform of type ${D(e)}, to ${f}`)}else if("list"===e.type)if(k=Ja(e),1===E(e)&&k===B.h){e=Ka(e.length);let l=0;for(g in e)b(c[`a${g}`],B.aa(e[g]),{ctype:"list",value:Array.from(Array(e[g]).keys()).map(m=>f.value[l+m])}),l+=e[g]}else for(g=0;g<e.length;g++)b(c[`a${g}`],
e.parameters,{ctype:"list",value:f.value[g].value});else console.error(`Don't know how to set uniform of type ${D(e)}, to`),console.log(f)}for(let c in a.D){let e=a.F.evaluateAndVal(a.D[c].V),f=a.D[c].type;if(!F(La(e),f)){console.log(`Type of ${c} changed (${D(La(e))} is no subtype of ${D(f)}); forcing rebuild.`);Ea(a);a.l.use(r);Ia(a);return}a.l.uniform[c]&&b(a.l.uniform[c],f,e)}[["rnd_",()=>[Math.random()]],["_lowerleft",()=>{let c=ra(a.F);return[c.x,c.y]}],["_lowerright",()=>{let c=sa(a.F);return[c.x,
c.y]}]].map(c=>a.l.uniform[c[0]]&&a.l.uniform[c[0]](c[1]()))}function Ma(a){let b=0;for(let e in a.O){r.activeTexture(r.TEXTURE0+b);var c=a.O[e];let f=c.name;c=Na(c);c.reloadIfRequired();c.bindTexture();[[`_sampler${f}`,[b]],[`_ratio${f}`,[c.M/c.I]],[`_cropfact${f}`,[c.M/c.R,c.I/c.N]]].map(g=>a.l.uniform[g[0]]&&a.l.uniform[g[0]](g[1]));b++}}function Oa(a){for(let b in a.ca)if(a.F.getMyfunction(b).generation>a.ca[b])return console.log(`${b} is outdated; forcing rebuild.`),!1;return!0};function ja(a){function b(c,e,f,g,k,l){if(!c.ia||c.ha<fa)c.ia=!0,c.ha=fa,c.ka=new Da(a,c);c=c.ka;Oa(c)||Ea(c);var m=k/g;m={x:e.x+-(f.y-e.y)*m,y:e.y+(f.x-e.x)*m};oa(g,k);l?r.viewport(0,0,g,k):r.viewport(0,d.height-k,g,k);c.l.use(r);Ia(c);Ha(c,e,f,m);Ma(c);l?(l.bindFramebuffer(),l.generation=++l.canvas.generation):r.bindFramebuffer(r.FRAMEBUFFER,null);r.drawArrays(r.TRIANGLE_STRIP,0,4);r.flush();l&&(l.generation=Math.max(l.generation,l.canvas.generation+1))}u=a.nada;a.defineFunction("compile",1,c=>
{c=Fa(new Ga(a),c[0]);console.log(c);return{ctype:"string",value:c}});a.defineFunction("use8bittextures",0,()=>{ea=!0;x=v=!1;console.log("Switching to 8-bit textures mode.");return a.nada});a.defineFunction("forcerecompile",0,()=>{fa++;return u});a.defineFunction("colorplot",1,c=>{ha();let e=a.instance.canvas.width,f=a.instance.canvas.height;b(c[0],ra(a),sa(a),e,f,null);c=a.instance.canvas.getContext("2d");c.save();c.setTransform(1,0,0,1,0,0);c.drawImage(d,0,0,e,f,0,0,e,f);c.restore();return u});
a.defineFunction("colorplot",3,c=>{ha();var e=c[0],f=a.extractPoint(a.evaluateAndVal(c[1])),g=a.extractPoint(a.evaluateAndVal(c[2])),k={x:Math.min(f.x,g.x),y:Math.min(f.y,g.y)},l={x:Math.max(f.x,g.x),y:Math.min(f.y,g.y)},m=Math.min(f.x,g.x),n=Math.max(f.y,g.y);c=a.instance.canvas.width;let p=a.instance.canvas.height;var t=qa(a,"(screenbounds()_1).x");var w=qa(a,"(screenbounds()_1).y");let z=sa(a),N=Math.abs((f.x-g.x)/(z.x-t));f=Math.abs((f.y-g.y)/(z.y-w));b(e,k,l,c*N,p*f,null);e=a.instance.canvas.getContext("2d");
a.getInitialMatrix();t=c*(m-t)/(z.x-t);w=p*(n-w)/(z.y-w);e.save();e.setTransform(1,0,0,1,0,0);e.drawImage(d,0,0,c*N,p*f,t,w,c*N,p*f);e.restore();return u});a.defineFunction("colorplot",4,c=>{ha();var e=a.extractPoint(a.evaluateAndVal(c[0])),f=a.extractPoint(a.evaluateAndVal(c[1])),g=a.evaluateAndVal(c[2]);c=c[3];if(!e.ok||!f.ok||"string"!==g.ctype)return u;g=a.getImage(g.value,!0);let k=za(g,a,!1);b(c,e,f,g.width,g.height,k);return u});a.defineFunction("colorplot",2,c=>{ha();var e=ra(a),f=sa(a),g=
a.evaluateAndVal(c[0]);c=c[1];if("string"!==g.ctype)return u;g=a.getImage(g.value,!0);let k=za(g,a,!1);b(c,e,f,g.width,g.height,k);return u});a.defineFunction("setpixel",4,c=>{var e=Pa.toString(a.evaluateAndVal(c[0])),f=Ra(a.evaluateAndVal(c[1])),g=Ra(a.evaluateAndVal(c[2])),k=Sa(a.evaluateAndVal(c[3]));if(!e)return u;c=a.getImage(e,!0);c=za(c,a,!1);if(isFinite(f)&&isFinite(g)&&e&&c&&k){c.bindTexture();e=[k[0],k[1],k[2],1];k=r;var l=k.texSubImage2D,m=r.TEXTURE_2D,n=r.RGBA,p=xa();var t=e;if(x)t=new Float32Array(t);
else if(v){var w=new Uint16Array(t.length);for(var z=0;z<t.length;z++)w[z]=va(t[z]);t=w}else{w=new Uint8Array(t.length);for(z=0;z<t.length;z++)w[z]=255*t[z];t=w}l.call(k,m,0,f,g,1,1,n,p,t);c=c.canvas.img.getContext("2d");k=c.createImageData(1,1);k.data.d=e;c.putImageData(k,f,g)}return u});a.defineFunction("colorplotxr",2,c=>{ha();let e=a.evaluate(c[0]).value.real;c=c[1];if(!c.ia||c.ha<fa)c.ia=!0,c.ha=fa,c.ka=new Da(a,c);c=c.ka;if(0==e){r.clearColor(0,0,0,1);r.clear(r.COLOR_BUFFER_BIT|r.DEPTH_BUFFER_BIT);
var f=r.getAttribLocation(c.l.handle,"aPos");r.enableVertexAttribArray(f);var g=r.getAttribLocation(c.l.handle,"aTexCoord");r.enableVertexAttribArray(g);r.vertexAttribPointer(f,3,r.FLOAT,!1,0,0);r.vertexAttribPointer(g,2,r.FLOAT,!1,0,48)}Oa(c)||Ea(c);c.l.use(r);Ia(c);Ha(c,{x:-1,y:-1},{x:1,y:-1},{x:-1,y:1});Ma(c);CindyJS._pluginRegistry.CindyXR.xrUpdateCindyGLView(r,e);r.drawArrays(r.TRIANGLE_STRIP,0,4);r.flush();return u})}ja.gl=null;ja.generateCanvasWrapperIfRequired=za;ja.initGLIfRequired=ha;
CindyJS.registerPlugin(1,"CindyGL",ja);let G=(a,b)=>({type:"list",length:a,parameters:b}),La=a=>({type:"constant",value:a}),Ta=a=>La({ctype:"number",value:{real:a,imag:0}});const B={C:1,v:2,h:3,i:4,U:5,color:6,B:7,line:8,L:9,image:10,H:G(2,3),K:G(3,3),P:G(4,3),aa:a=>G(a,3),ba:a=>G(a,4),Y:G(2,G(2,3)),Z:G(3,G(3,3)),$:G(4,G(4,3))};Object.freeze(B);
function D(a){return 1<=a&&10>=a?"bool int float complex voidt color point line coordinate2d image".split(" ")[a-1]:"list"===a.type?`${D(a.parameters)}[${a.length}]`:"constant"===a.type?`const[${JSON.stringify(a.value.value)}]`:JSON.stringify(a)}
let H=a=>"list"===a.type&&H(a.parameters)||F(a,B.h),I=a=>"list"===a.type&&I(a.parameters)||F(a,B.i),Ua=a=>"constant"===a.type&&F(a,B.v),J=a=>"constant"===a.type?A(a.value):a,E=a=>"list"===a.type?E(a.parameters)+1:0,Ja=a=>void 0!==a.parameters?Ja(a.parameters):a,Va=(a,b)=>E(a)===E(b)&&(0===E(a)||a.length===b.length&&Va(a.parameters,b.parameters)),K=a=>F(a,B.h)?B.h:F(a,B.i)?B.i:{type:"list",length:a.length,parameters:K(a.parameters)},Wa=a=>F(a,B.i)?B.i:{type:"list",length:a.length,parameters:Wa(a.parameters)},
L=a=>"constant"===a.type&&L(J(a))||a===B.C||a===B.v||a===B.h||a===B.i||a===B.B||a===B.line||"list"===a.type&&a.parameters===B.h&&1<=a.length&&4>=a.length||"list"===a.type&&"list"===a.parameters.type&&a.parameters.parameters===B.h&&a.length===a.parameters.length&&2<=a.length&&4>=a.length,Xa=a=>-1!==[B.C,B.v,B.h,B.i].indexOf(a),Ya=(a,b)=>a===b||"constant"===a.type&&"constant"===b.type&&la(a.value,b.value)||"list"===a.type&&"list"===b.type&&a.length===b.length&&Ya(a.parameters,b.parameters);
function F(a,b){return Ya(a,b)?!0:a?Xa(a)&&Xa(b)?a<=b:"constant"===b.type?!1:"constant"===a.type?F(A(a.value),b):b===B.L?F(a,B.i)||F(a,B.H)||F(a,B.B):b===B.B?F(a,B.K)||F(a,B.H):b===B.line?F(a,B.K):b===B.color?F(a,B.h)||"list"===a.type&&(3===a.length||4===a.length)&&F(a.parameters,B.h):"list"===a.type&&"list"===b.type&&a.length===b.length?F(a.parameters,b.parameters):!1:!1}
function C(a,b){if(!a)return b;if(!b||Ya(a,b))return a;"constant"===a.type&&(a=A(a.value));"constant"===b.type&&(b=A(b.value));return Xa(a)&&Xa(b)?Math.max(a,b):"list"===a.type&&"list"===b.type&&a.length===b.length&&(b=C(a.parameters,b.parameters))?{type:"list",length:a.length,parameters:b}:!1}function M(a){return b=>{for(let c in a){let e=a[c],f=e[0];if(b.length==f.length&&b.every((g,k)=>F(g,f[k])))return{s:f,u:e[1],m:e[2]}}return!1}}
function Za(a){switch(a){case B.v:return M([[[B.C],B.v,O("int")]]);case B.h:return M([[[B.C],B.h,O("float")],[[B.v],B.h,O("float")]]);case B.i:return M([[[B.h],B.i,b=>`vec2(${b}, 0.)`]]);case B.color:return M([[[B.h],B.color,P("float2color")],[[B.K],B.color,b=>`vec4(${b},1.0)`],[[B.P],B.color,Q]]);case B.B:return M([[[B.H],B.B,b=>`vec3(${b},1.0)`],[[B.K],B.B,Q]]);case B.line:return M([[[B.H],B.line,b=>`vec3(${b},1.0)`],[[B.K],B.line,Q]]);case B.L:return M([[[B.i],B.L,Q],[[B.H],B.L,Q],[[B.B],B.L,P("dehomogenize")]]);
default:if("list"===a.type)return b=>{let c=b[0],e=Za(a.parameters)([c.parameters]).m;return{s:b,u:a,m:(f,g,k)=>$a(a)(Array.from(Array(a.length).keys()).map(l=>e([R(c,l)([f],g,k)],g,k)),g,k)}}}console.log(`no inclusionfunction ->${D(a)} implemented yet; using identity...`);return b=>({s:b,u:a,m:Q})}
function S(a){a=J(a);switch(a){case B.C:return"bool";case B.v:return"int";case B.h:return"float";case B.i:case B.L:return"vec2";case B.U:return"void";case B.color:return"vec4";case B.B:case B.line:return"vec3"}if("list"===a.type&&a.parameters===B.h)return 1==a.length?"float":`vec${a.length}`;if("list"===a.type&&a.parameters===B.i)return`cvec${a.length}`;if("list"===a.type&&"list"===a.parameters.type&&a.length===a.parameters.length&&a.parameters.parameters===B.h)switch(a.length){case 2:return"mat2";
case 3:return"mat3";case 4:return"mat4"}if("list"===a.type)return`l${a.length}_${S(a.parameters)}`;console.error(`No WebGL implementation for type ${D(a)} found`)}
function ab(a,b){switch(b){case B.C:return`${S(b)}(${a.value})`;case B.v:return`${a.value.real|0}`;case B.h:return`${S(b)}(${a.value.real})`;case B.i:return`${S(b)}(${a.value.real}, ${a.value.imag})`;case B.color:return a=a.value.real,`vec4(${a},${a},${a},1.)`;default:console.error(`Dont know how to paste values of Type ${D(b)} yet.`)}};var T={};function bb(a,b,c){if(!c.mark("includedfunctions",a)){for(let e in T[a])bb(T[a][e],b,c);c.add("includedfunctions",a,()=>aa[a])}}function P(a){return(b,c,e)=>{bb(a,c,e);return O(a)(b)}};let Ka=a=>4>=a?[a]:5==a?[2,3]:Ka(a-4).concat([4]);function cb(a){let b=Ja(a),c=E(a);return 1==c&&b===B.h?Ka(a.length).map((e,f)=>({type:B.aa(e),name:`a${f}`})):1<=c?Array.from(Array(a.length).keys()).map(e=>({type:a.parameters,name:`a${e}`})):[]}function db(a,b){if(!L(a)){var c=S(a);b.add("structs",c,()=>`struct ${c} { ${cb(a).map(e=>db(e.type,b)||`${S(e.type)} ${e.name};`).join("")}};`)}}
function eb(a,b,c){if(!L(a)){var e=a.length,f=a.parameters.length;c.add("functions",`mult${e}_${f}`,()=>`${S(B.aa(e))} mult${e}_${f}(${S(a)} a, ${S(B.aa(f))} b){`+"return "+fb(e)(Array.from(Array(e).keys()).map(g=>gb(f)([`a.a${g}`,"b"],b,c)),b,c)+";}")}}function hb(a,b,c){if(!(L(a)&&1>=E(a))){var e=a.length,f=`sum${S(a)}`;c.add("functions",f,()=>`${S(a.parameters)} ${f}(${S(a)} a){`+`${S(a.parameters)} res = ${ib(a.parameters,0)([],b,c)};
${Array.from(Array(e).keys()).map(g=>"res = "+jb(a.parameters)(["res",R(a,g)(["a",g],b,c)],b,c)+";").join("\n")}
return res;
}`)}}function kb(a,b,c){let e=a.length,f=a.parameters.length;c.add("functions",`multc${e}_${f}`,()=>`${S(B.ba(e))} multc${e}_${f}(${S(a)} a, ${S(B.ba(f))} b){
return cvec${e}(${Array.from(Array(e).keys()).map(g=>lb(f)([`a.a${g}`,"b"],b,c))});
}
`)}function mb(a,b){2<=a&&4>=a||b.add("functions",`dot${a}`,()=>`float dot${a}(vec${a} a, vec${a} b) {
return ${Ka(a).map((c,e)=>`dot(a.a${e},b.a${e})`).join("+")}; }
`)}function nb(a,b){b.add("functions",`cdot${a}`,()=>`vec2 cdot${a}(cvec${a} a, cvec${a} b) {
return ${Array.from(Array(a).keys()).map(c=>`vec2(dot(a.a${c},vec2(b.a${c}.x,-b.a${c}.y)), dot(a.a${c},b.a${c}.yx))`).join("+\n")};
}
`)}function ob(a,b,c){let e=`add${S(a)}`;c.add("functions",e,()=>`${S(a)} ${e}(${S(a)} a, ${S(a)} b) {
return ${S(a)}(${cb(a).map(f=>`${S(f.type)}(${jb(f.type)([`a.${f.name}`,`b.${f.name}`],b,c)})`).join(",")});
}`)}function pb(a,b,c){let e=`sub${S(a)}`;c.add("functions",e,()=>`${S(a)} ${e}(${S(a)} a, ${S(a)} b) {
return ${S(a)}(${cb(a).map(f=>`${S(f.type)}(${qb(f.type)([`a.${f.name}`,`b.${f.name}`],b,c)})`).join(",")});
}`)}function rb(a,b,c){let e=`scalarmult${S(a)}`;c.add("functions",e,()=>`${S(a)} ${e}(float a, ${S(a)} b) {
return ${S(a)}(${cb(a).map(f=>`${S(f.type)}(${sb(f.type)(["a",`b.${f.name}`],b,c)})`).join(",")});
}`)}function tb(a,b,c){bb("multc",b,c);let e=`cscalarmult${S(a)}`;c.add("functions",e,()=>`${S(a)} ${e}(vec2 a, ${S(a)} b) {
return ${S(a)}(${cb(a).map(f=>`${ub(f.type)(["a",`b.${f.name}`],b,c)}`).join(",")});
}`)}function vb(a){if(a===B.i)return P("multc");if(L(a))return c=>U("*")([c[1],c[0]]);let b=Ja(a);if(F(b,B.h))return(c,e,f)=>eb(a,e,f)||`mult${a.length}_${a.parameters.length}(${c.join(",")})`;if(b===B.i)return(c,e,f)=>kb(a,e,f)||`multc${a.length}_${a.parameters.length}(${c.join(",")})`}function gb(a){return(b,c,e)=>mb(a,e)||`dot${2<=a&&4>=a?"":a}(${b.join(",")})`}function lb(a){return(b,c,e)=>nb(a,e)||`cdot${a}(${b.join(",")})`}
function jb(a){return L(a)?U("+"):(b,c,e)=>ob(a,c,e)||`add${S(a)}(${b.join(",")})`}function qb(a){return L(a)?U("-"):(b,c,e)=>pb(a,c,e)||`sub${S(a)}(${b.join(",")})`}function wb(a){return H(a)&&1==E(a)?(b,c,e)=>gb(a.length)([b[0],fb(a.length)(Array(a.length).fill("1."),c,e)],c,e):(b,c,e)=>hb(a,c,e)||`sum${S(a)}(${b.join(",")})`}
function fb(a){if(2<=a&&4>=a)return c=>`vec${a}(${c.join(",")})`;if(1==a)return c=>`float(${c.join(",")})`;let b=0;return(c,e,f)=>db(B.aa(a),f)||`vec${a}(${Ka(a).map(g=>`vec${g}(${Array.from(Array(g).keys()).map(()=>++b&&c[b-1]).join(",")})`).join(",")})`}function $a(a){let b=E(a);return L(a)?c=>`${S(a)}(${c.join(",")})`:1==b&&a.parameters===B.h?fb(a.length):(c,e,f)=>db(a,f)||`${S(a)}(${c.join(",")})`}
function R(a,b){let c=Ja(a);return 1==E(a)&&c===B.h?xb(a.length,b):L(a)?e=>`(${e[0]})[${b}]`:e=>`(${e[0]}).a${b}`}function ib(a,b){return L(a)?()=>`${S(a)}(float(${b}))`:(c,e,f)=>`${$a(a)}(${cb(a).map(g=>ib(g.type,b)(c,e,f)).join(",")})`}
function xb(a,b){return c=>{if(1==a)return c[0];if(2<=a&&4>=a)return`(${c[0]})[${b}]`;a:{var e=b;let f=Ka(a);for(let g in f)if(f[g]<=e)e-=f[g];else{e={first:g,second:e};break a}console.error("Accessing index out of range");e=void 0}return`(${c[0]}).a${e.first}[${e.second}]`}}function sb(a){return L(a)?U("*"):(b,c,e)=>rb(a,c,e)||`scalarmult${S(a)}(${b.join(",")})`}function ub(a){return a===B.i?P("multc"):(b,c,e)=>tb(a,c,e)||`cscalarmult${S(a)}(${b.join(",")})`}
function yb(a,b,c){let e=`reverse${S(a)}`;c.add("functions",e,()=>`${S(a)} ${e}(${S(a)} a){`+`${S(a.parameters)} m;\n`+Array.from(Array(Math.floor(a.length/2)).keys()).map(function(f){let g=R(a,f)(["a",f],b,c);f=R(a,a.length-1-f)(["a",a.length-1-f],b,c);return`m = ${g}; ${g} = ${f}; ${f} = m;`}).join("\n")+"return a;\n }")}function zb(a){return(b,c,e)=>yb(a,c,e)||`reverse${S(a)}(${b.join(",")})`}
function Ab(a,b,c){let e=`max${S(a)}`;c.add("functions",e,()=>`${S(a.parameters)} ${e}(${S(a)} a){`+`${S(a.parameters)} m = ${R(a,a.length-1)(["a",a.length-1],b,c)};\n`+Array.from(Array(a.length-1).keys()).map(function(f){return`m = max(m,${R(a,f)(["a",f],b,c)});`}).join("\n")+"return m;\n }")}function Bb(a){return(b,c,e)=>Ab(a,c,e)||`max${S(a)}(${b.join(",")})`}
function Cb(a,b,c){let e=`min${S(a)}`;c.add("functions",e,()=>`${S(a.parameters)} ${e}(${S(a)} a){`+`${S(a.parameters)} m = ${R(a,a.length-1)(["a",a.length-1],b,c)};\n`+Array.from(Array(a.length-1).keys()).map(function(f){return`m = min(m,${R(a,f)(["a",f],b,c)});`}).join("\n")+"return m;\n }")}function Db(a){return(b,c,e)=>Cb(a,c,e)||`min${S(a)}(${b.join(",")})`}
function Eb(a,b,c){let e=`transpose${S(a)}`,f=G(a.parameters.length,G(a.length,a.parameters.parameters));c.add("functions",e,()=>`${S(f)} ${e}(${S(a)} a){`+"return "+$a(f)(Array.from(Array(f.length).keys()).map(g=>$a(f.parameters)(Array.from(Array(f.parameters.length).keys()).map(k=>R(a.parameters,g)([R(a,k)(["a",k],b,c),g],b,c)),b,c)),b,c)+";}")}function Fb(a){return(b,c,e)=>Eb(a,c,e)||`transpose${S(a)}(${b.join(",")})`};function Gb(a){function b(f,g,k){if(1<g){let l=g/2|0;b(f,l,!k);b(f+l,g-l,k);c(f,g,k)}}function c(f,g,k){if(1<g){var l;for(l=1;l<g;)l<<=1;l>>=1;for(let p=f;p<f+g-l;p++){var m=p,n=p+l;k?e.push([m,n]):e.push([n,m])}c(f,l,k);c(f+l,g-l,k)}}let e=[];b(0,a,!0);return e}
function Hb(a,b,c){let e=`sort${S(a)}`;c.add("functions",e,()=>`${S(a)} ${e}(${S(a)} a){`+`${S(a.parameters)} m;\n`+Gb(a.length).map(function(f){let g=R(a,f[0])(["a",f[0]],b,c);f=R(a,f[1])(["a",f[1]],b,c);return`m = min(${g},${f}); ${f} = max(${g},${f}); ${g} = m;`}).join("\n")+"return a;\n }")}function Ib(a){return(b,c,e)=>Hb(a,c,e)||`sort${S(a)}(${b.join(",")})`};function O(a){return b=>`${y(a)}(${b})`}function U(a){return b=>`(${b.join(a)})`}function V(){return a=>`(${a.reverse().join("*")})`}let Q=a=>a;var W={};W.join=M([[[B.B,B.B],B.line,O("cross")]]);W.meet=M([[[B.line,B.line],B.B,O("cross")]]);W.gauss=M([[[B.i],B.H,Q]]);W.complex=M([[[B.H],B.i,Q],[[B.B],B.i,P("dehomogenize")]]);
W["if"]=a=>{if(!a.every(b=>b))return!1;if(2===a.length)return{s:a,u:a[1],m:b=>`if(${b[0]}) {${b[1]};}`};if(3===a.length){let b=C(a[1],a[2]);return b?{s:[B.C,b,b],u:b,m:c=>`(${c[0]} ? ${c[1]} : ${c[2]})`}:{s:a,u:B.U,m:c=>`if(${c[0]}) {${c[1]};} else {${c[2]};}`}}return!1};W["="]=a=>{a=C(a[0],a[1]);return{s:a,u:a,m:b=>`${b[0]} = ${b[1]};`}};W[";"]=a=>({s:a,u:a[1]!==B.U?a[1]:a[0],m:b=>`${b[0]} ; ${b[1]};`});W.repeat=a=>2!=a.length&&3!=a.length||!Ua(a[0])?!1:{s:a,u:a[a.length-1],m:()=>""};
W.forall=a=>2!=a.length&&3!=a.length||"list"!==J(a[0]).type?!1:{s:a,u:a[a.length-1],m:()=>""};W.apply=a=>2!=a.length&&3!=a.length||"list"!==J(a[0]).type?!1:{s:a,u:G(J(a[0]).length,a[a.length-1]),m:()=>""};W.sum=a=>1==a.length&&(H(a[0])||I(a[0]))?{s:a,u:a[0].parameters,m:wb(a[0])}:!1;W.regional=a=>({s:a,u:B.U,m:()=>""});W.sqrt=M([[[B.h],B.i,P("sqrtf")],[[B.i],B.i,P("sqrtc")]]);W.abs=M([[[B.h],B.h,O("abs")],[[B.i],B.h,O("length")],[[B.H],B.h,O("length")],[[B.K],B.h,O("length")],[[B.P],B.h,O("length")]]);
W.abs_infix=W.abs;W.dist=M([[[B.h,B.h],B.h,a=>O("abs")(U("-")(a))],[[B.i,B.i],B.h,a=>O("length")(U("-")(a))],[[B.H,B.H],B.h,a=>O("length")(U("-")(a))],[[B.K,B.K],B.h,a=>O("length")(U("-")(a))],[[B.P,B.P],B.h,a=>O("length")(U("-")(a))]]);W.dist_infix=W.dist;W.sin=M([[[B.h],B.h,O("sin")],[[B.i],B.i,P("sinc")]]);W.cos=M([[[B.h],B.h,O("cos")],[[B.i],B.i,P("cosc")]]);W.tan=M([[[B.h],B.h,O("tan")],[[B.i],B.i,P("tanc")]]);W.exp=M([[[B.h],B.h,O("exp")],[[B.i],B.i,P("expc")]]);
W.arctan=M([[[B.h],B.h,O("atan")],[[B.i],B.i,P("arctanc")]]);W.arcsin=M([[[B.h],B.i,P("arcsinf")],[[B.i],B.i,P("arcsinc")]]);W.arccos=M([[[B.h],B.i,P("arccosf")],[[B.i],B.i,P("arccosc")]]);W.log=M([[[B.h],B.i,P("logr")],[[B.i],B.i,P("logc")]]);let Jb=[2,3,4].map(a=>G(a,B.h)).concat([2,3,4].map(a=>G(a,G(a,B.h)))),Kb=[B.v,B.h,B.i].concat(Jb);
W.add=a=>{var b=M(Kb.map(c=>[[c,c],c,U("+")]).concat([[[B.B,B.B],B.H,P("addpoints")]]))(a);if(b)return b;b=a[0];a=a[1];if([b,a].every(c=>H(c)||I(c))&&Va(b,a))return a=C(K(b),K(a)),{s:[a,a],u:a,m:jb(a)}};W.sub=a=>{var b=M(Kb.map(c=>[[c,c],c,U("-")]).concat(Kb.map(c=>[[B.U,c],c,U("-")])).concat([[[B.B,B.B],B.H,P("subpoints")]]))(a);if(b)return b;b=a[0];a=a[1];if([b,a].every(c=>H(c)||I(c))&&Va(b,a))return a=C(K(b),K(a)),{s:[a,a],u:a,m:qb(a)}};W["+"]=W.add;W["-"]=W.sub;
W._=a=>{let b=J(a[0]);if(b===B.B||b===B.line)b=B.K;if("list"===b.type&&Ua(a[1])){let c=Number(a[1].value.value.real);return 1<=Math.abs(c)&&Math.abs(c)<=b.length?(0<c&&--c,0>c&&(c=b.length+c),{s:a,u:b.parameters,m:R(b,c)}):{s:a,u:b.parameters,m:()=>console.error(`try to access ${c}-th Element of ${b.length}-list ${JSON.stringify(a[0])}`)}}return!1};
W.mult=a=>{var b=M([[[B.v,B.v],B.v,U("*")],[[B.h,B.h],B.h,U("*")],[[B.i,B.h],B.i,U("*")],[[B.h,B.i],B.i,U("*")],[[B.i,B.i],B.i,P("multc")],[[B.Y,B.Y],B.Y,V()],[[B.Z,B.Z],B.Z,V()],[[B.$,B.$],B.$,V()],[[B.Y,B.H],B.H,V()],[[B.Z,B.K],B.K,V()],[[B.$,B.P],B.P,V()],[[B.H,B.Y],B.H,V()],[[B.K,B.Z],B.K,V()],[[B.P,B.$],B.P,V()]])(a);if(b)return b;if(2!==a.length)return!1;b=a[0];let c=a[1];if([b,c].every(e=>"list"===e.type&&F(e.parameters,B.h))&&b.length===c.length)return a=K(b),L(a)?{s:[a,a],u:B.h,m:O("dot")}:
{s:[a,a],u:B.h,m:gb(b.length)};if([b,c].every(e=>"list"===e.type&&F(e.parameters,B.i))&&b.length===c.length)return a=Wa(b),{s:[a,a],u:B.i,m:lb(b.length)};if(H(b)&&2===E(b)&&H(c)&&1===E(c)&&b.parameters.length===c.length)return{s:[K(b),K(c)],u:B.aa(b.length),m:vb(K(b))};if(I(b)&&2===E(b)&&I(c)&&1===E(c)&&b.parameters.length===c.length)return{s:[Wa(b),Wa(c)],u:B.ba(b.length),m:vb(Wa(b))};for(let e=0;2>e;e++){if(F(a[0^e],B.h)&&(H(a[1^e])||I(a[1^e]))){let f=K(a[1^e]);return{s:e?[f,B.h]:[B.h,f],u:f,m:(g,
k,l)=>sb(f)([g[0^e],g[1^e]],k,l)}}if(F(a[0^e],B.i)&&I(a[1^e])){let f=Wa(a[1^e]);return{s:e?[f,B.i]:[B.i,f],u:f,m:(g,k,l)=>ub(f)([g[0^e],g[1^e]],k,l)}}}};W["*"]=W.mult;W.div=a=>{let b=M([[[B.h,B.h],B.h,U("/")],[[B.h,B.i],B.i,P("divfc")],[[B.i,B.h],B.i,U("/")],[[B.i,B.i],B.i,P("divc")]])(a);return b?b:F(a[1],B.h)&&I(a[0])&&(a=K(a[0]),L(a))?{s:[a,B.h],u:a,m:U("/")}:!1};W["/"]=W.div;W.re=M([[[B.i],B.h,P("realc")]]);W.im=M([[[B.i],B.h,P("imagc")]]);
W.floor=M([[[B.h],B.v,a=>`int(floor(${a}))`],[[B.i],B.i,O("floor")]]);W.round=M([[[B.h],B.v,a=>`int(floor(${a}+.5))`],[[B.i],B.i,a=>`floor(${a}+vec2(.5))`]]);W.ceil=M([[[B.h],B.v,a=>`int(ceil(${a}))`],[[B.i],B.i,O("ceil")]]);W.mod=M([[[B.v,B.v],B.v,(a,b)=>`int(${O("mod")("float("+a[0]+"), float("+a[1]+")",b)})`],[[B.h,B.h],B.h,O("mod")],[[B.i,B.i],B.i,P("mod")]]);
W.random=M([[[],B.h,P("random")],[[B.h],B.h,(a,b,c)=>`${P("random")([],b,c)}*${a[0]}`],[[B.i],B.i,(a,b,c)=>`vec2(${P("random")([],b,c)},${P("random")([],b,c)})*${a[0]}`]]);W.randomint=M([[[B.v],B.v,(a,b,c)=>`int(floor(${P("random")([],b,c)}*float(${a[0]})))`],[[B.h],B.v,(a,b,c)=>`int(floor(${P("random")([],b,c)}*floor(${a[0]})))`]]);W.randominteger=W.randomint;W.randombool=M([[[],B.C,(a,b,c)=>`(${P("random")([],b,c)}>.5)`]]);W.randomnormal=M([[[],B.h,P("randomnormal")]]);
W.arctan2=M([[[B.h,B.h],B.h,a=>`atan(${a[1]}, ${a[0]})`],[[B.i,B.i],B.i,P("arctan2c")],[[B.i],B.h,P("arctan2vec2")],[[B.H],B.h,P("arctan2vec2")],[[B.ba(2)],B.i,P("arctan2cvec2")]]);["red","green","blue","gray","hue"].forEach(a=>{W[a]=M([[[B.h],B.K,P(a)]])});W.grey=W.gray;W.min=a=>{let b=M([[[B.h,B.h],B.h,O("min")]])(a);if(b)return b;if(1===a.length&&1===E(a[0])&&H(a[0]))return{s:a,u:a[0].parameters,m:Db(a[0])}};
W.max=a=>{let b=M([[[B.v,B.v],B.v,O("max")],[[B.h,B.h],B.h,O("max")]])(a);if(b)return b;if(1===a.length&&1===E(a[0])&&H(a[0]))return{s:a,u:a[0].parameters,m:Bb(a[0])}};let Lb=(a,b)=>{if(!(1>=a))if(2==a)b.add("functions","raise2",()=>"float raise2(float a) { return a*a; }");else{Lb(2,b);let c=(f,g)=>1==g?f:g&1?c(f,g-1)+"*a":`raise2(${c(f,g/2)})`,e=`raise${a}`;b.add("functions",e,()=>`float ${e}(float a) { return ${c("a",a)};}`)}},Mb=a=>(b,c,e)=>0==a?"1.":1==a?b[0]:Lb(a,e)||`raise${a}(${b[0]})`;
W.pow=a=>{if(Ua(a[1])&&F(a[0],B.h)){let b=Number(a[1].value.value.real);if(0<=b)return{s:[B.h,a[1]],u:B.h,m:Mb(b)}}return M([[[B.h,B.v],B.h,P("powi")],[[B.i,B.i],B.i,P("powc")]])(a)};W["^"]=W.pow;W.re=M([[[B.i],B.h,a=>`(${a}).x`]]);W.conjugate=M([[[B.i],B.i,P("conjugate")]]);W.im=M([[[B.i],B.h,a=>`(${a}).y`]]);W.genList=a=>{let b=a.length;if(0<b){let c=!1;for(let e in a)c=C(c,a[e]);if(c)return a=G(b,c),{s:Array(b).fill(c),u:a,m:$a(a)}}return!1};W["&"]=M([[[B.C,B.C],B.C,U("&&")]]);
W["%"]=M([[[B.C,B.C],B.C,U("||")]]);"> < >= <= == !=".split(" ").forEach(a=>{W[a]=M([[[B.v,B.v],B.C,U(a)],[[B.h,B.h],B.C,U(a)]])});W["!"]=M([[[B.C],B.C,O("!")],[[B.U,B.C],B.C,a=>O("!")([a[1]])]]);W.not=W["!"];W.imagergb=M([[[B.image,B.L],B.K,Nb],[[B.L,B.L,B.image,B.L],B.K,Ob]]);W.imagergba=M([[[B.image,B.L],B.P,Pb],[[B.L,B.L,B.image,B.L],B.P,Qb]]);W.reverse=a=>1===a.length&&"list"===a[0].type?{s:a,u:a[0],m:zb(a[0])}:!1;W.sort=a=>1===a.length&&1===E(a[0])&&H(a[0])?{s:a,u:a[0],m:Ib(a[0])}:!1;
W.transpose=a=>1===a.length&&2<=E(a[0])?{s:a,u:G(a[0].parameters.length,G(a[0].length,a[0].parameters.parameters)),m:Fb(a[0])}:!1;W.det=M([[[B.Y],B.h,P("det2")],[[B.Z],B.h,P("det3")],[[B.$],B.h,P("det4")],[[B.B,B.B,B.B],B.h,P("det3v")]]);Object.freeze(W);T.powc=["expc","multc","logc"];T.sqrtc=["expc","multc","logc"];T.arccosc=["multc","negc","sqrtc","addc","logc"];T.arcsinc=["multc","negc","sqrtc","addc","logc"];T.tanc=["sinc","cosc","divc"];T.arctanc=["logc","addc","multc","subc"];
T.arctan2c=["logc","divc","sqrtc","multc"];T.arctan2vec2c=["arctan2c"];T.hue=["hsv2rgb"];T.randomnormal=["random"];T.subpoints=["dehomogenize"];T.addpoints=["dehomogenize"];Object.freeze(T);function Ga(a){this.j={};this.G={};this.l={};this.S=0;this.D={};this.F=a;this.O={}}Ga.prototype.add=function(a,b,c){this.mark(a,b);this.l[a].ga[b]||(this.l[a].ga[b]=c(),this.l[a].ea[b]=!0,this.l[a].order.push(b))};Ga.prototype.mark=function(a,b){this.l[a]||(this.l[a]={order:[],ea:{},ga:{}});let c=this.l[a].ea[b]||!1;this.l[a].ea[b]=!0;return c};function Rb(a,b){return a.l[b]?a.l[b].order.map(c=>a.l[b].ga[c]).join("\n"):"\n"}
function X(a,b,c,e){if(Ya(c,e))return b;if(F(c,e)){if("constant"===c.type)return ab(c.value,e);let f=Za(e)([c]);if(!f)return console.error(`cannot find an implementation for ${D(c)} -> ${D(e)}, using identity`),b;e=f.m;return e(X(a,b,c,f.s[0]),{},a)}console.error(`${D(c)} is no subtype of ${D(e)} (trying to cast the term ${b})`);return b}function Y(a,b,c){a.j[b]||(a.j[b]={});a.j[b].T||(a.j[b].T=[]);a.j[b].A||(a.j[b].A=!1);a.hasOwnProperty("global")||(a.j[b].global=c)}
function Sb(a,b){var c=b.J;if(b.isuniform)return a.G[b.uvariable].type;if("variable"===b.ctype)return b=b.name,b=c[b]||b,a.j[b].A;if("function"===b.ctype&&a.D.hasOwnProperty(b.oper))return a.j[c[b.oper]].A;if("number"===b.ctype)return La(b);if("void"===b.ctype)return B.U;if("field"===b.ctype){a=J(Z(a,b.obj));if(1==b.key.length){if("list"===a.type)return a.parameters;if(F(a,B.B))return B.h}else if("xy"==b.key&&F(a,B.B))return B.H;if(!a)return!1}else{if("string"===b.ctype)return B.image;if("function"===
b.ctype||"infix"===b.ctype){c=Array(b.args.length);var e=!0;for(let f=0;f<b.args.length;f++)c[f]=Z(a,b.args[f]),e&="constant"===c[f].type;if(e&&b.impl)return b={ctype:b.ctype,oper:b.oper,impl:b.impl,args:c.map(f=>f.value)},b=a.F.evaluateAndVal(b),La(b);a=y(b.oper);e=W[a]?W[a](c):!1;if(!e&&c.every(f=>Ja(f)))throw console.error(`Could not find an implementation for ${a} with args (${c.map(D).join(", ")})`),console.log(b),"error";return e?e.u:!1}}console.error("Don't know how to compute type of");console.log(b);
return!1}function Z(a,b){if(!b.la||!b.S||a.S>b.S)b.la=Sb(a,b),b.S=a.S;return b.la}
function Tb(a,b,c){function e(m,n,p){let t={};for(let w in m)t[w]=m[w];m=na();Y(l,m,!1);g[m].A=p;g[m].ma=!0;t[n]=m;return t}function f(m,n,p,t){m.J=n;for(var w in m.args){var z=t||"repeat$2"===m.oper&&0==w||"repeat$3"===m.oper&&0==w||"_"===m.oper&&1==w;let Qa=n;-1!==["repeat","forall","apply"].indexOf(y(m.oper))&&(1==w?Qa="repeat$2"===m.oper?e(n,"#",B.v):"repeat$3"===m.oper?e(n,m.args[1].name,B.v):"forall$2"===m.oper||"apply$2"===m.oper?e(n,"#",!1):"forall$3"===m.oper||"apply$3"===m.oper?e(n,m.args[1].name,
!1):n:2==w&&(Qa=m.args[1].J));f(m.args[w],Qa,p,z)}"field"===m.ctype&&f(m.obj,n,p,t);"variable"===m.ctype&&(w=m.name,w=n[w]||w,t&&l.j[w]&&(l.j[w].W=!0));if("="===m.oper)t=m.args[0].name,t=n[t]||t,Y(l,t,!0),g[t].T.push(m.args[1]);else if(m.oper&&"regional"===y(m.oper)&&"global"!=p)for(var N in m.args){t=m.args[N].name;var pa=na();n[t]=pa;k[p].j||(k[p].j=[]);k[p].j.push(pa);Y(l,pa,!1)}else if("forall$2"===m.oper||"apply$2"===m.oper||"forall$3"===m.oper||"apply$3"===m.oper)g[2===m.args.length?m.args[1].J["#"]:
m.args[2].J[m.args[1].name]].T.push({ctype:"infix",oper:"_",args:[m.args[0],{ctype:"number",value:{real:1,imag:0}}],J:m.args[0].J});else if("function"===m.ctype&&k.hasOwnProperty(m.oper)){p=m.oper;N=p.replace("$","_");Y(l,N,!1);n[p]=N;n={};for(pa in k[p].arglist)w=k[p].arglist[pa].name,z=N+"_"+w,n[w]=z,Y(l,z,!1),g[z].T.push(m.args[pa]);k[p].oa||(k[p].oa=!0,f(k[p].body,n,p,t),g[N].T.push(k[p].body))}}let g=a.j,k=a.D;var l=a;f(b,c,"global",!1)}
function Ub(a,b){function c(n){if(n.hasOwnProperty("dependsOnPixel"))return n.dependsOnPixel;if("variable"===n.ctype){var p=n.name;p=n.J[p]||p;return k[p]?n.dependsOnPixel=!0:n.dependsOnPixel=!1}p="random randomint randominteger randombool randomnormal verbatimglsl".split(" ");if("function"===n.ctype&&-1!==p.indexOf(y(n.oper)))return n.dependsOnPixel=!0;if("repeat$2"===n.oper||"forall$2"===n.oper||"apply$2"===n.oper)return c(n.args[1])?(k[n.args[1].J["#"]]=!0,n.dependsOnPixel=!0):n.dependsOnPixel=
!1;if("repeat$3"===n.oper||"forall$3"===n.oper||"apply$3"===n.oper)return c(n.args[2])?(k[n.args[2].J[n.args[1].name]]=!0,n.args[1].dependsOnPixel=!0,n.dependsOnPixel=!0):n.dependsOnPixel=!1;for(let t in n.args)if(c(n.args[t]))return n.dependsOnPixel=!0;return"function"===n.ctype&&g.hasOwnProperty(n.oper)&&c(g[n.oper].body)?n.dependsOnPixel=!0:"field"===n.ctype?n.dependsOnPixel=c(n.obj):n.dependsOnPixel=!1}function e(n,p){if(c(n)){for(var t in n.args)e(n.args[t],p||"repeat$2"===n.oper&&0==t||"repeat$3"===
n.oper&&0==t||"_"===n.oper&&1==t);"field"===n.ctype&&e(n.obj,p);"function"===n.ctype&&g.hasOwnProperty(n.oper)&&(n=n.oper,l.hasOwnProperty(n)||(l[n]=!0,e(g[n].body,p)))}else if("boolean"!==n.ctype&&"number"!==n.ctype&&"void"!==n.ctype){".."===n.oper&&(p=!0);t=!1;for(let z in m)if(!t&&la(n,m[z].V)){t=!0;var w=z}t||(w=na(),m[w]={V:n,type:!1,W:p});m[w].W=m[w].W||p;n.isuniform=!0;n.uvariable=w}}let f=a.j,g=a.D;var k={cgl_pixel:!0,"cgl_pixel.x":!0,"cgl_pixel.y":!0};for(let n in f)if(1<=f[n].T.length||
f[n].ma)k[n]=!0;c(b);let l={"":!0},m=a.G;e(b,!1)}function Vb(a,b){if("function"===b.ctype&&!a.D.hasOwnProperty(b.oper)&&null!==a.F.getMyfunction(b.oper)){let c=b.oper;a.D[c]=ka(a.F.getMyfunction(c));Vb(a,a.D[c].body)}for(let c in b.args)Vb(a,b.args[c])}
function Wb(a,b){function c(k){let l={};for(let m in k)l[m]=k[m];return l}function e(k,l){"repeat$2"===k.oper||"forall$2"===k.oper||"apply$2"===k.oper?(l=c(l),l["#"]=!0):"repeat$3"===k.oper||"forall$3"===k.oper||"apply$3"===k.oper?(l=c(l),l[k.args[1].name]=!0):"="===k.oper&&(l[k.args[0].name]=!0);for(let m in k.args)e(k.args[m],l);"field"===k.ctype&&e(k.obj,l);"variable"===k.ctype&&(k=k.name,l[k]||(g[k]=!0))}let f={},g={};e(b,{});Y(a,"cgl_pixel",!1);a.j.cgl_pixel.A=B.H;if(1==Object.keys(g).length)f[Object.keys(g)[0]]=
"cgl_pixel";else if(g["#"])f["#"]="cgl_pixel";else if(g.x&&g.y)Y(a,"cgl_pixel.x",!1),a.j["cgl_pixel.x"].A=B.h,f.x="cgl_pixel.x",Y(a,"cgl_pixel.y",!1),a.j["cgl_pixel.y"].A=B.h,f.y="cgl_pixel.y";else{b=[];for(let k in g)a.F.nada==a.F.evaluateAndVal({ctype:"variable",name:k})&&b.push(k);1==b.length?f[b[0]]="cgl_pixel":g.p?f.p="cgl_pixel":g.z&&(f.z="cgl_pixel")}"cgl_pixel"===f.z&&(a.j.cgl_pixel.A=B.i);return f}
Ga.prototype.compile=function(a,b){var c=this,e=Z(this,a);if(a.isuniform)return a=a.uvariable,b?{code:"",o:"constant"===e.type?ab(e.value,J(e)):a}:{code:""};if(";"===a.oper){e={o:""};var f="",g=a.args.length-1;for(var k=g;0<=k;k--)"void"===a.args[k].ctype&&(g=k-1);for(k=0;k<=g;k++)e=this.compile(a.args[k],b&&k===g),f+=e.code;return b?{code:f,o:e.o}:{code:f}}if("constant"===e.type)return b?{o:ab(e.value,J(e)),code:""}:{code:""};if("="===a.oper)return e=this.compile(a.args[1],!0),a=`${this.compile(a.args[0],
!0).o} = ${X(this,e.o,Z(this,a.args[1]),Z(this,a.args[0]))}`,b?{code:e.code,o:a}:{code:`${e.code+a};\n`};if("repeat$2"===a.oper||"repeat$3"===a.oper){f=this.compile(a.args[0],!0);if("constant"!==Z(this,a.args[0]).type)return console.error("repeat possible only for fixed constant number in GLSL"),!1;e="repeat$2"===a.oper?a.args[1].J["#"]:a.args[2].J[a.args[1].name];f=Number(f.o);g="";if("constant"===this.j[e].A.type)for(k=1;k<=f;k++){this.j[e].A=Ta(k);this.S++;var l=this.compile(a.args["repeat$2"===
a.oper?1:2],k===f&&b);g+=l.code;if(k===f&&b)return{code:g,o:l.o}}else if(k="",l=this.compile(a.args["repeat$2"===a.oper?1:2],b),a=Z(this,a.args["repeat$2"===a.oper?1:2]),b&&(k=na(),this.j[k]||(Y(this,k,!0),this.j[k].A=a)),g=g+`for(int ${e}=1; ${e} <= ${f}; ${e}++) {\n`+l.code,b&&(g+=`${k} = ${l.o};\n`),g+="}\n",b)return{code:g,o:k};return{code:g}}if("forall$2"===a.oper||"forall$3"===a.oper||"apply$2"===a.oper||"apply$3"===a.oper){var m=Z(this,a.args[0]);if("list"!==m.type&&("constant"!==m.type||"list"!==
m.value.ctype))return console.error(`${a.oper} only possible for lists`),!1;f=m.length||m.value.value.length;k=2===a.args.length?a.args[1].J["#"]:a.args[2].J[a.args[1].name];var n=this.j[k].A,p=l="";b&&(p=na(),l+=`${S(e)} ${p};\n`);"list"===e.type&&db(e,this);if("constant"===this.j[k].A.type||"constant"===m.type)for(m=this.F.evaluateAndVal(a.args[0]),n=0;n<f;n++)this.j[k].A=La(m.value[n]),this.S++,g=this.compile(a.args[2===a.args.length?1:2],b),l+=g.code,"forall$2"===a.oper||"forall$3"===a.oper?n+
1===f&&b&&(l+=`${p} = ${g.o};\n`):b&&(l+=`${R(e,n)([p],[],this)} = ${g.o};\n`);else{g=this.compile(a.args[2===a.args.length?1:2],b);var t=this.compile(a.args[0],!0);l+=t.code;let w=t.o;!this.j[w]&&!this.G[w]&&2<=m.length&&(w=na(),l+=`${S(m)} ${w} = ${t.o};\n`);this.j[k].global=!0;for(t=0;t<f;t++)l+=`${k} = ${R(m,t)([w],[],this)};\n`,l+=g.code,b&&("forall$2"===a.oper||"forall$3"===a.oper?t===f-1&&(l+=`${p} = ${g.o};\n`):l+=`${R(e,t)([p],[],this)} = ${g.o};\n`);"list"===n.type&&db(n,this)}return b?
{code:l,o:p}:{code:l}}if("if$2"===a.oper||"if$3"===a.oper){l=this.compile(a.args[0],!0);f=Z(this,a.args[0]);k=g="";p=this.compile(a.args[1],b);b&&(k=na(),this.j[k]||(Y(this,k,!0),this.j[k].A=e));"constant"!=f.type&&(g+=l.code,g+=`if(${l.o}) {\n`);if("constant"!=f.type||"constant"==f.type&&f.value.value)g+=p.code,b&&(g+=`${k} = ${X(this,p.o,Z(this,a.args[1]),e)};\n`);"if$3"===a.oper&&(l=this.compile(a.args[2],b),"constant"!=f.type&&(g+="} else {\n"),"constant"!=f.type||"constant"==f.type&&!f.value.value)&&
(g+=l.code,b&&(g+=`${k} = ${X(this,l.o,Z(this,a.args[2]),e)};\n`));"constant"!=f.type&&(g+="}\n");return b?{code:g,o:k}:{code:g}}if("function"===a.ctype||"infix"===a.ctype){l=a.oper;if("verbatimglsl"===y(l))return a=this.F.evaluateAndVal(a.args[0]).value,b?{o:a,code:""}:{code:a};e=a.args.map(w=>c.compile(w,!0));f=a.args.map(w=>Z(c,w));if(this.D.hasOwnProperty(l))for(k=Xb(this,l),g=Array(e.length),p=0;p<e.length;p++)g[p]=this.j[this.D[l].body.J[this.D[l].arglist[p].name]].A;else{l=y(l);if("regional"===
l)return b?{o:"",code:""}:{code:""};k=W[l](f);if(!k)return console.error(`Could not find an implementation for ${l}(${f.map(D).join(", ")}).\nReturning empty code`),b?{o:"",code:""}:{code:""};g=k.s;k=k.m}l="";p=Array(e.length);for(m=0;m<e.length;m++)l+=e[m].code,p[m]=X(this,e[m].o,f[m],g[m]);a=k(p,a.modifs,this);return b?{o:a,code:l}:{code:`${l+a};\n`}}if("variable"===a.ctype)return e=a.name,e=a.J[e]||e,b?{o:e,code:""}:{code:`${e};\n`};if("void"===a.ctype)return b?{o:"",code:""}:{code:""};if("field"===
a.ctype&&(e=Z(this,a.obj),k={x:0,y:1,z:2,r:0,g:1,b:2,a:3}[a.key],f=!1,g=c.compile(a.obj,!0).o,void 0!=k&&"list"===e.type?f=R(e,k)([g],null,this):"xy"===a.key&&"list"===e.type?(2===e.length&&(f=g),3===e.length&&(f=P("dehomogenize")([X(c,g,e,B.B)],null,this))):e===B.B&&(k={xy:"dehomogenize",x:"dehomogenizex",y:"dehomogenizey"},k[a.key]&&(f=P(k[a.key])([X(c,g,e,B.B)],null,this))),f))return b?{o:f,code:""}:{code:`${f};\n`};console.error(`dont know how to this.compile ${JSON.stringify(a)}`)};
function Xb(a,b){Yb(a,b,a.D[b].arglist.length);return O(b.replace("$","_"))}
function Yb(a,b,c){if(!a.mark("compiledfunctions",b)){var e=a.D[b],f=b.replace("$","_"),g=e.body.J,k=Array(c);for(let n=0;n<c;n++)k[n]=e.arglist[n].name;c=a.j[f].A===B.U;var l=`${S(a.j[f].A)} ${f}(${k.map(n=>S(a.j[g[n]].A)+" "+g[n]).join(", ")}){\n`;for(var m in e.j)k=e.j[m],l+=`${S(a.j[k].A)} ${k};\n`;m=a.compile(e.body,!c);e=Z(a,e.body);l+=m.code;c||(l+=`return ${X(a,m.o,e,a.j[f].A)};\n`);l+="}\n";a.add("compiledfunctions",b,()=>l)}}
function Fa(a,b){ma=0;var c=b=ka(b);Vb(a,c);Tb(a,c,Wb(a,c));Ub(a,c);for(var e in a.G){c=a.F.evaluateAndVal(a.G[e].V);if(!c.ctype||"undefined"===c.ctype){console.error("can not evaluate:");console.log(a.G[e].V);break}a.G[e].type=a.G[e].W?La(c):A(c)}e=!0;for(var f in a.j)a.j[f].A=a.j[f].A||!1,a.j[f].W&&(a.j[f].A=Ta(1),a.S++);for(;e;){e=!1;for(var g in a.j)if(!a.j[g].W)for(var k in a.j[g].T)c=J(Z(a,a.j[g].T[k])),f=a.j[g].A||!1,c&&(c=f?F(c,f)?f:C(f,c):c)&&c!==f&&(a.j[g].A=c,a.S++,e=!0)}for(var l in a.G)"list"===
a.G[l].type.type&&db(a.G[l].type,a);for(let p in a.j)"list"===a.j[p].A.type&&db(a.j[p].A,a);g=a.compile(b,!0);k=Z(a,b);b=X(a,g.o,k,B.color);F(k,B.color)||console.error("expression does not generate a color");k=Rb(a,"structs");k+=Rb(a,"uniforms");l=[];for(var m in a.G)"constant"!=a.G[m].type.type&&a.G[m].type!=B.image&&l.push(`uniform ${S(a.G[m].type)} ${m};`);k+=l.join("\n");m="";for(var n in a.O)m+=`${a.O[n].code}\n`;k+=m;k+=Rb(a,"includedfunctions");k+=Rb(a,"functions");for(let p in a.j)a.j[p].A&&
a.j[p].global&&(k+=`${S(a.j[p].A)} ${p};\n`);k+=Rb(a,"compiledfunctions");k+=`void main(void) {\n${g.code}gl_FragColor = ${b};\n}\n`;console.log(k);n={};if(a.l.compiledfunctions)for(let p in a.l.compiledfunctions.ea)n[p]=a.F.getMyfunction(p).generation;return{code:k,G:a.G,O:a.O,ca:n}};function Zb(a,b,c,e){this.V=b;this.F=e;this.D=c;$b(this);b=this.l;this.name=a;this.code=`uniform sampler2D _sampler${a};
uniform float _ratio${a};
uniform vec2 _cropfact${a};
vec4 _imagergba${a}(vec2 A, vec2 B, vec2 p) {
p -= A; B -= A;
float b = dot(B,B);
p = vec2(dot(p,B),_ratio${a}*dot(p,vec2(-B.y,B.x)))/b;
${b.repeat?"p = mod(p, vec2(1.));":""}
${b.repeat&&b.mipmap?`vec4 color = vec4(0.);
float totalWeight = 0.;
for(int dx=0; dx<2; dx++) for(int dy=0; dy<2; dy++) {
vec2 delta = .5*vec2(dx, dy);
vec2 center = delta+vec2(.5);
vec2 tc = fract(p-delta)+delta;
float dst = dot(abs(tc-center),vec2(1.));
float w = max(.5-dst,0.);
w=w*w;
color += w * texture2D(_sampler${a}, tc*_cropfact${a});
totalWeight += w;
}
return color/totalWeight;`:b.repeat?`return texture2D(_sampler${a}, p*_cropfact${a});`:`if(0. <= p.x && p.x <= 1. && 0. <= p.y && p.y <= 1.)
return texture2D(_sampler${a}, p*_cropfact${a});
else
return vec4(0.);`}
}`}function $b(a){var b=a.D;let c=a.F;b={interpolate:b.hasOwnProperty("interpolate")?c.evaluateAndVal(b.interpolate).value:!0,mipmap:b.hasOwnProperty("mipmap")?c.evaluateAndVal(b.mipmap).value:!1,repeat:b.hasOwnProperty("repeat")?c.evaluateAndVal(b.repeat).value:!1};!a.l||a.l.mipmap==b.mipmap&&a.l.repeat==b.repeat||(console.log("enfore recompilation because texture modifiers changed."),fa++);a.l=b}
function Na(a){let b=a.F.evaluateAndVal(a.V).value,c="string"===typeof b?a.F.getImage(b,!0):b;if(null==c)return console.error(`Could not find image ${b}.`),u;$b(a);return za(c,a.F,a.l)}function ac(a,b,c){c.O.hasOwnProperty(a)||(c.O[a]=new Zb(a,c.G[a].V,b,c.F));return a}function Qb(a,b,c){return["_imagergba",ac(a[2],b,c),"(",a[0],",",a[1],",",a[3],")"].join("")}function Ob(a,b,c){return["(_imagergba",ac(a[2],b,c),"(",a[0],",",a[1],",",a[3],").rgb)"].join("")}
function Pb(a,b,c){c.add("uniforms","corners",()=>"uniform vec2 _lowerleft, _lowerright;");return["_imagergba",ac(a[0],b,c),"(_lowerleft, _lowerright, ",a[1],")"].join("")}function Nb(a,b,c){c.add("uniforms","corners",()=>"uniform vec2 _lowerleft, _lowerright;");return["(_imagergba",ac(a[0],b,c),"(_lowerleft, _lowerright, ",a[1],").rgb)"].join("")};let Pa={};function bc(a){return"list"!==a.ctype?(console.log("argument is not a list"),null):a.value}function Sa(a){var b=[.5,.5,.5];if("number"===a.ctype){let c=cc(a);if(!isNaN(c))return[c,c,c]}a=bc(a);return null===a?b:3!=a.length?(console.log("Not an RGB color vector"),b):a.map(c=>cc(c))}function dc(a,b=Number.NaN){if("number"!==a.ctype)return console.log("argument is not a number"),b;a=a.value;b=a.real;0!==a.imag&&console.log("complex number is not real");return b}
function Ra(a){var b=Number.NaN;if("number"!==a.ctype)return console.log("argument is not a number"),b;b=a.value;a=b.real;b=b.imag;0!==b&&console.log("complex number is not real");b=Math.round(a);b!==a&&console.log("number is not an integer");return b}function cc(a){a=dc(a,Number.NaN);return 0>a?0:1<a?1:a}Pa.toString=function(a,b=null){if("string"===a.ctype)return a.value;console.log("argument is not a string");return b};function ia(a){this.message=a}ia.prototype.toString=function(){return this.message};
function Ca(a,b){var c=r;this.handle=c.createProgram();c.l&&(a="#version 300 es\n"+a.replace(/attribute/g,"in").replace(/varying/g,"out"),b="#version 300 es\n"+b.replace(/varying/g,"in").replace(/gl_FragColor/g,"FragColor").replace(/texture2D/g,"texture").replace(/precision highp float;/g,"precision highp float;\n#define webgl2 true\nout vec4 FragColor;"));ec(this,c,c.VERTEX_SHADER,a);ec(this,c,c.FRAGMENT_SHADER,b);a=this.handle;c.linkProgram(a);if(!c.getProgramParameter(a,c.LINK_STATUS))throw new ia("Error linking shader:\n"+
c.getProgramInfoLog(a));c.validateProgram(a);if(!c.getProgramParameter(a,c.VALIDATE_STATUS))throw new ia("Error validating shader:\n"+c.getProgramInfoLog(a));let e=this.handle,f,g;var k;let l={},m;let n;b=c.getProgramParameter(e,c.ACTIVE_UNIFORMS);for(a=0;a<b;++a)if(f=c.getActiveUniform(e,a),null!==f&&(g=f.name.replace(/\]/g,""))){for(m=l;null!==(k=/[.\[]/.exec(g));){var p=g.substr(0,k.index);m.hasOwnProperty(p)?m=m[p]:"."===k[0]?m=m[p]={}:m=m[p]=[];g=g.substr(k.index+1)}if(1<f.size){k=f.size;n=Array(k);
for(p=0;p<k;++p){var t=f.name+"["+p+"]";t=fc(this,c,t,f);n[p]=t}m[g]=n}else t=fc(this,c,f.name,f),m[g]=t}this.uniform=l}function ec(a,b,c,e){c=b.createShader(c);b.shaderSource(c,e);b.compileShader(c);if(!b.getShaderParameter(c,b.COMPILE_STATUS))throw console.warn(e.split("\n")),new ia("Error compiling shader:\n"+b.getShaderInfoLog(c));b.attachShader(a.handle,c)}Ca.prototype.use=function(a){a.useProgram(this.handle);return this};
function fc(a,b,c,e){a=b.getUniformLocation(a.handle,c);switch(e.type){case b.FLOAT:return b.uniform1fv.bind(b,a);case b.FLOAT_VEC2:return b.uniform2fv.bind(b,a);case b.FLOAT_VEC3:return b.uniform3fv.bind(b,a);case b.FLOAT_VEC4:return b.uniform4fv.bind(b,a);case b.BOOL:case b.INT:case b.SAMPLER_2D:case b.SAMPLER_CUBE:return b.uniform1iv.bind(b,a);case b.BOOL_VEC2:case b.INT_VEC2:return b.uniform2iv.bind(b,a);case b.BOOL_VEC3:case b.INT_VEC3:return b.uniform3iv.bind(b,a);case b.BOOL_VEC4:case b.INT_VEC4:return b.uniform4iv.bind(b,
a);case b.FLOAT_MAT2:return b.uniformMatrix2fv.bind(b,a,!1);case b.FLOAT_MAT3:return b.uniformMatrix3fv.bind(b,a,!1);case b.FLOAT_MAT4:return b.uniformMatrix4fv.bind(b,a,!1);default:throw new ia("Unknown data type for uniform "+c);}};
}).call(this);//# sourceMappingURL=CindyGL.js.map