=this.size[1]||!this.properties.show||!this._video||(c.save(),c.drawImage(this._video,0,0,this.size[0],this.size[1]),c.restore())};D.prototype.onGetOutputs=function(){return[["width","number"],["height","number"],["stream_ready",e.EVENT],["stream_closed",e.EVENT],["stream_error",e.EVENT]]};e.registerNodeType("graphics/webcam",D)})(this);
(function(y){function c(){this.addOutput("tex","Texture");this.addOutput("name","string");this.properties={name:"",filter:!0};this.size=[c.image_preview_size,c.image_preview_size]}function k(){this.addInput("Texture","Texture");this.properties={flipY:!1};this.size=[c.image_preview_size,c.image_preview_size]}function t(){this.addInput("Texture","Texture");this.addOutput("tex","Texture");this.addOutput("name","string");this.properties={name:"",generate_mipmaps:!1}}function r(){this.addInput("Texture",
"Texture");this.addInput("TextureB","Texture");this.addInput("value","number");this.addOutput("Texture","Texture");this.help="pixelcode must be vec3, uvcode must be vec2, is optional
\t\tuv: tex. coords
color: texture colorB: textureB
time: scene time value: input value
For multiline you must type: result = ...
";this.properties={value:1,pixelcode:"color + colorB * value",uvcode:"",precision:c.DEFAULT};
this.has_error=!1}function w(){this.addOutput("out","Texture");this.properties={code:"",u_value:1,u_color:[1,1,1,1],width:512,height:512,precision:c.DEFAULT};this.properties.code=w.pixel_shader;this._uniforms={u_value:1,u_color:vec4.create(),in_texture:0,texSize:vec4.create(),time:0}}function g(){this.addInput("in","Texture");this.addInput("scale","vec2");this.addInput("offset","vec2");this.addOutput("out","Texture");this.properties={offset:vec2.fromValues(0,0),scale:vec2.fromValues(1,1),precision:c.DEFAULT}}
-function B(){this.addInput("in","Texture");this.addInput("warp","Texture");this.addInput("factor","number");this.addOutput("out","Texture");this.properties={factor:.01,scale:[1,1],offset:[0,0],precision:c.DEFAULT};this._uniforms={u_texture:0,u_textureB:1,u_factor:1,u_scale:vec2.create(),u_offset:vec2.create()}}function z(){this.addInput("Texture","Texture");this.properties={additive:!1,antialiasing:!1,filter:!0,disable_alpha:!1,gamma:1,viewport:[0,0,1,1]};this.size[0]=130}function G(){this.addInput("Texture",
-"Texture");this.addOutput("","Texture");this.properties={size:0,generate_mipmaps:!1,precision:c.DEFAULT}}function A(){this.addInput("Texture","Texture");this.addOutput("","Texture");this.properties={iterations:1,generate_mipmaps:!1,precision:c.DEFAULT}}function C(){this.addInput("Texture","Texture");this.addOutput("","Texture");this.properties={size:[512,512],generate_mipmaps:!1,precision:c.DEFAULT}}function e(){this.addInput("Texture","Texture");this.addOutput("tex","Texture");this.addOutput("avg",
-"vec4");this.addOutput("lum","number");this.properties={use_previous_frame:!0,high_quality:!1};this._uniforms={u_texture:0,u_mipmap_offset:0};this._luminance=new Float32Array(4)}function F(){this.addInput("in","Texture");this.addInput("factor","Number");this.addOutput("out","Texture");this.properties={factor:.5};this._uniforms={u_texture:0,u_textureB:1,u_factor:this.properties.factor}}function D(){this.addInput("in","Texture");this.addOutput("avg","Texture");this.addOutput("array","Texture");this.properties=
+function B(){this.addInput("in","Texture");this.addInput("warp","Texture");this.addInput("factor","number");this.addOutput("out","Texture");this.properties={factor:.01,scale:[1,1],offset:[0,0],precision:c.DEFAULT};this._uniforms={u_texture:0,u_textureB:1,u_factor:1,u_scale:vec2.create(),u_offset:vec2.create()}}function z(){this.addInput("Texture","Texture");this.properties={additive:!1,antialiasing:!1,filter:!0,disable_alpha:!1,gamma:1,viewport:[0,0,1,1]};this.size[0]=130}function F(){this.addInput("Texture",
+"Texture");this.addOutput("","Texture");this.properties={size:0,generate_mipmaps:!1,precision:c.DEFAULT}}function A(){this.addInput("Texture","Texture");this.addOutput("","Texture");this.properties={iterations:1,generate_mipmaps:!1,precision:c.DEFAULT}}function D(){this.addInput("Texture","Texture");this.addOutput("","Texture");this.properties={size:[512,512],generate_mipmaps:!1,precision:c.DEFAULT}}function e(){this.addInput("Texture","Texture");this.addOutput("tex","Texture");this.addOutput("avg",
+"vec4");this.addOutput("lum","number");this.properties={use_previous_frame:!0,high_quality:!1};this._uniforms={u_texture:0,u_mipmap_offset:0};this._luminance=new Float32Array(4)}function G(){this.addInput("in","Texture");this.addInput("factor","Number");this.addOutput("out","Texture");this.properties={factor:.5};this._uniforms={u_texture:0,u_textureB:1,u_factor:this.properties.factor}}function E(){this.addInput("in","Texture");this.addOutput("avg","Texture");this.addOutput("array","Texture");this.properties=
{samples:64,frames_interval:1};this._uniforms={u_texture:0,u_textureB:1,u_samples:this.properties.samples,u_isamples:1/this.properties.samples};this.frame=0}function x(){this.addInput("Image","image");this.addOutput("","Texture");this.properties={}}function K(){this.addInput("Texture","Texture");this.addInput("LUT","Texture");this.addInput("Intensity","number");this.addOutput("","Texture");this.properties={enabled:!0,intensity:1,precision:c.DEFAULT,texture:null};K._shader||(K._shader=new GL.Shader(Shader.SCREEN_VERTEX_SHADER,
-K.pixel_shader))}function l(){this.addInput("Texture","Texture");this.addInput("Atlas","Texture");this.addOutput("","Texture");this.properties={enabled:!0,num_row_symbols:4,symbol_size:16,brightness:1,colorize:!1,filter:!1,invert:!1,precision:c.DEFAULT,generate_mipmaps:!1,texture:null};l._shader||(l._shader=new GL.Shader(Shader.SCREEN_VERTEX_SHADER,l.pixel_shader));this._uniforms={u_texture:0,u_textureB:1,u_row_simbols:4,u_simbol_size:16,u_res:vec2.create()}}function m(){this.addInput("Texture","Texture");
-this.addOutput("R","Texture");this.addOutput("G","Texture");this.addOutput("B","Texture");this.addOutput("A","Texture");m._shader||(m._shader=new GL.Shader(Shader.SCREEN_VERTEX_SHADER,m.pixel_shader))}function v(){this.addInput("R","Texture");this.addInput("G","Texture");this.addInput("B","Texture");this.addInput("A","Texture");this.addOutput("Texture","Texture");this.properties={precision:c.DEFAULT,R:1,G:1,B:1,A:1};this._color=vec4.create();this._uniforms={u_textureR:0,u_textureG:1,u_textureB:2,
+K.pixel_shader))}function l(){this.addInput("Texture","Texture");this.addInput("Atlas","Texture");this.addOutput("","Texture");this.properties={enabled:!0,num_row_symbols:4,symbol_size:16,brightness:1,colorize:!1,filter:!1,invert:!1,precision:c.DEFAULT,generate_mipmaps:!1,texture:null};l._shader||(l._shader=new GL.Shader(Shader.SCREEN_VERTEX_SHADER,l.pixel_shader));this._uniforms={u_texture:0,u_textureB:1,u_row_simbols:4,u_simbol_size:16,u_res:vec2.create()}}function n(){this.addInput("Texture","Texture");
+this.addOutput("R","Texture");this.addOutput("G","Texture");this.addOutput("B","Texture");this.addOutput("A","Texture");n._shader||(n._shader=new GL.Shader(Shader.SCREEN_VERTEX_SHADER,n.pixel_shader))}function v(){this.addInput("R","Texture");this.addInput("G","Texture");this.addInput("B","Texture");this.addInput("A","Texture");this.addOutput("Texture","Texture");this.properties={precision:c.DEFAULT,R:1,G:1,B:1,A:1};this._color=vec4.create();this._uniforms={u_textureR:0,u_textureG:1,u_textureB:2,
u_textureA:3,u_color:this._color}}function a(){this.addOutput("Texture","Texture");this._tex_color=vec4.create();this.properties={color:vec4.create(),precision:c.DEFAULT}}function b(){this.addInput("A","color");this.addInput("B","color");this.addOutput("Texture","Texture");this.properties={angle:0,scale:1,A:[0,0,0],B:[1,1,1],texture_size:32};b._shader||(b._shader=new GL.Shader(Shader.SCREEN_VERTEX_SHADER,b.pixel_shader));this._uniforms={u_angle:0,u_colorA:vec3.create(),u_colorB:vec3.create()}}function d(){this.addInput("A",
"Texture");this.addInput("B","Texture");this.addInput("Mixer","Texture");this.addOutput("Texture","Texture");this.properties={factor:.5,size_from_biggest:!0,invert:!1,precision:c.DEFAULT};this._uniforms={u_textureA:0,u_textureB:1,u_textureMix:2,u_mix:vec4.create()}}function h(){this.addInput("Tex.","Texture");this.addOutput("Edges","Texture");this.properties={invert:!0,threshold:!1,factor:1,precision:c.DEFAULT};h._shader||(h._shader=new GL.Shader(Shader.SCREEN_VERTEX_SHADER,h.pixel_shader))}function f(){this.addInput("Texture",
-"Texture");this.addInput("Distance","number");this.addInput("Range","number");this.addOutput("Texture","Texture");this.properties={distance:100,range:50,only_depth:!1,high_precision:!1};this._uniforms={u_texture:0,u_distance:100,u_range:50,u_camera_planes:null}}function u(){this.addInput("Texture","Texture");this.addOutput("Texture","Texture");this.properties={precision:c.DEFAULT,invert:!1};this._uniforms={u_texture:0,u_camera_planes:null,u_ires:vec2.create()}}function n(){this.addInput("Texture",
+"Texture");this.addInput("Distance","number");this.addInput("Range","number");this.addOutput("Texture","Texture");this.properties={distance:100,range:50,only_depth:!1,high_precision:!1};this._uniforms={u_texture:0,u_distance:100,u_range:50,u_camera_planes:null}}function u(){this.addInput("Texture","Texture");this.addOutput("Texture","Texture");this.properties={precision:c.DEFAULT,invert:!1};this._uniforms={u_texture:0,u_camera_planes:null,u_ires:vec2.create()}}function m(){this.addInput("Texture",
"Texture");this.addInput("Iterations","number");this.addInput("Intensity","number");this.addOutput("Blurred","Texture");this.properties={intensity:1,iterations:1,preserve_aspect:!1,scale:[1,1],precision:c.DEFAULT}}function q(){this.intensity=.5;this.persistence=.6;this.iterations=8;this.threshold=.8;this.scale=1;this.dirt_texture=null;this.dirt_factor=.5;this._textures=[];this._uniforms={u_intensity:1,u_texture:0,u_glow_texture:1,u_threshold:0,u_texel_size:vec2.create()}}function N(){this.addInput("in",
"Texture");this.addInput("dirt","Texture");this.addOutput("out","Texture");this.addOutput("glow","Texture");this.properties={enabled:!0,intensity:1,persistence:.99,iterations:16,threshold:0,scale:1,dirt_factor:.5,precision:c.DEFAULT};this.fx=new q}function O(){this.addInput("Texture","Texture");this.addOutput("Filtered","Texture");this.properties={intensity:1,radius:5}}function M(){this.addInput("Texture","Texture");this.addOutput("Filtered","Texture");this.properties={sigma:1.4,k:1.6,p:21.7,epsilon:79,
-phi:.017}}function I(){this.addOutput("Webcam","Texture");this.properties={texture_name:"",facingMode:"user"};this.boxcolor="black";this.version=0}function J(){this.addInput("in","Texture");this.addInput("f","number");this.addOutput("out","Texture");this.properties={enabled:!0,factor:1,precision:c.LOW};this._uniforms={u_texture:0,u_factor:1}}function E(){this.addInput("in","");this.properties={precision:c.LOW,width:0,height:0,channels:1};this.addOutput("out","Texture")}function H(){this.addInput("in",
+phi:.017}}function I(){this.addOutput("Webcam","Texture");this.properties={texture_name:"",facingMode:"user"};this.boxcolor="black";this.version=0}function J(){this.addInput("in","Texture");this.addInput("f","number");this.addOutput("out","Texture");this.properties={enabled:!0,factor:1,precision:c.LOW};this._uniforms={u_texture:0,u_factor:1}}function C(){this.addInput("in","");this.properties={precision:c.LOW,width:0,height:0,channels:1};this.addOutput("out","Texture")}function H(){this.addInput("in",
"Texture");this.addOutput("out","Texture");this.properties={precision:c.LOW,split_channels:!1};this._values=new Uint8Array(1024);this._values.fill(255);this._curve_texture=null;this._uniforms={u_texture:0,u_curve:1,u_range:1};this._must_update=!0;this._points={RGB:[[0,0],[1,1]],R:[[0,0],[1,1]],G:[[0,0],[1,1]],B:[[0,0],[1,1]]};this.curve_editor=null;this.addWidget("toggle","Split Channels",!1,"split_channels");this.addWidget("combo","Channel","RGB",{values:["RGB","R","G","B"]});this.curve_offset=68;
this.size=[240,160]}function P(){this.addInput("in","Texture");this.addInput("exp","number");this.addOutput("out","Texture");this.properties={exposition:1,precision:c.LOW};this._uniforms={u_texture:0,u_exposition:1}}function Q(){this.addInput("in","Texture");this.addInput("avg","number,Texture");this.addOutput("out","Texture");this.properties={enabled:!0,scale:1,gamma:1,average_lum:1,lum_white:1,precision:c.LOW};this._uniforms={u_texture:0,u_lumwhite2:1,u_igamma:1,u_scale:1,u_average_lum:1}}function S(){this.addOutput("out",
"Texture");this.properties={width:512,height:512,seed:0,persistence:.1,octaves:8,scale:1,offset:[0,0],amplitude:1,precision:c.DEFAULT};this._key=0;this._texture=null;this._uniforms={u_persistence:.1,u_seed:0,u_offset:vec2.create(),u_scale:1,u_viewport:vec2.create()}}function R(){this.addInput("v");this.addOutput("out","Texture");this.properties={code:R.default_code,width:512,height:512,clear:!0,precision:c.DEFAULT,use_html_canvas:!1};this._temp_texture=this._func=null;this.compileCode()}function T(){this.addInput("in",
@@ -497,7 +503,7 @@ a.unbind(0)),this.properties.name&&(c.storeTexture?c.storeTexture(this.propertie
"Hide Texture":"Show Texture",callback:function(){b.properties.show=!b.properties.show}}]},r.prototype.onPropertyChanged=function(){this.has_error=!1},r.prototype.onDrawBackground=function(a){this.flags.collapsed||20>=this.size[1]||!this.properties.show||!this._tex||this._tex.gl!=a||(a.save(),a.drawImage(this._tex,0,0,this.size[0],this.size[1]),a.restore())},r.prototype.onExecute=function(){var a=this.getInputData(0);if(this.isOutputConnected(0))if(this.properties.precision===c.PASS_THROUGH)this.setOutputData(0,
a);else{var b=this.getInputData(1);if(this.properties.uvcode||this.properties.pixelcode){var d=512,f=512;a?(d=a.width,f=a.height):b&&(d=b.width,f=b.height);b||(b=GL.Texture.getWhiteTexture());var h=c.getTextureType(this.properties.precision,a);this._tex=a||this._tex?c.getTargetTexture(a||this._tex,this._tex,this.properties.precision):new GL.Texture(d,f,{type:h,format:gl.RGBA,filter:gl.LINEAR});h="";this.properties.uvcode&&(h="uv = "+this.properties.uvcode,-1!=this.properties.uvcode.indexOf(";")&&
(h=this.properties.uvcode));var e="";this.properties.pixelcode&&(e="result = "+this.properties.pixelcode,-1!=this.properties.pixelcode.indexOf(";")&&(e=this.properties.pixelcode));var g=this._shader;if(!(this.has_error||g&&this._shader_code==h+"|"+e)){var l=c.replaceCode(r.pixel_shader,{UV_CODE:h,PIXEL_CODE:e});try{g=new GL.Shader(Shader.SCREEN_VERTEX_SHADER,l),this.boxcolor="#00FF00"}catch(aa){GL.Shader.dumpErrorToConsole(aa,Shader.SCREEN_VERTEX_SHADER,l);this.boxcolor="#FF0000";this.has_error=!0;
-return}this._shader=g;this._shader_code=h+"|"+e}if(this._shader){var m=this.getInputData(2);null!=m?this.properties.value=m:m=parseFloat(this.properties.value);var v=this.graph.getTime();this._tex.drawTo(function(){gl.disable(gl.DEPTH_TEST);gl.disable(gl.CULL_FACE);gl.disable(gl.BLEND);a&&a.bind(0);b&&b.bind(1);var c=Mesh.getScreenQuad();g.uniforms({u_texture:0,u_textureB:1,value:m,texSize:[d,f,1/d,1/f],time:v}).draw(c)});this.setOutputData(0,this._tex)}}}},r.pixel_shader="precision highp float;\n\t\t\n\t\tuniform sampler2D u_texture;\n\t\tuniform sampler2D u_textureB;\n\t\tvarying vec2 v_coord;\n\t\tuniform vec4 texSize;\n\t\tuniform float time;\n\t\tuniform float value;\n\t\t\n\t\tvoid main() {\n\t\t\tvec2 uv = v_coord;\n\t\t\t{{UV_CODE}};\n\t\t\tvec4 color4 = texture2D(u_texture, uv);\n\t\t\tvec3 color = color4.rgb;\n\t\t\tvec4 color4B = texture2D(u_textureB, uv);\n\t\t\tvec3 colorB = color4B.rgb;\n\t\t\tvec3 result = color;\n\t\t\tfloat alpha = 1.0;\n\t\t\t{{PIXEL_CODE}};\n\t\t\tgl_FragColor = vec4(result, alpha);\n\t\t}\n\t\t",
+return}this._shader=g;this._shader_code=h+"|"+e}if(this._shader){var n=this.getInputData(2);null!=n?this.properties.value=n:n=parseFloat(this.properties.value);var v=this.graph.getTime();this._tex.drawTo(function(){gl.disable(gl.DEPTH_TEST);gl.disable(gl.CULL_FACE);gl.disable(gl.BLEND);a&&a.bind(0);b&&b.bind(1);var c=Mesh.getScreenQuad();g.uniforms({u_texture:0,u_textureB:1,value:n,texSize:[d,f,1/d,1/f],time:v}).draw(c)});this.setOutputData(0,this._tex)}}}},r.pixel_shader="precision highp float;\n\t\t\n\t\tuniform sampler2D u_texture;\n\t\tuniform sampler2D u_textureB;\n\t\tvarying vec2 v_coord;\n\t\tuniform vec4 texSize;\n\t\tuniform float time;\n\t\tuniform float value;\n\t\t\n\t\tvoid main() {\n\t\t\tvec2 uv = v_coord;\n\t\t\t{{UV_CODE}};\n\t\t\tvec4 color4 = texture2D(u_texture, uv);\n\t\t\tvec3 color = color4.rgb;\n\t\t\tvec4 color4B = texture2D(u_textureB, uv);\n\t\t\tvec3 colorB = color4B.rgb;\n\t\t\tvec3 result = color;\n\t\t\tfloat alpha = 1.0;\n\t\t\t{{PIXEL_CODE}};\n\t\t\tgl_FragColor = vec4(result, alpha);\n\t\t}\n\t\t",
r.registerPreset=function(a,b){r.presets[a]=b},r.registerPreset("",""),r.registerPreset("bypass","color"),r.registerPreset("add","color + colorB * value"),r.registerPreset("substract","(color - colorB) * value"),r.registerPreset("mate","mix( color, colorB, color4B.a * value)"),r.registerPreset("invert","vec3(1.0) - color"),r.registerPreset("multiply","color * colorB * value"),r.registerPreset("divide","(color / colorB) / value"),r.registerPreset("difference","abs(color - colorB) * value"),r.registerPreset("max",
"max(color, colorB) * value"),r.registerPreset("min","min(color, colorB) * value"),r.registerPreset("displace","texture2D(u_texture, uv + (colorB.xy - vec2(0.5)) * value).xyz"),r.registerPreset("grayscale","vec3(color.x + color.y + color.z) * value / 3.0"),r.registerPreset("saturation","mix( vec3(color.x + color.y + color.z) / 3.0, color, value )"),r.registerPreset("normalmap","\n\t\tfloat z0 = texture2D(u_texture, uv + vec2(-texSize.z, -texSize.w) ).x;\n\t\tfloat z1 = texture2D(u_texture, uv + vec2(0.0, -texSize.w) ).x;\n\t\tfloat z2 = texture2D(u_texture, uv + vec2(texSize.z, -texSize.w) ).x;\n\t\tfloat z3 = texture2D(u_texture, uv + vec2(-texSize.z, 0.0) ).x;\n\t\tfloat z4 = color.x;\n\t\tfloat z5 = texture2D(u_texture, uv + vec2(texSize.z, 0.0) ).x;\n\t\tfloat z6 = texture2D(u_texture, uv + vec2(-texSize.z, texSize.w) ).x;\n\t\tfloat z7 = texture2D(u_texture, uv + vec2(0.0, texSize.w) ).x;\n\t\tfloat z8 = texture2D(u_texture, uv + vec2(texSize.z, texSize.w) ).x;\n\t\tvec3 normal = vec3( z2 + 2.0*z4 + z7 - z0 - 2.0*z3 - z5, z5 + 2.0*z6 + z7 -z0 - 2.0*z1 - z2, 1.0 );\n\t\tnormal.xy *= value;\n\t\tresult.xyz = normalize(normal) * 0.5 + vec3(0.5);\n\t"),
r.registerPreset("threshold","vec3(color.x > colorB.x * value ? 1.0 : 0.0,color.y > colorB.y * value ? 1.0 : 0.0,color.z > colorB.z * value ? 1.0 : 0.0)"),r.prototype.onInspect=function(a){var b=this;a.addCombo("Presets","",{values:Object.keys(r.presets),callback:function(d){var c=r.presets[d];c&&(b.setProperty("pixelcode",c),b.title=d,a.refresh())}})},L.registerNodeType("texture/operation",r),w.title="Shader",w.desc="Texture shader",w.widgets_info={code:{type:"code",lang:"glsl"},precision:{widget:"combo",
@@ -514,25 +520,25 @@ Mesh.getScreenQuad();h.uniforms(e).draw(d)});this.setOutputData(0,this._tex)}},B
L.registerNodeType("texture/warp",B),z.title="to Viewport",z.desc="Texture to viewport",z._prev_viewport=new Float32Array(4),z.prototype.onDrawBackground=function(a){if(!(this.flags.collapsed||40>=this.size[1])){var b=this.getInputData(0);b&&a.drawImage(a==gl?b:gl.canvas,10,30,this.size[0]-20,this.size[1]-40)}},z.prototype.onExecute=function(){var a=this.getInputData(0);if(a){this.properties.disable_alpha?gl.disable(gl.BLEND):(gl.enable(gl.BLEND),this.properties.additive?gl.blendFunc(gl.SRC_ALPHA,
gl.ONE):gl.blendFunc(gl.SRC_ALPHA,gl.ONE_MINUS_SRC_ALPHA));gl.disable(gl.DEPTH_TEST);var b=this.properties.gamma||1;this.isInputConnected(1)&&(b=this.getInputData(1));a.setParameter(gl.TEXTURE_MAG_FILTER,this.properties.filter?gl.LINEAR:gl.NEAREST);var d=z._prev_viewport;d.set(gl.viewport_data);var c=this.properties.viewport;gl.viewport(d[0]+d[2]*c[0],d[1]+d[3]*c[1],d[2]*c[2],d[3]*c[3]);gl.getViewport();this.properties.antialiasing?(z._shader||(z._shader=new GL.Shader(GL.Shader.SCREEN_VERTEX_SHADER,
z.aa_pixel_shader)),c=Mesh.getScreenQuad(),a.bind(0),z._shader.uniforms({u_texture:0,uViewportSize:[a.width,a.height],u_igamma:1/b,inverseVP:[1/a.width,1/a.height]}).draw(c)):1!=b?(z._gamma_shader||(z._gamma_shader=new GL.Shader(Shader.SCREEN_VERTEX_SHADER,z.gamma_pixel_shader)),a.toViewport(z._gamma_shader,{u_texture:0,u_igamma:1/b})):a.toViewport();gl.viewport(d[0],d[1],d[2],d[3])}},z.prototype.onGetInputs=function(){return[["gamma","number"]]},z.aa_pixel_shader="precision highp float;\n\t\tprecision highp float;\n\t\tvarying vec2 v_coord;\n\t\tuniform sampler2D u_texture;\n\t\tuniform vec2 uViewportSize;\n\t\tuniform vec2 inverseVP;\n\t\tuniform float u_igamma;\n\t\t#define FXAA_REDUCE_MIN (1.0/ 128.0)\n\t\t#define FXAA_REDUCE_MUL (1.0 / 8.0)\n\t\t#define FXAA_SPAN_MAX 8.0\n\t\t\n\t\t/* from mitsuhiko/webgl-meincraft based on the code on geeks3d.com */\n\t\tvec4 applyFXAA(sampler2D tex, vec2 fragCoord)\n\t\t{\n\t\t\tvec4 color = vec4(0.0);\n\t\t\t/*vec2 inverseVP = vec2(1.0 / uViewportSize.x, 1.0 / uViewportSize.y);*/\n\t\t\tvec3 rgbNW = texture2D(tex, (fragCoord + vec2(-1.0, -1.0)) * inverseVP).xyz;\n\t\t\tvec3 rgbNE = texture2D(tex, (fragCoord + vec2(1.0, -1.0)) * inverseVP).xyz;\n\t\t\tvec3 rgbSW = texture2D(tex, (fragCoord + vec2(-1.0, 1.0)) * inverseVP).xyz;\n\t\t\tvec3 rgbSE = texture2D(tex, (fragCoord + vec2(1.0, 1.0)) * inverseVP).xyz;\n\t\t\tvec3 rgbM = texture2D(tex, fragCoord * inverseVP).xyz;\n\t\t\tvec3 luma = vec3(0.299, 0.587, 0.114);\n\t\t\tfloat lumaNW = dot(rgbNW, luma);\n\t\t\tfloat lumaNE = dot(rgbNE, luma);\n\t\t\tfloat lumaSW = dot(rgbSW, luma);\n\t\t\tfloat lumaSE = dot(rgbSE, luma);\n\t\t\tfloat lumaM = dot(rgbM, luma);\n\t\t\tfloat lumaMin = min(lumaM, min(min(lumaNW, lumaNE), min(lumaSW, lumaSE)));\n\t\t\tfloat lumaMax = max(lumaM, max(max(lumaNW, lumaNE), max(lumaSW, lumaSE)));\n\t\t\t\n\t\t\tvec2 dir;\n\t\t\tdir.x = -((lumaNW + lumaNE) - (lumaSW + lumaSE));\n\t\t\tdir.y = ((lumaNW + lumaSW) - (lumaNE + lumaSE));\n\t\t\t\n\t\t\tfloat dirReduce = max((lumaNW + lumaNE + lumaSW + lumaSE) * (0.25 * FXAA_REDUCE_MUL), FXAA_REDUCE_MIN);\n\t\t\t\n\t\t\tfloat rcpDirMin = 1.0 / (min(abs(dir.x), abs(dir.y)) + dirReduce);\n\t\t\tdir = min(vec2(FXAA_SPAN_MAX, FXAA_SPAN_MAX), max(vec2(-FXAA_SPAN_MAX, -FXAA_SPAN_MAX), dir * rcpDirMin)) * inverseVP;\n\t\t\t\n\t\t\tvec3 rgbA = 0.5 * (texture2D(tex, fragCoord * inverseVP + dir * (1.0 / 3.0 - 0.5)).xyz + \n\t\t\t\ttexture2D(tex, fragCoord * inverseVP + dir * (2.0 / 3.0 - 0.5)).xyz);\n\t\t\tvec3 rgbB = rgbA * 0.5 + 0.25 * (texture2D(tex, fragCoord * inverseVP + dir * -0.5).xyz + \n\t\t\t\ttexture2D(tex, fragCoord * inverseVP + dir * 0.5).xyz);\n\t\t\t\n\t\t\t//return vec4(rgbA,1.0);\n\t\t\tfloat lumaB = dot(rgbB, luma);\n\t\t\tif ((lumaB < lumaMin) || (lumaB > lumaMax))\n\t\t\t\tcolor = vec4(rgbA, 1.0);\n\t\t\telse\n\t\t\t\tcolor = vec4(rgbB, 1.0);\n\t\t\tif(u_igamma != 1.0)\n\t\t\t\tcolor.xyz = pow( color.xyz, vec3(u_igamma) );\n\t\t\treturn color;\n\t\t}\n\t\t\n\t\tvoid main() {\n\t\t gl_FragColor = applyFXAA( u_texture, v_coord * uViewportSize) ;\n\t\t}\n\t\t",
-z.gamma_pixel_shader="precision highp float;\n\t\tprecision highp float;\n\t\tvarying vec2 v_coord;\n\t\tuniform sampler2D u_texture;\n\t\tuniform float u_igamma;\n\t\tvoid main() {\n\t\t\tvec4 color = texture2D( u_texture, v_coord);\n\t\t\tcolor.xyz = pow(color.xyz, vec3(u_igamma) );\n\t\t gl_FragColor = color;\n\t\t}\n\t\t",L.registerNodeType("texture/toviewport",z),G.title="Copy",G.desc="Copy Texture",G.widgets_info={size:{widget:"combo",values:[0,32,64,128,256,512,1024,2048]},precision:{widget:"combo",
-values:c.MODE_VALUES}},G.prototype.onExecute=function(){var a=this.getInputData(0);if((a||this._temp_texture)&&this.isOutputConnected(0)){if(a){var b=a.width,d=a.height;0!=this.properties.size&&(d=b=this.properties.size);var f=this._temp_texture,h=a.type;this.properties.precision===c.LOW?h=gl.UNSIGNED_BYTE:this.properties.precision===c.HIGH&&(h=gl.HIGH_PRECISION_FORMAT);f&&f.width==b&&f.height==d&&f.type==h||(f=gl.LINEAR,this.properties.generate_mipmaps&&isPowerOfTwo(b)&&isPowerOfTwo(d)&&(f=gl.LINEAR_MIPMAP_LINEAR),
-this._temp_texture=new GL.Texture(b,d,{type:h,format:gl.RGBA,minFilter:f,magFilter:gl.LINEAR}));a.copyTo(this._temp_texture);this.properties.generate_mipmaps&&(this._temp_texture.bind(0),gl.generateMipmap(this._temp_texture.texture_type),this._temp_texture.unbind(0))}this.setOutputData(0,this._temp_texture)}},L.registerNodeType("texture/copy",G),A.title="Downsample",A.desc="Downsample Texture",A.widgets_info={iterations:{type:"number",step:1,precision:0,min:0},precision:{widget:"combo",values:c.MODE_VALUES}},
+z.gamma_pixel_shader="precision highp float;\n\t\tprecision highp float;\n\t\tvarying vec2 v_coord;\n\t\tuniform sampler2D u_texture;\n\t\tuniform float u_igamma;\n\t\tvoid main() {\n\t\t\tvec4 color = texture2D( u_texture, v_coord);\n\t\t\tcolor.xyz = pow(color.xyz, vec3(u_igamma) );\n\t\t gl_FragColor = color;\n\t\t}\n\t\t",L.registerNodeType("texture/toviewport",z),F.title="Copy",F.desc="Copy Texture",F.widgets_info={size:{widget:"combo",values:[0,32,64,128,256,512,1024,2048]},precision:{widget:"combo",
+values:c.MODE_VALUES}},F.prototype.onExecute=function(){var a=this.getInputData(0);if((a||this._temp_texture)&&this.isOutputConnected(0)){if(a){var b=a.width,d=a.height;0!=this.properties.size&&(d=b=this.properties.size);var f=this._temp_texture,h=a.type;this.properties.precision===c.LOW?h=gl.UNSIGNED_BYTE:this.properties.precision===c.HIGH&&(h=gl.HIGH_PRECISION_FORMAT);f&&f.width==b&&f.height==d&&f.type==h||(f=gl.LINEAR,this.properties.generate_mipmaps&&isPowerOfTwo(b)&&isPowerOfTwo(d)&&(f=gl.LINEAR_MIPMAP_LINEAR),
+this._temp_texture=new GL.Texture(b,d,{type:h,format:gl.RGBA,minFilter:f,magFilter:gl.LINEAR}));a.copyTo(this._temp_texture);this.properties.generate_mipmaps&&(this._temp_texture.bind(0),gl.generateMipmap(this._temp_texture.texture_type),this._temp_texture.unbind(0))}this.setOutputData(0,this._temp_texture)}},L.registerNodeType("texture/copy",F),A.title="Downsample",A.desc="Downsample Texture",A.widgets_info={iterations:{type:"number",step:1,precision:0,min:0},precision:{widget:"combo",values:c.MODE_VALUES}},
A.prototype.onExecute=function(){var a=this.getInputData(0);if((a||this._temp_texture)&&this.isOutputConnected(0)&&a&&a.texture_type===GL.TEXTURE_2D)if(1>this.properties.iterations)this.setOutputData(0,a);else{var b=A._shader;b||(A._shader=b=new GL.Shader(GL.Shader.SCREEN_VERTEX_SHADER,A.pixel_shader));var d=a.width|0,f=a.height|0,h=a.type;this.properties.precision===c.LOW?h=gl.UNSIGNED_BYTE:this.properties.precision===c.HIGH&&(h=gl.HIGH_PRECISION_FORMAT);var e=this.properties.iterations||1,g=a,l=
-[];h={type:h,format:a.format};var m=vec2.create(),v={u_offset:m};this._texture&&GL.Texture.releaseTemporary(this._texture);for(var k=0;k>1||0;f=f>>1||0;a=GL.Texture.getTemporary(d,f,h);l.push(a);g.setParameter(GL.TEXTURE_MAG_FILTER,GL.NEAREST);g.copyTo(a,b,v);if(1==d&&1==f)break;g=a}this._texture=l.pop();for(k=0;k>1||0;f=f>>1||0;a=GL.Texture.getTemporary(d,f,h);l.push(a);g.setParameter(GL.TEXTURE_MAG_FILTER,GL.NEAREST);g.copyTo(a,b,v);if(1==d&&1==f)break;g=a}this._texture=l.pop();for(k=0;kc;c++)this.isOutputConnected(c)?(this._channels[c]&&this._channels[c].width==a.width&&this._channels[c].height==a.height&&this._channels[c].type==a.type&&this._channels[c].format==b||(this._channels[c]=new GL.Texture(a.width,a.height,{type:a.type,format:b,filter:gl.LINEAR})),
-d++):this._channels[c]=null;if(d){gl.disable(gl.BLEND);gl.disable(gl.DEPTH_TEST);var f=Mesh.getScreenQuad(),h=m._shader,e=[[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]];for(c=0;4>c;c++)this._channels[c]&&(this._channels[c].drawTo(function(){a.bind(0);h.uniforms({u_texture:0,u_mask:e[c]}).draw(f)}),this.setOutputData(c,this._channels[c]))}}},m.pixel_shader="precision highp float;\n\t\tprecision highp float;\n\t\tvarying vec2 v_coord;\n\t\tuniform sampler2D u_texture;\n\t\tuniform vec4 u_mask;\n\t\t\n\t\tvoid main() {\n\t\t gl_FragColor = vec4( vec3( length( texture2D(u_texture, v_coord) * u_mask )), 1.0 );\n\t\t}\n\t\t",
-L.registerNodeType("texture/textureChannels",m),v.title="Channels to Texture",v.desc="Split texture channels",v.widgets_info={precision:{widget:"combo",values:c.MODE_VALUES}},v.prototype.onExecute=function(){var a=c.getWhiteTexture(),b=this.getInputData(0)||a,d=this.getInputData(1)||a,f=this.getInputData(2)||a,h=this.getInputData(3)||a;gl.disable(gl.BLEND);gl.disable(gl.DEPTH_TEST);var e=Mesh.getScreenQuad();v._shader||(v._shader=new GL.Shader(Shader.SCREEN_VERTEX_SHADER,v.pixel_shader));var g=v._shader;
-a=Math.max(b.width,d.width,f.width,h.width);var l=Math.max(b.height,d.height,f.height,h.height),m=this.properties.precision==c.HIGH?c.HIGH_PRECISION_FORMAT:gl.UNSIGNED_BYTE;this._texture&&this._texture.width==a&&this._texture.height==l&&this._texture.type==m||(this._texture=new GL.Texture(a,l,{type:m,format:gl.RGBA,filter:gl.LINEAR}));a=this._color;a[0]=this.properties.R;a[1]=this.properties.G;a[2]=this.properties.B;a[3]=this.properties.A;var k=this._uniforms;this._texture.drawTo(function(){b.bind(0);
+L.registerNodeType("texture/encode",l),n.title="Texture to Channels",n.desc="Split texture channels",n.prototype.onExecute=function(){var a=this.getInputData(0);if(a){this._channels||(this._channels=Array(4));for(var b=gl.RGB,d=0,c=0;4>c;c++)this.isOutputConnected(c)?(this._channels[c]&&this._channels[c].width==a.width&&this._channels[c].height==a.height&&this._channels[c].type==a.type&&this._channels[c].format==b||(this._channels[c]=new GL.Texture(a.width,a.height,{type:a.type,format:b,filter:gl.LINEAR})),
+d++):this._channels[c]=null;if(d){gl.disable(gl.BLEND);gl.disable(gl.DEPTH_TEST);var f=Mesh.getScreenQuad(),h=n._shader,e=[[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]];for(c=0;4>c;c++)this._channels[c]&&(this._channels[c].drawTo(function(){a.bind(0);h.uniforms({u_texture:0,u_mask:e[c]}).draw(f)}),this.setOutputData(c,this._channels[c]))}}},n.pixel_shader="precision highp float;\n\t\tprecision highp float;\n\t\tvarying vec2 v_coord;\n\t\tuniform sampler2D u_texture;\n\t\tuniform vec4 u_mask;\n\t\t\n\t\tvoid main() {\n\t\t gl_FragColor = vec4( vec3( length( texture2D(u_texture, v_coord) * u_mask )), 1.0 );\n\t\t}\n\t\t",
+L.registerNodeType("texture/textureChannels",n),v.title="Channels to Texture",v.desc="Split texture channels",v.widgets_info={precision:{widget:"combo",values:c.MODE_VALUES}},v.prototype.onExecute=function(){var a=c.getWhiteTexture(),b=this.getInputData(0)||a,d=this.getInputData(1)||a,f=this.getInputData(2)||a,h=this.getInputData(3)||a;gl.disable(gl.BLEND);gl.disable(gl.DEPTH_TEST);var e=Mesh.getScreenQuad();v._shader||(v._shader=new GL.Shader(Shader.SCREEN_VERTEX_SHADER,v.pixel_shader));var g=v._shader;
+a=Math.max(b.width,d.width,f.width,h.width);var l=Math.max(b.height,d.height,f.height,h.height),n=this.properties.precision==c.HIGH?c.HIGH_PRECISION_FORMAT:gl.UNSIGNED_BYTE;this._texture&&this._texture.width==a&&this._texture.height==l&&this._texture.type==n||(this._texture=new GL.Texture(a,l,{type:n,format:gl.RGBA,filter:gl.LINEAR}));a=this._color;a[0]=this.properties.R;a[1]=this.properties.G;a[2]=this.properties.B;a[3]=this.properties.A;var k=this._uniforms;this._texture.drawTo(function(){b.bind(0);
d.bind(1);f.bind(2);h.bind(3);g.uniforms(k).draw(e)});this.setOutputData(0,this._texture)},v.pixel_shader="precision highp float;\n\t\tprecision highp float;\n\t\tvarying vec2 v_coord;\n\t\tuniform sampler2D u_textureR;\n\t\tuniform sampler2D u_textureG;\n\t\tuniform sampler2D u_textureB;\n\t\tuniform sampler2D u_textureA;\n\t\tuniform vec4 u_color;\n\t\t\n\t\tvoid main() {\n\t\t gl_FragColor = u_color * vec4( \t\t\t\t\ttexture2D(u_textureR, v_coord).r,\t\t\t\t\ttexture2D(u_textureG, v_coord).r,\t\t\t\t\ttexture2D(u_textureB, v_coord).r,\t\t\t\t\ttexture2D(u_textureA, v_coord).r);\n\t\t}\n\t\t",
L.registerNodeType("texture/channelsTexture",v),a.title="Color",a.desc="Generates a 1x1 texture with a constant color",a.widgets_info={precision:{widget:"combo",values:c.MODE_VALUES}},a.prototype.onDrawBackground=function(a){var b=this.properties.color;a.fillStyle="rgb("+Math.floor(255*Math.clamp(b[0],0,1))+","+Math.floor(255*Math.clamp(b[1],0,1))+","+Math.floor(255*Math.clamp(b[2],0,1))+")";this.flags.collapsed?this.boxcolor=a.fillStyle:a.fillRect(0,0,this.size[0],this.size[1])},a.prototype.onExecute=
function(){var a=this.properties.precision==c.HIGH?c.HIGH_PRECISION_FORMAT:gl.UNSIGNED_BYTE;this._tex&&this._tex.type==a||(this._tex=new GL.Texture(1,1,{format:gl.RGBA,type:a,minFilter:gl.NEAREST}));a=this.properties.color;if(this.inputs)for(var b=0;ba.width?b:
-a,this._tex,this.properties.precision);gl.disable(gl.BLEND);gl.disable(gl.DEPTH_TEST);var e=Mesh.getScreenQuad(),g=null,l=this._uniforms;f?(g=d._shader_tex,g||(g=d._shader_tex=new GL.Shader(Shader.SCREEN_VERTEX_SHADER,d.pixel_shader,{MIX_TEX:""}))):(g=d._shader_factor,g||(g=d._shader_factor=new GL.Shader(Shader.SCREEN_VERTEX_SHADER,d.pixel_shader)),h=null==h?this.properties.factor:h,l.u_mix.set([h,h,h,h]));var m=this.properties.invert;this._tex.drawTo(function(){a.bind(m?1:0);b.bind(m?0:1);f&&f.bind(2);
+a,this._tex,this.properties.precision);gl.disable(gl.BLEND);gl.disable(gl.DEPTH_TEST);var e=Mesh.getScreenQuad(),g=null,l=this._uniforms;f?(g=d._shader_tex,g||(g=d._shader_tex=new GL.Shader(Shader.SCREEN_VERTEX_SHADER,d.pixel_shader,{MIX_TEX:""}))):(g=d._shader_factor,g||(g=d._shader_factor=new GL.Shader(Shader.SCREEN_VERTEX_SHADER,d.pixel_shader)),h=null==h?this.properties.factor:h,l.u_mix.set([h,h,h,h]));var n=this.properties.invert;this._tex.drawTo(function(){a.bind(n?1:0);b.bind(n?0:1);f&&f.bind(2);
g.uniforms(l).draw(e)});this.setOutputData(0,this._tex)}}},d.prototype.onGetInputs=function(){return[["factor","number"]]},d.pixel_shader="precision highp float;\n\t\tprecision highp float;\n\t\tvarying vec2 v_coord;\n\t\tuniform sampler2D u_textureA;\n\t\tuniform sampler2D u_textureB;\n\t\t#ifdef MIX_TEX\n\t\t\tuniform sampler2D u_textureMix;\n\t\t#else\n\t\t\tuniform vec4 u_mix;\n\t\t#endif\n\t\t\n\t\tvoid main() {\n\t\t\t#ifdef MIX_TEX\n\t\t\t vec4 f = texture2D(u_textureMix, v_coord);\n\t\t\t#else\n\t\t\t vec4 f = u_mix;\n\t\t\t#endif\n\t\t gl_FragColor = mix( texture2D(u_textureA, v_coord), texture2D(u_textureB, v_coord), f );\n\t\t}\n\t\t",
L.registerNodeType("texture/mix",d),h.title="Edges",h.desc="Detects edges",h.widgets_info={precision:{widget:"combo",values:c.MODE_VALUES}},h.prototype.onExecute=function(){if(this.isOutputConnected(0)){var a=this.getInputData(0);if(this.properties.precision===c.PASS_THROUGH)this.setOutputData(0,a);else if(a){this._tex=c.getTargetTexture(a,this._tex,this.properties.precision);gl.disable(gl.BLEND);gl.disable(gl.DEPTH_TEST);var b=Mesh.getScreenQuad(),d=h._shader,f=this.properties.invert,e=this.properties.factor,
g=this.properties.threshold?1:0;this._tex.drawTo(function(){a.bind(0);d.uniforms({u_texture:0,u_isize:[1/a.width,1/a.height],u_factor:e,u_threshold:g,u_invert:f?1:0}).draw(b)});this.setOutputData(0,this._tex)}}},h.pixel_shader="precision highp float;\n\t\tprecision highp float;\n\t\tvarying vec2 v_coord;\n\t\tuniform sampler2D u_texture;\n\t\tuniform vec2 u_isize;\n\t\tuniform int u_invert;\n\t\tuniform float u_factor;\n\t\tuniform float u_threshold;\n\t\t\n\t\tvoid main() {\n\t\t\tvec4 center = texture2D(u_texture, v_coord);\n\t\t\tvec4 up = texture2D(u_texture, v_coord + u_isize * vec2(0.0,1.0) );\n\t\t\tvec4 down = texture2D(u_texture, v_coord + u_isize * vec2(0.0,-1.0) );\n\t\t\tvec4 left = texture2D(u_texture, v_coord + u_isize * vec2(1.0,0.0) );\n\t\t\tvec4 right = texture2D(u_texture, v_coord + u_isize * vec2(-1.0,0.0) );\n\t\t\tvec4 diff = abs(center - up) + abs(center - down) + abs(center - left) + abs(center - right);\n\t\t\tdiff *= u_factor;\n\t\t\tif(u_invert == 1)\n\t\t\t\tdiff.xyz = vec3(1.0) - diff.xyz;\n\t\t\tif( u_threshold == 0.0 )\n\t\t\t\tgl_FragColor = vec4( diff.xyz, center.a );\n\t\t\telse\n\t\t\t\tgl_FragColor = vec4( diff.x > 0.5 ? 1.0 : 0.0, diff.y > 0.5 ? 1.0 : 0.0, diff.z > 0.5 ? 1.0 : 0.0, center.a );\n\t\t}\n\t\t",
@@ -561,12 +567,12 @@ filter:gl.LINEAR}));var d=this._uniforms;b=this.properties.distance;this.isInput
L.registerNodeType("texture/depth_range",f),u.widgets_info={precision:{widget:"combo",values:c.MODE_VALUES}},u.title="Linear Depth",u.desc="Creates a color texture with linear depth",u.prototype.onExecute=function(){if(this.isOutputConnected(0)){var a=this.getInputData(0);if(a&&(a.format==gl.DEPTH_COMPONENT||a.format==gl.DEPTH_STENCIL)){var b=this.properties.precision==c.HIGH?gl.HIGH_PRECISION_FORMAT:gl.UNSIGNED_BYTE;this._temp_texture&&this._temp_texture.type==b&&this._temp_texture.width==a.width&&
this._temp_texture.height==a.height||(this._temp_texture=new GL.Texture(a.width,a.height,{type:b,format:gl.RGB,filter:gl.LINEAR}));var d=this._uniforms;d.u_invert=this.properties.invert?1:0;gl.disable(gl.BLEND);gl.disable(gl.DEPTH_TEST);var f=Mesh.getScreenQuad();u._shader||(u._shader=new GL.Shader(GL.Shader.SCREEN_VERTEX_SHADER,u.pixel_shader));var h=u._shader;b=null;b=a.near_far_planes?a.near_far_planes:window.LS&&LS.Renderer._main_camera?LS.Renderer._main_camera._uniforms.u_camera_planes:[.1,1E3];
d.u_camera_planes=b;d.u_ires.set([0,0]);this._temp_texture.drawTo(function(){a.bind(0);h.uniforms(d).draw(f)});this._temp_texture.near_far_planes=b;this.setOutputData(0,this._temp_texture)}}},u.pixel_shader="precision highp float;\n\t\tprecision highp float;\n\t\tvarying vec2 v_coord;\n\t\tuniform sampler2D u_texture;\n\t\tuniform vec2 u_camera_planes;\n\t\tuniform int u_invert;\n\t\tuniform vec2 u_ires;\n\t\t\n\t\tvoid main() {\n\t\t\tfloat zNear = u_camera_planes.x;\n\t\t\tfloat zFar = u_camera_planes.y;\n\t\t\tfloat depth = texture2D(u_texture, v_coord + u_ires*0.5).x * 2.0 - 1.0;\n\t\t\tfloat f = zNear * (depth + 1.0) / (zFar + zNear - depth * (zFar - zNear));\n\t\t\tif( u_invert == 1 )\n\t\t\t\tf = 1.0 - f;\n\t\t\tgl_FragColor = vec4(vec3(f),1.0);\n\t\t}\n\t\t",
-L.registerNodeType("texture/linear_depth",u),n.title="Blur",n.desc="Blur a texture",n.widgets_info={precision:{widget:"combo",values:c.MODE_VALUES}},n.max_iterations=20,n.prototype.onExecute=function(){var a=this.getInputData(0);if(a&&this.isOutputConnected(0)){var b=this._final_texture;b&&b.width==a.width&&b.height==a.height&&b.type==a.type||(b=this._final_texture=new GL.Texture(a.width,a.height,{type:a.type,format:gl.RGBA,filter:gl.LINEAR}));var d=this.properties.iterations;this.isInputConnected(1)&&
-(d=this.getInputData(1),this.properties.iterations=d);d=Math.min(Math.floor(d),n.max_iterations);if(0==d)this.setOutputData(0,a);else{var c=this.properties.intensity;this.isInputConnected(2)&&(c=this.getInputData(2),this.properties.intensity=c);var f=L.camera_aspect;f||void 0===window.gl||(f=gl.canvas.height/gl.canvas.width);f||(f=1);f=this.properties.preserve_aspect?f:1;var h=this.properties.scale||[1,1];a.applyBlur(f*h[0],h[1],c,b);for(a=1;a>=1;1<(h|0)&&(h>>=1);if(2>f)break;v=l[u]=GL.Texture.getTemporary(f,h,e);H[0]=1/k.width;H[1]=1/k.height;k.blit(v,m.uniforms(g));k=v}c&&(H[0]=1/k.width,H[1]=1/k.height,g.u_intensity=E,g.u_delta=1,k.blit(c,m.uniforms(g)));gl.enable(gl.BLEND);gl.blendFunc(gl.ONE,gl.ONE);g.u_intensity=this.persistence;
-g.u_delta=.5;for(u-=2;0<=u;u--)v=l[u],l[u]=null,H[0]=1/k.width,H[1]=1/k.height,k.blit(v,m.uniforms(g)),GL.Texture.releaseTemporary(k),k=v;gl.disable(gl.BLEND);d&&k.blit(d);if(b){var r=this.dirt_texture,w=this.dirt_factor;g.u_intensity=E;m=r?q._dirt_final_shader:q._final_shader;m||(m=r?q._dirt_final_shader=new GL.Shader(GL.Shader.SCREEN_VERTEX_SHADER,q.final_pixel_shader,{USE_DIRT:""}):q._final_shader=new GL.Shader(GL.Shader.SCREEN_VERTEX_SHADER,q.final_pixel_shader));b.drawTo(function(){a.bind(0);
-k.bind(1);r&&(m.setUniform("u_dirt_factor",w),m.setUniform("u_dirt_texture",r.bind(2)));m.toViewport(g)})}GL.Texture.releaseTemporary(k)},q.cut_pixel_shader="precision highp float;\n\tvarying vec2 v_coord;\n\tuniform sampler2D u_texture;\n\tuniform float u_threshold;\n\tvoid main() {\n\t\tgl_FragColor = max( texture2D( u_texture, v_coord ) - vec4( u_threshold ), vec4(0.0) );\n\t}",q.scale_pixel_shader="precision highp float;\n\tvarying vec2 v_coord;\n\tuniform sampler2D u_texture;\n\tuniform vec2 u_texel_size;\n\tuniform float u_delta;\n\tuniform float u_intensity;\n\t\n\tvec4 sampleBox(vec2 uv) {\n\t\tvec4 o = u_texel_size.xyxy * vec2(-u_delta, u_delta).xxyy;\n\t\tvec4 s = texture2D( u_texture, uv + o.xy ) + texture2D( u_texture, uv + o.zy) + texture2D( u_texture, uv + o.xw) + texture2D( u_texture, uv + o.zw);\n\t\treturn s * 0.25;\n\t}\n\tvoid main() {\n\t\tgl_FragColor = u_intensity * sampleBox( v_coord );\n\t}",
+L.registerNodeType("texture/linear_depth",u),m.title="Blur",m.desc="Blur a texture",m.widgets_info={precision:{widget:"combo",values:c.MODE_VALUES}},m.max_iterations=20,m.prototype.onExecute=function(){var a=this.getInputData(0);if(a&&this.isOutputConnected(0)){var b=this._final_texture;b&&b.width==a.width&&b.height==a.height&&b.type==a.type||(b=this._final_texture=new GL.Texture(a.width,a.height,{type:a.type,format:gl.RGBA,filter:gl.LINEAR}));var d=this.properties.iterations;this.isInputConnected(1)&&
+(d=this.getInputData(1),this.properties.iterations=d);d=Math.min(Math.floor(d),m.max_iterations);if(0==d)this.setOutputData(0,a);else{var c=this.properties.intensity;this.isInputConnected(2)&&(c=this.getInputData(2),this.properties.intensity=c);var f=L.camera_aspect;f||void 0===window.gl||(f=gl.canvas.height/gl.canvas.width);f||(f=1);f=this.properties.preserve_aspect?f:1;var h=this.properties.scale||[1,1];a.applyBlur(f*h[0],h[1],c,b);for(a=1;a>=1;1<(h|0)&&(h>>=1);if(2>f)break;v=l[C]=GL.Texture.getTemporary(f,h,e);H[0]=1/k.width;H[1]=1/k.height;k.blit(v,n.uniforms(g));k=v}c&&(H[0]=1/k.width,H[1]=1/k.height,g.u_intensity=u,g.u_delta=1,k.blit(c,n.uniforms(g)));gl.enable(gl.BLEND);gl.blendFunc(gl.ONE,gl.ONE);g.u_intensity=this.persistence;
+g.u_delta=.5;for(C-=2;0<=C;C--)v=l[C],l[C]=null,H[0]=1/k.width,H[1]=1/k.height,k.blit(v,n.uniforms(g)),GL.Texture.releaseTemporary(k),k=v;gl.disable(gl.BLEND);d&&k.blit(d);if(b){var r=this.dirt_texture,w=this.dirt_factor;g.u_intensity=u;n=r?q._dirt_final_shader:q._final_shader;n||(n=r?q._dirt_final_shader=new GL.Shader(GL.Shader.SCREEN_VERTEX_SHADER,q.final_pixel_shader,{USE_DIRT:""}):q._final_shader=new GL.Shader(GL.Shader.SCREEN_VERTEX_SHADER,q.final_pixel_shader));b.drawTo(function(){a.bind(0);
+k.bind(1);r&&(n.setUniform("u_dirt_factor",w),n.setUniform("u_dirt_texture",r.bind(2)));n.toViewport(g)})}GL.Texture.releaseTemporary(k)},q.cut_pixel_shader="precision highp float;\n\tvarying vec2 v_coord;\n\tuniform sampler2D u_texture;\n\tuniform float u_threshold;\n\tvoid main() {\n\t\tgl_FragColor = max( texture2D( u_texture, v_coord ) - vec4( u_threshold ), vec4(0.0) );\n\t}",q.scale_pixel_shader="precision highp float;\n\tvarying vec2 v_coord;\n\tuniform sampler2D u_texture;\n\tuniform vec2 u_texel_size;\n\tuniform float u_delta;\n\tuniform float u_intensity;\n\t\n\tvec4 sampleBox(vec2 uv) {\n\t\tvec4 o = u_texel_size.xyxy * vec2(-u_delta, u_delta).xxyy;\n\t\tvec4 s = texture2D( u_texture, uv + o.xy ) + texture2D( u_texture, uv + o.zy) + texture2D( u_texture, uv + o.xw) + texture2D( u_texture, uv + o.zw);\n\t\treturn s * 0.25;\n\t}\n\tvoid main() {\n\t\tgl_FragColor = u_intensity * sampleBox( v_coord );\n\t}",
q.final_pixel_shader="precision highp float;\n\tvarying vec2 v_coord;\n\tuniform sampler2D u_texture;\n\tuniform sampler2D u_glow_texture;\n\t#ifdef USE_DIRT\n\t\tuniform sampler2D u_dirt_texture;\n\t#endif\n\tuniform vec2 u_texel_size;\n\tuniform float u_delta;\n\tuniform float u_intensity;\n\tuniform float u_dirt_factor;\n\t\n\tvec4 sampleBox(vec2 uv) {\n\t\tvec4 o = u_texel_size.xyxy * vec2(-u_delta, u_delta).xxyy;\n\t\tvec4 s = texture2D( u_glow_texture, uv + o.xy ) + texture2D( u_glow_texture, uv + o.zy) + texture2D( u_glow_texture, uv + o.xw) + texture2D( u_glow_texture, uv + o.zw);\n\t\treturn s * 0.25;\n\t}\n\tvoid main() {\n\t\tvec4 glow = sampleBox( v_coord );\n\t\t#ifdef USE_DIRT\n\t\t\tglow = mix( glow, glow * texture2D( u_dirt_texture, v_coord ), u_dirt_factor );\n\t\t#endif\n\t\tgl_FragColor = texture2D( u_texture, v_coord ) + u_intensity * glow;\n\t}",
N.title="Glow",N.desc="Filters a texture giving it a glow effect",N.widgets_info={iterations:{type:"number",min:0,max:16,step:1,precision:0},threshold:{type:"number",min:0,max:10,step:.01,precision:2},precision:{widget:"combo",values:c.MODE_VALUES}},N.prototype.onGetInputs=function(){return[["enabled","boolean"],["threshold","number"],["intensity","number"],["persistence","number"],["iterations","number"],["dirt_factor","number"]]},N.prototype.onGetOutputs=function(){return[["average","Texture"]]},
N.prototype.onExecute=function(){var a=this.getInputData(0);if(a&&this.isAnyOutputConnected())if(this.properties.precision===c.PASS_THROUGH||!1===this.getInputOrProperty("enabled"))this.setOutputData(0,a);else{var b=this.fx;b.threshold=this.getInputOrProperty("threshold");b.iterations=this.getInputOrProperty("iterations");b.intensity=this.getInputOrProperty("intensity");b.persistence=this.getInputOrProperty("persistence");b.dirt_texture=this.getInputData(1);b.dirt_factor=this.getInputOrProperty("dirt_factor");
@@ -583,8 +589,8 @@ function(a,b){"facingMode"==a&&(this.properties.facingMode=b,this.closeStream(),
this._video_texture);this.setOutputData(0,this._video_texture);for(a=1;aTex",E.desc="Generates or applies a curve to a texture",E.widgets_info={precision:{widget:"combo",values:c.MODE_VALUES}},E.prototype.onExecute=function(){if(this.isOutputConnected(0)){var a=this.getInputData(0);if(a){var b=this.properties.channels,d=this.properties.width,f=this.properties.height;d&&f||(d=Math.floor(a.length/b),f=1);var h=gl.RGBA;3==b?h=gl.RGB:1==b&&(h=gl.LUMINANCE);b=this._temp_texture;var e=c.getTextureType(this.properties.precision);
-b&&b.width==d&&b.height==f&&b.type==e||(b=this._temp_texture=new GL.Texture(d,f,{type:e,format:h,filter:gl.LINEAR}));b.uploadData(a);this.setOutputData(0,b)}}},L.registerNodeType("texture/fromdata",E),H.title="Curve",H.desc="Generates or applies a curve to a texture",H.widgets_info={precision:{widget:"combo",values:c.MODE_VALUES}},H.prototype.onExecute=function(){if(this.isOutputConnected(0)){var a=this.getInputData(0),b=this._temp_texture;if(a){var d=c.getTextureType(this.properties.precision,a);
+L.registerNodeType("texture/lensfx",J),C.title="Data->Tex",C.desc="Generates or applies a curve to a texture",C.widgets_info={precision:{widget:"combo",values:c.MODE_VALUES}},C.prototype.onExecute=function(){if(this.isOutputConnected(0)){var a=this.getInputData(0);if(a){var b=this.properties.channels,d=this.properties.width,f=this.properties.height;d&&f||(d=Math.floor(a.length/b),f=1);var h=gl.RGBA;3==b?h=gl.RGB:1==b&&(h=gl.LUMINANCE);b=this._temp_texture;var e=c.getTextureType(this.properties.precision);
+b&&b.width==d&&b.height==f&&b.type==e||(b=this._temp_texture=new GL.Texture(d,f,{type:e,format:h,filter:gl.LINEAR}));b.uploadData(a);this.setOutputData(0,b)}}},L.registerNodeType("texture/fromdata",C),H.title="Curve",H.desc="Generates or applies a curve to a texture",H.widgets_info={precision:{widget:"combo",values:c.MODE_VALUES}},H.prototype.onExecute=function(){if(this.isOutputConnected(0)){var a=this.getInputData(0),b=this._temp_texture;if(a){var d=c.getTextureType(this.properties.precision,a);
b&&b.type==d&&b.width==a.width&&b.height==a.height&&b.format==a.format||(b=this._temp_texture=new GL.Texture(a.width,a.height,{type:d,format:a.format,filter:gl.LINEAR}));var f=H._shader;f||(f=H._shader=new GL.Shader(GL.Shader.SCREEN_VERTEX_SHADER,H.pixel_shader));!this._must_update&&this._curve_texture||this.updateCurve();var h=this._uniforms,e=this._curve_texture;b.drawTo(function(){gl.disable(gl.DEPTH_TEST);a.bind(0);e.bind(1);f.uniforms(h).draw(GL.Mesh.getScreenQuad())});this.setOutputData(0,b)}else!this._must_update&&
this._curve_texture||this.updateCurve(),this.setOutputData(0,this._curve_texture)}},H.prototype.sampleCurve=function(a,b){if(b=b||this._points.RGB){for(var d=0;dMath.abs(b))return c[1];a=(a-c[0])/b;return c[1]*(1-a)+f[1]*a}}return 0}},H.prototype.updateCurve=function(){for(var a=this._values,b=a.length/4,d=this.properties.split_channels,c=0;c= res)\n\t\t\t\t\tbreak;\n\t\t\t\tiCount++;\n\t\t\t}\n\t\t\tfloat nf = n/normK;\n\t\t\treturn nf*nf*nf*nf;\n\t\t}\n\t\tvoid main() {\n\t\t\tvec2 uv = v_coord * u_scale * u_viewport + u_offset * u_scale;\n\t\t\tvec4 color = vec4( pNoise( uv, u_octaves ) * u_amplitude );\n\t\t\tgl_FragColor = color;\n\t\t}",
+this.properties.width|0,b=this.properties.height|0;0==a&&(a=gl.viewport_data[2]);0==b&&(b=gl.viewport_data[3]);var d=c.getTextureType(this.properties.precision),f=this._texture;f&&f.width==a&&f.height==b&&f.type==d||(f=this._texture=new GL.Texture(a,b,{type:d,format:gl.RGB,filter:gl.LINEAR}));var h=this.getInputOrProperty("persistence"),e=this.getInputOrProperty("octaves"),g=this.getInputOrProperty("offset"),l=this.getInputOrProperty("scale"),n=this.getInputOrProperty("amplitude"),v=this.getInputOrProperty("seed");
+d=""+a+b+d+h+e+l+v+g[0]+g[1]+n;if(d!=this._key){this._key=d;var k=this._uniforms;k.u_persistence=h;k.u_octaves=e;k.u_offset.set(g);k.u_scale=l;k.u_amplitude=n;k.u_seed=128*v;k.u_viewport[0]=a;k.u_viewport[1]=b;var m=S._shader;m||(m=S._shader=new GL.Shader(GL.Shader.SCREEN_VERTEX_SHADER,S.pixel_shader));gl.disable(gl.BLEND);gl.disable(gl.DEPTH_TEST);f.drawTo(function(){m.uniforms(k).draw(GL.Mesh.getScreenQuad())})}this.setOutputData(0,f)}},S.pixel_shader="precision highp float;\n\t\tvarying vec2 v_coord;\n\t\tuniform vec2 u_offset;\n\t\tuniform float u_scale;\n\t\tuniform float u_persistence;\n\t\tuniform int u_octaves;\n\t\tuniform float u_amplitude;\n\t\tuniform vec2 u_viewport;\n\t\tuniform float u_seed;\n\t\t#define M_PI 3.14159265358979323846\n\t\t\n\t\tfloat rand(vec2 c){\treturn fract(sin(dot(c.xy ,vec2( 12.9898 + u_seed,78.233 + u_seed))) * 43758.5453); }\n\t\t\n\t\tfloat noise(vec2 p, float freq ){\n\t\t\tfloat unit = u_viewport.x/freq;\n\t\t\tvec2 ij = floor(p/unit);\n\t\t\tvec2 xy = mod(p,unit)/unit;\n\t\t\t//xy = 3.*xy*xy-2.*xy*xy*xy;\n\t\t\txy = .5*(1.-cos(M_PI*xy));\n\t\t\tfloat a = rand((ij+vec2(0.,0.)));\n\t\t\tfloat b = rand((ij+vec2(1.,0.)));\n\t\t\tfloat c = rand((ij+vec2(0.,1.)));\n\t\t\tfloat d = rand((ij+vec2(1.,1.)));\n\t\t\tfloat x1 = mix(a, b, xy.x);\n\t\t\tfloat x2 = mix(c, d, xy.x);\n\t\t\treturn mix(x1, x2, xy.y);\n\t\t}\n\t\t\n\t\tfloat pNoise(vec2 p, int res){\n\t\t\tfloat persistance = u_persistence;\n\t\t\tfloat n = 0.;\n\t\t\tfloat normK = 0.;\n\t\t\tfloat f = 4.;\n\t\t\tfloat amp = 1.0;\n\t\t\tint iCount = 0;\n\t\t\tfor (int i = 0; i<50; i++){\n\t\t\t\tn+=amp*noise(p, f);\n\t\t\t\tf*=2.;\n\t\t\t\tnormK+=amp;\n\t\t\t\tamp*=persistance;\n\t\t\t\tif (iCount >= res)\n\t\t\t\t\tbreak;\n\t\t\t\tiCount++;\n\t\t\t}\n\t\t\tfloat nf = n/normK;\n\t\t\treturn nf*nf*nf*nf;\n\t\t}\n\t\tvoid main() {\n\t\t\tvec2 uv = v_coord * u_scale * u_viewport + u_offset * u_scale;\n\t\t\tvec4 color = vec4( pNoise( uv, u_octaves ) * u_amplitude );\n\t\t\tgl_FragColor = color;\n\t\t}",
L.registerNodeType("texture/perlin",S),R.title="Canvas2D",R.desc="Executes Canvas2D code inside a texture or the viewport.",R.help="Set width and height to 0 to match viewport size.",R.default_code="//vars: canvas,ctx,time\nctx.fillStyle='red';\nctx.fillRect(0,0,50,50);\n",R.widgets_info={precision:{widget:"combo",values:c.MODE_VALUES},code:{type:"code"},width:{type:"number",precision:0,step:1},height:{type:"number",precision:0,step:1}},R.prototype.onPropertyChanged=function(a,b){"code"==a&&this.compileCode(b)},
R.prototype.compileCode=function(a){this._func=null;if(L.allow_scripts)try{this._func=new Function("canvas","ctx","time","script","v",a),this.boxcolor="#00FF00"}catch(X){this.boxcolor="#FF0000",console.error("Error parsing script"),console.error(X)}},R.prototype.onExecute=function(){var a=this._func;a&&this.isOutputConnected(0)&&this.executeDraw(a)},R.prototype.executeDraw=function(a){var b=this.properties.width||gl.canvas.width,d=this.properties.height||gl.canvas.height,f=this._temp_texture,h=c.getTextureType(this.properties.precision);
-f&&f.width==b&&f.height==d&&f.type==h||(f=this._temp_texture=new GL.Texture(b,d,{format:gl.RGBA,filter:gl.LINEAR,type:h}));var e=this.getInputData(0),g=this.properties,l=this,m=this.graph.getTime(),k=gl,v=gl.canvas;if(this.properties.use_html_canvas||!y.enableWebGLCanvas)this._canvas?(v=this._canvas,k=this._ctx):(v=this._canvas=createCanvas(b.height),k=this._ctx=v.getContext("2d")),v.width=b,v.height=d;if(k==gl)f.drawTo(function(){gl.start2D();g.clear&&(gl.clearColor(0,0,0,0),gl.clear(gl.COLOR_BUFFER_BIT));
-try{a.draw?a.draw.call(l,v,k,m,a,e):a.call(l,v,k,m,a,e),l.boxcolor="#00FF00"}catch(V){l.boxcolor="#FF0000",console.error("Error executing script"),console.error(V)}gl.finish2D()});else{g.clear&&k.clearRect(0,0,v.width,v.height);try{a.draw?a.draw.call(this,v,k,m,a,e):a.call(this,v,k,m,a,e),this.boxcolor="#00FF00"}catch(V){this.boxcolor="#FF0000",console.error("Error executing script"),console.error(V)}f.uploadImage(v)}this.setOutputData(0,f)},L.registerNodeType("texture/canvas2D",R),T.title="Matte",
+f&&f.width==b&&f.height==d&&f.type==h||(f=this._temp_texture=new GL.Texture(b,d,{format:gl.RGBA,filter:gl.LINEAR,type:h}));var e=this.getInputData(0),g=this.properties,l=this,n=this.graph.getTime(),v=gl,k=gl.canvas;if(this.properties.use_html_canvas||!y.enableWebGLCanvas)this._canvas?(k=this._canvas,v=this._ctx):(k=this._canvas=createCanvas(b.height),v=this._ctx=k.getContext("2d")),k.width=b,k.height=d;if(v==gl)f.drawTo(function(){gl.start2D();g.clear&&(gl.clearColor(0,0,0,0),gl.clear(gl.COLOR_BUFFER_BIT));
+try{a.draw?a.draw.call(l,k,v,n,a,e):a.call(l,k,v,n,a,e),l.boxcolor="#00FF00"}catch(V){l.boxcolor="#FF0000",console.error("Error executing script"),console.error(V)}gl.finish2D()});else{g.clear&&v.clearRect(0,0,k.width,k.height);try{a.draw?a.draw.call(this,k,v,n,a,e):a.call(this,k,v,n,a,e),this.boxcolor="#00FF00"}catch(V){this.boxcolor="#FF0000",console.error("Error executing script"),console.error(V)}f.uploadImage(k)}this.setOutputData(0,f)},L.registerNodeType("texture/canvas2D",R),T.title="Matte",
T.desc="Extracts background",T.widgets_info={key_color:{widget:"color"},precision:{widget:"combo",values:c.MODE_VALUES}},T.prototype.onExecute=function(){if(this.isOutputConnected(0)){var a=this.getInputData(0);if(this.properties.precision===c.PASS_THROUGH)this.setOutputData(0,a);else if(a){this._tex=c.getTargetTexture(a,this._tex,this.properties.precision);gl.disable(gl.BLEND);gl.disable(gl.DEPTH_TEST);this._uniforms||(this._uniforms={u_texture:0,u_key_color:this.properties.key_color,u_threshold:1,
u_slope:1});var b=this._uniforms,d=Mesh.getScreenQuad(),f=T._shader;f||(f=T._shader=new GL.Shader(GL.Shader.SCREEN_VERTEX_SHADER,T.pixel_shader));b.u_key_color=this.properties.key_color;b.u_threshold=this.properties.threshold;b.u_slope=this.properties.slope;this._tex.drawTo(function(){a.bind(0);f.uniforms(b).draw(d)});this.setOutputData(0,this._tex)}}},T.pixel_shader="precision highp float;\n\t\tvarying vec2 v_coord;\n\t\tuniform sampler2D u_texture;\n\t\tuniform vec3 u_key_color;\n\t\tuniform float u_threshold;\n\t\tuniform float u_slope;\n\t\t\n\t\tvoid main() {\n\t\t\tvec3 color = texture2D( u_texture, v_coord ).xyz;\n\t\t\tfloat diff = length( normalize(color) - normalize(u_key_color) );\n\t\t\tfloat edge = u_threshold * (1.0 - u_slope);\n\t\t\tfloat alpha = smoothstep( edge, u_threshold, diff);\n\t\t\tgl_FragColor = vec4( color, alpha );\n\t\t}",
L.registerNodeType("texture/matte",T),U.title="CubemapToTexture2D",U.desc="Transforms a CUBEMAP texture into a TEXTURE2D in Polar Representation",U.prototype.onExecute=function(){if(this.isOutputConnected(0)){var a=this.getInputData(0);if(a&&a.texture_type==GL.TEXTURE_CUBE_MAP){!this._last_tex||this._last_tex.height==a.height&&this._last_tex.type==a.type||(this._last_tex=null);var b=this.getInputOrProperty("yaw");this._last_tex=GL.Texture.cubemapToTexture2D(a,a.height,this._last_tex,!0,b);this.setOutputData(0,
@@ -612,13 +618,13 @@ this._last_tex)}}},L.registerNodeType("texture/cubemapToTexture2D",U))})(this);
function(a){this.shader_destination[a]=!0;if(this.inputs)for(var b=0;bd+f.NODE_TITLE_HEIGHT&&a.drawImage(b,10,h,this.size[0]-20,this.size[1]-d-f.NODE_TITLE_HEIGHT);var h=this.size[1]-f.NODE_TITLE_HEIGHT+.5;c=f.isInsideRectangle(c[0],c[1],this.pos[0],this.pos[1]+h,this.size[0],f.NODE_TITLE_HEIGHT);a.fillStyle=c?"#555":"#222";a.beginPath();this._shape==f.BOX_SHAPE?a.rect(0,h,this.size[0]+1,f.NODE_TITLE_HEIGHT):a.roundRect(0,h,this.size[0]+1,f.NODE_TITLE_HEIGHT,0,8);a.fill();a.textAlign="center";a.font="24px Arial";a.fillStyle=
c?"#DDD":"#999";a.fillText("+",.5*this.size[0],h+24)}};B.prototype.onMouseDown=function(a,b,d){b[1]>this.size[1]-f.NODE_TITLE_HEIGHT+.5&&d.showSubgraphPropertiesDialog(this)};B.prototype.onDrawSubgraphBackground=function(a){};B.prototype.getExtraMenuOptions=function(a){var b=this;return[{content:"Print Code",callback:function(){var a=b._context.computeShaderCode();console.log(a.vs_code,a.fs_code)}}]};f.registerNodeType("texture/shaderGraph",B);z.title="Uniform";z.desc="Input data for the shader";
z.prototype.getTitle=function(){return this.properties.name&&this.flags.collapsed?this.properties.type+" "+this.properties.name:"Uniform"};z.prototype.onPropertyChanged=function(a,b){this.outputs[0].name=this.properties.type+" "+this.properties.name};z.prototype.onGetCode=function(a){if(this.shader_destination){var b=this.properties.type;if(!b){if(!a.onGetPropertyInfo)return;b=a.onGetPropertyInfo(this.property.name);if(!b)return;b=b.type}"number"==b?b="float":"texture"==b&&(b="sampler2D");-1!=u.GLSL_types.indexOf(b)&&
-(a.addUniform("u_"+this.properties.name,b),this.setOutputData(0,b))}};z.prototype.getOutputVarName=function(a){return"u_"+this.properties.name};k("input/uniform",z);G.title="Attribute";G.desc="Input data from mesh attribute";G.prototype.getTitle=function(){return"att. "+this.properties.name};G.prototype.onGetCode=function(a){if(this.shader_destination){var b=this.properties.type;b&&-1!=u.GLSL_types.indexOf(b)&&("number"==b&&(b="float"),"coord"!=this.properties.name&&a.addCode("varying"," varying "+
-b+" v_"+this.properties.name+";"),this.setOutputData(0,b))}};G.prototype.getOutputVarName=function(a){return"v_"+this.properties.name};k("input/attribute",G);A.title="Sampler2D";A.desc="Reads a pixel from a texture";A.prototype.onGetCode=function(a){if(this.shader_destination){var b=r(this,0),d=t(this),c="vec4 "+d+" = vec4(0.0);\n";if(b){var f=r(this,1)||a.buffer_names.uvs;c+=d+" = texture2D("+b+","+f+");\n"}w(this,0)&&(c+="vec4 "+w(this,0)+" = "+d+";\n");w(this,1)&&(c+="vec3 "+w(this,1)+" = "+d+
-".xyz;\n");a.addCode("code",c,this.shader_destination);this.setOutputData(0,"vec4");this.setOutputData(1,"vec3")}};k("texture/sampler2D",A);C.title="const";C.prototype.getTitle=function(){return this.flags.collapsed?M(this.properties.value,this.properties.type,2):"Const"};C.prototype.onPropertyChanged=function(a,b){"type"==a&&(this.outputs[0].type!=b&&(this.disconnectOutput(0),this.outputs[0].type=b),this.widgets.length=1,this.updateWidgets());"value"==a&&(b.length?(this.widgets[1].value=b[1],2d;++d)b.push({name:r(this,d),type:this.getInputData(d)||"float"});var c=w(this,0);if(c){var f=b[0].type,h=this.properties.operation,
e=[];for(d=0;2>d;++d){var g=b[d].name;null==g&&(g=null!=p.value?p.value:"(1.0)",b[d].type="float");b[d].type!=f&&("float"!=b[d].type||"*"!=h&&"/"!=h)&&(g=J(g,b[d].type,f));e.push(g)}a.addCode("code",f+" "+c+" = "+e[0]+h+e[1]+";",this.shader_destination);this.setOutputData(0,f)}}};k("math/operation",K);l.title="Func";l.prototype.onPropertyChanged=function(a,b){this.graph&&this.graph._version++;if("func"==a&&(a=N[b])){for(b=a.params.length;bd;++d)b.push({name:r(this,d),type:this.getInputData(d)||"float"});var c=w(this,0);if(c){var f=N[this.properties.func];if(f){var h=b[0].type,e=f.return_type;"T"==e&&(e=h);var g=[];for(d=
-0;d x0.y) ? vec2(1.0, 0.0) : vec2(0.0, 1.0);\n\r\n vec4 x12 = x0.xyxy + C.xxzz;\n\r\n x12.xy -= i1;\n\r\n i = mod(i, 289.0);\n\r\n vec3 p = permute( permute( i.y + vec3(0.0, i1.y, 1.0 ))\n\r\n + i.x + vec3(0.0, i1.x, 1.0 ));\n\r\n vec3 m = max(0.5 - vec3(dot(x0,x0), dot(x12.xy,x12.xy),dot(x12.zw,x12.zw)), 0.0);\n\r\n m = m*m ;\n\r\n m = m*m ;\n\r\n vec3 x = 2.0 * fract(p * C.www) - 1.0;\n\r\n vec3 h = abs(x) - 0.5;\n\r\n vec3 ox = floor(x + 0.5);\n\r\n vec3 a0 = x - ox;\n\r\n m *= 1.79284291400159 - 0.85373472095314 * ( a0*a0 + h*h );\n\r\n vec3 g;\n\r\n g.x = a0.x * x0.x + h.x * x0.y;\n\r\n g.yz = a0.yz * x12.xz + h.yz * x12.yw;\n\r\n return 130.0 * dot(m, g);\n\r\n}\n\r\nvec4 permute(vec4 x){return mod(((x*34.0)+1.0)*x, 289.0);}\n\r\nvec4 taylorInvSqrt(vec4 r){return 1.79284291400159 - 0.85373472095314 * r;}\n\r\n\n\r\nfloat snoise(vec3 v){ \n\r\n const vec2 C = vec2(1.0/6.0, 1.0/3.0) ;\n\r\n const vec4 D = vec4(0.0, 0.5, 1.0, 2.0);\n\r\n\n\r\n// First corner\n\r\n vec3 i = floor(v + dot(v, C.yyy) );\n\r\n vec3 x0 = v - i + dot(i, C.xxx) ;\n\r\n\n\r\n// Other corners\n\r\n vec3 g = step(x0.yzx, x0.xyz);\n\r\n vec3 l = 1.0 - g;\n\r\n vec3 i1 = min( g.xyz, l.zxy );\n\r\n vec3 i2 = max( g.xyz, l.zxy );\n\r\n\n\r\n // x0 = x0 - 0. + 0.0 * C \n\r\n vec3 x1 = x0 - i1 + 1.0 * C.xxx;\n\r\n vec3 x2 = x0 - i2 + 2.0 * C.xxx;\n\r\n vec3 x3 = x0 - 1. + 3.0 * C.xxx;\n\r\n\n\r\n// Permutations\n\r\n i = mod(i, 289.0 ); \n\r\n vec4 p = permute( permute( permute( \n\r\n i.z + vec4(0.0, i1.z, i2.z, 1.0 ))\n\r\n + i.y + vec4(0.0, i1.y, i2.y, 1.0 )) \n\r\n + i.x + vec4(0.0, i1.x, i2.x, 1.0 ));\n\r\n\n\r\n// Gradients\n\r\n// ( N*N points uniformly over a square, mapped onto an octahedron.)\n\r\n float n_ = 1.0/7.0; // N=7\n\r\n vec3 ns = n_ * D.wyz - D.xzx;\n\r\n\n\r\n vec4 j = p - 49.0 * floor(p * ns.z *ns.z); // mod(p,N*N)\n\r\n\n\r\n vec4 x_ = floor(j * ns.z);\n\r\n vec4 y_ = floor(j - 7.0 * x_ ); // mod(j,N)\n\r\n\n\r\n vec4 x = x_ *ns.x + ns.yyyy;\n\r\n vec4 y = y_ *ns.x + ns.yyyy;\n\r\n vec4 h = 1.0 - abs(x) - abs(y);\n\r\n\n\r\n vec4 b0 = vec4( x.xy, y.xy );\n\r\n vec4 b1 = vec4( x.zw, y.zw );\n\r\n\n\r\n vec4 s0 = floor(b0)*2.0 + 1.0;\n\r\n vec4 s1 = floor(b1)*2.0 + 1.0;\n\r\n vec4 sh = -step(h, vec4(0.0));\n\r\n\n\r\n vec4 a0 = b0.xzyw + s0.xzyw*sh.xxyy ;\n\r\n vec4 a1 = b1.xzyw + s1.xzyw*sh.zzww ;\n\r\n\n\r\n vec3 p0 = vec3(a0.xy,h.x);\n\r\n vec3 p1 = vec3(a0.zw,h.y);\n\r\n vec3 p2 = vec3(a1.xy,h.z);\n\r\n vec3 p3 = vec3(a1.zw,h.w);\n\r\n\n\r\n//Normalise gradients\n\r\n vec4 norm = taylorInvSqrt(vec4(dot(p0,p0), dot(p1,p1), dot(p2, p2), dot(p3,p3)));\n\r\n p0 *= norm.x;\n\r\n p1 *= norm.y;\n\r\n p2 *= norm.z;\n\r\n p3 *= norm.w;\n\r\n\n\r\n// Mix final noise value\n\r\n vec4 m = max(0.6 - vec4(dot(x0,x0), dot(x1,x1), dot(x2,x2), dot(x3,x3)), 0.0);\n\r\n m = m * m;\n\r\n return 42.0 * dot( m*m, vec4( dot(p0,x0), dot(p1,x1),dot(p2,x2), dot(p3,x3) ) );\n\r\n}\n\r\n\n\r\nvec3 hash3( vec2 p ){\n\r\n vec3 q = vec3( dot(p,vec2(127.1,311.7)), \n\r\n\t\t\t\t dot(p,vec2(269.5,183.3)), \n\r\n\t\t\t\t dot(p,vec2(419.2,371.9)) );\n\r\n\treturn fract(sin(q)*43758.5453);\n\r\n}\n\r\nvec4 hash4( vec3 p ){\n\r\n vec4 q = vec4( dot(p,vec3(127.1,311.7,257.3)), \n\r\n\t\t\t\t dot(p,vec3(269.5,183.3,335.1)), \n\r\n\t\t\t\t dot(p,vec3(314.5,235.1,467.3)), \n\r\n\t\t\t\t dot(p,vec3(419.2,371.9,114.9)) );\n\r\n\treturn fract(sin(q)*43758.5453);\n\r\n}\n\r\n\n\r\nfloat iqnoise( in vec2 x, float u, float v ){\n\r\n vec2 p = floor(x);\n\r\n vec2 f = fract(x);\n\r\n\t\n\r\n\tfloat k = 1.0+63.0*pow(1.0-v,4.0);\n\r\n\t\n\r\n\tfloat va = 0.0;\n\r\n\tfloat wt = 0.0;\n\r\n for( int j=-2; j<=2; j++ )\n\r\n for( int i=-2; i<=2; i++ )\n\r\n {\n\r\n vec2 g = vec2( float(i),float(j) );\n\r\n\t\tvec3 o = hash3( p + g )*vec3(u,u,1.0);\n\r\n\t\tvec2 r = g - f + o.xy;\n\r\n\t\tfloat d = dot(r,r);\n\r\n\t\tfloat ww = pow( 1.0-smoothstep(0.0,1.414,sqrt(d)), k );\n\r\n\t\tva += o.z*ww;\n\r\n\t\twt += ww;\n\r\n }\n\r\n\t\n\r\n return va/wt;\n\r\n}\n\r\n";
b.title="Time";b.prototype.onGetCode=function(a){if(this.shader_destination&&this.isOutputConnected(0)){var b=w(this,0);a.addUniform("u_time"+this.id,"float",function(){return.001*getTime()});a.addCode("code","float "+b+" = u_time"+this.id+";",this.shader_destination);this.setOutputData(0,"float")}};k("input/time",b);d.title="Dither";d.prototype.onGetCode=function(a){if(this.shader_destination&&this.isOutputConnected(0)){var b=r(this,0),c=w(this,0),f=this.getInputData(0);b=I(b,f,"float");a.addFunction("dither8x8",
@@ -663,66 +669,66 @@ this.outputs[0].type=c;if("T"==c)console.warn("node type is T and cannot be reso
(function(y){function c(){return 1E5*Math.random()|0}function k(){this.addInput("obj","");this.addInput("radius","number");this.addOutput("out","geometry");this.addOutput("points","[vec3]");this.properties={radius:1,num_points:4096,generate_normals:!0,regular:!1,mode:k.SPHERE,force_update:!1};this.points=new Float32Array(3*this.properties.num_points);this.normals=new Float32Array(3*this.properties.num_points);this.must_update=!0;this.version=0;var a=this;this.addWidget("button","update",null,function(){a.must_update=
!0});this.geometry={vertices:null,_id:c()};this._last_radius=this._old_obj=null}function t(a,d){var b=a.length,c=0,e=0,g=b;if(0==b)return-1;if(1==b)return 0;for(;g>=c;){e=.5*(g+c)|0;b=a[e];if(b==d)break;if(c==g-1)return c;ba&&(a=1);this.points&&this.points.length==3*a||(this.points=new Float32Array(3*a));this.properties.generate_normals?this.normals&&this.normals.length==this.points.length||(this.normals=new Float32Array(this.points.length)):this.normals=null;var d=this._last_radius||this.properties.radius,c=this.properties.mode,f=this.getInputData(0);this._old_obj_version=f?f._version:null;this.points=k.generatePoints(d,a,c,this.points,this.normals,
-this.properties.regular,f);this.version++};k.generatePoints=function(a,d,c,f,e,g,l){var b=3*d;f&&f.length==b||(f=new Float32Array(b));var h=new Float32Array(3),m=new Float32Array([0,1,0]);if(g)if(c==k.RECTANGLE){b=Math.floor(Math.sqrt(d));for(d=0;dg||zl&&lm))break}this.geometry.indices=this.indices=new Uint32Array(k)}this.indices&&this.indices.length?(this.geometry.indices=this.indices,this.setOutputData(0,this.geometry)):this.setOutputData(0,null)}};x.registerNodeType("geometry/connectPoints",G);"undefined"!=typeof GL&&(A.title="to geometry",A.desc="converts a mesh to geometry",A.prototype.onExecute=function(){var a=this.getInputData(0);if(a){if(a!=this.last_mesh){this.last_mesh=a;for(i in a.vertexBuffers)this.geometry[i]=
-a.vertexBuffers[i].data;a.indexBuffers.triangles&&(this.geometry.indices=a.indexBuffers.triangles.data);this.geometry._id=c();this.geometry._version=0}this.setOutputData(0,this.geometry);this.geometry&&this.setOutputData(1,this.geometry.vertices)}},x.registerNodeType("geometry/toGeometry",A),C.title="Geo to Mesh",C.prototype.updateMesh=function(a){this.mesh||(this.mesh=new GL.Mesh);for(var b in a)if("_"!=b[0]){var c=a[b],f=GL.Mesh.common_buffers[b];if(f||"indices"==b){f=f?f.spacing:3;var e=this.mesh.vertexBuffers[b];
+0;fg||zl&&ln))break}this.geometry.indices=this.indices=new Uint32Array(k)}this.indices&&this.indices.length?(this.geometry.indices=this.indices,this.setOutputData(0,this.geometry)):this.setOutputData(0,null)}};x.registerNodeType("geometry/connectPoints",F);"undefined"!=typeof GL&&(A.title="to geometry",A.desc="converts a mesh to geometry",A.prototype.onExecute=function(){var a=this.getInputData(0);if(a){if(a!=this.last_mesh){this.last_mesh=a;for(i in a.vertexBuffers)this.geometry[i]=
+a.vertexBuffers[i].data;a.indexBuffers.triangles&&(this.geometry.indices=a.indexBuffers.triangles.data);this.geometry._id=c();this.geometry._version=0}this.setOutputData(0,this.geometry);this.geometry&&this.setOutputData(1,this.geometry.vertices)}},x.registerNodeType("geometry/toGeometry",A),D.title="Geo to Mesh",D.prototype.updateMesh=function(a){this.mesh||(this.mesh=new GL.Mesh);for(var b in a)if("_"!=b[0]){var c=a[b],f=GL.Mesh.common_buffers[b];if(f||"indices"==b){f=f?f.spacing:3;var e=this.mesh.vertexBuffers[b];
e&&e.data.length==c.length?(e.data.set(c),e.upload(GL.DYNAMIC_DRAW)):e=new GL.Buffer("indices"==b?GL.ELEMENT_ARRAY_BUFFER:GL.ARRAY_BUFFER,c,f,GL.DYNAMIC_DRAW);this.mesh.addBuffer(b,e)}}if(this.mesh.vertexBuffers.normals&&this.mesh.vertexBuffers.normals.data.length!=this.mesh.vertexBuffers.vertices.data.length){c=new Float32Array([0,1,0]);f=new Float32Array(this.mesh.vertexBuffers.vertices.data.length);for(b=0;b 0.45 )\n\r\n\t\t\t\t\t\tdiscard;\n\r\n\t\t\t\t#endif\n\r\n\t\t\t#endif\n\r\n\t\t\t#ifdef USE_COLOR\n\r\n\t\t\t\tcolor *= v_color;\n\r\n\t\t\t#endif\n\r\n\t\t\tgl_FragColor = color;\n\r\n\t\t}\r\n\t")})(this);
+x.registerNodeType("geometry/render_points",E),E.vertex_shader_code="\r\n\t\tprecision mediump float;\n\r\n\t\tattribute vec3 a_vertex;\n\r\n\t\tvarying vec3 v_vertex;\n\r\n\t\tattribute vec3 a_normal;\n\r\n\t\tvarying vec3 v_normal;\n\r\n\t\t#ifdef USE_COLOR\n\r\n\t\t\tattribute vec4 a_color;\n\r\n\t\t\tvarying vec4 v_color;\n\r\n\t\t#endif\n\r\n\t\tattribute vec2 a_coord;\n\r\n\t\tvarying vec2 v_coord;\n\r\n\t\t#ifdef USE_SIZE\n\r\n\t\t\tattribute float a_extra;\n\r\n\t\t#endif\n\r\n\t\t#ifdef USE_INSTANCING\n\r\n\t\t\tattribute mat4 u_model;\n\r\n\t\t#else\n\r\n\t\t\tuniform mat4 u_model;\n\r\n\t\t#endif\n\r\n\t\tuniform mat4 u_viewprojection;\n\r\n\t\tuniform float u_point_size;\n\r\n\t\tuniform float u_perspective;\n\r\n\t\tuniform float u_point_perspective;\n\r\n\t\tfloat computePointSize(float radius, float w)\n\r\n\t\t{\n\r\n\t\t\tif(radius < 0.0)\n\r\n\t\t\t\treturn -radius;\n\r\n\t\t\treturn u_perspective * radius / w;\n\r\n\t\t}\n\r\n\t\tvoid main() {\n\r\n\t\t\tv_coord = a_coord;\n\r\n\t\t\t#ifdef USE_COLOR\n\r\n\t\t\t\tv_color = a_color;\n\r\n\t\t\t#endif\n\r\n\t\t\tv_vertex = ( u_model * vec4( a_vertex, 1.0 )).xyz;\n\r\n\t\t\tv_normal = ( u_model * vec4( a_normal, 0.0 )).xyz;\n\r\n\t\t\tgl_Position = u_viewprojection * vec4(v_vertex,1.0);\n\r\n\t\t\tgl_PointSize = u_point_size;\n\r\n\t\t\t#ifdef USE_SIZE\n\r\n\t\t\t\tgl_PointSize = a_extra;\n\r\n\t\t\t#endif\n\r\n\t\t\tif(u_point_perspective != 0.0)\n\r\n\t\t\t\tgl_PointSize = computePointSize( gl_PointSize, gl_Position.w );\n\r\n\t\t}\r\n\t",
+E.fragment_shader_code="\r\n\t\tprecision mediump float;\n\r\n\t\tuniform vec4 u_color;\n\r\n\t\t#ifdef USE_COLOR\n\r\n\t\t\tvarying vec4 v_color;\n\r\n\t\t#endif\n\r\n\t\tvarying vec2 v_coord;\n\r\n\t\tuniform sampler2D u_texture;\n\r\n\t\tvoid main() {\n\r\n\t\t\tvec4 color = u_color;\n\r\n\t\t\t#ifdef USE_TEXTURED_POINTS\n\r\n\t\t\t\tcolor *= texture2D(u_texture, gl_PointCoord.xy);\n\r\n\t\t\t#else\n\r\n\t\t\t\t#ifdef USE_TEXTURE\n\r\n\t\t\t\t color *= texture2D(u_texture, v_coord);\n\r\n\t\t\t\t if(color.a < 0.1)\n\r\n\t\t\t\t\tdiscard;\n\r\n\t\t\t\t#endif\n\r\n\t\t\t\t#ifdef USE_POINTS\n\r\n\t\t\t\t\tfloat dist = length( gl_PointCoord.xy - vec2(0.5) );\n\r\n\t\t\t\t\tif( dist > 0.45 )\n\r\n\t\t\t\t\t\tdiscard;\n\r\n\t\t\t\t#endif\n\r\n\t\t\t#endif\n\r\n\t\t\t#ifdef USE_COLOR\n\r\n\t\t\t\tcolor *= v_color;\n\r\n\t\t\t#endif\n\r\n\t\t\tgl_FragColor = color;\n\r\n\t\t}\r\n\t")})(this);
(function(y){var c=y.LiteGraph,k=y.LGraphTexture;if("undefined"!=typeof GL){var t=function(){this.addInput("Tex.","Texture");this.addInput("intensity","number");this.addOutput("Texture","Texture");this.properties={intensity:1,invert:!1,precision:k.DEFAULT};t._shader||(t._shader=new GL.Shader(Shader.SCREEN_VERTEX_SHADER,t.pixel_shader))},r=function(){this.addInput("Texture","Texture");this.addInput("value1","number");this.addInput("value2","number");this.addOutput("Texture","Texture");this.properties=
{fx:"halftone",value1:1,value2:1,precision:k.DEFAULT}},w=function(){this.addInput("Texture","Texture");this.addInput("Blurred","Texture");this.addInput("Mask","Texture");this.addInput("Threshold","number");this.addOutput("Texture","Texture");this.properties={shape:"",size:10,alpha:1,threshold:1,high_precision:!1}},g=function(){this.addInput("Texture","Texture");this.addInput("Aberration","number");this.addInput("Distortion","number");this.addInput("Blur","number");this.addOutput("Texture","Texture");
this.properties={aberration:1,distortion:1,blur:1,precision:k.DEFAULT};g._shader||(g._shader=new GL.Shader(GL.Shader.SCREEN_VERTEX_SHADER,g.pixel_shader),g._texture=new GL.Texture(3,1,{format:gl.RGB,wrap:gl.CLAMP_TO_EDGE,magFilter:gl.LINEAR,minFilter:gl.LINEAR,pixel_data:[255,0,0,0,255,0,0,0,255]}))};g.title="Lens";g.desc="Camera Lens distortion";g.widgets_info={precision:{widget:"combo",values:k.MODE_VALUES}};g.prototype.onExecute=function(){var c=this.getInputData(0);if(this.properties.precision===
k.PASS_THROUGH)this.setOutputData(0,c);else if(c){this._tex=k.getTargetTexture(c,this._tex,this.properties.precision);var r=this.properties.aberration;this.isInputConnected(1)&&(r=this.getInputData(1),this.properties.aberration=r);var w=this.properties.distortion;this.isInputConnected(2)&&(w=this.getInputData(2),this.properties.distortion=w);var t=this.properties.blur;this.isInputConnected(3)&&(t=this.getInputData(3),this.properties.blur=t);gl.disable(gl.BLEND);gl.disable(gl.DEPTH_TEST);var y=Mesh.getScreenQuad(),
e=g._shader;this._tex.drawTo(function(){c.bind(0);e.uniforms({u_texture:0,u_aberration:r,u_distortion:w,u_blur:t}).draw(y)});this.setOutputData(0,this._tex)}};g.pixel_shader="precision highp float;\n\r\n\t\t\tprecision highp float;\n\r\n\t\t\tvarying vec2 v_coord;\n\r\n\t\t\tuniform sampler2D u_texture;\n\r\n\t\t\tuniform vec2 u_camera_planes;\n\r\n\t\t\tuniform float u_aberration;\n\r\n\t\t\tuniform float u_distortion;\n\r\n\t\t\tuniform float u_blur;\n\r\n\t\t\t\n\r\n\t\t\tvoid main() {\n\r\n\t\t\t\tvec2 coord = v_coord;\n\r\n\t\t\t\tfloat dist = distance(vec2(0.5), coord);\n\r\n\t\t\t\tvec2 dist_coord = coord - vec2(0.5);\n\r\n\t\t\t\tfloat percent = 1.0 + ((0.5 - dist) / 0.5) * u_distortion;\n\r\n\t\t\t\tdist_coord *= percent;\n\r\n\t\t\t\tcoord = dist_coord + vec2(0.5);\n\r\n\t\t\t\tvec4 color = texture2D(u_texture,coord, u_blur * dist);\n\r\n\t\t\t\tcolor.r = texture2D(u_texture,vec2(0.5) + dist_coord * (1.0+0.01*u_aberration), u_blur * dist ).r;\n\r\n\t\t\t\tcolor.b = texture2D(u_texture,vec2(0.5) + dist_coord * (1.0-0.01*u_aberration), u_blur * dist ).b;\n\r\n\t\t\t\tgl_FragColor = color;\n\r\n\t\t\t}\n\r\n\t\t\t";
c.registerNodeType("fx/lens",g);y.LGraphFXLens=g;w.title="Bokeh";w.desc="applies an Bokeh effect";w.widgets_info={shape:{widget:"texture"}};w.prototype.onExecute=function(){var c=this.getInputData(0),g=this.getInputData(1),r=this.getInputData(2);if(c&&r&&this.properties.shape){g||(g=c);var t=k.getTexture(this.properties.shape);if(t){var y=this.properties.threshold;this.isInputConnected(3)&&(y=this.getInputData(3),this.properties.threshold=y);var e=gl.UNSIGNED_BYTE;this.properties.high_precision&&
-(e=gl.half_float_ext?gl.HALF_FLOAT_OES:gl.FLOAT);this._temp_texture&&this._temp_texture.type==e&&this._temp_texture.width==c.width&&this._temp_texture.height==c.height||(this._temp_texture=new GL.Texture(c.width,c.height,{type:e,format:gl.RGBA,filter:gl.LINEAR}));var F=w._first_shader;F||(F=w._first_shader=new GL.Shader(Shader.SCREEN_VERTEX_SHADER,w._first_pixel_shader));var D=w._second_shader;D||(D=w._second_shader=new GL.Shader(w._second_vertex_shader,w._second_pixel_shader));var x=this._points_mesh;
-x&&x._width==c.width&&x._height==c.height&&2==x._spacing||(x=this.createPointsMesh(c.width,c.height,2));var K=Mesh.getScreenQuad(),l=this.properties.size,m=this.properties.alpha;gl.disable(gl.DEPTH_TEST);gl.disable(gl.BLEND);this._temp_texture.drawTo(function(){c.bind(0);g.bind(1);r.bind(2);F.uniforms({u_texture:0,u_texture_blur:1,u_mask:2,u_texsize:[c.width,c.height]}).draw(K)});this._temp_texture.drawTo(function(){gl.enable(gl.BLEND);gl.blendFunc(gl.ONE,gl.ONE);c.bind(0);t.bind(3);D.uniforms({u_texture:0,
-u_mask:2,u_shape:3,u_alpha:m,u_threshold:y,u_pointSize:l,u_itexsize:[1/c.width,1/c.height]}).draw(x,gl.POINTS)});this.setOutputData(0,this._temp_texture)}}else this.setOutputData(0,c)};w.prototype.createPointsMesh=function(c,g,k){for(var r=Math.round(c/k),w=Math.round(g/k),e=new Float32Array(r*w*2),t=-1,z=2/c*k,x=2/g*k,y=0;y=c.NOTEON||g<=c.NOTEOFF)this.channel=e&15};Object.defineProperty(c.prototype,"velocity",{get:function(){return this.cmd==c.NOTEON?this.data[2]:-1},set:function(c){this.data[2]=c},enumerable:!0});c.notes="A A# B C C# D D# E F F# G G#".split(" ");c.note_to_index={A:0,"A#":1,B:2,C:3,"C#":4,D:5,"D#":6,E:7,F:8,"F#":9,G:10,"G#":11};Object.defineProperty(c.prototype,"note",{get:function(){return this.cmd!=
c.NOTEON?-1:c.toNoteString(this.data[1],!0)},set:function(c){throw"notes cannot be assigned this way, must modify the data[1]";},enumerable:!0});Object.defineProperty(c.prototype,"octave",{get:function(){return this.cmd!=c.NOTEON?-1:Math.floor((this.data[1]-24)/12+1)},set:function(c){throw"octave cannot be assigned this way, must modify the data[1]";},enumerable:!0});c.prototype.getPitch=function(){return 440*Math.pow(2,(this.data[1]-69)/12)};c.computePitch=function(c){return 440*Math.pow(2,(c-69)/
12)};c.prototype.getCC=function(){return this.data[1]};c.prototype.getCCValue=function(){return this.data[2]};c.prototype.getPitchBend=function(){return this.data[1]+(this.data[2]<<7)-8192};c.computePitchBend=function(c,e){return c+(e<<7)-8192};c.prototype.setCommandFromString=function(e){this.cmd=c.computeCommandFromString(e)};c.computeCommandFromString=function(e){if(!e)return 0;if(e&&e.constructor===Number)return e;e=e.toUpperCase();switch(e){case "NOTE ON":case "NOTEON":return c.NOTEON;case "NOTE OFF":case "NOTEOFF":return c.NOTEON;
@@ -759,64 +765,64 @@ c.NOTEON?this.gate=!0:g.cmd==c.NOTEOFF&&(this.gate=!1)):(g=this.midi_event,g.cha
if(-1!=k.link)switch(k.name){case "note":k=this.getInputData(g);null!=k&&(k.constructor===String&&(k=c.NoteStringToPitch(k)),this.properties.value1=(k|0)%255);break;case "cmd":k=this.getInputData(g);null!=k&&(this.properties.cmd=k);break;case "value1":k=this.getInputData(g);null!=k&&(this.properties.value1=Math.clamp(k|0,0,127));break;case "value2":k=this.getInputData(g),null!=k&&(this.properties.value2=Math.clamp(k|0,0,127))}}if(this.outputs)for(g=0;gc;++c)this.valid_notes[c]=-1!=this.notes_pitches.indexOf(c);for(c=0;12>c;++c)if(this.valid_notes[c])this.offset_notes[c]=0;else for(var e=1;12>e;++e){if(this.valid_notes[(c-e)%12]){this.offset_notes[c]=-e;break}if(this.valid_notes[(c+e)%12]){this.offset_notes[c]=e;break}}};C.prototype.onAction=function(e,g){g&&g.constructor===c&&(g.data[0]==c.NOTEON||g.data[0]==c.NOTEOFF?(this.midi_event=new c,this.midi_event.setup(g.data),this.midi_event.data[1]+=this.offset_notes[c.note_to_index[g.note]],
-this.trigger("out",this.midi_event)):this.trigger("out",g))};C.prototype.onExecute=function(){var c=this.getInputData(1);null!=c&&c!=this._current_scale&&this.processScale(c)};x.registerNodeType("midi/quantize",C);e.title="MIDI fromFile";e.desc="Plays a MIDI file";e.color="#243";e.prototype.onAction=function(c){"play"==c?this.play():"pause"==c&&(this._playing=!this._playing)};e.prototype.onPropertyChanged=function(c,e){"url"==c&&this.loadMIDIFile(e)};e.prototype.onExecute=function(){if(this._midi&&
+B);z.title="MIDICC";z.desc="gets a Controller Change";z.color="#243";z.prototype.onExecute=function(){k.input&&(this.properties.value=k.input.state.cc[this.properties.cc]);this.setOutputData(0,this.properties.value)};x.registerNodeType("midi/cc",z);F.title="MIDI Generator";F.desc="Generates a random MIDI note";F.color="#243";F.processScale=function(e){e=e.split(",");for(var g=0;gc;++c)this.valid_notes[c]=-1!=this.notes_pitches.indexOf(c);for(c=0;12>c;++c)if(this.valid_notes[c])this.offset_notes[c]=0;else for(var e=1;12>e;++e){if(this.valid_notes[(c-e)%12]){this.offset_notes[c]=-e;break}if(this.valid_notes[(c+e)%12]){this.offset_notes[c]=e;break}}};D.prototype.onAction=function(e,g){g&&g.constructor===c&&(g.data[0]==c.NOTEON||g.data[0]==c.NOTEOFF?(this.midi_event=new c,this.midi_event.setup(g.data),this.midi_event.data[1]+=this.offset_notes[c.note_to_index[g.note]],
+this.trigger("out",this.midi_event)):this.trigger("out",g))};D.prototype.onExecute=function(){var c=this.getInputData(1);null!=c&&c!=this._current_scale&&this.processScale(c)};x.registerNodeType("midi/quantize",D);e.title="MIDI fromFile";e.desc="Plays a MIDI file";e.color="#243";e.prototype.onAction=function(c){"play"==c?this.play():"pause"==c&&(this._playing=!this._playing)};e.prototype.onPropertyChanged=function(c,e){"url"==c&&this.loadMIDIFile(e)};e.prototype.onExecute=function(){if(this._midi&&
this._playing){this._current_time+=this.graph.elapsed_time;for(var e=100*this._current_time,g=0;gb;b++)for(var d=0;dh+f||c[1]>d))return b}}return-1};D.prototype.onAction=function(e,g){if("reset"==e)for(g=0;gg[1]))return e=this.getKeyIndex(g),this.keys[e]=!0,this._last_key=e,e=12*(this.properties.start_octave-1)+29+e,g=new c,g.setup([c.NOTEON,e,100]),this.trigger("note",g),!0};D.prototype.onMouseMove=function(e,g){if(!(0>g[1]||-1==this._last_key)){this.setDirtyCanvas(!0);
-e=this.getKeyIndex(g);if(this._last_key==e)return!0;this.keys[this._last_key]=!1;g=12*(this.properties.start_octave-1)+29+this._last_key;var k=new c;k.setup([c.NOTEOFF,g,100]);this.trigger("note",k);this.keys[e]=!0;g=12*(this.properties.start_octave-1)+29+e;k=new c;k.setup([c.NOTEON,g,100]);this.trigger("note",k);this._last_key=e;return!0}};D.prototype.onMouseUp=function(e,g){if(!(0>g[1]))return e=this.getKeyIndex(g),this.keys[e]=!1,this._last_key=-1,e=12*(this.properties.start_octave-1)+29+e,g=new c,
-g.setup([c.NOTEOFF,e,100]),this.trigger("note",g),!0};x.registerNodeType("midi/keys",D)})(this);
-(function(y){function c(){this.properties={src:"",gain:.5,loop:!0,autoplay:!0,playbackRate:1};this._loading_audio=!1;this._audiobuffer=null;this._audionodes=[];this._last_sourcenode=null;this.addOutput("out","audio");this.addInput("gain","number");this.audionode=m.getAudioContext().createGain();this.audionode.graphnode=this;this.audionode.gain.value=this.properties.gain;this.properties.src&&this.loadSound(this.properties.src)}function k(){this.properties={gain:.5};this._audionodes=[];this._media_stream=
-null;this.addOutput("out","audio");this.addInput("gain","number");this.audionode=m.getAudioContext().createGain();this.audionode.graphnode=this;this.audionode.gain.value=this.properties.gain}function t(){this.properties={fftSize:2048,minDecibels:-100,maxDecibels:-10,smoothingTimeConstant:.5};this.audionode=m.getAudioContext().createAnalyser();this.audionode.graphnode=this;this.audionode.fftSize=this.properties.fftSize;this.audionode.minDecibels=this.properties.minDecibels;this.audionode.maxDecibels=
-this.properties.maxDecibels;this.audionode.smoothingTimeConstant=this.properties.smoothingTimeConstant;this.addInput("in","audio");this.addOutput("freqs","array");this.addOutput("samples","array");this._time_bin=this._freq_bin=null}function r(){this.properties={gain:1};this.audionode=m.getAudioContext().createGain();this.addInput("in","audio");this.addInput("gain","number");this.addOutput("out","audio")}function w(){this.properties={impulse_src:"",normalize:!0};this.audionode=m.getAudioContext().createConvolver();
-this.addInput("in","audio");this.addOutput("out","audio")}function g(){this.properties={threshold:-50,knee:40,ratio:12,reduction:-20,attack:0,release:.25};this.audionode=m.getAudioContext().createDynamicsCompressor();this.addInput("in","audio");this.addOutput("out","audio")}function B(){this.properties={};this.audionode=m.getAudioContext().createWaveShaper();this.addInput("in","audio");this.addInput("shape","waveshape");this.addOutput("out","audio")}function z(){this.properties={gain1:.5,gain2:.5};
-this.audionode=m.getAudioContext().createGain();this.audionode1=m.getAudioContext().createGain();this.audionode1.gain.value=this.properties.gain1;this.audionode2=m.getAudioContext().createGain();this.audionode2.gain.value=this.properties.gain2;this.audionode1.connect(this.audionode);this.audionode2.connect(this.audionode);this.addInput("in1","audio");this.addInput("in1 gain","number");this.addInput("in2","audio");this.addInput("in2 gain","number");this.addOutput("out","audio")}function G(){this.properties=
-{A:.1,D:.1,S:.1,R:.1};this.audionode=m.getAudioContext().createGain();this.audionode.gain.value=0;this.addInput("in","audio");this.addInput("gate","bool");this.addOutput("out","audio");this.gate=!1}function A(){this.properties={delayTime:.5};this.audionode=m.getAudioContext().createDelay(10);this.audionode.delayTime.value=this.properties.delayTime;this.addInput("in","audio");this.addInput("time","number");this.addOutput("out","audio")}function C(){this.properties={frequency:350,detune:0,Q:1};this.addProperty("type",
-"lowpass","enum",{values:"lowpass highpass bandpass lowshelf highshelf peaking notch allpass".split(" ")});this.audionode=m.getAudioContext().createBiquadFilter();this.addInput("in","audio");this.addOutput("out","audio")}function e(){this.properties={frequency:440,detune:0,type:"sine"};this.addProperty("type","sine","enum",{values:["sine","square","sawtooth","triangle","custom"]});this.audionode=m.getAudioContext().createOscillator();this.addOutput("out","audio")}function F(){this.properties={continuous:!0,
-mark:-1};this.addInput("data","array");this.addInput("mark","number");this.size=[300,200];this._last_buffer=null}function D(){this.properties={band:440,amplitude:1};this.addInput("freqs","array");this.addOutput("signal","number")}function x(){if(!x.default_code){var c=x.default_function.toString(),a=c.indexOf("{")+1,b=c.lastIndexOf("}");x.default_code=c.substr(a,b-a)}this.properties={code:x.default_code};c=m.getAudioContext();c.createScriptProcessor?this.audionode=c.createScriptProcessor(4096,1,1):
-(console.warn("ScriptProcessorNode deprecated"),this.audionode=c.createGain());this.processCode();x._bypass_function||(x._bypass_function=this.audionode.onaudioprocess);this.addInput("in","audio");this.addOutput("out","audio")}function K(){this.audionode=m.getAudioContext().destination;this.addInput("in","audio")}var l=y.LiteGraph,m={};y.LGAudio=m;m.getAudioContext=function(){if(!this._audio_context){window.AudioContext=window.AudioContext||window.webkitAudioContext;if(!window.AudioContext)return console.error("AudioContext not supported by browser"),
-null;this._audio_context=new AudioContext;this._audio_context.onmessage=function(c){console.log("msg",c)};this._audio_context.onended=function(c){console.log("ended",c)};this._audio_context.oncomplete=function(c){console.log("complete",c)}}return this._audio_context};m.connect=function(c,a){try{c.connect(a)}catch(b){console.warn("LGraphAudio:",b)}};m.disconnect=function(c,a){try{c.disconnect(a)}catch(b){console.warn("LGraphAudio:",b)}};m.changeAllAudiosConnections=function(c,a){if(c.inputs)for(var b=
-0;bb;b++)for(var d=0;dh+f||c[1]>d))return b}}return-1};E.prototype.onAction=function(e,g){if("reset"==e)for(g=0;gg[1]))return e=this.getKeyIndex(g),this.keys[e]=!0,this._last_key=e,e=12*(this.properties.start_octave-1)+29+e,g=new c,g.setup([c.NOTEON,e,100]),this.trigger("note",g),!0};E.prototype.onMouseMove=function(e,g){if(!(0>g[1]||-1==this._last_key)){this.setDirtyCanvas(!0);
+e=this.getKeyIndex(g);if(this._last_key==e)return!0;this.keys[this._last_key]=!1;g=12*(this.properties.start_octave-1)+29+this._last_key;var k=new c;k.setup([c.NOTEOFF,g,100]);this.trigger("note",k);this.keys[e]=!0;g=12*(this.properties.start_octave-1)+29+e;k=new c;k.setup([c.NOTEON,g,100]);this.trigger("note",k);this._last_key=e;return!0}};E.prototype.onMouseUp=function(e,g){if(!(0>g[1]))return e=this.getKeyIndex(g),this.keys[e]=!1,this._last_key=-1,e=12*(this.properties.start_octave-1)+29+e,g=new c,
+g.setup([c.NOTEOFF,e,100]),this.trigger("note",g),!0};x.registerNodeType("midi/keys",E)})(this);
+(function(y){function c(){this.properties={src:"",gain:.5,loop:!0,autoplay:!0,playbackRate:1};this._loading_audio=!1;this._audiobuffer=null;this._audionodes=[];this._last_sourcenode=null;this.addOutput("out","audio");this.addInput("gain","number");this.audionode=n.getAudioContext().createGain();this.audionode.graphnode=this;this.audionode.gain.value=this.properties.gain;this.properties.src&&this.loadSound(this.properties.src)}function k(){this.properties={gain:.5};this._audionodes=[];this._media_stream=
+null;this.addOutput("out","audio");this.addInput("gain","number");this.audionode=n.getAudioContext().createGain();this.audionode.graphnode=this;this.audionode.gain.value=this.properties.gain}function t(){this.properties={fftSize:2048,minDecibels:-100,maxDecibels:-10,smoothingTimeConstant:.5};this.audionode=n.getAudioContext().createAnalyser();this.audionode.graphnode=this;this.audionode.fftSize=this.properties.fftSize;this.audionode.minDecibels=this.properties.minDecibels;this.audionode.maxDecibels=
+this.properties.maxDecibels;this.audionode.smoothingTimeConstant=this.properties.smoothingTimeConstant;this.addInput("in","audio");this.addOutput("freqs","array");this.addOutput("samples","array");this._time_bin=this._freq_bin=null}function r(){this.properties={gain:1};this.audionode=n.getAudioContext().createGain();this.addInput("in","audio");this.addInput("gain","number");this.addOutput("out","audio")}function w(){this.properties={impulse_src:"",normalize:!0};this.audionode=n.getAudioContext().createConvolver();
+this.addInput("in","audio");this.addOutput("out","audio")}function g(){this.properties={threshold:-50,knee:40,ratio:12,reduction:-20,attack:0,release:.25};this.audionode=n.getAudioContext().createDynamicsCompressor();this.addInput("in","audio");this.addOutput("out","audio")}function B(){this.properties={};this.audionode=n.getAudioContext().createWaveShaper();this.addInput("in","audio");this.addInput("shape","waveshape");this.addOutput("out","audio")}function z(){this.properties={gain1:.5,gain2:.5};
+this.audionode=n.getAudioContext().createGain();this.audionode1=n.getAudioContext().createGain();this.audionode1.gain.value=this.properties.gain1;this.audionode2=n.getAudioContext().createGain();this.audionode2.gain.value=this.properties.gain2;this.audionode1.connect(this.audionode);this.audionode2.connect(this.audionode);this.addInput("in1","audio");this.addInput("in1 gain","number");this.addInput("in2","audio");this.addInput("in2 gain","number");this.addOutput("out","audio")}function F(){this.properties=
+{A:.1,D:.1,S:.1,R:.1};this.audionode=n.getAudioContext().createGain();this.audionode.gain.value=0;this.addInput("in","audio");this.addInput("gate","bool");this.addOutput("out","audio");this.gate=!1}function A(){this.properties={delayTime:.5};this.audionode=n.getAudioContext().createDelay(10);this.audionode.delayTime.value=this.properties.delayTime;this.addInput("in","audio");this.addInput("time","number");this.addOutput("out","audio")}function D(){this.properties={frequency:350,detune:0,Q:1};this.addProperty("type",
+"lowpass","enum",{values:"lowpass highpass bandpass lowshelf highshelf peaking notch allpass".split(" ")});this.audionode=n.getAudioContext().createBiquadFilter();this.addInput("in","audio");this.addOutput("out","audio")}function e(){this.properties={frequency:440,detune:0,type:"sine"};this.addProperty("type","sine","enum",{values:["sine","square","sawtooth","triangle","custom"]});this.audionode=n.getAudioContext().createOscillator();this.addOutput("out","audio")}function G(){this.properties={continuous:!0,
+mark:-1};this.addInput("data","array");this.addInput("mark","number");this.size=[300,200];this._last_buffer=null}function E(){this.properties={band:440,amplitude:1};this.addInput("freqs","array");this.addOutput("signal","number")}function x(){if(!x.default_code){var c=x.default_function.toString(),a=c.indexOf("{")+1,b=c.lastIndexOf("}");x.default_code=c.substr(a,b-a)}this.properties={code:x.default_code};c=n.getAudioContext();c.createScriptProcessor?this.audionode=c.createScriptProcessor(4096,1,1):
+(console.warn("ScriptProcessorNode deprecated"),this.audionode=c.createGain());this.processCode();x._bypass_function||(x._bypass_function=this.audionode.onaudioprocess);this.addInput("in","audio");this.addOutput("out","audio")}function K(){this.audionode=n.getAudioContext().destination;this.addInput("in","audio")}var l=y.LiteGraph,n={};y.LGAudio=n;n.getAudioContext=function(){if(!this._audio_context){window.AudioContext=window.AudioContext||window.webkitAudioContext;if(!window.AudioContext)return console.error("AudioContext not supported by browser"),
+null;this._audio_context=new AudioContext;this._audio_context.onmessage=function(c){console.log("msg",c)};this._audio_context.onended=function(c){console.log("ended",c)};this._audio_context.oncomplete=function(c){console.log("complete",c)}}return this._audio_context};n.connect=function(c,a){try{c.connect(a)}catch(b){console.warn("LGraphAudio:",b)}};n.disconnect=function(c,a){try{c.disconnect(a)}catch(b){console.warn("LGraphAudio:",b)}};n.changeAllAudiosConnections=function(c,a){if(c.inputs)for(var b=
+0;b=this.size[0]&&(e=this.size[0]-1),c.strokeStyle=
-"red",c.beginPath(),c.moveTo(e,d),c.lineTo(e,0),c.stroke())}};F.title="Visualization";F.desc="Audio Visualization";l.registerNodeType("audio/visualization",F);D.prototype.onExecute=function(){if(this._freqs=this.getInputData(0)){var c=this.properties.band,a=this.getInputData(1);void 0!==a&&(c=a);a=m.getAudioContext().sampleRate/this._freqs.length;a=c/a*2;a>=this._freqs.length?a=this._freqs[this._freqs.length-1]:(c=a|0,a-=c,a=this._freqs[c]*(1-a)+this._freqs[c+1]*a);this.setOutputData(0,a/255*this.properties.amplitude)}};
-D.prototype.onGetInputs=function(){return[["band","number"]]};D.title="Signal";D.desc="extract the signal of some frequency";l.registerNodeType("audio/signal",D);x.prototype.onAdded=function(c){c.status==LGraph.STATUS_RUNNING&&(this.audionode.onaudioprocess=this._callback)};x["@code"]={widget:"code",type:"code"};x.prototype.onStart=function(){this.audionode.onaudioprocess=this._callback};x.prototype.onStop=function(){this.audionode.onaudioprocess=x._bypass_function};x.prototype.onPause=function(){this.audionode.onaudioprocess=
+this.getInputData(1);void 0!==c&&(this.audionode.curve=c)}};B.prototype.setWaveShape=function(c){this.audionode.curve=c};n.createAudioNodeWrapper(B);z.prototype.getAudioNodeInInputSlot=function(c){if(0==c)return this.audionode1;if(2==c)return this.audionode2};z.prototype.onPropertyChanged=function(c,a){"gain1"==c?this.audionode1.gain.value=a:"gain2"==c&&(this.audionode2.gain.value=a)};z.prototype.onExecute=function(){if(this.inputs&&this.inputs.length)for(var c=1;c