=this.size[1]||!this.properties.show||!this._video||(c.save(),c.drawImage(this._video,0,0,this.size[0],this.size[1]),c.restore())};e.prototype.onGetOutputs=function(){return[["width","number"],["height","number"],["stream_ready",v.EVENT],["stream_closed",v.EVENT],["stream_error",v.EVENT]]};
-v.registerNodeType("graphics/webcam",e)})(this);
-(function(u){function c(){this.addOutput("Texture","Texture");this.properties={name:"",filter:!0};this.size=[c.image_preview_size,c.image_preview_size]}function r(){this.addInput("Texture","Texture");this.properties={flipY:!1};this.size=[c.image_preview_size,c.image_preview_size]}function f(){this.addInput("Texture","Texture");this.addOutput("","Texture");this.properties={name:"",generate_mipmaps:!1}}function h(){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 q(){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="//time: time in seconds\n//texSize: vec2 with res\nuniform float u_value;\nuniform vec4 u_color;\n\nvoid main() {\n vec2 uv = v_coord;\n vec3 color = vec3(0.0);\n\t//your code here\n\tcolor.xy=uv;\n\ngl_FragColor = vec4(color, 1.0);\n}\n";this._uniforms={u_value:1,u_color:vec4.create(),in_texture:0,texSize:vec2.create(),time:0}}function l(){this.addInput("in","Texture");
+function(c){var e=this;return[{content:e.properties.show?"Hide Frame":"Show Frame",callback:function(){e.properties.show=!e.properties.show}}]};e.prototype.onDrawBackground=function(c){this.flags.collapsed||20>=this.size[1]||!this.properties.show||!this._video||(c.save(),c.drawImage(this._video,0,0,this.size[0],this.size[1]),c.restore())};e.prototype.onGetOutputs=function(){return[["width","number"],["height","number"],["stream_ready",w.EVENT],["stream_closed",w.EVENT],["stream_error",w.EVENT]]};
+w.registerNodeType("graphics/webcam",e)})(this);
+(function(v){function c(){this.addOutput("Texture","Texture");this.properties={name:"",filter:!0};this.size=[c.image_preview_size,c.image_preview_size]}function q(){this.addInput("Texture","Texture");this.properties={flipY:!1};this.size=[c.image_preview_size,c.image_preview_size]}function g(){this.addInput("Texture","Texture");this.addOutput("","Texture");this.properties={name:"",generate_mipmaps:!1}}function l(){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 r(){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="//time: time in seconds\n//texSize: vec2 with res\nuniform float u_value;\nuniform vec4 u_color;\n\nvoid main() {\n vec2 uv = v_coord;\n vec3 color = vec3(0.0);\n\t//your code here\n\tcolor.xy=uv;\n\ngl_FragColor = vec4(color, 1.0);\n}\n";this._uniforms={u_value:1,u_color:vec4.create(),in_texture:0,texSize:vec2.create(),time:0}}function f(){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 y(){this.addInput("in","Texture");this.addInput("warp","Texture");this.addInput("factor","number");this.addOutput("out","Texture");this.properties={factor:0.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 s(){this.addInput("Texture",
-"Texture");this.properties={additive:!1,antialiasing:!1,filter:!0,disable_alpha:!1,gamma:1};this.size[0]=130}function w(){this.addInput("Texture","Texture");this.addOutput("","Texture");this.properties={size:0,generate_mipmaps:!1,precision:c.DEFAULT}}function z(){this.addInput("Texture","Texture");this.addOutput("","Texture");this.properties={iterations:1,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 v(){this.addInput("Texture","Texture");this.addOutput("min_t","Texture");this.addOutput("max_t","Texture");this.addOutput("min","vec4");this.addOutput("max","vec4");this.properties={mode:"max",use_previous_frame:!0};this._uniforms={u_texture:0};this._max=new Float32Array(4);this._min=new Float32Array(4);this._textures_chain=
-[]}function k(){this.addInput("in","Texture");this.addInput("factor","Number");this.addOutput("out","Texture");this.properties={factor:0.5};this._uniforms={u_texture:0,u_textureB:1,u_factor:this.properties.factor}}function m(){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 D(){this.addInput("Image",
-"image");this.addOutput("","Texture");this.properties={}}function g(){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};g._shader||(g._shader=new GL.Shader(Shader.SCREEN_VERTEX_SHADER,g.pixel_shader))}function t(){this.addInput("Texture","Texture");this.addOutput("R","Texture");this.addOutput("G","Texture");this.addOutput("B","Texture");this.addOutput("A",
-"Texture");t._shader||(t._shader=new GL.Shader(Shader.SCREEN_VERTEX_SHADER,t.pixel_shader))}function n(){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();
+"Texture");this.properties={additive:!1,antialiasing:!1,filter:!0,disable_alpha:!1,gamma:1};this.size[0]=130}function u(){this.addInput("Texture","Texture");this.addOutput("","Texture");this.properties={size:0,generate_mipmaps:!1,precision:c.DEFAULT}}function z(){this.addInput("Texture","Texture");this.addOutput("","Texture");this.properties={iterations:1,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 w(){this.addInput("Texture","Texture");this.addOutput("min_t","Texture");this.addOutput("max_t","Texture");this.addOutput("min","vec4");this.addOutput("max","vec4");this.properties={mode:"max",use_previous_frame:!0};this._uniforms={u_texture:0};this._max=new Float32Array(4);this._min=new Float32Array(4);this._textures_chain=
+[]}function k(){this.addInput("in","Texture");this.addInput("factor","Number");this.addOutput("out","Texture");this.properties={factor:0.5};this._uniforms={u_texture:0,u_textureB:1,u_factor:this.properties.factor}}function n(){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 D(){this.addInput("Image",
+"image");this.addOutput("","Texture");this.properties={}}function h(){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};h._shader||(h._shader=new GL.Shader(Shader.SCREEN_VERTEX_SHADER,h.pixel_shader))}function t(){this.addInput("Texture","Texture");this.addOutput("R","Texture");this.addOutput("G","Texture");this.addOutput("B","Texture");this.addOutput("A",
+"Texture");t._shader||(t._shader=new GL.Shader(Shader.SCREEN_VERTEX_SHADER,t.pixel_shader))}function m(){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:0.5,precision:c.DEFAULT};this._uniforms={u_textureA:0,u_textureB:1,u_textureMix:2,u_mix:vec4.create()}}function x(){this.addInput("Tex.","Texture");this.addOutput("Edges","Texture");this.properties={invert:!0,threshold:!1,factor:1,precision:c.DEFAULT};x._shader||(x._shader=new GL.Shader(Shader.SCREEN_VERTEX_SHADER,x.pixel_shader))}function p(){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 K(){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 A(){this.addInput("in","Texture");this.addInput("dirt","Texture");this.addOutput("out",
@@ -406,7 +407,7 @@ this.properties={color:vec4.create(),precision:c.DEFAULT}}function b(){this.addI
{sigma:1.4,k:1.6,p:21.7,epsilon:79,phi:0.017}}function F(){this.addOutput("Webcam","Texture");this.properties={texture_name:"",facingMode:"user"};this.boxcolor="black";this.version=0}function I(){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","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 B(){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 J(){this.addOutput("out","Texture");this.properties={width:512,height:512,seed:0,persistence:0.1,octaves:8,scale:1,offset:[0,0],amplitude:1,
precision:c.DEFAULT};this._key=0;this._texture=null;this._uniforms={u_persistence:0.1,u_seed:0,u_offset:vec2.create(),u_scale:1,u_viewport:vec2.create()}}function L(){this.addInput("v");this.addOutput("out","Texture");this.properties={code:"",width:512,height:512,clear:!0,precision:c.DEFAULT,use_html_canvas:!1};this._temp_texture=this._func=null}function M(){this.addInput("in","Texture");this.addOutput("out","Texture");this.properties={key_color:vec3.fromValues(0,1,0),threshold:0.8,slope:0.2,precision:c.DEFAULT}}
-function N(){this.addInput("in","texture");this.addInput("yaw","number");this.addOutput("out","texture");this.properties={yaw:0}}var E=u.LiteGraph;u.LGraphTexture=null;"undefined"!=typeof GL&&(LGraphCanvas.link_type_colors.Texture="#987",u.LGraphTexture=c,c.title="Texture",c.desc="Texture",c.widgets_info={name:{widget:"texture"},filter:{widget:"checkbox"}},c.loadTextureCallback=null,c.image_preview_size=256,c.PASS_THROUGH=1,c.COPY=2,c.LOW=3,c.HIGH=4,c.REUSE=5,c.DEFAULT=2,c.MODE_VALUES={"pass through":c.PASS_THROUGH,
+function N(){this.addInput("in","texture");this.addInput("yaw","number");this.addOutput("out","texture");this.properties={yaw:0}}var E=v.LiteGraph;v.LGraphTexture=null;"undefined"!=typeof GL&&(LGraphCanvas.link_type_colors.Texture="#987",v.LGraphTexture=c,c.title="Texture",c.desc="Texture",c.widgets_info={name:{widget:"texture"},filter:{widget:"checkbox"}},c.loadTextureCallback=null,c.image_preview_size=256,c.PASS_THROUGH=1,c.COPY=2,c.LOW=3,c.HIGH=4,c.REUSE=5,c.DEFAULT=2,c.MODE_VALUES={"pass through":c.PASS_THROUGH,
copy:c.COPY,low:c.LOW,high:c.HIGH,reuse:c.REUSE,"default":c.DEFAULT},c.getTexturesContainer=function(){return gl.textures},c.loadTexture=function(a,b){b=b||{};var d=a;"http://"==d.substr(0,7)&&E.proxy&&(d=E.proxy+d.substr(7));return c.getTexturesContainer()[a]=GL.Texture.fromURL(d,b)},c.getTexture=function(a){var b=this.getTexturesContainer();if(!b)throw"Cannot load texture, container of textures not found";b=b[a];return!b&&a&&":"!=a[0]?this.loadTexture(a):b},c.getTargetTexture=function(a,b,d){if(!a)throw"LGraphTexture.getTargetTexture expects a reference texture";
var e=null;switch(d){case c.LOW:e=gl.UNSIGNED_BYTE;break;case c.HIGH:e=gl.HIGH_PRECISION_FORMAT;break;case c.REUSE:return a;default:e=a?a.type:gl.UNSIGNED_BYTE}b&&b.width==a.width&&b.height==a.height&&b.type==e||(b=new GL.Texture(a.width,a.height,{type:e,format:gl.RGBA,filter:gl.LINEAR}));return b},c.getTextureType=function(a,b){var d=b?b.type:gl.UNSIGNED_BYTE;switch(a){case c.HIGH:d=gl.HIGH_PRECISION_FORMAT;break;case c.LOW:d=gl.UNSIGNED_BYTE}return d},c.getWhiteTexture=function(){return this._white_texture?
this._white_texture:this._white_texture=GL.Texture.fromMemory(1,1,[255,255,255,255],{format:gl.RGBA,wrap:gl.REPEAT,filter:gl.NEAREST})},c.getNoiseTexture=function(){if(this._noise_texture)return this._noise_texture;for(var a=new Uint8Array(1048576),b=0;1048576>b;++b)a[b]=255*Math.random();return this._noise_texture=a=GL.Texture.fromMemory(512,512,a,{format:gl.RGBA,wrap:gl.REPEAT,filter:gl.NEAREST})},c.prototype.onDropFile=function(a,b,c){if(a){var d=null;"string"==typeof a?d=GL.Texture.fromURL(a):
@@ -414,238 +415,239 @@ this._white_texture:this._white_texture=GL.Texture.fromMemory(1,1,[255,255,255,2
(a=this._drop_texture);!a&&this.properties.name&&(a=c.getTexture(this.properties.name));if(a){this._last_tex=a;!1===this.properties.filter?a.setParameter(gl.TEXTURE_MAG_FILTER,gl.NEAREST):a.setParameter(gl.TEXTURE_MAG_FILTER,gl.LINEAR);this.setOutputData(0,a);for(var b=1;b=this.size[1]))if(this._drop_texture&&a.webgl)a.drawImage(this._drop_texture,0,0,this.size[0],this.size[1]);else{if(this._last_preview_tex!=this._last_tex)if(a.webgl)this._canvas=this._last_tex;else{var b=c.generateLowResTexturePreview(this._last_tex);if(!b)return;this._last_preview_tex=this._last_tex;this._canvas=cloneCanvas(b)}this._canvas&&(a.save(),a.webgl||(a.translate(0,this.size[1]),a.scale(1,
-1)),a.drawImage(this._canvas,0,0,this.size[0],this.size[1]),a.restore())}},c.generateLowResTexturePreview=function(a){if(!a)return null;var b=c.image_preview_size,d=a;if(a.format==gl.DEPTH_COMPONENT)return null;if(a.width>b||a.height>b)d=this._preview_temp_tex,this._preview_temp_tex||(this._preview_temp_tex=d=new GL.Texture(b,b,{minFilter:gl.NEAREST})),a.copyTo(d);a=this._preview_canvas;a||(this._preview_canvas=a=createCanvas(b,b));d&&d.toCanvas(a);return a},c.prototype.getResources=function(a){this.properties.name&&
-(a[this.properties.name]=GL.Texture);return a},c.prototype.onGetInputs=function(){return[["in","Texture"]]},c.prototype.onGetOutputs=function(){return[["width","number"],["height","number"],["aspect","number"]]},c.replaceCode=function(a,b){return a.replace(/\{\{[a-zA-Z0-9_]*\}\}/g,function(a){a=a.replace(/[\{\}]/g,"");return b[a]||""})},E.registerNodeType("texture/texture",c),r.title="Preview",r.desc="Show a texture in the graph canvas",r.allow_preview=!1,r.prototype.onDrawBackground=function(a){if(!this.flags.collapsed&&
-(a.webgl||r.allow_preview)){var b=this.getInputData(0);if(b){var d=null,d=!b.handle&&a.webgl?b:c.generateLowResTexturePreview(b);a.save();this.properties.flipY&&(a.translate(0,this.size[1]),a.scale(1,-1));a.drawImage(d,0,0,this.size[0],this.size[1]);a.restore()}}},E.registerNodeType("texture/preview",r),f.title="Save",f.desc="Save a texture in the repository",f.prototype.getPreviewTexture=function(){return this._texture},f.prototype.onExecute=function(){var a=this.getInputData(0);a&&(this.properties.generate_mipmaps&&
-(a.bind(0),a.setParameter(gl.TEXTURE_MIN_FILTER,gl.LINEAR_MIPMAP_LINEAR),gl.generateMipmap(a.texture_type),a.unbind(0)),this.properties.name&&(c.storeTexture?c.storeTexture(this.properties.name,a):c.getTexturesContainer()[this.properties.name]=a),this._texture=a,this.setOutputData(0,a))},E.registerNodeType("texture/save",f),h.widgets_info={uvcode:{widget:"code"},pixelcode:{widget:"code"},precision:{widget:"combo",values:c.MODE_VALUES}},h.title="Operation",h.desc="Texture shader operation",h.presets=
-{},h.prototype.getExtraMenuOptions=function(a){var b=this;return[{content:b.properties.show?"Hide Texture":"Show Texture",callback:function(){b.properties.show=!b.properties.show}}]},h.prototype.onPropertyChanged=function(){this.has_error=!1},h.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())},h.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,e=512;a?(d=a.width,e=a.height):b&&(d=b.width,e=b.height);b||(b=GL.Texture.getWhiteTexture());var g=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,e,{type:g,format:gl.RGBA,filter:gl.LINEAR});g="";this.properties.uvcode&&
-(g="uv = "+this.properties.uvcode,-1!=this.properties.uvcode.indexOf(";")&&(g=this.properties.uvcode));var f="";this.properties.pixelcode&&(f="result = "+this.properties.pixelcode,-1!=this.properties.pixelcode.indexOf(";")&&(f=this.properties.pixelcode));var k=this._shader;if(!(this.has_error||k&&this._shader_code==g+"|"+f)){var m=c.replaceCode(h.pixel_shader,{UV_CODE:g,PIXEL_CODE:f});try{k=new GL.Shader(Shader.SCREEN_VERTEX_SHADER,m),this.boxcolor="#00FF00"}catch(n){GL.Shader.dumpErrorToConsole(n,
-Shader.SCREEN_VERTEX_SHADER,m);this.boxcolor="#FF0000";this.has_error=!0;return}this._shader=k;this._shader_code=g+"|"+f}if(this._shader){var l=this.getInputData(2);null!=l?this.properties.value=l:l=parseFloat(this.properties.value);var t=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();k.uniforms({u_texture:0,u_textureB:1,value:l,texSize:[d,e],time:t}).draw(c)});this.setOutputData(0,
-this._tex)}}}},h.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 vec2 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",
-h.registerPreset=function(a,b){h.presets[a]=b},h.registerPreset("",""),h.registerPreset("bypass","color"),h.registerPreset("add","color + colorB * value"),h.registerPreset("substract","(color - colorB) * value"),h.registerPreset("mate","mix( color, colorB, color4B.a * value)"),h.registerPreset("invert","vec3(1.0) - color"),h.registerPreset("multiply","color * colorB * value"),h.registerPreset("divide","(color / colorB) / value"),h.registerPreset("difference","abs(color - colorB) * value"),h.registerPreset("max",
-"max(color, colorB) * value"),h.registerPreset("min","min(color, colorB) * value"),h.registerPreset("displace","texture2D(u_texture, uv + (colorB.xy - vec2(0.5)) * value).xyz"),h.registerPreset("grayscale","vec3(color.x + color.y + color.z) * value / 3.0"),h.registerPreset("saturation","mix( vec3(color.x + color.y + color.z) / 3.0, color, value )"),h.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)"),
-h.prototype.onInspect=function(a){var b=this;a.addCombo("Presets","",{values:Object.keys(h.presets),callback:function(c){var d=h.presets[c];d&&(b.setProperty("pixelcode",d),b.title=c,a.refresh())}})},E.registerNodeType("texture/operation",h),q.title="Shader",q.desc="Texture shader",q.widgets_info={code:{type:"code"},precision:{widget:"combo",values:c.MODE_VALUES}},q.prototype.onPropertyChanged=function(a,b){if("code"==a){var c=this.getShader();if(c){var d=c.uniformInfo;if(this.inputs)for(var e={},
-g=0;g=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())},l.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,e=512;a?(d=a.width,e=a.height):b&&(d=b.width,e=b.height);b||(b=GL.Texture.getWhiteTexture());var f=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,e,{type:f,format:gl.RGBA,filter:gl.LINEAR});f="";this.properties.uvcode&&
+(f="uv = "+this.properties.uvcode,-1!=this.properties.uvcode.indexOf(";")&&(f=this.properties.uvcode));var h="";this.properties.pixelcode&&(h="result = "+this.properties.pixelcode,-1!=this.properties.pixelcode.indexOf(";")&&(h=this.properties.pixelcode));var k=this._shader;if(!(this.has_error||k&&this._shader_code==f+"|"+h)){var g=c.replaceCode(l.pixel_shader,{UV_CODE:f,PIXEL_CODE:h});try{k=new GL.Shader(Shader.SCREEN_VERTEX_SHADER,g),this.boxcolor="#00FF00"}catch(m){GL.Shader.dumpErrorToConsole(m,
+Shader.SCREEN_VERTEX_SHADER,g);this.boxcolor="#FF0000";this.has_error=!0;return}this._shader=k;this._shader_code=f+"|"+h}if(this._shader){var n=this.getInputData(2);null!=n?this.properties.value=n:n=parseFloat(this.properties.value);var t=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();k.uniforms({u_texture:0,u_textureB:1,value:n,texSize:[d,e],time:t}).draw(c)});this.setOutputData(0,
+this._tex)}}}},l.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 vec2 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",
+l.registerPreset=function(a,b){l.presets[a]=b},l.registerPreset("",""),l.registerPreset("bypass","color"),l.registerPreset("add","color + colorB * value"),l.registerPreset("substract","(color - colorB) * value"),l.registerPreset("mate","mix( color, colorB, color4B.a * value)"),l.registerPreset("invert","vec3(1.0) - color"),l.registerPreset("multiply","color * colorB * value"),l.registerPreset("divide","(color / colorB) / value"),l.registerPreset("difference","abs(color - colorB) * value"),l.registerPreset("max",
+"max(color, colorB) * value"),l.registerPreset("min","min(color, colorB) * value"),l.registerPreset("displace","texture2D(u_texture, uv + (colorB.xy - vec2(0.5)) * value).xyz"),l.registerPreset("grayscale","vec3(color.x + color.y + color.z) * value / 3.0"),l.registerPreset("saturation","mix( vec3(color.x + color.y + color.z) / 3.0, color, value )"),l.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)"),
+l.prototype.onInspect=function(a){var b=this;a.addCombo("Presets","",{values:Object.keys(l.presets),callback:function(c){var d=l.presets[c];d&&(b.setProperty("pixelcode",d),b.title=c,a.refresh())}})},E.registerNodeType("texture/operation",l),r.title="Shader",r.desc="Texture shader",r.widgets_info={code:{type:"code"},precision:{widget:"combo",values:c.MODE_VALUES}},r.prototype.onPropertyChanged=function(a,b){if("code"==a){var c=this.getShader();if(c){var d=c.uniformInfo;if(this.inputs)for(var e={},
+f=0;f 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",
-s.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",E.registerNodeType("texture/toviewport",s),w.title="Copy",w.desc="Copy Texture",w.widgets_info={size:{widget:"combo",values:[0,32,64,128,256,512,1024,2048]},precision:{widget:"combo",
-values:c.MODE_VALUES}},w.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 e=this._temp_texture,g=a.type;this.properties.precision===c.LOW?g=gl.UNSIGNED_BYTE:this.properties.precision===c.HIGH&&(g=gl.HIGH_PRECISION_FORMAT);e&&e.width==b&&e.height==d&&e.type==g||(e=gl.LINEAR,this.properties.generate_mipmaps&&isPowerOfTwo(b)&&isPowerOfTwo(d)&&(e=gl.LINEAR_MIPMAP_LINEAR),
-this._temp_texture=new GL.Texture(b,d,{type:g,format:gl.RGBA,minFilter:e,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)}},E.registerNodeType("texture/copy",w),z.title="Downsample",z.desc="Downsample Texture",z.widgets_info={iterations:{type:"number",step:1,precision:0,min:0},precision:{widget:"combo",values:c.MODE_VALUES}},
-z.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=z._shader;b||(z._shader=b=new GL.Shader(GL.Shader.SCREEN_VERTEX_SHADER,z.pixel_shader));var d=a.width|0,e=a.height|0,g=a.type;this.properties.precision===c.LOW?g=gl.UNSIGNED_BYTE:this.properties.precision===c.HIGH&&(g=gl.HIGH_PRECISION_FORMAT);var f=this.properties.iterations||1,k=a,m=
-null,h=[],a={type:g,format:a.format},g=vec2.create(),n={u_offset:g};this._texture&&GL.Texture.releaseTemporary(this._texture);for(var l=0;l>1||0;e=e>>1||0;m=GL.Texture.getTemporary(d,e,a);h.push(m);k.setParameter(GL.TEXTURE_MAG_FILTER,GL.NEAREST);k.copyTo(m,b,n);if(1==d&&1==e)break;k=m}this._texture=h.pop();for(l=0;lthis.properties.iterations)this.setOutputData(0,a);else{var b=z._shader;b||(z._shader=b=new GL.Shader(GL.Shader.SCREEN_VERTEX_SHADER,z.pixel_shader));var d=a.width|0,e=a.height|0,f=a.type;this.properties.precision===c.LOW?f=gl.UNSIGNED_BYTE:this.properties.precision===c.HIGH&&(f=gl.HIGH_PRECISION_FORMAT);var h=this.properties.iterations||1,k=a,g=
+null,m=[],a={type:f,format:a.format},f=vec2.create(),n={u_offset:f};this._texture&&GL.Texture.releaseTemporary(this._texture);for(var l=0;l>1||0;e=e>>1||0;g=GL.Texture.getTemporary(d,e,a);m.push(g);k.setParameter(GL.TEXTURE_MAG_FILTER,GL.NEAREST);k.copyTo(g,b,n);if(1==d&&1==e)break;k=g}this._texture=m.pop();for(l=0;l>=2,d++,1!=c););a.copyTo(this._textures_chain[0]);for(var d=1;d<=this._textures_chain.length;++d)a=this._textures_chain[d];var e=v._shader,g=this._uniforms;g.u_mipmap_offset=this.properties.mipmap_offset;gl.disable(gl.DEPTH_TEST);
-gl.disable(gl.BLEND);this._temp_texture.drawTo(function(){a.toViewport(e,g)})}},v.pixel_shader="precision highp float;\n\t\tprecision highp float;\n\t\tuniform mat4 u_samples_a;\n\t\tuniform mat4 u_samples_b;\n\t\tuniform sampler2D u_texture;\n\t\tuniform float u_mipmap_offset;\n\t\tvarying vec2 v_coord;\n\t\t\n\t\tvoid main() {\n\t\t\tvec4 color = vec4(0.0);\n\t\t\t//random average\n\t\t\tfor(int i = 0; i < 4; ++i)\n\t\t\t\tfor(int j = 0; j < 4; ++j)\n\t\t\t\t{\n\t\t\t\t\tcolor += texture2D(u_texture, vec2( u_samples_a[i][j], u_samples_b[i][j] ), u_mipmap_offset );\n\t\t\t\t\tcolor += texture2D(u_texture, vec2( 1.0 - u_samples_a[i][j], 1.0 - u_samples_b[i][j] ), u_mipmap_offset );\n\t\t\t\t}\n\t\t gl_FragColor = color * 0.03125;\n\t\t}\n\t\t",
+new GL.Texture(1,1,{type:b,format:gl.RGBA,filter:gl.NEAREST}));this._uniforms.u_mipmap_offset=0;this.properties.high_quality&&(this._temp_pot2_texture&&this._temp_pot2_texture.type==b||(this._temp_pot2_texture=new GL.Texture(512,512,{type:b,format:gl.RGBA,minFilter:gl.LINEAR_MIPMAP_LINEAR,magFilter:gl.LINEAR})),a.copyTo(this._temp_pot2_texture),a=this._temp_pot2_texture,a.bind(0),gl.generateMipmap(GL.TEXTURE_2D),this._uniforms.u_mipmap_offset=9);var d=e._shader,f=this._uniforms;f.u_mipmap_offset=
+this.properties.mipmap_offset;gl.disable(gl.DEPTH_TEST);gl.disable(gl.BLEND);this._temp_texture.drawTo(function(){a.toViewport(d,f)});if(this.isOutputConnected(1)||this.isOutputConnected(2))if(c=this._temp_texture.getPixels()){var h=this._luminance,b=this._temp_texture.type;h.set(c);b==gl.UNSIGNED_BYTE&&vec4.scale(h,h,1/255)}}},e.pixel_shader="precision highp float;\n\t\tprecision highp float;\n\t\tuniform mat4 u_samples_a;\n\t\tuniform mat4 u_samples_b;\n\t\tuniform sampler2D u_texture;\n\t\tuniform float u_mipmap_offset;\n\t\tvarying vec2 v_coord;\n\t\t\n\t\tvoid main() {\n\t\t\tvec4 color = vec4(0.0);\n\t\t\t//random average\n\t\t\tfor(int i = 0; i < 4; ++i)\n\t\t\t\tfor(int j = 0; j < 4; ++j)\n\t\t\t\t{\n\t\t\t\t\tcolor += texture2D(u_texture, vec2( u_samples_a[i][j], u_samples_b[i][j] ), u_mipmap_offset );\n\t\t\t\t\tcolor += texture2D(u_texture, vec2( 1.0 - u_samples_a[i][j], 1.0 - u_samples_b[i][j] ), u_mipmap_offset );\n\t\t\t\t}\n\t\t gl_FragColor = color * 0.03125;\n\t\t}\n\t\t",
+E.registerNodeType("texture/average",e),w.widgets_info={mode:{widget:"combo",values:["min","max","avg"]}},w.title="MinMax",w.desc="Compute the scene min max",w.prototype.onExecute=function(){this.properties.use_previous_frame||this.update();this.setOutputData(0,this._temp_texture);this.setOutputData(1,this._luminance)},w.prototype.onPreRenderExecute=function(){this.update()},w.prototype.update=function(){var a=this.getInputData(0);if(a&&(this.isOutputConnected(0)||this.isOutputConnected(1))){w._shader||
+(w._shader=new GL.Shader(GL.Shader.SCREEN_VERTEX_SHADER,w.pixel_shader));var b=gl.UNSIGNED_BYTE;a.type!=b&&(b=gl.FLOAT);var c=512;if(!this._textures_chain.length||this._textures_chain[0].type!=b)for(;d&&(this._textures_chain[d]=new GL.Texture(c,c,{type:b,format:gl.RGBA,filter:gl.NEAREST}),c>>=2,d++,1!=c););a.copyTo(this._textures_chain[0]);for(var d=1;d<=this._textures_chain.length;++d)a=this._textures_chain[d];var e=w._shader,f=this._uniforms;f.u_mipmap_offset=this.properties.mipmap_offset;gl.disable(gl.DEPTH_TEST);
+gl.disable(gl.BLEND);this._temp_texture.drawTo(function(){a.toViewport(e,f)})}},w.pixel_shader="precision highp float;\n\t\tprecision highp float;\n\t\tuniform mat4 u_samples_a;\n\t\tuniform mat4 u_samples_b;\n\t\tuniform sampler2D u_texture;\n\t\tuniform float u_mipmap_offset;\n\t\tvarying vec2 v_coord;\n\t\t\n\t\tvoid main() {\n\t\t\tvec4 color = vec4(0.0);\n\t\t\t//random average\n\t\t\tfor(int i = 0; i < 4; ++i)\n\t\t\t\tfor(int j = 0; j < 4; ++j)\n\t\t\t\t{\n\t\t\t\t\tcolor += texture2D(u_texture, vec2( u_samples_a[i][j], u_samples_b[i][j] ), u_mipmap_offset );\n\t\t\t\t\tcolor += texture2D(u_texture, vec2( 1.0 - u_samples_a[i][j], 1.0 - u_samples_b[i][j] ), u_mipmap_offset );\n\t\t\t\t}\n\t\t gl_FragColor = color * 0.03125;\n\t\t}\n\t\t",
k.title="Smooth",k.desc="Smooth texture over time",k.prototype.onExecute=function(){var a=this.getInputData(0);if(a&&this.isOutputConnected(0)){k._shader||(k._shader=new GL.Shader(GL.Shader.SCREEN_VERTEX_SHADER,k.pixel_shader));var b=this._temp_texture;b&&b.type==a.type&&b.width==a.width&&b.height==a.height||(b={type:a.type,format:gl.RGBA,filter:gl.NEAREST},this._temp_texture=new GL.Texture(a.width,a.height,b),this._temp_texture2=new GL.Texture(a.width,a.height,b),a.copyTo(this._temp_texture2));var b=
this._temp_texture,c=this._temp_texture2,d=k._shader,e=this._uniforms;e.u_factor=1-this.getInputOrProperty("factor");gl.disable(gl.BLEND);gl.disable(gl.DEPTH_TEST);b.drawTo(function(){c.bind(1);a.toViewport(d,e)});this.setOutputData(0,b);this._temp_texture=c;this._temp_texture2=b}},k.pixel_shader="precision highp float;\n\t\tprecision highp float;\n\t\tuniform sampler2D u_texture;\n\t\tuniform sampler2D u_textureB;\n\t\tuniform float u_factor;\n\t\tvarying vec2 v_coord;\n\t\t\n\t\tvoid main() {\n\t\t\tgl_FragColor = mix( texture2D( u_texture, v_coord ), texture2D( u_textureB, v_coord ), u_factor );\n\t\t}\n\t\t",
-E.registerNodeType("texture/temporal_smooth",k),m.title="Lineal Avg Smooth",m.desc="Smooth texture linearly over time",m["@samples"]={type:"number",min:1,max:64,step:1,precision:1},m.prototype.getPreviewTexture=function(){return this._temp_texture2},m.prototype.onExecute=function(){var a=this.getInputData(0);if(a&&this.isOutputConnected(0)){m._shader||(m._shader_copy=new GL.Shader(GL.Shader.SCREEN_VERTEX_SHADER,m.pixel_shader_copy),m._shader_avg=new GL.Shader(GL.Shader.SCREEN_VERTEX_SHADER,m.pixel_shader_avg));
-var b=Math.clamp(this.properties.samples,0,64),c=this.frame,d=this.properties.frames_interval;if(0==d||0==c%d){c=this._temp_texture;c&&c.type==a.type&&c.width==b||(c={type:a.type,format:gl.RGBA,filter:gl.NEAREST},this._temp_texture=new GL.Texture(b,1,c),this._temp_texture2=new GL.Texture(b,1,c),this._temp_texture_out=new GL.Texture(1,1,c));var e=this._temp_texture,g=this._temp_texture2,f=m._shader_copy,k=m._shader_avg,h=this._uniforms;h.u_samples=b;h.u_isamples=1/b;gl.disable(gl.BLEND);gl.disable(gl.DEPTH_TEST);
-e.drawTo(function(){g.bind(1);a.toViewport(f,h)});this._temp_texture_out.drawTo(function(){e.toViewport(k,h)});this.setOutputData(0,this._temp_texture_out);this._temp_texture=g;this._temp_texture2=e}else this.setOutputData(0,this._temp_texture_out);this.setOutputData(1,this._temp_texture2);this.frame++}},m.pixel_shader_copy="precision highp float;\n\t\tprecision highp float;\n\t\tuniform sampler2D u_texture;\n\t\tuniform sampler2D u_textureB;\n\t\tuniform float u_isamples;\n\t\tvarying vec2 v_coord;\n\t\t\n\t\tvoid main() {\n\t\t\tif( v_coord.x <= u_isamples )\n\t\t\t\tgl_FragColor = texture2D( u_texture, vec2(0.5) );\n\t\t\telse\n\t\t\t\tgl_FragColor = texture2D( u_textureB, v_coord - vec2(u_isamples,0.0) );\n\t\t}\n\t\t",
-m.pixel_shader_avg="precision highp float;\n\t\tprecision highp float;\n\t\tuniform sampler2D u_texture;\n\t\tuniform int u_samples;\n\t\tuniform float u_isamples;\n\t\tvarying vec2 v_coord;\n\t\t\n\t\tvoid main() {\n\t\t\tvec4 color = vec4(0.0);\n\t\t\tfor(int i = 0; i < 64; ++i)\n\t\t\t{\n\t\t\t\tcolor += texture2D( u_texture, vec2( float(i)*u_isamples,0.0) );\n\t\t\t\tif(i == (u_samples - 1))\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tgl_FragColor = color * u_isamples;\n\t\t}\n\t\t",E.registerNodeType("texture/linear_avg_smooth",
-m),D.title="Image to Texture",D.desc="Uploads an image to the GPU",D.prototype.onExecute=function(){var a=this.getInputData(0);if(a){var b=a.videoWidth||a.width,c=a.videoHeight||a.height;if(a.gltexture)this.setOutputData(0,a.gltexture);else{var d=this._temp_texture;d&&d.width==b&&d.height==c||(this._temp_texture=new GL.Texture(b,c,{format:gl.RGBA,filter:gl.LINEAR}));try{this._temp_texture.uploadImage(a)}catch(e){console.error("image comes from an unsafe location, cannot be uploaded to webgl: "+e);
-return}this.setOutputData(0,this._temp_texture)}}},E.registerNodeType("texture/imageToTexture",D),g.widgets_info={texture:{widget:"texture"},precision:{widget:"combo",values:c.MODE_VALUES}},g.title="LUT",g.desc="Apply LUT to Texture",g.prototype.onExecute=function(){if(this.isOutputConnected(0)){var a=this.getInputData(0);if(this.properties.precision===c.PASS_THROUGH||!1===this.properties.enabled)this.setOutputData(0,a);else if(a){var b=this.getInputData(1);b||(b=c.getTexture(this.properties.texture));
-if(b){b.bind(0);gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MIN_FILTER,gl.LINEAR);gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_S,gl.CLAMP_TO_EDGE);gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_T,gl.CLAMP_TO_EDGE);gl.bindTexture(gl.TEXTURE_2D,null);var d=this.properties.intensity;this.isInputConnected(2)&&(this.properties.intensity=d=this.getInputData(2));this._tex=c.getTargetTexture(a,this._tex,this.properties.precision);this._tex.drawTo(function(){b.bind(1);a.toViewport(g._shader,{u_texture:0,u_textureB:1,
-u_amount:d})});this.setOutputData(0,this._tex)}else this.setOutputData(0,a)}}},g.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 sampler2D u_textureB;\n\t\tuniform float u_amount;\n\t\t\n\t\tvoid main() {\n\t\t\t lowp vec4 textureColor = clamp( texture2D(u_texture, v_coord), vec4(0.0), vec4(1.0) );\n\t\t\t mediump float blueColor = textureColor.b * 63.0;\n\t\t\t mediump vec2 quad1;\n\t\t\t quad1.y = floor(floor(blueColor) / 8.0);\n\t\t\t quad1.x = floor(blueColor) - (quad1.y * 8.0);\n\t\t\t mediump vec2 quad2;\n\t\t\t quad2.y = floor(ceil(blueColor) / 8.0);\n\t\t\t quad2.x = ceil(blueColor) - (quad2.y * 8.0);\n\t\t\t highp vec2 texPos1;\n\t\t\t texPos1.x = (quad1.x * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.r);\n\t\t\t texPos1.y = 1.0 - ((quad1.y * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.g));\n\t\t\t highp vec2 texPos2;\n\t\t\t texPos2.x = (quad2.x * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.r);\n\t\t\t texPos2.y = 1.0 - ((quad2.y * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.g));\n\t\t\t lowp vec4 newColor1 = texture2D(u_textureB, texPos1);\n\t\t\t lowp vec4 newColor2 = texture2D(u_textureB, texPos2);\n\t\t\t lowp vec4 newColor = mix(newColor1, newColor2, fract(blueColor));\n\t\t\t gl_FragColor = vec4( mix( textureColor.rgb, newColor.rgb, u_amount), textureColor.w);\n\t\t}\n\t\t",
-E.registerNodeType("texture/LUT",g),t.title="Texture to Channels",t.desc="Split texture channels",t.prototype.onExecute=function(){var a=this.getInputData(0);if(a){this._channels||(this._channels=Array(4));for(var b=gl.RGB,c=0,d=0;4>d;d++)this.isOutputConnected(d)?(this._channels[d]&&this._channels[d].width==a.width&&this._channels[d].height==a.height&&this._channels[d].type==a.type&&this._channels[d].format==b||(this._channels[d]=new GL.Texture(a.width,a.height,{type:a.type,format:b,filter:gl.LINEAR})),
-c++):this._channels[d]=null;if(c){gl.disable(gl.BLEND);gl.disable(gl.DEPTH_TEST);for(var e=Mesh.getScreenQuad(),g=t._shader,f=[[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]],d=0;4>d;d++)this._channels[d]&&(this._channels[d].drawTo(function(){a.bind(0);g.uniforms({u_texture:0,u_mask:f[d]}).draw(e)}),this.setOutputData(d,this._channels[d]))}}},t.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",
-E.registerNodeType("texture/textureChannels",t),n.title="Channels to Texture",n.desc="Split texture channels",n.widgets_info={precision:{widget:"combo",values:c.MODE_VALUES}},n.prototype.onExecute=function(){var a=c.getWhiteTexture(),b=this.getInputData(0)||a,d=this.getInputData(1)||a,e=this.getInputData(2)||a,g=this.getInputData(3)||a;gl.disable(gl.BLEND);gl.disable(gl.DEPTH_TEST);var f=Mesh.getScreenQuad();n._shader||(n._shader=new GL.Shader(Shader.SCREEN_VERTEX_SHADER,n.pixel_shader));var k=n._shader,
-a=Math.max(b.width,d.width,e.width,g.width),m=Math.max(b.height,d.height,e.height,g.height),h=this.properties.precision==c.HIGH?c.HIGH_PRECISION_FORMAT:gl.UNSIGNED_BYTE;this._texture&&this._texture.width==a&&this._texture.height==m&&this._texture.type==h||(this._texture=new GL.Texture(a,m,{type:h,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 l=this._uniforms;this._texture.drawTo(function(){b.bind(0);
-d.bind(1);e.bind(2);g.bind(3);k.uniforms(l).draw(f)});this.setOutputData(0,this._texture)},n.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",
-E.registerNodeType("texture/channelsTexture",n),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=
+E.registerNodeType("texture/temporal_smooth",k),n.title="Lineal Avg Smooth",n.desc="Smooth texture linearly over time",n["@samples"]={type:"number",min:1,max:64,step:1,precision:1},n.prototype.getPreviewTexture=function(){return this._temp_texture2},n.prototype.onExecute=function(){var a=this.getInputData(0);if(a&&this.isOutputConnected(0)){n._shader||(n._shader_copy=new GL.Shader(GL.Shader.SCREEN_VERTEX_SHADER,n.pixel_shader_copy),n._shader_avg=new GL.Shader(GL.Shader.SCREEN_VERTEX_SHADER,n.pixel_shader_avg));
+var b=Math.clamp(this.properties.samples,0,64),c=this.frame,d=this.properties.frames_interval;if(0==d||0==c%d){c=this._temp_texture;c&&c.type==a.type&&c.width==b||(c={type:a.type,format:gl.RGBA,filter:gl.NEAREST},this._temp_texture=new GL.Texture(b,1,c),this._temp_texture2=new GL.Texture(b,1,c),this._temp_texture_out=new GL.Texture(1,1,c));var e=this._temp_texture,f=this._temp_texture2,h=n._shader_copy,k=n._shader_avg,g=this._uniforms;g.u_samples=b;g.u_isamples=1/b;gl.disable(gl.BLEND);gl.disable(gl.DEPTH_TEST);
+e.drawTo(function(){f.bind(1);a.toViewport(h,g)});this._temp_texture_out.drawTo(function(){e.toViewport(k,g)});this.setOutputData(0,this._temp_texture_out);this._temp_texture=f;this._temp_texture2=e}else this.setOutputData(0,this._temp_texture_out);this.setOutputData(1,this._temp_texture2);this.frame++}},n.pixel_shader_copy="precision highp float;\n\t\tprecision highp float;\n\t\tuniform sampler2D u_texture;\n\t\tuniform sampler2D u_textureB;\n\t\tuniform float u_isamples;\n\t\tvarying vec2 v_coord;\n\t\t\n\t\tvoid main() {\n\t\t\tif( v_coord.x <= u_isamples )\n\t\t\t\tgl_FragColor = texture2D( u_texture, vec2(0.5) );\n\t\t\telse\n\t\t\t\tgl_FragColor = texture2D( u_textureB, v_coord - vec2(u_isamples,0.0) );\n\t\t}\n\t\t",
+n.pixel_shader_avg="precision highp float;\n\t\tprecision highp float;\n\t\tuniform sampler2D u_texture;\n\t\tuniform int u_samples;\n\t\tuniform float u_isamples;\n\t\tvarying vec2 v_coord;\n\t\t\n\t\tvoid main() {\n\t\t\tvec4 color = vec4(0.0);\n\t\t\tfor(int i = 0; i < 64; ++i)\n\t\t\t{\n\t\t\t\tcolor += texture2D( u_texture, vec2( float(i)*u_isamples,0.0) );\n\t\t\t\tif(i == (u_samples - 1))\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tgl_FragColor = color * u_isamples;\n\t\t}\n\t\t",E.registerNodeType("texture/linear_avg_smooth",
+n),D.title="Image to Texture",D.desc="Uploads an image to the GPU",D.prototype.onExecute=function(){var a=this.getInputData(0);if(a){var b=a.videoWidth||a.width,c=a.videoHeight||a.height;if(a.gltexture)this.setOutputData(0,a.gltexture);else{var d=this._temp_texture;d&&d.width==b&&d.height==c||(this._temp_texture=new GL.Texture(b,c,{format:gl.RGBA,filter:gl.LINEAR}));try{this._temp_texture.uploadImage(a)}catch(e){console.error("image comes from an unsafe location, cannot be uploaded to webgl: "+e);
+return}this.setOutputData(0,this._temp_texture)}}},E.registerNodeType("texture/imageToTexture",D),h.widgets_info={texture:{widget:"texture"},precision:{widget:"combo",values:c.MODE_VALUES}},h.title="LUT",h.desc="Apply LUT to Texture",h.prototype.onExecute=function(){if(this.isOutputConnected(0)){var a=this.getInputData(0);if(this.properties.precision===c.PASS_THROUGH||!1===this.properties.enabled)this.setOutputData(0,a);else if(a){var b=this.getInputData(1);b||(b=c.getTexture(this.properties.texture));
+if(b){b.bind(0);gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MIN_FILTER,gl.LINEAR);gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_S,gl.CLAMP_TO_EDGE);gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_T,gl.CLAMP_TO_EDGE);gl.bindTexture(gl.TEXTURE_2D,null);var d=this.properties.intensity;this.isInputConnected(2)&&(this.properties.intensity=d=this.getInputData(2));this._tex=c.getTargetTexture(a,this._tex,this.properties.precision);this._tex.drawTo(function(){b.bind(1);a.toViewport(h._shader,{u_texture:0,u_textureB:1,
+u_amount:d})});this.setOutputData(0,this._tex)}else this.setOutputData(0,a)}}},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 sampler2D u_textureB;\n\t\tuniform float u_amount;\n\t\t\n\t\tvoid main() {\n\t\t\t lowp vec4 textureColor = clamp( texture2D(u_texture, v_coord), vec4(0.0), vec4(1.0) );\n\t\t\t mediump float blueColor = textureColor.b * 63.0;\n\t\t\t mediump vec2 quad1;\n\t\t\t quad1.y = floor(floor(blueColor) / 8.0);\n\t\t\t quad1.x = floor(blueColor) - (quad1.y * 8.0);\n\t\t\t mediump vec2 quad2;\n\t\t\t quad2.y = floor(ceil(blueColor) / 8.0);\n\t\t\t quad2.x = ceil(blueColor) - (quad2.y * 8.0);\n\t\t\t highp vec2 texPos1;\n\t\t\t texPos1.x = (quad1.x * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.r);\n\t\t\t texPos1.y = 1.0 - ((quad1.y * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.g));\n\t\t\t highp vec2 texPos2;\n\t\t\t texPos2.x = (quad2.x * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.r);\n\t\t\t texPos2.y = 1.0 - ((quad2.y * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.g));\n\t\t\t lowp vec4 newColor1 = texture2D(u_textureB, texPos1);\n\t\t\t lowp vec4 newColor2 = texture2D(u_textureB, texPos2);\n\t\t\t lowp vec4 newColor = mix(newColor1, newColor2, fract(blueColor));\n\t\t\t gl_FragColor = vec4( mix( textureColor.rgb, newColor.rgb, u_amount), textureColor.w);\n\t\t}\n\t\t",
+E.registerNodeType("texture/LUT",h),t.title="Texture to Channels",t.desc="Split texture channels",t.prototype.onExecute=function(){var a=this.getInputData(0);if(a){this._channels||(this._channels=Array(4));for(var b=gl.RGB,c=0,d=0;4>d;d++)this.isOutputConnected(d)?(this._channels[d]&&this._channels[d].width==a.width&&this._channels[d].height==a.height&&this._channels[d].type==a.type&&this._channels[d].format==b||(this._channels[d]=new GL.Texture(a.width,a.height,{type:a.type,format:b,filter:gl.LINEAR})),
+c++):this._channels[d]=null;if(c){gl.disable(gl.BLEND);gl.disable(gl.DEPTH_TEST);for(var e=Mesh.getScreenQuad(),f=t._shader,h=[[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]],d=0;4>d;d++)this._channels[d]&&(this._channels[d].drawTo(function(){a.bind(0);f.uniforms({u_texture:0,u_mask:h[d]}).draw(e)}),this.setOutputData(d,this._channels[d]))}}},t.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",
+E.registerNodeType("texture/textureChannels",t),m.title="Channels to Texture",m.desc="Split texture channels",m.widgets_info={precision:{widget:"combo",values:c.MODE_VALUES}},m.prototype.onExecute=function(){var a=c.getWhiteTexture(),b=this.getInputData(0)||a,d=this.getInputData(1)||a,e=this.getInputData(2)||a,f=this.getInputData(3)||a;gl.disable(gl.BLEND);gl.disable(gl.DEPTH_TEST);var h=Mesh.getScreenQuad();m._shader||(m._shader=new GL.Shader(Shader.SCREEN_VERTEX_SHADER,m.pixel_shader));var k=m._shader,
+a=Math.max(b.width,d.width,e.width,f.width),g=Math.max(b.height,d.height,e.height,f.height),n=this.properties.precision==c.HIGH?c.HIGH_PRECISION_FORMAT:gl.UNSIGNED_BYTE;this._texture&&this._texture.width==a&&this._texture.height==g&&this._texture.type==n||(this._texture=new GL.Texture(a,g,{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 l=this._uniforms;this._texture.drawTo(function(){b.bind(0);
+d.bind(1);e.bind(2);f.bind(3);k.uniforms(l).draw(h)});this.setOutputData(0,this._texture)},m.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",
+E.registerNodeType("texture/channelsTexture",m),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;b 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",
+E.registerNodeType("texture/mix",d),x.title="Edges",x.desc="Detects edges",x.widgets_info={precision:{widget:"combo",values:c.MODE_VALUES}},x.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=x._shader,e=this.properties.invert,f=this.properties.factor,
+h=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:f,u_threshold:h,u_invert:e?1:0}).draw(b)});this.setOutputData(0,this._tex)}}},x.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",
E.registerNodeType("texture/edges",x),p.title="Depth Range",p.desc="Generates a texture with a depth range",p.prototype.onExecute=function(){if(this.isOutputConnected(0)){var a=this.getInputData(0);if(a){var b=gl.UNSIGNED_BYTE;this.properties.high_precision&&(b=gl.half_float_ext?gl.HALF_FLOAT_OES:gl.FLOAT);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.RGBA,
filter:gl.LINEAR}));var c=this._uniforms,b=this.properties.distance;this.isInputConnected(1)&&(b=this.getInputData(1),this.properties.distance=b);var d=this.properties.range;this.isInputConnected(2)&&(d=this.getInputData(2),this.properties.range=d);c.u_distance=b;c.u_range=d;gl.disable(gl.BLEND);gl.disable(gl.DEPTH_TEST);var e=Mesh.getScreenQuad();p._shader||(p._shader=new GL.Shader(Shader.SCREEN_VERTEX_SHADER,p.pixel_shader),p._shader_onlydepth=new GL.Shader(Shader.SCREEN_VERTEX_SHADER,p.pixel_shader,
-{ONLY_DEPTH:""}));var g=this.properties.only_depth?p._shader_onlydepth:p._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:[0.1,1E3];c.u_camera_planes=b;this._temp_texture.drawTo(function(){a.bind(0);g.uniforms(c).draw(e)});this._temp_texture.near_far_planes=b;this.setOutputData(0,this._temp_texture)}}},p.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 float u_distance;\n\t\tuniform float u_range;\n\t\t\n\t\tfloat LinearDepth()\n\t\t{\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).x;\n\t\t\tdepth = depth * 2.0 - 1.0;\n\t\t\treturn zNear * (depth + 1.0) / (zFar + zNear - depth * (zFar - zNear));\n\t\t}\n\t\t\n\t\tvoid main() {\n\t\t\tfloat depth = LinearDepth();\n\t\t\t#ifdef ONLY_DEPTH\n\t\t\t gl_FragColor = vec4(depth);\n\t\t\t#else\n\t\t\t\tfloat diff = abs(depth * u_camera_planes.y - u_distance);\n\t\t\t\tfloat dof = 1.0;\n\t\t\t\tif(diff <= u_range)\n\t\t\t\t\tdof = diff / u_range;\n\t\t\t gl_FragColor = vec4(dof);\n\t\t\t#endif\n\t\t}\n\t\t",
+{ONLY_DEPTH:""}));var f=this.properties.only_depth?p._shader_onlydepth:p._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:[0.1,1E3];c.u_camera_planes=b;this._temp_texture.drawTo(function(){a.bind(0);f.uniforms(c).draw(e)});this._temp_texture.near_far_planes=b;this.setOutputData(0,this._temp_texture)}}},p.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 float u_distance;\n\t\tuniform float u_range;\n\t\t\n\t\tfloat LinearDepth()\n\t\t{\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).x;\n\t\t\tdepth = depth * 2.0 - 1.0;\n\t\t\treturn zNear * (depth + 1.0) / (zFar + zNear - depth * (zFar - zNear));\n\t\t}\n\t\t\n\t\tvoid main() {\n\t\t\tfloat depth = LinearDepth();\n\t\t\t#ifdef ONLY_DEPTH\n\t\t\t gl_FragColor = vec4(depth);\n\t\t\t#else\n\t\t\t\tfloat diff = abs(depth * u_camera_planes.y - u_distance);\n\t\t\t\tfloat dof = 1.0;\n\t\t\t\tif(diff <= u_range)\n\t\t\t\t\tdof = diff / u_range;\n\t\t\t gl_FragColor = vec4(dof);\n\t\t\t#endif\n\t\t}\n\t\t",
E.registerNodeType("texture/depth_range",p),K.title="Blur",K.desc="Blur a texture",K.widgets_info={precision:{widget:"combo",values:c.MODE_VALUES}},K.max_iterations=20,K.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 c=this.properties.iterations;this.isInputConnected(1)&&
-(c=this.getInputData(1),this.properties.iterations=c);c=Math.min(Math.floor(c),K.max_iterations);if(0==c)this.setOutputData(0,a);else{var d=this.properties.intensity;this.isInputConnected(2)&&(d=this.getInputData(2),this.properties.intensity=d);var e=E.camera_aspect;e||void 0===window.gl||(e=gl.canvas.height/gl.canvas.width);e||(e=1);var e=this.properties.preserve_aspect?e:1,g=this.properties.scale||[1,1];a.applyBlur(e*g[0],g[1],d,b);for(a=1;a>=1;1<(d|0)&&(d>>=1);if(2>b)break;h=k[q]=GL.Texture.getTemporary(b,d,e);t[0]=1/n.width;t[1]=1/n.height;n.blit(h,m.uniforms(f));n=h}this.isOutputConnected(2)&&(b=this._average_texture,b&&b.type==a.type&&b.format==a.format||(b=this._average_texture=new GL.Texture(1,1,{type:a.type,format:a.format,filter:gl.LINEAR})),t[0]=1/n.width,t[1]=1/n.height,f.u_intensity=p,f.u_delta=1,n.blit(b,m.uniforms(f)),this.setOutputData(2,b));gl.enable(gl.BLEND);gl.blendFunc(gl.ONE,gl.ONE);f.u_intensity=
-this.getInputOrProperty("persistence");f.u_delta=0.5;for(q-=2;0<=q;q--)h=k[q],k[q]=null,t[0]=1/n.width,t[1]=1/n.height,n.blit(h,m.uniforms(f)),GL.Texture.releaseTemporary(n),n=h;gl.disable(gl.BLEND);this.isOutputConnected(1)&&(k=this._glow_texture,k&&k.width==a.width&&k.height==a.height&&k.type==g&&k.format==a.format||(k=this._glow_texture=new GL.Texture(a.width,a.height,{type:g,format:a.format,filter:gl.LINEAR})),n.blit(k),this.setOutputData(1,k));if(this.isOutputConnected(0)){k=this._final_texture;
-k&&k.width==a.width&&k.height==a.height&&k.type==g&&k.format==a.format||(k=this._final_texture=new GL.Texture(a.width,a.height,{type:g,format:a.format,filter:gl.LINEAR}));var s=this.getInputData(1),r=this.getInputOrProperty("dirt_factor");f.u_intensity=p;m=s?A._dirt_final_shader:A._final_shader;m||(m=s?A._dirt_final_shader=new GL.Shader(GL.Shader.SCREEN_VERTEX_SHADER,A.final_pixel_shader,{USE_DIRT:""}):A._final_shader=new GL.Shader(GL.Shader.SCREEN_VERTEX_SHADER,A.final_pixel_shader));k.drawTo(function(){a.bind(0);
-n.bind(1);s&&(m.setUniform("u_dirt_factor",r),m.setUniform("u_dirt_texture",s.bind(2)));m.toViewport(f)});this.setOutputData(0,k)}GL.Texture.releaseTemporary(n)}},A.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}",A.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}",
+"number"]]},A.prototype.onGetOutputs=function(){return[["average","Texture"]]},A.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=a.width,d=a.height,e={format:a.format,type:a.type,minFilter:GL.LINEAR,magFilter:GL.LINEAR,wrap:gl.CLAMP_TO_EDGE},f=c.getTextureType(this.properties.precision,a),h=this._uniforms,k=this._textures,g=A._cut_shader;
+g||(g=A._cut_shader=new GL.Shader(GL.Shader.SCREEN_VERTEX_SHADER,A.cut_pixel_shader));gl.disable(gl.DEPTH_TEST);gl.disable(gl.BLEND);h.u_threshold=this.getInputOrProperty("threshold");var m=k[0]=GL.Texture.getTemporary(b,d,e);a.blit(m,g.uniforms(h));var n=m,l=this.getInputOrProperty("iterations"),l=Math.clamp(l,1,16)|0,t=h.u_texel_size,p=this.getInputOrProperty("intensity");h.u_intensity=1;h.u_delta=this.properties.scale;g=A._shader;g||(g=A._shader=new GL.Shader(GL.Shader.SCREEN_VERTEX_SHADER,A.scale_pixel_shader));
+for(var r=1;r>=1;1<(d|0)&&(d>>=1);if(2>b)break;m=k[r]=GL.Texture.getTemporary(b,d,e);t[0]=1/n.width;t[1]=1/n.height;n.blit(m,g.uniforms(h));n=m}this.isOutputConnected(2)&&(b=this._average_texture,b&&b.type==a.type&&b.format==a.format||(b=this._average_texture=new GL.Texture(1,1,{type:a.type,format:a.format,filter:gl.LINEAR})),t[0]=1/n.width,t[1]=1/n.height,h.u_intensity=p,h.u_delta=1,n.blit(b,g.uniforms(h)),this.setOutputData(2,b));gl.enable(gl.BLEND);gl.blendFunc(gl.ONE,gl.ONE);h.u_intensity=
+this.getInputOrProperty("persistence");h.u_delta=0.5;for(r-=2;0<=r;r--)m=k[r],k[r]=null,t[0]=1/n.width,t[1]=1/n.height,n.blit(m,g.uniforms(h)),GL.Texture.releaseTemporary(n),n=m;gl.disable(gl.BLEND);this.isOutputConnected(1)&&(k=this._glow_texture,k&&k.width==a.width&&k.height==a.height&&k.type==f&&k.format==a.format||(k=this._glow_texture=new GL.Texture(a.width,a.height,{type:f,format:a.format,filter:gl.LINEAR})),n.blit(k),this.setOutputData(1,k));if(this.isOutputConnected(0)){k=this._final_texture;
+k&&k.width==a.width&&k.height==a.height&&k.type==f&&k.format==a.format||(k=this._final_texture=new GL.Texture(a.width,a.height,{type:f,format:a.format,filter:gl.LINEAR}));var s=this.getInputData(1),q=this.getInputOrProperty("dirt_factor");h.u_intensity=p;g=s?A._dirt_final_shader:A._final_shader;g||(g=s?A._dirt_final_shader=new GL.Shader(GL.Shader.SCREEN_VERTEX_SHADER,A.final_pixel_shader,{USE_DIRT:""}):A._final_shader=new GL.Shader(GL.Shader.SCREEN_VERTEX_SHADER,A.final_pixel_shader));k.drawTo(function(){a.bind(0);
+n.bind(1);s&&(g.setUniform("u_dirt_factor",q),g.setUniform("u_dirt_texture",s.bind(2)));g.toViewport(h)});this.setOutputData(0,k)}GL.Texture.releaseTemporary(n)}},A.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}",A.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}",
A.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}",
E.registerNodeType("texture/glow",A),G.title="Kuwahara Filter",G.desc="Filters a texture giving an artistic oil canvas painting",G.max_radius=10,G._shaders=[],G.prototype.onExecute=function(){var a=this.getInputData(0);if(a&&this.isOutputConnected(0)){var b=this._temp_texture;b&&b.width==a.width&&b.height==a.height&&b.type==a.type||(this._temp_texture=new GL.Texture(a.width,a.height,{type:a.type,format:gl.RGBA,filter:gl.LINEAR}));b=this.properties.radius;b=Math.min(Math.floor(b),G.max_radius);if(0==
-b)this.setOutputData(0,a);else{var c=this.properties.intensity,d=E.camera_aspect;d||void 0===window.gl||(d=gl.canvas.height/gl.canvas.width);d||(d=1);d=this.properties.preserve_aspect?d:1;G._shaders[b]||(G._shaders[b]=new GL.Shader(Shader.SCREEN_VERTEX_SHADER,G.pixel_shader,{RADIUS:b.toFixed(0)}));var e=G._shaders[b],g=GL.Mesh.getScreenQuad();a.bind(0);this._temp_texture.drawTo(function(){e.uniforms({u_texture:0,u_intensity:c,u_resolution:[a.width,a.height],u_iResolution:[1/a.width,1/a.height]}).draw(g)});
+b)this.setOutputData(0,a);else{var c=this.properties.intensity,d=E.camera_aspect;d||void 0===window.gl||(d=gl.canvas.height/gl.canvas.width);d||(d=1);d=this.properties.preserve_aspect?d:1;G._shaders[b]||(G._shaders[b]=new GL.Shader(Shader.SCREEN_VERTEX_SHADER,G.pixel_shader,{RADIUS:b.toFixed(0)}));var e=G._shaders[b],f=GL.Mesh.getScreenQuad();a.bind(0);this._temp_texture.drawTo(function(){e.uniforms({u_texture:0,u_intensity:c,u_resolution:[a.width,a.height],u_iResolution:[1/a.width,1/a.height]}).draw(f)});
this.setOutputData(0,this._temp_texture)}}},G.pixel_shader="\nprecision highp float;\nvarying vec2 v_coord;\nuniform sampler2D u_texture;\nuniform float u_intensity;\nuniform vec2 u_resolution;\nuniform vec2 u_iResolution;\n#ifndef RADIUS\n\t#define RADIUS 7\n#endif\nvoid main() {\n\n\tconst int radius = RADIUS;\n\tvec2 fragCoord = v_coord;\n\tvec2 src_size = u_iResolution;\n\tvec2 uv = v_coord;\n\tfloat n = float((radius + 1) * (radius + 1));\n\tint i;\n\tint j;\n\tvec3 m0 = vec3(0.0); vec3 m1 = vec3(0.0); vec3 m2 = vec3(0.0); vec3 m3 = vec3(0.0);\n\tvec3 s0 = vec3(0.0); vec3 s1 = vec3(0.0); vec3 s2 = vec3(0.0); vec3 s3 = vec3(0.0);\n\tvec3 c;\n\t\n\tfor (int j = -radius; j <= 0; ++j) {\n\t\tfor (int i = -radius; i <= 0; ++i) {\n\t\t\tc = texture2D(u_texture, uv + vec2(i,j) * src_size).rgb;\n\t\t\tm0 += c;\n\t\t\ts0 += c * c;\n\t\t}\n\t}\n\t\n\tfor (int j = -radius; j <= 0; ++j) {\n\t\tfor (int i = 0; i <= radius; ++i) {\n\t\t\tc = texture2D(u_texture, uv + vec2(i,j) * src_size).rgb;\n\t\t\tm1 += c;\n\t\t\ts1 += c * c;\n\t\t}\n\t}\n\t\n\tfor (int j = 0; j <= radius; ++j) {\n\t\tfor (int i = 0; i <= radius; ++i) {\n\t\t\tc = texture2D(u_texture, uv + vec2(i,j) * src_size).rgb;\n\t\t\tm2 += c;\n\t\t\ts2 += c * c;\n\t\t}\n\t}\n\t\n\tfor (int j = 0; j <= radius; ++j) {\n\t\tfor (int i = -radius; i <= 0; ++i) {\n\t\t\tc = texture2D(u_texture, uv + vec2(i,j) * src_size).rgb;\n\t\t\tm3 += c;\n\t\t\ts3 += c * c;\n\t\t}\n\t}\n\t\n\tfloat min_sigma2 = 1e+2;\n\tm0 /= n;\n\ts0 = abs(s0 / n - m0 * m0);\n\t\n\tfloat sigma2 = s0.r + s0.g + s0.b;\n\tif (sigma2 < min_sigma2) {\n\t\tmin_sigma2 = sigma2;\n\t\tgl_FragColor = vec4(m0, 1.0);\n\t}\n\t\n\tm1 /= n;\n\ts1 = abs(s1 / n - m1 * m1);\n\t\n\tsigma2 = s1.r + s1.g + s1.b;\n\tif (sigma2 < min_sigma2) {\n\t\tmin_sigma2 = sigma2;\n\t\tgl_FragColor = vec4(m1, 1.0);\n\t}\n\t\n\tm2 /= n;\n\ts2 = abs(s2 / n - m2 * m2);\n\t\n\tsigma2 = s2.r + s2.g + s2.b;\n\tif (sigma2 < min_sigma2) {\n\t\tmin_sigma2 = sigma2;\n\t\tgl_FragColor = vec4(m2, 1.0);\n\t}\n\t\n\tm3 /= n;\n\ts3 = abs(s3 / n - m3 * m3);\n\t\n\tsigma2 = s3.r + s3.g + s3.b;\n\tif (sigma2 < min_sigma2) {\n\t\tmin_sigma2 = sigma2;\n\t\tgl_FragColor = vec4(m3, 1.0);\n\t}\n}\n",
E.registerNodeType("texture/kuwahara",G),H.title="XDoG Filter",H.desc="Filters a texture giving an artistic ink style",H.max_radius=10,H._shaders=[],H.prototype.onExecute=function(){var a=this.getInputData(0);if(a&&this.isOutputConnected(0)){var b=this._temp_texture;b&&b.width==a.width&&b.height==a.height&&b.type==a.type||(this._temp_texture=new GL.Texture(a.width,a.height,{type:a.type,format:gl.RGBA,filter:gl.LINEAR}));H._xdog_shader||(H._xdog_shader=new GL.Shader(Shader.SCREEN_VERTEX_SHADER,H.xdog_pixel_shader));
-var c=H._xdog_shader,d=GL.Mesh.getScreenQuad(),e=this.properties.sigma,g=this.properties.k,f=this.properties.p,k=this.properties.epsilon,m=this.properties.phi;a.bind(0);this._temp_texture.drawTo(function(){c.uniforms({src:0,sigma:e,k:g,p:f,epsilon:k,phi:m,cvsWidth:a.width,cvsHeight:a.height}).draw(d)});this.setOutputData(0,this._temp_texture)}},H.xdog_pixel_shader="\nprecision highp float;\nuniform sampler2D src;\n\nuniform float cvsHeight;\nuniform float cvsWidth;\n\nuniform float sigma;\nuniform float k;\nuniform float p;\nuniform float epsilon;\nuniform float phi;\nvarying vec2 v_coord;\n\nfloat cosh(float val)\n{\n\tfloat tmp = exp(val);\n\tfloat cosH = (tmp + 1.0 / tmp) / 2.0;\n\treturn cosH;\n}\n\nfloat tanh(float val)\n{\n\tfloat tmp = exp(val);\n\tfloat tanH = (tmp - 1.0 / tmp) / (tmp + 1.0 / tmp);\n\treturn tanH;\n}\n\nfloat sinh(float val)\n{\n\tfloat tmp = exp(val);\n\tfloat sinH = (tmp - 1.0 / tmp) / 2.0;\n\treturn sinH;\n}\n\nvoid main(void){\n\tvec3 destColor = vec3(0.0);\n\tfloat tFrag = 1.0 / cvsHeight;\n\tfloat sFrag = 1.0 / cvsWidth;\n\tvec2 Frag = vec2(sFrag,tFrag);\n\tvec2 uv = gl_FragCoord.st;\n\tfloat twoSigmaESquared = 2.0 * sigma * sigma;\n\tfloat twoSigmaRSquared = twoSigmaESquared * k * k;\n\tint halfWidth = int(ceil( 1.0 * sigma * k ));\n\n\tconst int MAX_NUM_ITERATION = 99999;\n\tvec2 sum = vec2(0.0);\n\tvec2 norm = vec2(0.0);\n\n\tfor(int cnt=0;cnt (2*halfWidth+1)*(2*halfWidth+1)){break;}\n\t\tint i = int(cnt / (2*halfWidth+1)) - halfWidth;\n\t\tint j = cnt - halfWidth - int(cnt / (2*halfWidth+1)) * (2*halfWidth+1);\n\n\t\tfloat d = length(vec2(i,j));\n\t\tvec2 kernel = vec2( exp( -d * d / twoSigmaESquared ), \n\t\t\t\t\t\t\texp( -d * d / twoSigmaRSquared ));\n\n\t\tvec2 L = texture2D(src, (uv + vec2(i,j)) * Frag).xx;\n\n\t\tnorm += kernel;\n\t\tsum += kernel * L;\n\t}\n\n\tsum /= norm;\n\n\tfloat H = 100.0 * ((1.0 + p) * sum.x - p * sum.y);\n\tfloat edge = ( H > epsilon )? 1.0 : 1.0 + tanh( phi * (H - epsilon));\n\tdestColor = vec3(edge);\n\tgl_FragColor = vec4(destColor, 1.0);\n}",
+var c=H._xdog_shader,d=GL.Mesh.getScreenQuad(),e=this.properties.sigma,f=this.properties.k,h=this.properties.p,k=this.properties.epsilon,g=this.properties.phi;a.bind(0);this._temp_texture.drawTo(function(){c.uniforms({src:0,sigma:e,k:f,p:h,epsilon:k,phi:g,cvsWidth:a.width,cvsHeight:a.height}).draw(d)});this.setOutputData(0,this._temp_texture)}},H.xdog_pixel_shader="\nprecision highp float;\nuniform sampler2D src;\n\nuniform float cvsHeight;\nuniform float cvsWidth;\n\nuniform float sigma;\nuniform float k;\nuniform float p;\nuniform float epsilon;\nuniform float phi;\nvarying vec2 v_coord;\n\nfloat cosh(float val)\n{\n\tfloat tmp = exp(val);\n\tfloat cosH = (tmp + 1.0 / tmp) / 2.0;\n\treturn cosH;\n}\n\nfloat tanh(float val)\n{\n\tfloat tmp = exp(val);\n\tfloat tanH = (tmp - 1.0 / tmp) / (tmp + 1.0 / tmp);\n\treturn tanH;\n}\n\nfloat sinh(float val)\n{\n\tfloat tmp = exp(val);\n\tfloat sinH = (tmp - 1.0 / tmp) / 2.0;\n\treturn sinH;\n}\n\nvoid main(void){\n\tvec3 destColor = vec3(0.0);\n\tfloat tFrag = 1.0 / cvsHeight;\n\tfloat sFrag = 1.0 / cvsWidth;\n\tvec2 Frag = vec2(sFrag,tFrag);\n\tvec2 uv = gl_FragCoord.st;\n\tfloat twoSigmaESquared = 2.0 * sigma * sigma;\n\tfloat twoSigmaRSquared = twoSigmaESquared * k * k;\n\tint halfWidth = int(ceil( 1.0 * sigma * k ));\n\n\tconst int MAX_NUM_ITERATION = 99999;\n\tvec2 sum = vec2(0.0);\n\tvec2 norm = vec2(0.0);\n\n\tfor(int cnt=0;cnt (2*halfWidth+1)*(2*halfWidth+1)){break;}\n\t\tint i = int(cnt / (2*halfWidth+1)) - halfWidth;\n\t\tint j = cnt - halfWidth - int(cnt / (2*halfWidth+1)) * (2*halfWidth+1);\n\n\t\tfloat d = length(vec2(i,j));\n\t\tvec2 kernel = vec2( exp( -d * d / twoSigmaESquared ), \n\t\t\t\t\t\t\texp( -d * d / twoSigmaRSquared ));\n\n\t\tvec2 L = texture2D(src, (uv + vec2(i,j)) * Frag).xx;\n\n\t\tnorm += kernel;\n\t\tsum += kernel * L;\n\t}\n\n\tsum /= norm;\n\n\tfloat H = 100.0 * ((1.0 + p) * sum.x - p * sum.y);\n\tfloat edge = ( H > epsilon )? 1.0 : 1.0 + tanh( phi * (H - epsilon));\n\tdestColor = vec3(edge);\n\tgl_FragColor = vec4(destColor, 1.0);\n}",
E.registerNodeType("texture/xDoG",H),F.title="Webcam",F.desc="Webcam texture",F.is_webcam_open=!1,F.prototype.openStream=function(){function a(c){F.is_webcam_open=!1;console.log("Webcam rejected",c);b._webcam_stream=!1;b.boxcolor="red";b.trigger("stream_error")}if(navigator.getUserMedia){this._waiting_confirmation=!0;navigator.mediaDevices.getUserMedia({audio:!1,video:{facingMode:this.properties.facingMode}}).then(this.streamReady.bind(this))["catch"](a);var b=this}},F.prototype.closeStream=function(){if(this._webcam_stream){var a=
this._webcam_stream.getTracks();if(a.length)for(var b=0;b=this.size[1]||!this._video||(a.save(),a.webgl?this._video_texture&&a.drawImage(this._video_texture,0,0,this.size[0],this.size[1]):a.drawImage(this._video,
0,0,this.size[0],this.size[1]),a.restore())},F.prototype.onExecute=function(){null!=this._webcam_stream||this._waiting_confirmation||this.openStream();if(this._video&&this._video.videoWidth){var a=this._video.videoWidth,b=this._video.videoHeight,d=this._video_texture;d&&d.width==a&&d.height==b||(this._video_texture=new GL.Texture(a,b,{format:gl.RGB,filter:gl.LINEAR}));this._video_texture.uploadImage(this._video);this._video_texture.version=++this.version;this.properties.texture_name&&(c.getTexturesContainer()[this.properties.texture_name]=
this._video_texture);this.setOutputData(0,this._video_texture);for(a=1;a= 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),e=this._texture;e&&e.width==a&&e.height==b&&e.type==d||(e=this._texture=new GL.Texture(a,b,{type:d,format:gl.RGB,filter:gl.LINEAR}));var f=this.getInputOrProperty("persistence"),h=this.getInputOrProperty("octaves"),k=this.getInputOrProperty("offset"),g=this.getInputOrProperty("scale"),m=this.getInputOrProperty("amplitude"),n=this.getInputOrProperty("seed"),
+d=""+a+b+d+f+h+g+n+k[0]+k[1]+m;if(d!=this._key){this._key=d;var l=this._uniforms;l.u_persistence=f;l.u_octaves=h;l.u_offset.set(k);l.u_scale=g;l.u_amplitude=m;l.u_seed=128*n;l.u_viewport[0]=a;l.u_viewport[1]=b;var t=J._shader;t||(t=J._shader=new GL.Shader(GL.Shader.SCREEN_VERTEX_SHADER,J.pixel_shader));gl.disable(gl.BLEND);gl.disable(gl.DEPTH_TEST);e.drawTo(function(){t.uniforms(l).draw(GL.Mesh.getScreenQuad())})}this.setOutputData(0,e)}},J.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}",
E.registerNodeType("texture/perlin",J),L.title="Canvas2D",L.desc="Executes Canvas2D code inside a texture or the viewport.",L.help="Set width and height to 0 to match viewport size.",L.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}},L.prototype.onPropertyChanged=function(a,b){"code"==a&&this.compileCode(b)},L.prototype.compileCode=function(a){this._func=null;if(E.allow_scripts)try{this._func=
-new Function("canvas","ctx","time","script","v",a),this.boxcolor="#00FF00"}catch(b){this.boxcolor="#FF0000",console.error("Error parsing script"),console.error(b)}},L.prototype.onExecute=function(){var a=this._func;a&&this.isOutputConnected(0)&&this.executeDraw(a)},L.prototype.executeDraw=function(a){var b=this.properties.width||gl.canvas.width,d=this.properties.height||gl.canvas.height,e=this._temp_texture,g=c.getTextureType(this.properties.precision);e&&e.width==b&&e.height==d&&e.type==g||(e=this._temp_texture=
-new GL.Texture(b,d,{format:gl.RGBA,filter:gl.LINEAR,type:g}));var f=this.getInputData(0),k=this.properties,m=this,h=this.graph.getTime(),n=gl,l=gl.canvas;if(this.properties.use_html_canvas||!u.enableWebGLCanvas)this._canvas?(l=this._canvas,n=this._ctx):(l=this._canvas=createCanvas(b.height),n=this._ctx=l.getContext("2d")),l.width=b,l.height=d;if(n==gl)e.drawTo(function(){gl.start2D();k.clear&&(gl.clearColor(0,0,0,0),gl.clear(gl.COLOR_BUFFER_BIT));try{a.draw?a.draw.call(m,l,n,h,a,f):a.call(m,l,n,h,
-a,f),m.boxcolor="#00FF00"}catch(b){m.boxcolor="#FF0000",console.error("Error executing script"),console.error(b)}gl.finish2D()});else{k.clear&&n.clearRect(0,0,l.width,l.height);try{a.draw?a.draw.call(this,l,n,h,a,f):a.call(this,l,n,h,a,f),this.boxcolor="#00FF00"}catch(t){this.boxcolor="#FF0000",console.error("Error executing script"),console.error(t)}e.uploadImage(l)}this.setOutputData(0,e)},E.registerNodeType("texture/canvas2D",L),M.title="Matte",M.desc="Extracts background",M.widgets_info={key_color:{widget:"color"},
+new Function("canvas","ctx","time","script","v",a),this.boxcolor="#00FF00"}catch(b){this.boxcolor="#FF0000",console.error("Error parsing script"),console.error(b)}},L.prototype.onExecute=function(){var a=this._func;a&&this.isOutputConnected(0)&&this.executeDraw(a)},L.prototype.executeDraw=function(a){var b=this.properties.width||gl.canvas.width,d=this.properties.height||gl.canvas.height,e=this._temp_texture,f=c.getTextureType(this.properties.precision);e&&e.width==b&&e.height==d&&e.type==f||(e=this._temp_texture=
+new GL.Texture(b,d,{format:gl.RGBA,filter:gl.LINEAR,type:f}));var h=this.getInputData(0),k=this.properties,g=this,m=this.graph.getTime(),n=gl,l=gl.canvas;if(this.properties.use_html_canvas||!v.enableWebGLCanvas)this._canvas?(l=this._canvas,n=this._ctx):(l=this._canvas=createCanvas(b.height),n=this._ctx=l.getContext("2d")),l.width=b,l.height=d;if(n==gl)e.drawTo(function(){gl.start2D();k.clear&&(gl.clearColor(0,0,0,0),gl.clear(gl.COLOR_BUFFER_BIT));try{a.draw?a.draw.call(g,l,n,m,a,h):a.call(g,l,n,m,
+a,h),g.boxcolor="#00FF00"}catch(b){g.boxcolor="#FF0000",console.error("Error executing script"),console.error(b)}gl.finish2D()});else{k.clear&&n.clearRect(0,0,l.width,l.height);try{a.draw?a.draw.call(this,l,n,m,a,h):a.call(this,l,n,m,a,h),this.boxcolor="#00FF00"}catch(t){this.boxcolor="#FF0000",console.error("Error executing script"),console.error(t)}e.uploadImage(l)}this.setOutputData(0,e)},E.registerNodeType("texture/canvas2D",L),M.title="Matte",M.desc="Extracts background",M.widgets_info={key_color:{widget:"color"},
precision:{widget:"combo",values:c.MODE_VALUES}},M.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(),e=M._shader;e||
(e=M._shader=new GL.Shader(GL.Shader.SCREEN_VERTEX_SHADER,M.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);e.uniforms(b).draw(d)});this.setOutputData(0,this._tex)}}},M.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}",
E.registerNodeType("texture/matte",M),N.title="CubemapToTexture2D",N.desc="Transforms a CUBEMAP texture into a TEXTURE2D in Polar Representation",N.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,
this._last_tex)}}},E.registerNodeType("texture/cubemapToTexture2D",N))})(this);
-(function(u){function c(){this.addOutput("out","geometry");this.addOutput("points","array");this.properties={radius:1,num_points:4096,regular:!1,mode:c.SPHERE};this.points=new Float32Array(3*this.properties.num_points);this.must_update=!0;this.version=0;this.geometry={vertices:null,_id:1E5*Math.random()|0}}function r(){this.addInput("mesh","mesh");this.addOutput("out","geometry");this.geometry={};this.last_mesh=null}function f(){this.addInput("in","geometry");this.addOutput("out","geometry");this.properties=
-{code:"V[1] += 0.01 * Math.sin(I + T*0.001);",execute_every_frame:!1};this.geometry=null;this.version=this.geometry_id=-1;this.must_update=!0;this.func=this.vertices=null}function h(){this.addInput("in","geometry");this.addOutput("out","geometry");this.properties={min_dist:0.4,max_dist:0.5,max_connections:0,probability:1};this.version=this.geometry_id=-1;this.my_version=1;this.must_update=!0}function q(){this.addInput("in","geometry");this.addInput("mat4","mat4");this.addInput("tex","texture");this.addOutput("mesh",
-"mesh");this.properties={enabled:!0,primitive:GL.TRIANGLES,additive:!1,color:[1,1,1],opacity:1};this.color=vec4.create([1,1,1,1]);this.uniforms={u_color:this.color};this.version=-1;this.mesh=null}function l(){this.addInput("in","geometry");this.addInput("mat4","mat4");this.addInput("tex","texture");this.properties={enabled:!0,point_size:0.1,fixed_size:!1,additive:!0,color:[1,1,1],opacity:1};this.color=vec4.create([1,1,1,1]);this.uniforms={u_point_size:1,u_perspective:1,u_point_perspective:1,u_color:this.color};
-this.version=this.geometry_id=-1;this.mesh=null}var y=u.LiteGraph,s=new Float32Array(16),w=new Float32Array(16),z=new Float32Array(16),e=new Float32Array(16),v={u_view:s,u_projection:w,u_viewprojection:z,u_model:e};y.LGraphRender={onRequestCameraMatrices:null};u.LGraphPoints3D=c;c.RECTANGLE=1;c.CIRCLE=2;c.CUBE=10;c.SPHERE=11;c.HEMISPHERE=12;c.INSIDE_SPHERE=13;c.MODE_VALUES={rectangle:c.RECTANGLE,circle:c.CIRCLE,cube:c.CUBE,sphere:c.SPHERE,hemisphere:c.HEMISPHERE,inside_sphere:c.INSIDE_SPHERE};c.widgets_info=
-{mode:{widget:"combo",values:c.MODE_VALUES}};c.title="list of points";c.desc="returns an array of points";c.prototype.onPropertyChanged=function(c,e){this.must_update=!0};c.prototype.onExecute=function(){this.must_update&&(this.must_update=!1,this.updatePoints());this.geometry.vertices=this.points;this.geometry._version=this.version;this.setOutputData(0,this.geometry)};c.generatePoints=function(e,f,h,g,l){var n=3*f;g&&g.length==n||(g=new Float32Array(n));if(l)if(h==c.RECTANGLE){n=Math.floor(Math.sqrt(f));
-for(f=0;fe&&(e=1);this.points.length!=3*e&&(this.points=new Float32Array(3*e));this.points=c.generatePoints(this.properties.radius,e,this.properties.mode,this.points,this.properties.regular);this.version++};y.registerNodeType("geometry/points3D",c);r.title="to geometry";r.desc="converts a mesh to geometry";r.prototype.onExecute=function(){var c=this.getInputData(0);if(c){if(c!=
-this.last_mesh){this.last_mesh=c;for(i in c.vertexBuffers)this.geometry[i]=c.vertexBuffers[i].data;c.indexBuffers.triangles&&(this.geometry.indices=c.indexBuffers.triangles.data);this.geometry._id=1E5*Math.random()|0;this.geometry._version=0}this.setOutputData(0,this.geometry);this.geometry&&this.setOutputData(1,this.geometry.vertices)}};y.registerNodeType("geometry/toGeometry",r);f.title="geoeval";f.desc="eval code";f.widgets_info={code:{widget:"code"}};f.prototype.onConfigure=function(c){this.compileCode()};
-f.prototype.compileCode=function(){if(this.properties.code)try{this.func=new Function("V","I","T",this.properties.code),this.boxcolor="#AFA",this.must_update=!0}catch(c){this.boxcolor="red"}};f.prototype.onPropertyChanged=function(c,e){"code"==c&&(this.properties.code=e,this.compileCode())};f.prototype.onExecute=function(){var c=this.getInputData(0);if(c)if(this.func){if(this.geometry_id!=c._id||this.version!=c._version||this.must_update||this.properties.execute_every_frame){this.must_update=!1;this.geometry_id=
-c._id;this.properties.execute_every_frame?this.version++:this.version=c._version;var e=this.func,f=getTime();this.geometry||(this.geometry={});for(var g in c)null!=c[g]&&(this.geometry[g]=c[g].constructor==Float32Array?new Float32Array(c[g]):c[g]);this.geometry._id=c._id;this.geometry._version=this.properties.execute_every_frame?this.version:c._version+1;var h=vec3.create(),l=this.vertices;l&&this.vertices.length==c.vertices.length?l.set(c.vertices):l=this.vertices=new Float32Array(c.vertices);for(g=
-0;gh||wl&&
-la))break}this.geometry.indices=this.indices=new Uint32Array(b)}this.indices&&this.indices.length?(this.geometry.indices=this.indices,this.setOutputData(0,this.geometry)):this.setOutputData(0,null)}};y.registerNodeType("geometry/connectPoints",h);"undefined"!=typeof GL&&(q.title="render",q.desc="renders a geometry",q.PRIMITIVE_VALUES={points:GL.POINTS,lines:GL.LINES,line_loop:GL.LINE_LOOP,line_strip:GL.LINE_STRIP,triangles:GL.TRIANGLES,triangle_fan:GL.TRIANGLE_FAN,
-triangle_strip:GL.TRIANGLE_STRIP},q.widgets_info={primitive:{widget:"combo",values:q.PRIMITIVE_VALUES},color:{widget:"color"}},q.prototype.updateMesh=function(c){this.mesh||(this.mesh=new GL.Mesh);for(var e in c)if("_"!=e[0]){var f=c[e],g=GL.Mesh.common_buffers[e];if(g||"indices"==e){var g=g?g.spacing:3,h=this.mesh.vertexBuffers[e];h&&h.data.length==f.length?(h.data.set(f),h.upload(GL.DYNAMIC_DRAW)):h=new GL.Buffer("indices"==e?GL.ELEMENT_ARRAY_BUFFER:GL.ARRAY_BUFFER,f,g,GL.DYNAMIC_DRAW);this.mesh.addBuffer(e,
-h)}}this.geometry_id=this.mesh.id=c._id;this.version=this.mesh.version=c._version;return this.mesh},q.prototype.onExecute=function(){if(this.properties.enabled){var c=this.getInputData(0);if(c)if(this.version==c._version&&this.geometry_id==c._id||this.updateMesh(c),y.LGraphRender.onRequestCameraMatrices){y.LGraphRender.onRequestCameraMatrices(s,w,z);c=null;this.getInputData(2)?(c=gl.shaders.textured)||(c=gl.shaders.textured=new GL.Shader(l.vertex_shader_code,l.fragment_shader_code,{USE_TEXTURE:""})):
-(c=gl.shaders.flat)||(c=gl.shaders.flat=new GL.Shader(l.vertex_shader_code,l.fragment_shader_code));this.color.set(this.properties.color);this.color[3]=this.properties.opacity;var f=this.getInputData(1);f?e.set(f):mat4.identity(e);this.uniforms.u_point_size=1;f=this.properties.primitive;c.uniforms(v);c.uniforms(this.uniforms);1<=this.properties.opacity?gl.disable(gl.BLEND):gl.enable(gl.BLEND);gl.enable(gl.DEPTH_TEST);this.properties.additive?(gl.blendFunc(gl.SRC_ALPHA,gl.ONE),gl.depthMask(!1)):gl.blendFunc(gl.SRC_ALPHA,
-gl.ONE_MINUS_SRC_ALPHA);c.draw(this.mesh,f,"indices");gl.disable(gl.BLEND);gl.depthMask(!0)}else console.warn("cannot render geometry, LiteGraph.onRequestCameraMatrices is null, remember to fill this with a callback(view_matrix, projection_matrix,viewprojection_matrix) to use 3D rendering from the graph")}},y.registerNodeType("geometry/render",q),l.widgets_info={color:{widget:"color"}},l.prototype.updateMesh=function(c){this.buffer&&this.buffer.data.length==c.vertices.length?(this.buffer.data.set(c.vertices),
-this.buffer.upload(GL.DYNAMIC_DRAW)):this.buffer=new GL.Buffer(GL.ARRAY_BUFFER,c.vertices,3,GL.DYNAMIC_DRAW);this.mesh||(this.mesh=new GL.Mesh);this.mesh.addBuffer("vertices",this.buffer);this.geometry_id=this.mesh.id=c._id;this.version=this.mesh.version=c._version},l.prototype.onExecute=function(){if(this.properties.enabled){var c=this.getInputData(0);if(c)if(this.version==c._version&&this.geometry_id==c._id||this.updateMesh(c),y.LGraphRender.onRequestCameraMatrices){y.LGraphRender.onRequestCameraMatrices(s,
-w,z);c=null;this.getInputData(2)?(c=gl.shaders.textured_points)||(c=gl.shaders.textured_points=new GL.Shader(l.vertex_shader_code,l.fragment_shader_code,{USE_TEXTURED_POINTS:""})):(c=gl.shaders.points)||(c=gl.shaders.points=new GL.Shader(l.vertex_shader_code,l.fragment_shader_code,{USE_POINTS:""}));this.color.set(this.properties.color);this.color[3]=this.properties.opacity;var f=this.getInputData(1);f?e.set(f):mat4.identity(e);this.uniforms.u_point_size=this.properties.point_size;this.uniforms.u_point_perspective=
-this.properties.fixed_size?0:1;this.uniforms.u_perspective=gl.viewport_data[3]*w[5];c.uniforms(v);c.uniforms(this.uniforms);1<=this.properties.opacity?gl.disable(gl.BLEND):gl.enable(gl.BLEND);gl.enable(gl.DEPTH_TEST);this.properties.additive?(gl.blendFunc(gl.SRC_ALPHA,gl.ONE),gl.depthMask(!1)):gl.blendFunc(gl.SRC_ALPHA,gl.ONE_MINUS_SRC_ALPHA);c.draw(this.mesh,GL.POINTS);gl.disable(gl.BLEND);gl.depthMask(!0)}else console.warn("cannot render geometry, LiteGraph.onRequestCameraMatrices is null, remember to fill this with a callback(view_matrix, projection_matrix,viewprojection_matrix) to use 3D rendering from the graph")}},
-y.registerNodeType("geometry/render_points",l),l.vertex_shader_code="\t\tprecision mediump float;\n\t\tattribute vec3 a_vertex;\n\t\tvarying vec3 v_vertex;\n\t\tattribute vec3 a_normal;\n\t\tvarying vec3 v_normal;\n\t\t#ifdef USE_COLOR\n\t\t\tattribute vec4 a_color;\n\t\t\tvarying vec4 v_color;\n\t\t#endif\n\t\tattribute vec2 a_coord;\n\t\tvarying vec2 v_coord;\n\t\t#ifdef USE_SIZE\n\t\t\tattribute float a_extra;\n\t\t#endif\n\t\t#ifdef USE_INSTANCING\n\t\t\tattribute mat4 u_model;\n\t\t#else\n\t\t\tuniform mat4 u_model;\n\t\t#endif\n\t\tuniform mat4 u_viewprojection;\n\t\tuniform float u_point_size;\n\t\tuniform float u_perspective;\n\t\tuniform float u_point_perspective;\n\t\tfloat computePointSize(float radius, float w)\n\t\t{\n\t\t\tif(radius < 0.0)\n\t\t\t\treturn -radius;\n\t\t\treturn u_perspective * radius / w;\n\t\t}\n\t\tvoid main() {\n\t\t\tv_coord = a_coord;\n\t\t\t#ifdef USE_COLOR\n\t\t\t\tv_color = a_color;\n\t\t\t#endif\n\t\t\tv_vertex = ( u_model * vec4( a_vertex, 1.0 )).xyz;\n\t\t\tv_normal = ( u_model * vec4( a_normal, 0.0 )).xyz;\n\t\t\tgl_Position = u_viewprojection * vec4(v_vertex,1.0);\n\t\t\tgl_PointSize = u_point_size;\n\t\t\t#ifdef USE_SIZE\n\t\t\t\tgl_PointSize = a_extra;\n\t\t\t#endif\n\t\t\tif(u_point_perspective != 0.0)\n\t\t\t\tgl_PointSize = computePointSize( gl_PointSize, gl_Position.w );\n\t\t}\t",
-l.fragment_shader_code="\t\tprecision mediump float;\n\t\tuniform vec4 u_color;\n\t\t#ifdef USE_COLOR\n\t\t\tvarying vec4 v_color;\n\t\t#endif\n\t\tvarying vec2 v_coord;\n\t\tuniform sampler2D u_texture;\n\t\tvoid main() {\n\t\t\tvec4 color = u_color;\n\t\t\t#ifdef USE_TEXTURED_POINTS\n\t\t\t\tcolor *= texture2D(u_texture, gl_PointCoord.xy);\n\t\t\t#else\n\t\t\t\t#ifdef USE_TEXTURE\n\t\t\t\t color *= texture2D(u_texture, v_coord);\n\t\t\t\t if(color.a < 0.1)\n\t\t\t\t\tdiscard;\n\t\t\t\t#endif\n\t\t\t\t#ifdef USE_POINTS\n\t\t\t\t\tfloat dist = length( gl_PointCoord.xy - vec2(0.5) );\n\t\t\t\t\tif( dist > 0.45 )\n\t\t\t\t\t\tdiscard;\n\t\t\t\t#endif\n\t\t\t#endif\n\t\t\t#ifdef USE_COLOR\n\t\t\t\tcolor *= v_color;\n\t\t\t#endif\n\t\t\tgl_FragColor = color;\n\t\t}\t")})(this);
-(function(u){var c=u.LiteGraph;if("undefined"!=typeof GL){var r=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:LGraphTexture.DEFAULT};r._shader||(r._shader=new GL.Shader(GL.Shader.SCREEN_VERTEX_SHADER,r.pixel_shader),r._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]}))};r.title="Lens";r.desc="Camera Lens distortion";r.widgets_info={precision:{widget:"combo",values:LGraphTexture.MODE_VALUES}};r.prototype.onExecute=function(){var c=this.getInputData(0);if(this.properties.precision===LGraphTexture.PASS_THROUGH)this.setOutputData(0,c);else if(c){this._tex=LGraphTexture.getTargetTexture(c,this._tex,this.properties.precision);var f=this.properties.aberration;this.isInputConnected(1)&&(f=this.getInputData(1),
-this.properties.aberration=f);var h=this.properties.distortion;this.isInputConnected(2)&&(h=this.getInputData(2),this.properties.distortion=h);var q=this.properties.blur;this.isInputConnected(3)&&(q=this.getInputData(3),this.properties.blur=q);gl.disable(gl.BLEND);gl.disable(gl.DEPTH_TEST);var u=Mesh.getScreenQuad(),e=r._shader;this._tex.drawTo(function(){c.bind(0);e.uniforms({u_texture:0,u_aberration:f,u_distortion:h,u_blur:q}).draw(u)});this.setOutputData(0,this._tex)}};r.pixel_shader="precision highp float;\n\t\t\tprecision highp float;\n\t\t\tvarying vec2 v_coord;\n\t\t\tuniform sampler2D u_texture;\n\t\t\tuniform vec2 u_camera_planes;\n\t\t\tuniform float u_aberration;\n\t\t\tuniform float u_distortion;\n\t\t\tuniform float u_blur;\n\t\t\t\n\t\t\tvoid main() {\n\t\t\t\tvec2 coord = v_coord;\n\t\t\t\tfloat dist = distance(vec2(0.5), coord);\n\t\t\t\tvec2 dist_coord = coord - vec2(0.5);\n\t\t\t\tfloat percent = 1.0 + ((0.5 - dist) / 0.5) * u_distortion;\n\t\t\t\tdist_coord *= percent;\n\t\t\t\tcoord = dist_coord + vec2(0.5);\n\t\t\t\tvec4 color = texture2D(u_texture,coord, u_blur * dist);\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\t\t\t\tcolor.b = texture2D(u_texture,vec2(0.5) + dist_coord * (1.0-0.01*u_aberration), u_blur * dist ).b;\n\t\t\t\tgl_FragColor = color;\n\t\t\t}\n\t\t\t";
-c.registerNodeType("fx/lens",r);u.LGraphFXLens=r;var f=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}};f.title="Bokeh";f.desc="applies an Bokeh effect";f.widgets_info={shape:{widget:"texture"}};f.prototype.onExecute=function(){var c=this.getInputData(0),h=this.getInputData(1),q=this.getInputData(2);
-if(c&&q&&this.properties.shape){h||(h=c);var r=LGraphTexture.getTexture(this.properties.shape);if(r){var u=this.properties.threshold;this.isInputConnected(3)&&(u=this.getInputData(3),this.properties.threshold=u);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 v=f._first_shader;v||(v=f._first_shader=new GL.Shader(Shader.SCREEN_VERTEX_SHADER,f._first_pixel_shader));var k=f._second_shader;k||(k=f._second_shader=new GL.Shader(f._second_vertex_shader,f._second_pixel_shader));var m=this._points_mesh;m&&m._width==c.width&&m._height==c.height&&2==m._spacing||(m=this.createPointsMesh(c.width,c.height,2));var D=Mesh.getScreenQuad(),g=this.properties.size,t=this.properties.alpha;gl.disable(gl.DEPTH_TEST);gl.disable(gl.BLEND);this._temp_texture.drawTo(function(){c.bind(0);
-h.bind(1);q.bind(2);v.uniforms({u_texture:0,u_texture_blur:1,u_mask:2,u_texsize:[c.width,c.height]}).draw(D)});this._temp_texture.drawTo(function(){gl.enable(gl.BLEND);gl.blendFunc(gl.ONE,gl.ONE);c.bind(0);r.bind(3);k.uniforms({u_texture:0,u_mask:2,u_shape:3,u_alpha:t,u_threshold:u,u_pointSize:g,u_itexsize:[1/c.width,1/c.height]}).draw(m,gl.POINTS)});this.setOutputData(0,this._temp_texture)}}else this.setOutputData(0,c)};f.prototype.createPointsMesh=function(c,f,h){for(var q=Math.round(c/h),r=Math.round(f/
-h),e=new Float32Array(q*r*2),v=-1,k=2/c*h,m=2/f*h,u=0;u=c.NOTEON||f<=c.NOTEOFF)this.channel=
+(function(v){function c(){this.addOutput("out","geometry");this.addOutput("points","array");this.properties={radius:1,num_points:4096,regular:!1,mode:c.SPHERE};this.points=new Float32Array(3*this.properties.num_points);this.must_update=!0;this.version=0;this.geometry={vertices:null,_id:1E5*Math.random()|0}}function q(){this.addInput("mesh","mesh");this.addOutput("out","geometry");this.geometry={};this.last_mesh=null}function g(){this.addInput("in","geometry");this.addOutput("out","geometry");this.properties=
+{code:"V[1] += 0.01 * Math.sin(I + T*0.001);",execute_every_frame:!1};this.geometry=null;this.version=this.geometry_id=-1;this.must_update=!0;this.func=this.vertices=null}function l(){this.addInput("in","geometry");this.addOutput("out","geometry");this.properties={min_dist:0.4,max_dist:0.5,max_connections:0,probability:1};this.version=this.geometry_id=-1;this.my_version=1;this.must_update=!0}function r(){this.addInput("in","geometry");this.addInput("mat4","mat4");this.addInput("tex","texture");this.addOutput("mesh",
+"mesh");this.properties={enabled:!0,primitive:GL.TRIANGLES,additive:!1,color:[1,1,1],opacity:1};this.color=vec4.create([1,1,1,1]);this.uniforms={u_color:this.color};this.version=-1;this.mesh=null}function f(){this.addInput("in","geometry");this.addInput("mat4","mat4");this.addInput("tex","texture");this.properties={enabled:!0,point_size:0.1,fixed_size:!1,additive:!0,color:[1,1,1],opacity:1};this.color=vec4.create([1,1,1,1]);this.uniforms={u_point_size:1,u_perspective:1,u_point_perspective:1,u_color:this.color};
+this.version=this.geometry_id=-1;this.mesh=null}var y=v.LiteGraph,s=new Float32Array(16),u=new Float32Array(16),z=new Float32Array(16),e=new Float32Array(16),w={u_view:s,u_projection:u,u_viewprojection:z,u_model:e};y.LGraphRender={onRequestCameraMatrices:null};v.LGraphPoints3D=c;c.RECTANGLE=1;c.CIRCLE=2;c.CUBE=10;c.SPHERE=11;c.HEMISPHERE=12;c.INSIDE_SPHERE=13;c.MODE_VALUES={rectangle:c.RECTANGLE,circle:c.CIRCLE,cube:c.CUBE,sphere:c.SPHERE,hemisphere:c.HEMISPHERE,inside_sphere:c.INSIDE_SPHERE};c.widgets_info=
+{mode:{widget:"combo",values:c.MODE_VALUES}};c.title="list of points";c.desc="returns an array of points";c.prototype.onPropertyChanged=function(c,e){this.must_update=!0};c.prototype.onExecute=function(){this.must_update&&(this.must_update=!1,this.updatePoints());this.geometry.vertices=this.points;this.geometry._version=this.version;this.setOutputData(0,this.geometry)};c.generatePoints=function(e,f,g,h,l){var m=3*f;h&&h.length==m||(h=new Float32Array(m));if(l)if(g==c.RECTANGLE){m=Math.floor(Math.sqrt(f));
+for(f=0;fe&&(e=1);this.points.length!=3*e&&(this.points=new Float32Array(3*e));this.points=c.generatePoints(this.properties.radius,e,this.properties.mode,this.points,this.properties.regular);this.version++};y.registerNodeType("geometry/points3D",c);q.title="to geometry";q.desc="converts a mesh to geometry";q.prototype.onExecute=function(){var c=this.getInputData(0);if(c){if(c!=
+this.last_mesh){this.last_mesh=c;for(i in c.vertexBuffers)this.geometry[i]=c.vertexBuffers[i].data;c.indexBuffers.triangles&&(this.geometry.indices=c.indexBuffers.triangles.data);this.geometry._id=1E5*Math.random()|0;this.geometry._version=0}this.setOutputData(0,this.geometry);this.geometry&&this.setOutputData(1,this.geometry.vertices)}};y.registerNodeType("geometry/toGeometry",q);g.title="geoeval";g.desc="eval code";g.widgets_info={code:{widget:"code"}};g.prototype.onConfigure=function(c){this.compileCode()};
+g.prototype.compileCode=function(){if(this.properties.code)try{this.func=new Function("V","I","T",this.properties.code),this.boxcolor="#AFA",this.must_update=!0}catch(c){this.boxcolor="red"}};g.prototype.onPropertyChanged=function(c,e){"code"==c&&(this.properties.code=e,this.compileCode())};g.prototype.onExecute=function(){var c=this.getInputData(0);if(c)if(this.func){if(this.geometry_id!=c._id||this.version!=c._version||this.must_update||this.properties.execute_every_frame){this.must_update=!1;this.geometry_id=
+c._id;this.properties.execute_every_frame?this.version++:this.version=c._version;var e=this.func,f=getTime();this.geometry||(this.geometry={});for(var h in c)null!=c[h]&&(this.geometry[h]=c[h].constructor==Float32Array?new Float32Array(c[h]):c[h]);this.geometry._id=c._id;this.geometry._version=this.properties.execute_every_frame?this.version:c._version+1;var g=vec3.create(),m=this.vertices;m&&this.vertices.length==c.vertices.length?m.set(c.vertices):m=this.vertices=new Float32Array(c.vertices);for(h=
+0;hg||qm&&
+ma))break}this.geometry.indices=this.indices=new Uint32Array(b)}this.indices&&this.indices.length?(this.geometry.indices=this.indices,this.setOutputData(0,this.geometry)):this.setOutputData(0,null)}};y.registerNodeType("geometry/connectPoints",l);"undefined"!=typeof GL&&(r.title="render",r.desc="renders a geometry",r.PRIMITIVE_VALUES={points:GL.POINTS,lines:GL.LINES,line_loop:GL.LINE_LOOP,line_strip:GL.LINE_STRIP,triangles:GL.TRIANGLES,triangle_fan:GL.TRIANGLE_FAN,
+triangle_strip:GL.TRIANGLE_STRIP},r.widgets_info={primitive:{widget:"combo",values:r.PRIMITIVE_VALUES},color:{widget:"color"}},r.prototype.updateMesh=function(c){this.mesh||(this.mesh=new GL.Mesh);for(var e in c)if("_"!=e[0]){var f=c[e],h=GL.Mesh.common_buffers[e];if(h||"indices"==e){var h=h?h.spacing:3,g=this.mesh.vertexBuffers[e];g&&g.data.length==f.length?(g.data.set(f),g.upload(GL.DYNAMIC_DRAW)):g=new GL.Buffer("indices"==e?GL.ELEMENT_ARRAY_BUFFER:GL.ARRAY_BUFFER,f,h,GL.DYNAMIC_DRAW);this.mesh.addBuffer(e,
+g)}}this.geometry_id=this.mesh.id=c._id;this.version=this.mesh.version=c._version;return this.mesh},r.prototype.onExecute=function(){if(this.properties.enabled){var c=this.getInputData(0);if(c)if(this.version==c._version&&this.geometry_id==c._id||this.updateMesh(c),y.LGraphRender.onRequestCameraMatrices){y.LGraphRender.onRequestCameraMatrices(s,u,z);c=null;this.getInputData(2)?(c=gl.shaders.textured)||(c=gl.shaders.textured=new GL.Shader(f.vertex_shader_code,f.fragment_shader_code,{USE_TEXTURE:""})):
+(c=gl.shaders.flat)||(c=gl.shaders.flat=new GL.Shader(f.vertex_shader_code,f.fragment_shader_code));this.color.set(this.properties.color);this.color[3]=this.properties.opacity;var g=this.getInputData(1);g?e.set(g):mat4.identity(e);this.uniforms.u_point_size=1;g=this.properties.primitive;c.uniforms(w);c.uniforms(this.uniforms);1<=this.properties.opacity?gl.disable(gl.BLEND):gl.enable(gl.BLEND);gl.enable(gl.DEPTH_TEST);this.properties.additive?(gl.blendFunc(gl.SRC_ALPHA,gl.ONE),gl.depthMask(!1)):gl.blendFunc(gl.SRC_ALPHA,
+gl.ONE_MINUS_SRC_ALPHA);c.draw(this.mesh,g,"indices");gl.disable(gl.BLEND);gl.depthMask(!0)}else console.warn("cannot render geometry, LiteGraph.onRequestCameraMatrices is null, remember to fill this with a callback(view_matrix, projection_matrix,viewprojection_matrix) to use 3D rendering from the graph")}},y.registerNodeType("geometry/render",r),f.widgets_info={color:{widget:"color"}},f.prototype.updateMesh=function(c){this.buffer&&this.buffer.data.length==c.vertices.length?(this.buffer.data.set(c.vertices),
+this.buffer.upload(GL.DYNAMIC_DRAW)):this.buffer=new GL.Buffer(GL.ARRAY_BUFFER,c.vertices,3,GL.DYNAMIC_DRAW);this.mesh||(this.mesh=new GL.Mesh);this.mesh.addBuffer("vertices",this.buffer);this.geometry_id=this.mesh.id=c._id;this.version=this.mesh.version=c._version},f.prototype.onExecute=function(){if(this.properties.enabled){var c=this.getInputData(0);if(c)if(this.version==c._version&&this.geometry_id==c._id||this.updateMesh(c),y.LGraphRender.onRequestCameraMatrices){y.LGraphRender.onRequestCameraMatrices(s,
+u,z);c=null;this.getInputData(2)?(c=gl.shaders.textured_points)||(c=gl.shaders.textured_points=new GL.Shader(f.vertex_shader_code,f.fragment_shader_code,{USE_TEXTURED_POINTS:""})):(c=gl.shaders.points)||(c=gl.shaders.points=new GL.Shader(f.vertex_shader_code,f.fragment_shader_code,{USE_POINTS:""}));this.color.set(this.properties.color);this.color[3]=this.properties.opacity;var g=this.getInputData(1);g?e.set(g):mat4.identity(e);this.uniforms.u_point_size=this.properties.point_size;this.uniforms.u_point_perspective=
+this.properties.fixed_size?0:1;this.uniforms.u_perspective=gl.viewport_data[3]*u[5];c.uniforms(w);c.uniforms(this.uniforms);1<=this.properties.opacity?gl.disable(gl.BLEND):gl.enable(gl.BLEND);gl.enable(gl.DEPTH_TEST);this.properties.additive?(gl.blendFunc(gl.SRC_ALPHA,gl.ONE),gl.depthMask(!1)):gl.blendFunc(gl.SRC_ALPHA,gl.ONE_MINUS_SRC_ALPHA);c.draw(this.mesh,GL.POINTS);gl.disable(gl.BLEND);gl.depthMask(!0)}else console.warn("cannot render geometry, LiteGraph.onRequestCameraMatrices is null, remember to fill this with a callback(view_matrix, projection_matrix,viewprojection_matrix) to use 3D rendering from the graph")}},
+y.registerNodeType("geometry/render_points",f),f.vertex_shader_code="\t\tprecision mediump float;\n\t\tattribute vec3 a_vertex;\n\t\tvarying vec3 v_vertex;\n\t\tattribute vec3 a_normal;\n\t\tvarying vec3 v_normal;\n\t\t#ifdef USE_COLOR\n\t\t\tattribute vec4 a_color;\n\t\t\tvarying vec4 v_color;\n\t\t#endif\n\t\tattribute vec2 a_coord;\n\t\tvarying vec2 v_coord;\n\t\t#ifdef USE_SIZE\n\t\t\tattribute float a_extra;\n\t\t#endif\n\t\t#ifdef USE_INSTANCING\n\t\t\tattribute mat4 u_model;\n\t\t#else\n\t\t\tuniform mat4 u_model;\n\t\t#endif\n\t\tuniform mat4 u_viewprojection;\n\t\tuniform float u_point_size;\n\t\tuniform float u_perspective;\n\t\tuniform float u_point_perspective;\n\t\tfloat computePointSize(float radius, float w)\n\t\t{\n\t\t\tif(radius < 0.0)\n\t\t\t\treturn -radius;\n\t\t\treturn u_perspective * radius / w;\n\t\t}\n\t\tvoid main() {\n\t\t\tv_coord = a_coord;\n\t\t\t#ifdef USE_COLOR\n\t\t\t\tv_color = a_color;\n\t\t\t#endif\n\t\t\tv_vertex = ( u_model * vec4( a_vertex, 1.0 )).xyz;\n\t\t\tv_normal = ( u_model * vec4( a_normal, 0.0 )).xyz;\n\t\t\tgl_Position = u_viewprojection * vec4(v_vertex,1.0);\n\t\t\tgl_PointSize = u_point_size;\n\t\t\t#ifdef USE_SIZE\n\t\t\t\tgl_PointSize = a_extra;\n\t\t\t#endif\n\t\t\tif(u_point_perspective != 0.0)\n\t\t\t\tgl_PointSize = computePointSize( gl_PointSize, gl_Position.w );\n\t\t}\t",
+f.fragment_shader_code="\t\tprecision mediump float;\n\t\tuniform vec4 u_color;\n\t\t#ifdef USE_COLOR\n\t\t\tvarying vec4 v_color;\n\t\t#endif\n\t\tvarying vec2 v_coord;\n\t\tuniform sampler2D u_texture;\n\t\tvoid main() {\n\t\t\tvec4 color = u_color;\n\t\t\t#ifdef USE_TEXTURED_POINTS\n\t\t\t\tcolor *= texture2D(u_texture, gl_PointCoord.xy);\n\t\t\t#else\n\t\t\t\t#ifdef USE_TEXTURE\n\t\t\t\t color *= texture2D(u_texture, v_coord);\n\t\t\t\t if(color.a < 0.1)\n\t\t\t\t\tdiscard;\n\t\t\t\t#endif\n\t\t\t\t#ifdef USE_POINTS\n\t\t\t\t\tfloat dist = length( gl_PointCoord.xy - vec2(0.5) );\n\t\t\t\t\tif( dist > 0.45 )\n\t\t\t\t\t\tdiscard;\n\t\t\t\t#endif\n\t\t\t#endif\n\t\t\t#ifdef USE_COLOR\n\t\t\t\tcolor *= v_color;\n\t\t\t#endif\n\t\t\tgl_FragColor = color;\n\t\t}\t")})(this);
+(function(v){var c=v.LiteGraph;if("undefined"!=typeof GL){var q=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:LGraphTexture.DEFAULT};q._shader||(q._shader=new GL.Shader(GL.Shader.SCREEN_VERTEX_SHADER,q.pixel_shader),q._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]}))};q.title="Lens";q.desc="Camera Lens distortion";q.widgets_info={precision:{widget:"combo",values:LGraphTexture.MODE_VALUES}};q.prototype.onExecute=function(){var c=this.getInputData(0);if(this.properties.precision===LGraphTexture.PASS_THROUGH)this.setOutputData(0,c);else if(c){this._tex=LGraphTexture.getTargetTexture(c,this._tex,this.properties.precision);var g=this.properties.aberration;this.isInputConnected(1)&&(g=this.getInputData(1),
+this.properties.aberration=g);var l=this.properties.distortion;this.isInputConnected(2)&&(l=this.getInputData(2),this.properties.distortion=l);var r=this.properties.blur;this.isInputConnected(3)&&(r=this.getInputData(3),this.properties.blur=r);gl.disable(gl.BLEND);gl.disable(gl.DEPTH_TEST);var v=Mesh.getScreenQuad(),e=q._shader;this._tex.drawTo(function(){c.bind(0);e.uniforms({u_texture:0,u_aberration:g,u_distortion:l,u_blur:r}).draw(v)});this.setOutputData(0,this._tex)}};q.pixel_shader="precision highp float;\n\t\t\tprecision highp float;\n\t\t\tvarying vec2 v_coord;\n\t\t\tuniform sampler2D u_texture;\n\t\t\tuniform vec2 u_camera_planes;\n\t\t\tuniform float u_aberration;\n\t\t\tuniform float u_distortion;\n\t\t\tuniform float u_blur;\n\t\t\t\n\t\t\tvoid main() {\n\t\t\t\tvec2 coord = v_coord;\n\t\t\t\tfloat dist = distance(vec2(0.5), coord);\n\t\t\t\tvec2 dist_coord = coord - vec2(0.5);\n\t\t\t\tfloat percent = 1.0 + ((0.5 - dist) / 0.5) * u_distortion;\n\t\t\t\tdist_coord *= percent;\n\t\t\t\tcoord = dist_coord + vec2(0.5);\n\t\t\t\tvec4 color = texture2D(u_texture,coord, u_blur * dist);\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\t\t\t\tcolor.b = texture2D(u_texture,vec2(0.5) + dist_coord * (1.0-0.01*u_aberration), u_blur * dist ).b;\n\t\t\t\tgl_FragColor = color;\n\t\t\t}\n\t\t\t";
+c.registerNodeType("fx/lens",q);v.LGraphFXLens=q;var g=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.title="Bokeh";g.desc="applies an Bokeh effect";g.widgets_info={shape:{widget:"texture"}};g.prototype.onExecute=function(){var c=this.getInputData(0),l=this.getInputData(1),r=this.getInputData(2);
+if(c&&r&&this.properties.shape){l||(l=c);var q=LGraphTexture.getTexture(this.properties.shape);if(q){var v=this.properties.threshold;this.isInputConnected(3)&&(v=this.getInputData(3),this.properties.threshold=v);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 w=g._first_shader;w||(w=g._first_shader=new GL.Shader(Shader.SCREEN_VERTEX_SHADER,g._first_pixel_shader));var k=g._second_shader;k||(k=g._second_shader=new GL.Shader(g._second_vertex_shader,g._second_pixel_shader));var n=this._points_mesh;n&&n._width==c.width&&n._height==c.height&&2==n._spacing||(n=this.createPointsMesh(c.width,c.height,2));var D=Mesh.getScreenQuad(),h=this.properties.size,t=this.properties.alpha;gl.disable(gl.DEPTH_TEST);gl.disable(gl.BLEND);this._temp_texture.drawTo(function(){c.bind(0);
+l.bind(1);r.bind(2);w.uniforms({u_texture:0,u_texture_blur:1,u_mask:2,u_texsize:[c.width,c.height]}).draw(D)});this._temp_texture.drawTo(function(){gl.enable(gl.BLEND);gl.blendFunc(gl.ONE,gl.ONE);c.bind(0);q.bind(3);k.uniforms({u_texture:0,u_mask:2,u_shape:3,u_alpha:t,u_threshold:v,u_pointSize:h,u_itexsize:[1/c.width,1/c.height]}).draw(n,gl.POINTS)});this.setOutputData(0,this._temp_texture)}}else this.setOutputData(0,c)};g.prototype.createPointsMesh=function(c,g,l){for(var r=Math.round(c/l),q=Math.round(g/
+l),e=new Float32Array(r*q*2),w=-1,k=2/c*l,n=2/g*l,v=0;v=c.NOTEON||f<=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;case "KEY PRESSURE":case "KEYPRESSURE":return c.KEYPRESSURE;case "CONTROLLER CHANGE":case "CONTROLLERCHANGE":case "CC":return c.CONTROLLERCHANGE;
-case "PROGRAM CHANGE":case "PROGRAMCHANGE":case "PC":return c.PROGRAMCHANGE;case "CHANNEL PRESSURE":case "CHANNELPRESSURE":return c.CHANNELPRESSURE;case "PITCH BEND":case "PITCHBEND":return c.PITCHBEND;case "TIME TICK":case "TIMETICK":return c.TIMETICK;default:return Number(e)}};c.toNoteString=function(e,f){e=Math.round(e);var h,a=Math.floor((e-24)/12+1);h=(e-21)%12;0>h&&(h=12+h);return c.notes[h]+(f?"":a)};c.NoteStringToPitch=function(e){e=e.toUpperCase();var f=e[0],h=4;"#"==e[1]?(f+="#",2g&&(g=12+g);return c.notes[g]+(f?"":a)};c.NoteStringToPitch=function(e){e=e.toUpperCase();var f=e[0],g=4;"#"==e[1]?(f+="#",2this.properties.max_value)return;this.trigger("on_midi",f)}};m.registerNodeType("midi/filter",l);y.title="MIDIEvent";y.desc="Create a MIDI Event";y.color="#243";y.prototype.onAction=function(e,f){"assign"==
+224:"pitch bend",240:"system",242:"Song pos",243:"Song select",246:"Tune request",248:"time tick",250:"Start Song",251:"Continue Song",252:"Stop Song",254:"Sensing",255:"Reset"};c.commands_short={128:"NOTEOFF",144:"NOTEOFF",160:"KEYP",176:"CC",192:"PC",208:"CP",224:"PB",240:"SYS",242:"POS",243:"SELECT",246:"TUNEREQ",248:"TT",250:"START",251:"CONTINUE",252:"STOP",254:"SENS",255:"RESET"};c.commands_reversed={};for(var D in c.commands)c.commands_reversed[c.commands[D]]=D;q.input=null;q.MIDIEvent=c;q.prototype.onMIDISuccess=
+function(c){console.log("MIDI ready!");console.log(c);this.midi=c;this.updatePorts();if(this.on_ready)this.on_ready(this)};q.prototype.updatePorts=function(){var c=this.midi;this.input_ports=c.inputs;for(var e=0,f=this.input_ports.values(),a=f.next();a&&!1===a.done;)a=a.value,console.log("Input port [type:'"+a.type+"'] id:'"+a.id+"' manufacturer:'"+a.manufacturer+"' name:'"+a.name+"' version:'"+a.version+"'"),e++,a=f.next();this.num_input_ports=e;e=0;this.output_ports=c.outputs;f=this.output_ports.values();
+for(a=f.next();a&&!1===a.done;)a=a.value,console.log("Output port [type:'"+a.type+"'] id:'"+a.id+"' manufacturer:'"+a.manufacturer+"' name:'"+a.name+"' version:'"+a.version+"'"),e++,a=f.next();this.num_output_ports=e};q.prototype.onMIDIFailure=function(c){console.error("Failed to get MIDI access - "+c)};q.prototype.openInputPort=function(e,f){var g=this.input_ports.get("input-"+e);if(!g)return!1;q.input=this;var a=this;g.onmidimessage=function(b){var d=new c(b.data);a.updateState(d);f&&f(b.data,d);
+if(q.on_message)q.on_message(b.data,d)};console.log("port open: ",g);return!0};q.parseMsg=function(c){};q.prototype.updateState=function(e){switch(e.cmd){case c.NOTEON:this.state.note[e.value1|0]=e.value2;break;case c.NOTEOFF:this.state.note[e.value1|0]=0;break;case c.CONTROLLERCHANGE:this.state.cc[e.getCC()]=e.getCCValue()}};q.prototype.sendMIDI=function(e,f){if(f){var g=this.output_ports.get("output-"+e);g&&(q.output=this,f.constructor===c?g.send(f.data):g.send(f))}};g.MIDIInterface=q;g.title="MIDI Input";
+g.desc="Reads MIDI from a input port";g.color="#243";g.prototype.getPropertyInfo=function(c){if(this._midi&&"port"==c){c={};for(var e=0;ethis.properties.max_value)return;this.trigger("on_midi",f)}};n.registerNodeType("midi/filter",f);y.title="MIDIEvent";y.desc="Create a MIDI Event";y.color="#243";y.prototype.onAction=function(e,f){"assign"==
e?(this.properties.channel=f.channel,this.properties.cmd=f.cmd,this.properties.value1=f.data[1],this.properties.value2=f.data[2],f.cmd==c.NOTEON?this.gate=!0:f.cmd==c.NOTEOFF&&(this.gate=!1)):(f=this.midi_event,f.channel=this.properties.channel,this.properties.cmd&&this.properties.cmd.constructor===String?f.setCommandFromString(this.properties.cmd):f.cmd=this.properties.cmd,f.data[0]=f.cmd|f.channel,f.data[1]=Number(this.properties.value1),f.data[2]=Number(this.properties.value2),this.trigger("on_midi",
-f))};y.prototype.onExecute=function(){var e=this.properties;if(this.inputs)for(var f=0;fc;++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=
+f))};y.prototype.onExecute=function(){var e=this.properties;if(this.inputs)for(var f=0;fc;++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}}};e.prototype.onAction=function(e,f){f&&f.constructor===c&&(f.data[0]==c.NOTEON||f.data[0]==c.NOTEOFF?(this.midi_event=new c,this.midi_event.setup(f.data),this.midi_event.data[1]+=this.offset_notes[c.note_to_index[f.note]],this.trigger("out",this.midi_event)):this.trigger("out",f))};e.prototype.onExecute=function(){var c=this.getInputData(1);null!=c&&c!=this._current_scale&&
-this.processScale(c)};m.registerNodeType("midi/quantize",e);v.title="MIDI Play";v.desc="Plays a MIDI note";v.color="#243";v.prototype.onAction=function(e,f){if(f&&f.constructor===c){if(this.instrument&&f.data[0]==c.NOTEON){var h=f.note;if(!h||"undefined"==h||h.constructor!==String)return;this.instrument.play(h,f.octave,this.properties.duration,this.properties.volume)}this.trigger("note",f)}};v.prototype.onExecute=function(){var c=this.getInputData(1);null!=c&&(this.properties.volume=c);c=this.getInputData(2);
-null!=c&&(this.properties.duration=c)};m.registerNodeType("midi/play",v);k.title="MIDI Keys";k.desc="Keyboard to play notes";k.color="#243";k.keys=[{x:0,w:1,h:1,t:0},{x:0.75,w:0.5,h:0.6,t:1},{x:1,w:1,h:1,t:0},{x:1.75,w:0.5,h:0.6,t:1},{x:2,w:1,h:1,t:0},{x:2.75,w:0.5,h:0.6,t:1},{x:3,w:1,h:1,t:0},{x:4,w:1,h:1,t:0},{x:4.75,w:0.5,h:0.6,t:1},{x:5,w:1,h:1,t:0},{x:5.75,w:0.5,h:0.6,t:1},{x:6,w:1,h:1,t:0}];k.prototype.onDrawForeground=function(c){if(!this.flags.collapsed){var e=12*this.properties.num_octaves;
-this.keys.length=e;var f=this.size[0]/(7*this.properties.num_octaves),a=this.size[1];c.globalAlpha=1;for(var b=0;2>b;b++)for(var d=0;dh+l||c[1]>d))return b}}return-1};k.prototype.onAction=function(e,f){if("reset"==e)for(var h=0;hf[1])){var h=this.getKeyIndex(f);this.keys[h]=!0;this._last_key=
-h;var h=12*(this.properties.start_octave-1)+29+h,a=new c;a.setup([c.NOTEON,h,100]);this.trigger("note",a);return!0}};k.prototype.onMouseMove=function(e,f){if(!(0>f[1]||-1==this._last_key)){this.setDirtyCanvas(!0);var h=this.getKeyIndex(f);if(this._last_key==h)return!0;this.keys[this._last_key]=!1;var a=12*(this.properties.start_octave-1)+29+this._last_key,b=new c;b.setup([c.NOTEOFF,a,100]);this.trigger("note",b);this.keys[h]=!0;a=12*(this.properties.start_octave-1)+29+h;b=new c;b.setup([c.NOTEON,
-a,100]);this.trigger("note",b);this._last_key=h;return!0}};k.prototype.onMouseUp=function(e,f){if(!(0>f[1])){var h=this.getKeyIndex(f);this.keys[h]=!1;this._last_key=-1;var h=12*(this.properties.start_octave-1)+29+h,a=new c;a.setup([c.NOTEOFF,h,100]);this.trigger("note",a);return!0}};m.registerNodeType("midi/keys",k)})(this);
-(function(u){function c(){this.properties={src:"",gain:0.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 r(){this.properties={gain:0.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 f(){this.properties={fftSize:2048,minDecibels:-100,maxDecibels:-10,smoothingTimeConstant:0.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 h(){this.properties={gain:1};this.audionode=n.getAudioContext().createGain();this.addInput("in","audio");this.addInput("gain","number");this.addOutput("out","audio")}function q(){this.properties={impulse_src:"",normalize:!0};this.audionode=n.getAudioContext().createConvolver();
-this.addInput("in","audio");this.addOutput("out","audio")}function l(){this.properties={threshold:-50,knee:40,ratio:12,reduction:-20,attack:0,release:0.25};this.audionode=n.getAudioContext().createDynamicsCompressor();this.addInput("in","audio");this.addOutput("out","audio")}function y(){this.properties={};this.audionode=n.getAudioContext().createWaveShaper();this.addInput("in","audio");this.addInput("shape","waveshape");this.addOutput("out","audio")}function s(){this.properties={gain1:0.5,gain2:0.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 w(){this.properties=
-{A:0.1,D:0.1,S:0.1,R:0.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 z(){this.properties={delayTime:0.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 e(){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 v(){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 k(){this.properties=
-{continuous:!0,mark:-1};this.addInput("data","array");this.addInput("mark","number");this.size=[300,200];this._last_buffer=null}function m(){this.properties={band:440,amplitude:1};this.addInput("freqs","array");this.addOutput("signal","number")}function D(){if(!D.default_code){var a=D.default_function.toString(),b=a.indexOf("{")+1,c=a.lastIndexOf("}");D.default_code=a.substr(b,c-b)}this.properties={code:D.default_code};a=n.getAudioContext();a.createScriptProcessor?this.audionode=a.createScriptProcessor(4096,
-1,1):(console.warn("ScriptProcessorNode deprecated"),this.audionode=a.createGain());this.processCode();D._bypass_function||(D._bypass_function=this.audionode.onaudioprocess);this.addInput("in","audio");this.addOutput("out","audio")}function g(){this.audionode=n.getAudioContext().destination;this.addInput("in","audio")}var t=u.LiteGraph,n={};u.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(a){console.log("msg",a)};this._audio_context.onended=function(a){console.log("ended",a)};this._audio_context.oncomplete=function(a){console.log("complete",a)}}return this._audio_context};n.connect=function(a,b){try{a.connect(b)}catch(c){console.warn("LGraphAudio:",c)}};n.disconnect=function(a,b){try{a.disconnect(b)}catch(c){console.warn("LGraphAudio:",c)}};n.changeAllAudiosConnections=function(a,b){if(a.inputs)for(var c=
-0;cb;b++)for(var d=0;dg+l||c[1]>d))return b}}return-1};k.prototype.onAction=function(e,f){if("reset"==e)for(var g=0;gf[1])){var g=this.getKeyIndex(f);this.keys[g]=!0;this._last_key=
+g;var g=12*(this.properties.start_octave-1)+29+g,a=new c;a.setup([c.NOTEON,g,100]);this.trigger("note",a);return!0}};k.prototype.onMouseMove=function(e,f){if(!(0>f[1]||-1==this._last_key)){this.setDirtyCanvas(!0);var g=this.getKeyIndex(f);if(this._last_key==g)return!0;this.keys[this._last_key]=!1;var a=12*(this.properties.start_octave-1)+29+this._last_key,b=new c;b.setup([c.NOTEOFF,a,100]);this.trigger("note",b);this.keys[g]=!0;a=12*(this.properties.start_octave-1)+29+g;b=new c;b.setup([c.NOTEON,
+a,100]);this.trigger("note",b);this._last_key=g;return!0}};k.prototype.onMouseUp=function(e,f){if(!(0>f[1])){var g=this.getKeyIndex(f);this.keys[g]=!1;this._last_key=-1;var g=12*(this.properties.start_octave-1)+29+g,a=new c;a.setup([c.NOTEOFF,g,100]);this.trigger("note",a);return!0}};n.registerNodeType("midi/keys",k)})(this);
+(function(v){function c(){this.properties={src:"",gain:0.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 q(){this.properties={gain:0.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 g(){this.properties={fftSize:2048,minDecibels:-100,maxDecibels:-10,smoothingTimeConstant:0.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 l(){this.properties={gain:1};this.audionode=m.getAudioContext().createGain();this.addInput("in","audio");this.addInput("gain","number");this.addOutput("out","audio")}function r(){this.properties={impulse_src:"",normalize:!0};this.audionode=m.getAudioContext().createConvolver();
+this.addInput("in","audio");this.addOutput("out","audio")}function f(){this.properties={threshold:-50,knee:40,ratio:12,reduction:-20,attack:0,release:0.25};this.audionode=m.getAudioContext().createDynamicsCompressor();this.addInput("in","audio");this.addOutput("out","audio")}function y(){this.properties={};this.audionode=m.getAudioContext().createWaveShaper();this.addInput("in","audio");this.addInput("shape","waveshape");this.addOutput("out","audio")}function s(){this.properties={gain1:0.5,gain2:0.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 u(){this.properties=
+{A:0.1,D:0.1,S:0.1,R:0.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 z(){this.properties={delayTime:0.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 e(){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 w(){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 k(){this.properties=
+{continuous:!0,mark:-1};this.addInput("data","array");this.addInput("mark","number");this.size=[300,200];this._last_buffer=null}function n(){this.properties={band:440,amplitude:1};this.addInput("freqs","array");this.addOutput("signal","number")}function D(){if(!D.default_code){var a=D.default_function.toString(),b=a.indexOf("{")+1,c=a.lastIndexOf("}");D.default_code=a.substr(b,c-b)}this.properties={code:D.default_code};a=m.getAudioContext();a.createScriptProcessor?this.audionode=a.createScriptProcessor(4096,
+1,1):(console.warn("ScriptProcessorNode deprecated"),this.audionode=a.createGain());this.processCode();D._bypass_function||(D._bypass_function=this.audionode.onaudioprocess);this.addInput("in","audio");this.addOutput("out","audio")}function h(){this.audionode=m.getAudioContext().destination;this.addInput("in","audio")}var t=v.LiteGraph,m={};v.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(a){console.log("msg",a)};this._audio_context.onended=function(a){console.log("ended",a)};this._audio_context.oncomplete=function(a){console.log("complete",a)}}return this._audio_context};m.connect=function(a,b){try{a.connect(b)}catch(c){console.warn("LGraphAudio:",c)}};m.disconnect=function(a,b){try{a.disconnect(b)}catch(c){console.warn("LGraphAudio:",c)}};m.changeAllAudiosConnections=function(a,b){if(a.inputs)for(var c=
+0;c=this.size[0]&&(f=this.size[0]-1),a.strokeStyle="red",a.beginPath(),a.moveTo(f,e),a.lineTo(f,0),a.stroke())}};k.title="Visualization";k.desc="Audio Visualization";t.registerNodeType("audio/visualization",k);m.prototype.onExecute=function(){if(this._freqs=this.getInputData(0)){var a=this.properties.band,b=this.getInputData(1);void 0!==b&&(a=b);b=n.getAudioContext().sampleRate/this._freqs.length;b=a/b*2;b>=this._freqs.length?b=this._freqs[this._freqs.length-1]:(a=b|0,
-b-=a,b=this._freqs[a]*(1-b)+this._freqs[a+1]*b);this.setOutputData(0,b/255*this.properties.amplitude)}};m.prototype.onGetInputs=function(){return[["band","number"]]};m.title="Signal";m.desc="extract the signal of some frequency";t.registerNodeType("audio/signal",m);D.prototype.onAdded=function(a){a.status==LGraph.STATUS_RUNNING&&(this.audionode.onaudioprocess=this._callback)};D["@code"]={widget:"code"};D.prototype.onStart=function(){this.audionode.onaudioprocess=this._callback};D.prototype.onStop=
+m.createAudioNodeWrapper(e);e.title="BiquadFilter";e.desc="Audio filter";t.registerNodeType("audio/biquadfilter",e);w.prototype.onStart=function(){if(!this.audionode.started){this.audionode.started=!0;try{this.audionode.start()}catch(a){}}};w.prototype.onStop=function(){this.audionode.started&&(this.audionode.started=!1,this.audionode.stop())};w.prototype.onPause=function(){this.onStop()};w.prototype.onUnpause=function(){this.onStart()};w.prototype.onExecute=function(){if(this.inputs&&this.inputs.length)for(var a=
+0;a=this.size[0]&&(f=this.size[0]-1),a.strokeStyle="red",a.beginPath(),a.moveTo(f,e),a.lineTo(f,0),a.stroke())}};k.title="Visualization";k.desc="Audio Visualization";t.registerNodeType("audio/visualization",k);n.prototype.onExecute=function(){if(this._freqs=this.getInputData(0)){var a=this.properties.band,b=this.getInputData(1);void 0!==b&&(a=b);b=m.getAudioContext().sampleRate/this._freqs.length;b=a/b*2;b>=this._freqs.length?b=this._freqs[this._freqs.length-1]:(a=b|0,
+b-=a,b=this._freqs[a]*(1-b)+this._freqs[a+1]*b);this.setOutputData(0,b/255*this.properties.amplitude)}};n.prototype.onGetInputs=function(){return[["band","number"]]};n.title="Signal";n.desc="extract the signal of some frequency";t.registerNodeType("audio/signal",n);D.prototype.onAdded=function(a){a.status==LGraph.STATUS_RUNNING&&(this.audionode.onaudioprocess=this._callback)};D["@code"]={widget:"code"};D.prototype.onStart=function(){this.audionode.onaudioprocess=this._callback};D.prototype.onStop=
function(){this.audionode.onaudioprocess=D._bypass_function};D.prototype.onPause=function(){this.audionode.onaudioprocess=D._bypass_function};D.prototype.onUnpause=function(){this.audionode.onaudioprocess=this._callback};D.prototype.onExecute=function(){};D.prototype.onRemoved=function(){this.audionode.onaudioprocess=D._bypass_function};D.prototype.processCode=function(){try{this._script=new new Function("properties",this.properties.code)(this.properties),this._old_code=this.properties.code,this._callback=
this._script.onaudioprocess}catch(a){console.error("Error in onaudioprocess code",a),this._callback=D._bypass_function,this.audionode.onaudioprocess=this._callback}};D.prototype.onPropertyChanged=function(a,b){"code"==a&&(this.properties.code=b,this.processCode(),this.graph&&this.graph.status==LGraph.STATUS_RUNNING&&(this.audionode.onaudioprocess=this._callback))};D.default_function=function(){this.onaudioprocess=function(a){var b=a.inputBuffer;a=a.outputBuffer;for(var c=0;c