q&&(q=0);this.value=q;this.properties.value=this.properties.min+(this.properties.max-this.properties.min)*this.value;this.oldmouse=c;this.setDirtyCanvas(!0)}};t.prototype.onMouseUp=function(c){this.oldmouse&&(this.oldmouse=null,this.captureInput(!1))};t.prototype.onPropertyChanged=function(c,q){if("min"==c||"max"==c||"value"==c)return this.properties[c]=parseFloat(q),!0};D.registerNodeType("widget/knob", -t);h.title="Inner Slider";h.prototype.onPropertyChanged=function(c,q){"value"==c&&(this.slider.value=q)};h.prototype.onExecute=function(){this.setOutputData(0,this.properties.value)};D.registerNodeType("widget/internal_slider",h);C.title="H.Slider";C.desc="Linear slider controller";C.prototype.onDrawForeground=function(c){-1==this.value&&(this.value=(this.properties.value-this.properties.min)/(this.properties.max-this.properties.min));c.globalAlpha=1;c.lineWidth=1;c.fillStyle="#000";c.fillRect(2, +this.pos[0],c.canvasY-this.pos[1]];var n=this.value,n=n-0.01*(c[1]-this.oldmouse[1]);1n&&(n=0);this.value=n;this.properties.value=this.properties.min+(this.properties.max-this.properties.min)*this.value;this.oldmouse=c;this.setDirtyCanvas(!0)}};t.prototype.onMouseUp=function(c){this.oldmouse&&(this.oldmouse=null,this.captureInput(!1))};t.prototype.onPropertyChanged=function(c,n){if("min"==c||"max"==c||"value"==c)return this.properties[c]=parseFloat(n),!0};D.registerNodeType("widget/knob", +t);h.title="Inner Slider";h.prototype.onPropertyChanged=function(c,n){"value"==c&&(this.slider.value=n)};h.prototype.onExecute=function(){this.setOutputData(0,this.properties.value)};D.registerNodeType("widget/internal_slider",h);C.title="H.Slider";C.desc="Linear slider controller";C.prototype.onDrawForeground=function(c){-1==this.value&&(this.value=(this.properties.value-this.properties.min)/(this.properties.max-this.properties.min));c.globalAlpha=1;c.lineWidth=1;c.fillStyle="#000";c.fillRect(2, 2,this.size[0]-4,this.size[1]-4);c.fillStyle=this.properties.color;c.beginPath();c.rect(4,4,(this.size[0]-8)*this.value,this.size[1]-8);c.fill()};C.prototype.onExecute=function(){this.properties.value=this.properties.min+(this.properties.max-this.properties.min)*this.value;this.setOutputData(0,this.properties.value);this.boxcolor=D.colorToString([this.value,this.value,this.value])};C.prototype.onMouseDown=function(c){if(0>c.canvasY-this.pos[1])return!1;this.oldmouse=[c.canvasX-this.pos[0],c.canvasY- -this.pos[1]];this.captureInput(!0);return!0};C.prototype.onMouseMove=function(c){if(this.oldmouse){c=[c.canvasX-this.pos[0],c.canvasY-this.pos[1]];var q=this.value,q=q+(c[0]-this.oldmouse[0])/this.size[0];1 q&&(q=0);this.value=q;this.oldmouse=c;this.setDirtyCanvas(!0)}};C.prototype.onMouseUp=function(c){this.oldmouse=null;this.captureInput(!1)};C.prototype.onMouseLeave=function(c){};D.registerNodeType("widget/hslider",C);x.title="Progress";x.desc="Shows data in linear progress";x.prototype.onExecute= -function(){var c=this.getInputData(0);void 0!=c&&(this.properties.value=c)};x.prototype.onDrawForeground=function(c){c.lineWidth=1;c.fillStyle=this.properties.color;var q=(this.properties.value-this.properties.min)/(this.properties.max-this.properties.min),q=Math.min(1,q),q=Math.max(0,q);c.fillRect(2,2,(this.size[0]-4)*q,this.size[1]-4)};D.registerNodeType("widget/progress",x);G.title="Text";G.desc="Shows the input value";G.widgets=[{name:"resize",text:"Resize box",type:"button"},{name:"led_text", -text:"LED",type:"minibutton"},{name:"normal_text",text:"Normal",type:"minibutton"}];G.prototype.onDrawForeground=function(c){c.fillStyle=this.properties.color;var q=this.properties.value;this.properties.glowSize?(c.shadowColor=this.properties.color,c.shadowOffsetX=0,c.shadowOffsetY=0,c.shadowBlur=this.properties.glowSize):c.shadowColor="transparent";var h=this.properties.fontsize;c.textAlign=this.properties.align;c.font=h.toString()+"px "+this.properties.font;this.str="number"==typeof q?q.toFixed(this.properties.decimals): -q;if("string"==typeof this.str)for(var q=this.str.split("\\n"),r=0;rn&&(n=0);this.value=n;this.oldmouse=c;this.setDirtyCanvas(!0)}};C.prototype.onMouseUp=function(c){this.oldmouse=null;this.captureInput(!1)};C.prototype.onMouseLeave=function(c){};D.registerNodeType("widget/hslider",C);x.title="Progress";x.desc="Shows data in linear progress";x.prototype.onExecute= +function(){var c=this.getInputData(0);void 0!=c&&(this.properties.value=c)};x.prototype.onDrawForeground=function(c){c.lineWidth=1;c.fillStyle=this.properties.color;var n=(this.properties.value-this.properties.min)/(this.properties.max-this.properties.min),n=Math.min(1,n),n=Math.max(0,n);c.fillRect(2,2,(this.size[0]-4)*n,this.size[1]-4)};D.registerNodeType("widget/progress",x);G.title="Text";G.desc="Shows the input value";G.widgets=[{name:"resize",text:"Resize box",type:"button"},{name:"led_text", +text:"LED",type:"minibutton"},{name:"normal_text",text:"Normal",type:"minibutton"}];G.prototype.onDrawForeground=function(c){c.fillStyle=this.properties.color;var n=this.properties.value;this.properties.glowSize?(c.shadowColor=this.properties.color,c.shadowOffsetX=0,c.shadowOffsetY=0,c.shadowBlur=this.properties.glowSize):c.shadowColor="transparent";var h=this.properties.fontsize;c.textAlign=this.properties.align;c.font=h.toString()+"px "+this.properties.font;this.str="number"==typeof n?n.toFixed(this.properties.decimals): +n;if("string"==typeof this.str)for(var n=this.str.split("\\n"),s=0;s r?l.xbox.axes.lx:0,this._left_axis[1]=Math.abs(l.xbox.axes.ly)>r?l.xbox.axes.ly:0,this._right_axis[0]=Math.abs(l.xbox.axes.rx)>r?l.xbox.axes.rx:0,this._right_axis[1]=Math.abs(l.xbox.axes.ry)>r?l.xbox.axes.ry:0,this._triggers[0]=Math.abs(l.xbox.axes.ltrigger)>r?l.xbox.axes.ltrigger: -0,this._triggers[1]=Math.abs(l.xbox.axes.rtrigger)>r?l.xbox.axes.rtrigger:0);if(this.outputs)for(r=0;r l;l++)if(r[l]){l=r[l];r=this.xbox_mapping;r||(r=this.xbox_mapping={axes:[], -buttons:{},hat:"",hatmap:c.CENTER});r.axes.lx=l.axes[0];r.axes.ly=l.axes[1];r.axes.rx=l.axes[2];r.axes.ry=l.axes[3];r.axes.ltrigger=l.buttons[6].value;r.axes.rtrigger=l.buttons[7].value;r.hat="";r.hatmap=c.CENTER;for(var t=0;t t)r.buttons[c.mapping_array[t]]=l.buttons[t].pressed,l.buttons[t].was_pressed&&this.trigger(c.mapping_array[t]+"_button_event");else switch(t){case 12:l.buttons[t].pressed&&(r.hat+="up",r.hatmap|=c.UP); -break;case 13:l.buttons[t].pressed&&(r.hat+="down",r.hatmap|=c.DOWN);break;case 14:l.buttons[t].pressed&&(r.hat+="left",r.hatmap|=c.LEFT);break;case 15:l.buttons[t].pressed&&(r.hat+="right",r.hatmap|=c.RIGHT);break;case 16:r.buttons.home=l.buttons[t].pressed}l.xbox=r;return l}};c.prototype.onDrawBackground=function(c){if(!this.flags.collapsed){var l=this._left_axis,t=this._right_axis;c.strokeStyle="#88A";c.strokeRect(0.5*(l[0]+1)*this.size[0]-4,0.5*(l[1]+1)*this.size[1]-4,8,8);c.strokeStyle="#8A8"; -c.strokeRect(0.5*(t[0]+1)*this.size[0]-4,0.5*(t[1]+1)*this.size[1]-4,8,8);l=this.size[1]/this._current_buttons.length;c.fillStyle="#AEB";for(t=0;t s?k.xbox.axes.lx:0,this._left_axis[1]=Math.abs(k.xbox.axes.ly)>s?k.xbox.axes.ly:0,this._right_axis[0]=Math.abs(k.xbox.axes.rx)>s?k.xbox.axes.rx:0,this._right_axis[1]=Math.abs(k.xbox.axes.ry)>s?k.xbox.axes.ry:0,this._triggers[0]=Math.abs(k.xbox.axes.ltrigger)>s?k.xbox.axes.ltrigger: +0,this._triggers[1]=Math.abs(k.xbox.axes.rtrigger)>s?k.xbox.axes.rtrigger:0);if(this.outputs)for(s=0;s k;k++)if(s[k]){k=s[k];s=this.xbox_mapping;s||(s=this.xbox_mapping={axes:[], +buttons:{},hat:"",hatmap:c.CENTER});s.axes.lx=k.axes[0];s.axes.ly=k.axes[1];s.axes.rx=k.axes[2];s.axes.ry=k.axes[3];s.axes.ltrigger=k.buttons[6].value;s.axes.rtrigger=k.buttons[7].value;s.hat="";s.hatmap=c.CENTER;for(var t=0;t t)s.buttons[c.mapping_array[t]]=k.buttons[t].pressed,k.buttons[t].was_pressed&&this.trigger(c.mapping_array[t]+"_button_event");else switch(t){case 12:k.buttons[t].pressed&&(s.hat+="up",s.hatmap|=c.UP); +break;case 13:k.buttons[t].pressed&&(s.hat+="down",s.hatmap|=c.DOWN);break;case 14:k.buttons[t].pressed&&(s.hat+="left",s.hatmap|=c.LEFT);break;case 15:k.buttons[t].pressed&&(s.hat+="right",s.hatmap|=c.RIGHT);break;case 16:s.buttons.home=k.buttons[t].pressed}k.xbox=s;return k}};c.prototype.onDrawBackground=function(c){if(!this.flags.collapsed){var k=this._left_axis,t=this._right_axis;c.strokeStyle="#88A";c.strokeRect(0.5*(k[0]+1)*this.size[0]-4,0.5*(k[1]+1)*this.size[1]-4,8,8);c.strokeStyle="#8A8"; +c.strokeRect(0.5*(t[0]+1)*this.size[0]-4,0.5*(t[1]+1)*this.size[1]-4,8,8);k=this.size[1]/this._current_buttons.length;c.fillStyle="#AEB";for(t=0;t ","enum",{values:a.values});this.addWidget("combo","Cond.",this.properties.OP, +"number");this.size=[80,30]}function f(){this.addInput("in","number");this.addOutput("out","number");this.size=[80,30]}function n(){this.addInput("in","number");this.addOutput("out","number");this.size=[80,30];this.properties={A:0,B:1}}function H(){this.addInput("in","number",{label:""});this.addOutput("out","number",{label:""});this.size=[80,30];this.addProperty("factor",1)}function v(){this.addInput("v","boolean");this.addInput("A");this.addInput("B");this.addOutput("out")}function L(){this.addInput("in", +"number");this.addOutput("out","number");this.size=[80,30];this.addProperty("samples",10);this._values=new Float32Array(10);this._current=0}function l(){this.addInput("in","number");this.addOutput("out","number");this.addProperty("factor",0.1);this.size=[80,30];this._value=null}function w(){this.addInput("A","number,array,object");this.addInput("B","number");this.addOutput("=","number");this.addProperty("A",1);this.addProperty("B",1);this.addProperty("OP","+","enum",{values:w.values});this._func= +function(a,b){return a+b};this._result=[]}function q(){this.addInput("A","number");this.addInput("B","number");this.addOutput("A==B","boolean");this.addOutput("A!=B","boolean");this.addProperty("A",0);this.addProperty("B",0)}function a(){this.addInput("A","number");this.addInput("B","number");this.addOutput("true","boolean");this.addOutput("false","boolean");this.addProperty("A",1);this.addProperty("B",1);this.addProperty("OP",">","enum",{values:a.values});this.addWidget("combo","Cond.",this.properties.OP, {property:"OP",values:a.values});this.size=[80,60]}function b(){this.addInput("in","");this.addInput("cond","boolean");this.addOutput("true","");this.addOutput("false","");this.size=[80,60]}function d(){this.addInput("inc","number");this.addOutput("total","number");this.addProperty("increment",1);this.addProperty("value",0)}function g(){this.addInput("v","number");this.addOutput("sin","number");this.addProperty("amplitude",1);this.addProperty("offset",0);this.bgImageUrl="nodes/imgs/icon-sin.png"} function e(){this.addInput("x","number");this.addInput("y","number");this.addOutput("","number");this.properties={x:1,y:1,formula:"x+y"};this.code_widget=this.addWidget("text","F(x,y)",this.properties.formula,function(a,b,d){d.properties.formula=a});this.addWidget("toggle","allow",z.allow_scripts,function(a){z.allow_scripts=a});this._func=null}function E(){this.addInput("vec2","vec2");this.addOutput("x","number");this.addOutput("y","number")}function m(){this.addInputs([["x","number"],["y","number"]]); -this.addOutput("vec2","vec2");this.properties={x:0,y:0};this._data=new Float32Array(2)}function s(){this.addInput("vec3","vec3");this.addOutput("x","number");this.addOutput("y","number");this.addOutput("z","number")}function y(){this.addInputs([["x","number"],["y","number"],["z","number"]]);this.addOutput("vec3","vec3");this.properties={x:0,y:0,z:0};this._data=new Float32Array(3)}function N(){this.addInput("vec4","vec4");this.addOutput("x","number");this.addOutput("y","number");this.addOutput("z", +this.addOutput("vec2","vec2");this.properties={x:0,y:0};this._data=new Float32Array(2)}function r(){this.addInput("vec3","vec3");this.addOutput("x","number");this.addOutput("y","number");this.addOutput("z","number")}function y(){this.addInputs([["x","number"],["y","number"],["z","number"]]);this.addOutput("vec3","vec3");this.properties={x:0,y:0,z:0};this._data=new Float32Array(3)}function N(){this.addInput("vec4","vec4");this.addOutput("x","number");this.addOutput("y","number");this.addOutput("z", "number");this.addOutput("w","number")}function M(){this.addInputs([["x","number"],["y","number"],["z","number"],["w","number"]]);this.addOutput("vec4","vec4");this.properties={x:0,y:0,z:0,w:0};this._data=new Float32Array(4)}var z=B.LiteGraph;c.title="Converter";c.desc="type A to type B";c.prototype.onExecute=function(){var a=this.getInputData(0);if(null!=a&&this.outputs)for(var b=0;b a&&(a+=1024);var c=Math.floor(a);a-=c;d=h.data[c];c=h.data[1023==c?0:c+1];b&&(a=a*a*a*(a*(6*a-15)+10));return d*(1-a)+c*a};h.prototype.onExecute=function(){for(var a= this.getInputData(0)||0,b=this.properties.octaves||1,d=0,c=1,a=a+(this.properties.seed||0),e=this.properties.speed||1,g=0,f=0;fc);++f);a=this.properties.min;this._last_v=d/g*(this.properties.max-a)+a;this.setOutputData(0,this._last_v)};h.prototype.onDrawBackground=function(a){this.outputs[0].label=(this._last_v||0).toFixed(3)};z.registerNodeType("math/noise",h);C.title="Spikes";C.desc="spike every random time"; C.prototype.onExecute=function(){var a=this.graph.elapsed_time;this._remaining_time-=a;this._blink_time-=a;a=0;0 this._remaining_time?(this._remaining_time=Math.random()*(this.properties.max_time-this.properties.min_time)+this.properties.min_time,this._blink_time=this.properties.duration,this.boxcolor="#FFF"):this.boxcolor="#000";this.setOutputData(0,a)};z.registerNodeType("math/spikes",C);x.title="Clamp";x.desc= "Clamp number between min and max";x.prototype.onExecute=function(){var a=this.getInputData(0);null!=a&&(a=Math.max(this.properties.min,a),a=Math.min(this.properties.max,a),this.setOutputData(0,a))};x.prototype.getCode=function(a){a="";this.isInputConnected(0)&&(a+="clamp({{0}},"+this.properties.min+","+this.properties.max+")");return a};z.registerNodeType("math/clamp",x);G.title="Lerp";G.desc="Linear Interpolation";G.prototype.onExecute=function(){var a=this.getInputData(0);null==a&&(a=0);var b= this.getInputData(1);null==b&&(b=0);var d=this.properties.f,c=this.getInputData(2);void 0!==c&&(d=c);this.setOutputData(0,a*(1-d)+b*d)};G.prototype.onGetInputs=function(){return[["f","number"]]};z.registerNodeType("math/lerp",G);A.title="Abs";A.desc="Absolute";A.prototype.onExecute=function(){var a=this.getInputData(0);null!=a&&this.setOutputData(0,Math.abs(a))};z.registerNodeType("math/abs",A);D.title="Floor";D.desc="Floor number to remove fractional part";D.prototype.onExecute=function(){var a= -this.getInputData(0);null!=a&&this.setOutputData(0,Math.floor(a))};z.registerNodeType("math/floor",D);f.title="Frac";f.desc="Returns fractional part";f.prototype.onExecute=function(){var a=this.getInputData(0);null!=a&&this.setOutputData(0,a%1)};z.registerNodeType("math/frac",f);q.title="Smoothstep";q.desc="Smoothstep";q.prototype.onExecute=function(){var a=this.getInputData(0);if(void 0!==a){var b=this.properties.A,a=Math.clamp((a-b)/(this.properties.B-b),0,1);this.setOutputData(0,a*a*(3-2*a))}}; -z.registerNodeType("math/smoothstep",q);H.title="Scale";H.desc="v * factor";H.prototype.onExecute=function(){var a=this.getInputData(0);null!=a&&this.setOutputData(0,a*this.properties.factor)};z.registerNodeType("math/scale",H);w.title="Gate";w.desc="if v is true, then outputs A, otherwise B";w.prototype.onExecute=function(){var a=this.getInputData(0);this.setOutputData(0,this.getInputData(a?1:2))};z.registerNodeType("math/gate",w);L.title="Average";L.desc="Average Filter";L.prototype.onExecute=function(){var a= +this.getInputData(0);null!=a&&this.setOutputData(0,Math.floor(a))};z.registerNodeType("math/floor",D);f.title="Frac";f.desc="Returns fractional part";f.prototype.onExecute=function(){var a=this.getInputData(0);null!=a&&this.setOutputData(0,a%1)};z.registerNodeType("math/frac",f);n.title="Smoothstep";n.desc="Smoothstep";n.prototype.onExecute=function(){var a=this.getInputData(0);if(void 0!==a){var b=this.properties.A,a=Math.clamp((a-b)/(this.properties.B-b),0,1);this.setOutputData(0,a*a*(3-2*a))}}; +z.registerNodeType("math/smoothstep",n);H.title="Scale";H.desc="v * factor";H.prototype.onExecute=function(){var a=this.getInputData(0);null!=a&&this.setOutputData(0,a*this.properties.factor)};z.registerNodeType("math/scale",H);v.title="Gate";v.desc="if v is true, then outputs A, otherwise B";v.prototype.onExecute=function(){var a=this.getInputData(0);this.setOutputData(0,this.getInputData(a?1:2))};z.registerNodeType("math/gate",v);L.title="Average";L.desc="Average Filter";L.prototype.onExecute=function(){var a= this.getInputData(0);null==a&&(a=0);var b=this._values.length;this._values[this._current%b]=a;this._current+=1;this._current>b&&(this._current=0);for(var d=a=0;db&&(b=1);this.properties.samples=Math.round(b);var d=this._values;this._values=new Float32Array(this.properties.samples);d.length<=this._values.length?this._values.set(d):this._values.set(d.subarray(0,this._values.length))};z.registerNodeType("math/average", -L);n.title="TendTo";n.desc="moves the output value always closer to the input";n.prototype.onExecute=function(){var a=this.getInputData(0);null==a&&(a=0);var b=this.properties.factor;this._value=null==this._value?a:this._value*(1-b)+a*b;this.setOutputData(0,this._value)};z.registerNodeType("math/tendTo",n);v.values="+ - * / % ^ max min".split(" ");v.title="Operation";v.desc="Easy math operators";v["@OP"]={type:"enum",title:"operation",values:v.values};v.size=[100,60];v.prototype.getTitle=function(){return"max"== -this.properties.OP||"min"==this.properties.OP?this.properties.OP+"(A,B)":"A "+this.properties.OP+" B"};v.prototype.setValue=function(a){"string"==typeof a&&(a=parseFloat(a));this.properties.value=a};v.prototype.onPropertyChanged=function(a,b){if("OP"==a)switch(this.properties.OP){case "+":this._func=function(a,b){return a+b};break;case "-":this._func=function(a,b){return a-b};break;case "x":case "X":case "*":this._func=function(a,b){return a*b};break;case "/":this._func=function(a,b){return a/b}; -break;case "%":this._func=function(a,b){return a%b};break;case "^":this._func=function(a,b){return Math.pow(a,b)};break;case "max":this._func=function(a,b){return Math.max(a,b)};break;case "min":this._func=function(a,b){return Math.min(a,b)};break;default:console.warn("Unknown operation: "+this.properties.OP),this._func=function(a){return a}}};v.prototype.onExecute=function(){var a=this.getInputData(0),b=this.getInputData(1);null!=a?a.constructor===Number&&(this.properties.A=a):a=this.properties.A; -null!=b?this.properties.B=b:b=this.properties.B;var d;if(a.constructor===Number)d=this._func(a,b);else if(a.constructor===Array){d=this._result;d.length=a.length;for(var c=0;c B":g=a>b;break;case "A=B":g=a>=b}this.setOutputData(d,g)}}};k.prototype.onGetOutputs=function(){return[["A==B","boolean"],["A!=B","boolean"],["A>B","boolean"],["A=B","boolean"],["A<=B","boolean"]]};z.registerNodeType("math/compare",k);z.registerSearchboxExtra("math/compare","==",{outputs:[["A==B","boolean"]], +L);l.title="TendTo";l.desc="moves the output value always closer to the input";l.prototype.onExecute=function(){var a=this.getInputData(0);null==a&&(a=0);var b=this.properties.factor;this._value=null==this._value?a:this._value*(1-b)+a*b;this.setOutputData(0,this._value)};z.registerNodeType("math/tendTo",l);w.values="+ - * / % ^ max min".split(" ");w.title="Operation";w.desc="Easy math operators";w["@OP"]={type:"enum",title:"operation",values:w.values};w.size=[100,60];w.prototype.getTitle=function(){return"max"== +this.properties.OP||"min"==this.properties.OP?this.properties.OP+"(A,B)":"A "+this.properties.OP+" B"};w.prototype.setValue=function(a){"string"==typeof a&&(a=parseFloat(a));this.properties.value=a};w.prototype.onPropertyChanged=function(a,b){if("OP"==a)switch(this.properties.OP){case "+":this._func=function(a,b){return a+b};break;case "-":this._func=function(a,b){return a-b};break;case "x":case "X":case "*":this._func=function(a,b){return a*b};break;case "/":this._func=function(a,b){return a/b}; +break;case "%":this._func=function(a,b){return a%b};break;case "^":this._func=function(a,b){return Math.pow(a,b)};break;case "max":this._func=function(a,b){return Math.max(a,b)};break;case "min":this._func=function(a,b){return Math.min(a,b)};break;default:console.warn("Unknown operation: "+this.properties.OP),this._func=function(a){return a}}};w.prototype.onExecute=function(){var a=this.getInputData(0),b=this.getInputData(1);null!=a?a.constructor===Number&&(this.properties.A=a):a=this.properties.A; +null!=b?this.properties.B=b:b=this.properties.B;var d;if(a.constructor===Number)d=this._func(a,b);else if(a.constructor===Array){d=this._result;d.length=a.length;for(var c=0;c B":g=a>b;break;case "A=B":g=a>=b}this.setOutputData(d,g)}}};q.prototype.onGetOutputs=function(){return[["A==B","boolean"],["A!=B","boolean"],["A>B","boolean"],["A=B","boolean"],["A<=B","boolean"]]};z.registerNodeType("math/compare",q);z.registerSearchboxExtra("math/compare","==",{outputs:[["A==B","boolean"]], title:"A==B"});z.registerSearchboxExtra("math/compare","!=",{outputs:[["A!=B","boolean"]],title:"A!=B"});z.registerSearchboxExtra("math/compare",">",{outputs:[["A>B","boolean"]],title:"A>B"});z.registerSearchboxExtra("math/compare","<",{outputs:[["A=",{outputs:[["A>=B","boolean"]],title:"A>=B"});z.registerSearchboxExtra("math/compare","<=",{outputs:[["A<=B","boolean"]],title:"A<=B"});a.values="> < == != <= >= || &&".split(" "); a["@OP"]={type:"enum",title:"operation",values:a.values};a.title="Condition";a.desc="evaluates condition between A and B";a.prototype.getTitle=function(){return"A "+this.properties.OP+" B"};a.prototype.onExecute=function(){var a=this.getInputData(0);void 0===a?a=this.properties.A:this.properties.A=a;var b=this.getInputData(1);void 0===b?b=this.properties.B:this.properties.B=b;var d=!0;switch(this.properties.OP){case ">":d=a>b;break;case "<":d=a=":d=a>=b;break;case "||":d=a||b;break;case "&&":d=a&&b}this.setOutputData(0,d);this.setOutputData(1,!d)};z.registerNodeType("math/condition",a);b.title="Branch";b.desc="If condition is true, outputs IN in true, otherwise in false";b.prototype.onExecute=function(){var a=this.getInputData(0);this.getInputData(1)?(this.setOutputData(0,a),this.setOutputData(1,null)):(this.setOutputData(0,null),this.setOutputData(1,a))};z.registerNodeType("math/branch",b);d.title="Accumulate"; @@ -394,56 +395,56 @@ d.desc="Increments a value every time";d.prototype.onExecute=function(){null===t "number"]]};g.prototype.onGetOutputs=function(){return[["sin","number"],["cos","number"],["tan","number"],["asin","number"],["acos","number"],["atan","number"]]};z.registerNodeType("math/trigonometry",g);z.registerSearchboxExtra("math/trigonometry","SIN()",{outputs:[["sin","number"]],title:"SIN()"});z.registerSearchboxExtra("math/trigonometry","COS()",{outputs:[["cos","number"]],title:"COS()"});z.registerSearchboxExtra("math/trigonometry","TAN()",{outputs:[["tan","number"]],title:"TAN()"});e.title= "Formula";e.desc="Compute formula";e.size=[160,100];L.prototype.onPropertyChanged=function(a,b){"formula"==a&&(this.code_widget.value=b)};e.prototype.onExecute=function(){if(z.allow_scripts){var a=this.getInputData(0),b=this.getInputData(1);null!=a?this.properties.x=a:a=this.properties.x;null!=b?this.properties.y=b:b=this.properties.y;var d;try{this._func&&this._func_code==this.properties.formula||(this._func=new Function("x","y","TIME","return "+this.properties.formula),this._func_code=this.properties.formula), d=this._func(a,b,this.graph.globaltime),this.boxcolor=null}catch(c){this.boxcolor="red"}this.setOutputData(0,d)}};e.prototype.getTitle=function(){return this._func_code||"Formula"};e.prototype.onDrawBackground=function(){var a=this.properties.formula;this.outputs&&this.outputs.length&&(this.outputs[0].label=a)};z.registerNodeType("math/formula",e);E.title="Vec2->XY";E.desc="vector 2 to components";E.prototype.onExecute=function(){var a=this.getInputData(0);null!=a&&(this.setOutputData(0,a[0]),this.setOutputData(1, -a[1]))};z.registerNodeType("math3d/vec2-to-xy",E);m.title="XY->Vec2";m.desc="components to vector2";m.prototype.onExecute=function(){var a=this.getInputData(0);null==a&&(a=this.properties.x);var b=this.getInputData(1);null==b&&(b=this.properties.y);var d=this._data;d[0]=a;d[1]=b;this.setOutputData(0,d)};z.registerNodeType("math3d/xy-to-vec2",m);s.title="Vec3->XYZ";s.desc="vector 3 to components";s.prototype.onExecute=function(){var a=this.getInputData(0);null!=a&&(this.setOutputData(0,a[0]),this.setOutputData(1, -a[1]),this.setOutputData(2,a[2]))};z.registerNodeType("math3d/vec3-to-xyz",s);y.title="XYZ->Vec3";y.desc="components to vector3";y.prototype.onExecute=function(){var a=this.getInputData(0);null==a&&(a=this.properties.x);var b=this.getInputData(1);null==b&&(b=this.properties.y);var d=this.getInputData(2);null==d&&(d=this.properties.z);var c=this._data;c[0]=a;c[1]=b;c[2]=d;this.setOutputData(0,c)};z.registerNodeType("math3d/xyz-to-vec3",y);N.title="Vec4->XYZW";N.desc="vector 4 to components";N.prototype.onExecute= +a[1]))};z.registerNodeType("math3d/vec2-to-xy",E);m.title="XY->Vec2";m.desc="components to vector2";m.prototype.onExecute=function(){var a=this.getInputData(0);null==a&&(a=this.properties.x);var b=this.getInputData(1);null==b&&(b=this.properties.y);var d=this._data;d[0]=a;d[1]=b;this.setOutputData(0,d)};z.registerNodeType("math3d/xy-to-vec2",m);r.title="Vec3->XYZ";r.desc="vector 3 to components";r.prototype.onExecute=function(){var a=this.getInputData(0);null!=a&&(this.setOutputData(0,a[0]),this.setOutputData(1, +a[1]),this.setOutputData(2,a[2]))};z.registerNodeType("math3d/vec3-to-xyz",r);y.title="XYZ->Vec3";y.desc="components to vector3";y.prototype.onExecute=function(){var a=this.getInputData(0);null==a&&(a=this.properties.x);var b=this.getInputData(1);null==b&&(b=this.properties.y);var d=this.getInputData(2);null==d&&(d=this.properties.z);var c=this._data;c[0]=a;c[1]=b;c[2]=d;this.setOutputData(0,c)};z.registerNodeType("math3d/xyz-to-vec3",y);N.title="Vec4->XYZW";N.desc="vector 4 to components";N.prototype.onExecute= function(){var a=this.getInputData(0);null!=a&&(this.setOutputData(0,a[0]),this.setOutputData(1,a[1]),this.setOutputData(2,a[2]),this.setOutputData(3,a[3]))};z.registerNodeType("math3d/vec4-to-xyzw",N);M.title="XYZW->Vec4";M.desc="components to vector4";M.prototype.onExecute=function(){var a=this.getInputData(0);null==a&&(a=this.properties.x);var b=this.getInputData(1);null==b&&(b=this.properties.y);var d=this.getInputData(2);null==d&&(d=this.properties.z);var c=this.getInputData(3);null==c&&(c=this.properties.w); var e=this._data;e[0]=a;e[1]=b;e[2]=d;e[3]=c;this.setOutputData(0,e)};z.registerNodeType("math3d/xyzw-to-vec4",M)})(this); -(function(B){function c(){this.addInput("T","vec3");this.addInput("R","vec3");this.addInput("S","vec3");this.addOutput("mat4","mat4");this.properties={T:[0,0,0],R:[0,0,0],S:[1,1,1],R_in_degrees:!0};this._result=mat4.create();this._must_update=!0}function l(){this.addInput("A","number,vec3");this.addInput("B","number,vec3");this.addOutput("=","number,vec3");this.addProperty("OP","+","enum",{values:l.values});this._result=vec3.create()}function u(){this.addInput("in","vec3");this.addInput("f","number"); -this.addOutput("out","vec3");this.properties={f:1};this._data=new Float32Array(3)}function r(){this.addInput("in","vec3");this.addOutput("out","number")}function t(){this.addInput("in","vec3");this.addOutput("out","vec3");this._data=new Float32Array(3)}function h(){this.addInput("A","vec3");this.addInput("B","vec3");this.addInput("f","vec3");this.addOutput("out","vec3");this.properties={f:0.5};this._data=new Float32Array(3)}function C(){this.addInput("A","vec3");this.addInput("B","vec3");this.addOutput("out", -"number")}var x=B.LiteGraph;c.title="mat4";c.temp_quat=new Float32Array([0,0,0,1]);c.temp_mat4=new Float32Array(16);c.temp_vec3=new Float32Array(3);c.prototype.onPropertyChanged=function(c,h){this._must_update=!0};c.prototype.onExecute=function(){var h=this._result,l=c.temp_quat,r=c.temp_mat4,f=c.temp_vec3,q=this.getInputData(0),t=this.getInputData(1),w=this.getInputData(2);if(this._must_update||q||t||w)q=q||this.properties.T,t=t||this.properties.R,w=w||this.properties.S,mat4.identity(h),mat4.translate(h, -h,q),this.properties.R_in_degrees?(f.set(t),vec3.scale(f,f,DEG2RAD),quat.fromEuler(l,f)):quat.fromEuler(l,t),mat4.fromQuat(r,l),mat4.multiply(h,h,r),mat4.scale(h,h,w);this.setOutputData(0,h)};x.registerNodeType("math3d/mat4",c);l.values="+ - * / % ^ max min dot cross".split(" ");x.registerSearchboxExtra("math3d/operation","CROSS()",{properties:{OP:"cross"},title:"CROSS()"});x.registerSearchboxExtra("math3d/operation","DOT()",{properties:{OP:"dot"},title:"DOT()"});l.title="Operation";l.desc="Easy math 3D operators"; -l["@OP"]={type:"enum",title:"operation",values:l.values};l.size=[100,60];l.prototype.getTitle=function(){return"max"==this.properties.OP||"min"==this.properties.OP?this.properties.OP+"(A,B)":"A "+this.properties.OP+" B"};l.prototype.onExecute=function(){var c=this.getInputData(0),h=this.getInputData(1);if(null!=c&&null!=h){c.constructor===Number&&(c=[c,c,c]);h.constructor===Number&&(h=[h,h,h]);var l=this._result;switch(this.properties.OP){case "+":l=vec3.add(l,c,h);break;case "-":l=vec3.sub(l,c,h); -break;case "x":case "X":case "*":l=vec3.mul(l,c,h);break;case "/":l=vec3.div(l,c,h);break;case "%":l[0]=c[0]%h[0];l[1]=c[1]%h[1];l[2]=c[2]%h[2];break;case "^":l[0]=Math.pow(c[0],h[0]);l[1]=Math.pow(c[1],h[1]);l[2]=Math.pow(c[2],h[2]);break;case "max":l[0]=Math.max(c[0],h[0]);l[1]=Math.max(c[1],h[1]);l[2]=Math.max(c[2],h[2]);break;case "min":l[0]=Math.min(c[0],h[0]),l[1]=Math.min(c[1],h[1]),l[2]=Math.min(c[2],h[2]);case "dot":l=vec3.dot(c,h);break;case "cross":vec3.cross(l,c,h);break;default:console.warn("Unknown operation: "+ -this.properties.OP)}this.setOutputData(0,l)}};l.prototype.onDrawBackground=function(c){this.flags.collapsed||(c.font="40px Arial",c.fillStyle="#666",c.textAlign="center",c.fillText(this.properties.OP,0.5*this.size[0],0.5*(this.size[1]+x.NODE_TITLE_HEIGHT)),c.textAlign="left")};x.registerNodeType("math3d/operation",l);u.title="vec3_scale";u.desc="scales the components of a vec3";u.prototype.onExecute=function(){var c=this.getInputData(0);if(null!=c){var h=this.getInputData(1);null==h&&(h=this.properties.f); -var l=this._data;l[0]=c[0]*h;l[1]=c[1]*h;l[2]=c[2]*h;this.setOutputData(0,l)}};x.registerNodeType("math3d/vec3-scale",u);r.title="vec3_length";r.desc="returns the module of a vector";r.prototype.onExecute=function(){var c=this.getInputData(0);null!=c&&(c=Math.sqrt(c[0]*c[0]+c[1]*c[1]+c[2]*c[2]),this.setOutputData(0,c))};x.registerNodeType("math3d/vec3-length",r);t.title="vec3_normalize";t.desc="returns the vector normalized";t.prototype.onExecute=function(){var c=this.getInputData(0);if(null!=c){var h= -Math.sqrt(c[0]*c[0]+c[1]*c[1]+c[2]*c[2]),l=this._data;l[0]=c[0]/h;l[1]=c[1]/h;l[2]=c[2]/h;this.setOutputData(0,l)}};x.registerNodeType("math3d/vec3-normalize",t);h.title="vec3_lerp";h.desc="returns the interpolated vector";h.prototype.onExecute=function(){var c=this.getInputData(0);if(null!=c){var h=this.getInputData(1);if(null!=h){var l=this.getInputOrProperty("f"),f=this._data;f[0]=c[0]*(1-l)+h[0]*l;f[1]=c[1]*(1-l)+h[1]*l;f[2]=c[2]*(1-l)+h[2]*l;this.setOutputData(0,f)}}};x.registerNodeType("math3d/vec3-lerp", +(function(B){function c(){this.addInput("T","vec3");this.addInput("R","vec3");this.addInput("S","vec3");this.addOutput("mat4","mat4");this.properties={T:[0,0,0],R:[0,0,0],S:[1,1,1],R_in_degrees:!0};this._result=mat4.create();this._must_update=!0}function k(){this.addInput("A","number,vec3");this.addInput("B","number,vec3");this.addOutput("=","number,vec3");this.addProperty("OP","+","enum",{values:k.values});this._result=vec3.create()}function u(){this.addInput("in","vec3");this.addInput("f","number"); +this.addOutput("out","vec3");this.properties={f:1};this._data=new Float32Array(3)}function s(){this.addInput("in","vec3");this.addOutput("out","number")}function t(){this.addInput("in","vec3");this.addOutput("out","vec3");this._data=new Float32Array(3)}function h(){this.addInput("A","vec3");this.addInput("B","vec3");this.addInput("f","vec3");this.addOutput("out","vec3");this.properties={f:0.5};this._data=new Float32Array(3)}function C(){this.addInput("A","vec3");this.addInput("B","vec3");this.addOutput("out", +"number")}var x=B.LiteGraph;c.title="mat4";c.temp_quat=new Float32Array([0,0,0,1]);c.temp_mat4=new Float32Array(16);c.temp_vec3=new Float32Array(3);c.prototype.onPropertyChanged=function(c,h){this._must_update=!0};c.prototype.onExecute=function(){var h=this._result,k=c.temp_quat,s=c.temp_mat4,f=c.temp_vec3,n=this.getInputData(0),t=this.getInputData(1),v=this.getInputData(2);if(this._must_update||n||t||v)n=n||this.properties.T,t=t||this.properties.R,v=v||this.properties.S,mat4.identity(h),mat4.translate(h, +h,n),this.properties.R_in_degrees?(f.set(t),vec3.scale(f,f,DEG2RAD),quat.fromEuler(k,f)):quat.fromEuler(k,t),mat4.fromQuat(s,k),mat4.multiply(h,h,s),mat4.scale(h,h,v);this.setOutputData(0,h)};x.registerNodeType("math3d/mat4",c);k.values="+ - * / % ^ max min dot cross".split(" ");x.registerSearchboxExtra("math3d/operation","CROSS()",{properties:{OP:"cross"},title:"CROSS()"});x.registerSearchboxExtra("math3d/operation","DOT()",{properties:{OP:"dot"},title:"DOT()"});k.title="Operation";k.desc="Easy math 3D operators"; +k["@OP"]={type:"enum",title:"operation",values:k.values};k.size=[100,60];k.prototype.getTitle=function(){return"max"==this.properties.OP||"min"==this.properties.OP?this.properties.OP+"(A,B)":"A "+this.properties.OP+" B"};k.prototype.onExecute=function(){var c=this.getInputData(0),h=this.getInputData(1);if(null!=c&&null!=h){c.constructor===Number&&(c=[c,c,c]);h.constructor===Number&&(h=[h,h,h]);var k=this._result;switch(this.properties.OP){case "+":k=vec3.add(k,c,h);break;case "-":k=vec3.sub(k,c,h); +break;case "x":case "X":case "*":k=vec3.mul(k,c,h);break;case "/":k=vec3.div(k,c,h);break;case "%":k[0]=c[0]%h[0];k[1]=c[1]%h[1];k[2]=c[2]%h[2];break;case "^":k[0]=Math.pow(c[0],h[0]);k[1]=Math.pow(c[1],h[1]);k[2]=Math.pow(c[2],h[2]);break;case "max":k[0]=Math.max(c[0],h[0]);k[1]=Math.max(c[1],h[1]);k[2]=Math.max(c[2],h[2]);break;case "min":k[0]=Math.min(c[0],h[0]),k[1]=Math.min(c[1],h[1]),k[2]=Math.min(c[2],h[2]);case "dot":k=vec3.dot(c,h);break;case "cross":vec3.cross(k,c,h);break;default:console.warn("Unknown operation: "+ +this.properties.OP)}this.setOutputData(0,k)}};k.prototype.onDrawBackground=function(c){this.flags.collapsed||(c.font="40px Arial",c.fillStyle="#666",c.textAlign="center",c.fillText(this.properties.OP,0.5*this.size[0],0.5*(this.size[1]+x.NODE_TITLE_HEIGHT)),c.textAlign="left")};x.registerNodeType("math3d/operation",k);u.title="vec3_scale";u.desc="scales the components of a vec3";u.prototype.onExecute=function(){var c=this.getInputData(0);if(null!=c){var h=this.getInputData(1);null==h&&(h=this.properties.f); +var k=this._data;k[0]=c[0]*h;k[1]=c[1]*h;k[2]=c[2]*h;this.setOutputData(0,k)}};x.registerNodeType("math3d/vec3-scale",u);s.title="vec3_length";s.desc="returns the module of a vector";s.prototype.onExecute=function(){var c=this.getInputData(0);null!=c&&(c=Math.sqrt(c[0]*c[0]+c[1]*c[1]+c[2]*c[2]),this.setOutputData(0,c))};x.registerNodeType("math3d/vec3-length",s);t.title="vec3_normalize";t.desc="returns the vector normalized";t.prototype.onExecute=function(){var c=this.getInputData(0);if(null!=c){var h= +Math.sqrt(c[0]*c[0]+c[1]*c[1]+c[2]*c[2]),k=this._data;k[0]=c[0]/h;k[1]=c[1]/h;k[2]=c[2]/h;this.setOutputData(0,k)}};x.registerNodeType("math3d/vec3-normalize",t);h.title="vec3_lerp";h.desc="returns the interpolated vector";h.prototype.onExecute=function(){var c=this.getInputData(0);if(null!=c){var h=this.getInputData(1);if(null!=h){var k=this.getInputOrProperty("f"),f=this._data;f[0]=c[0]*(1-k)+h[0]*k;f[1]=c[1]*(1-k)+h[1]*k;f[2]=c[2]*(1-k)+h[2]*k;this.setOutputData(0,f)}}};x.registerNodeType("math3d/vec3-lerp", h);C.title="vec3_dot";C.desc="returns the dot product";C.prototype.onExecute=function(){var c=this.getInputData(0);if(null!=c){var h=this.getInputData(1);null!=h&&this.setOutputData(0,c[0]*h[0]+c[1]*h[1]+c[2]*h[2])}};x.registerNodeType("math3d/vec3-dot",C);B.glMatrix?(B=function(){this.addOutput("quat","quat");this.properties={x:0,y:0,z:0,w:1,normalize:!1};this._value=quat.create()},B.title="Quaternion",B.desc="quaternion",B.prototype.onExecute=function(){this._value[0]=this.getInputOrProperty("x"); this._value[1]=this.getInputOrProperty("y");this._value[2]=this.getInputOrProperty("z");this._value[3]=this.getInputOrProperty("w");this.properties.normalize&&quat.normalize(this._value,this._value);this.setOutputData(0,this._value)},B.prototype.onGetInputs=function(){return[["x","number"],["y","number"],["z","number"],["w","number"]]},x.registerNodeType("math3d/quaternion",B),B=function(){this.addInputs([["degrees","number"],["axis","vec3"]]);this.addOutput("quat","quat");this.properties={angle:90, axis:vec3.fromValues(0,1,0)};this._value=quat.create()},B.title="Rotation",B.desc="quaternion rotation",B.prototype.onExecute=function(){var c=this.getInputData(0);null==c&&(c=this.properties.angle);var h=this.getInputData(1);null==h&&(h=this.properties.axis);c=quat.setAxisAngle(this._value,h,0.0174532925*c);this.setOutputData(0,c)},x.registerNodeType("math3d/rotation",B),B=function(){this.addInput("euler","vec3");this.addOutput("quat","quat");this.properties={euler:[0,0,0],use_yaw_pitch_roll:!1}; this._degs=vec3.create();this._value=quat.create()},B.title="Euler->Quat",B.desc="Converts euler angles (in degrees) to quaternion",B.prototype.onExecute=function(){var c=this.getInputData(0);null==c&&(c=this.properties.euler);vec3.scale(this._degs,c,DEG2RAD);this.properties.use_yaw_pitch_roll&&(this._degs=[this._degs[2],this._degs[0],this._degs[1]]);c=quat.fromEuler(this._value,this._degs);this.setOutputData(0,c)},x.registerNodeType("math3d/euler_to_quat",B),B=function(){this.addInput(["quat","quat"]); this.addOutput("euler","vec3");this._value=vec3.create()},B.title="Euler->Quat",B.desc="Converts rotX,rotY,rotZ in degrees to quat",B.prototype.onExecute=function(){var c=this.getInputData(0);c&&(quat.toEuler(this._value,c),vec3.scale(this._value,this._value,DEG2RAD),this.setOutputData(0,this._value))},x.registerNodeType("math3d/quat_to_euler",B),B=function(){this.addInputs([["vec3","vec3"],["quat","quat"]]);this.addOutput("result","vec3");this.properties={vec:[0,0,1]}},B.title="Rot. Vec3",B.desc= "rotate a point",B.prototype.onExecute=function(){var c=this.getInputData(0);null==c&&(c=this.properties.vec);var h=this.getInputData(1);null==h?this.setOutputData(c):this.setOutputData(0,vec3.transformQuat(vec3.create(),c,h))},x.registerNodeType("math3d/rotate_vec3",B),B=function(){this.addInputs([["A","quat"],["B","quat"]]);this.addOutput("A*B","quat");this._value=quat.create()},B.title="Mult. Quat",B.desc="rotate quaternion",B.prototype.onExecute=function(){var c=this.getInputData(0);if(null!= -c){var h=this.getInputData(1);null!=h&&(c=quat.multiply(this._value,c,h),this.setOutputData(0,c))}},x.registerNodeType("math3d/mult-quat",B),B=function(){this.addInputs([["A","quat"],["B","quat"],["factor","number"]]);this.addOutput("slerp","quat");this.addProperty("factor",0.5);this._value=quat.create()},B.title="Quat Slerp",B.desc="quaternion spherical interpolation",B.prototype.onExecute=function(){var c=this.getInputData(0);if(null!=c){var h=this.getInputData(1);if(null!=h){var l=this.properties.factor; -null!=this.getInputData(2)&&(l=this.getInputData(2));c=quat.slerp(this._value,c,h,l);this.setOutputData(0,c)}}},x.registerNodeType("math3d/quat-slerp",B),B=function(){this.addInput("vec3","vec3");this.addOutput("remap","vec3");this.addOutput("clamped","vec3");this.properties={clamp:!0,range_min:[-1,-1,0],range_max:[1,1,0],target_min:[-1,-1,0],target_max:[1,1,0]};this._value=vec3.create();this._clamped=vec3.create()},B.title="Remap Range",B.desc="remap a 3D range",B.prototype.onExecute=function(){var c= -this.getInputData(0);c&&this._value.set(c);for(var c=this.properties.range_min,h=this.properties.range_max,l=this.properties.target_min,f=this.properties.target_max,q=0;3>q;++q){var r=h[q]-c[q];this._clamped[q]=Math.clamp(this._value[q],c[q],h[q]);0==r?this._value[q]=0.5*(l[q]+f[q]):(r=(this._value[q]-c[q])/r,this.properties.clamp&&(r=Math.clamp(r,0,1)),this._value[q]=l[q]+r*(f[q]-l[q]))}this.setOutputData(0,this._value);this.setOutputData(1,this._clamped)},x.registerNodeType("math3d/remap_range", +c){var h=this.getInputData(1);null!=h&&(c=quat.multiply(this._value,c,h),this.setOutputData(0,c))}},x.registerNodeType("math3d/mult-quat",B),B=function(){this.addInputs([["A","quat"],["B","quat"],["factor","number"]]);this.addOutput("slerp","quat");this.addProperty("factor",0.5);this._value=quat.create()},B.title="Quat Slerp",B.desc="quaternion spherical interpolation",B.prototype.onExecute=function(){var c=this.getInputData(0);if(null!=c){var h=this.getInputData(1);if(null!=h){var k=this.properties.factor; +null!=this.getInputData(2)&&(k=this.getInputData(2));c=quat.slerp(this._value,c,h,k);this.setOutputData(0,c)}}},x.registerNodeType("math3d/quat-slerp",B),B=function(){this.addInput("vec3","vec3");this.addOutput("remap","vec3");this.addOutput("clamped","vec3");this.properties={clamp:!0,range_min:[-1,-1,0],range_max:[1,1,0],target_min:[-1,-1,0],target_max:[1,1,0]};this._value=vec3.create();this._clamped=vec3.create()},B.title="Remap Range",B.desc="remap a 3D range",B.prototype.onExecute=function(){var c= +this.getInputData(0);c&&this._value.set(c);for(var c=this.properties.range_min,h=this.properties.range_max,k=this.properties.target_min,f=this.properties.target_max,n=0;3>n;++n){var s=h[n]-c[n];this._clamped[n]=Math.clamp(this._value[n],c[n],h[n]);0==s?this._value[n]=0.5*(k[n]+f[n]):(s=(this._value[n]-c[n])/s,this.properties.clamp&&(s=Math.clamp(s,0,1)),this._value[n]=k[n]+s*(f[n]-k[n]))}this.setOutputData(0,this._value);this.setOutputData(1,this._clamped)},x.registerNodeType("math3d/remap_range", B)):console.warn("No glmatrix found, some Math3D nodes may not work")})(this); (function(B){function c(){this.addInput("","string");this.addOutput("table","table");this.addOutput("rows","number");this.addProperty("value","");this.addProperty("separator",",");this._table=null}B=B.LiteGraph;B.wrapFunctionAsNode("string/toString",function(c){if(c&&c.constructor===Object)try{return JSON.stringify(c)}catch(u){}return String(c)},[""],"String");B.wrapFunctionAsNode("string/compare",function(c,u){return c==u},["string","string"],"boolean");B.wrapFunctionAsNode("string/concatenate", function(c,u){return void 0===c?u:void 0===u?c:c+u},["string","string"],"string");B.wrapFunctionAsNode("string/contains",function(c,u){return void 0===c||void 0===u?!1:-1!=c.indexOf(u)},["string","string"],"boolean");B.wrapFunctionAsNode("string/toUpperCase",function(c){return null!=c&&c.constructor===String?c.toUpperCase():c},["string"],"string");B.wrapFunctionAsNode("string/split",function(c,u){null==u&&(u=this.properties.separator);if(null==c)return[];if(c.constructor===String)return c.split(u|| -" ");if(c.constructor===Array){for(var r=[],t=0;t f;++f){var h=this.getInputData(f);if(null!=h){var l=this.values[f];l.push(h);l.length>c[0]&&l.shift()}}}};c.prototype.onDrawBackground=function(f){if(!this.flags.collapsed){var h=this.size,l=0.5*h[1]/ -this.properties.scale,r=c.colors,n=0.5*h[1];f.fillStyle="#000";f.fillRect(0,0,h[0],h[1]);f.strokeStyle="#555";f.beginPath();f.moveTo(0,n);f.lineTo(h[0],n);f.stroke();if(this.inputs)for(var v=0;4>v;++v){var k=this.values[v];if(this.inputs[v]&&this.inputs[v].link){f.strokeStyle=r[v];f.beginPath();var a=k[0]*l*-1+n;f.moveTo(0,Math.clamp(a,0,h[1]));for(var b=1;b f&&(f=0);if(0!=c.length){var h=[0,0,0];if(0==f)h=c[0];else if(1==f)h=c[c.length-1];else{var l= -(c.length-1)*f,f=c[Math.floor(l)],c=c[Math.floor(l)+1],l=l-Math.floor(l);h[0]=f[0]*(1-l)+c[0]*l;h[1]=f[1]*(1-l)+c[1]*l;h[2]=f[2]*(1-l)+c[2]*l}for(f=0;f f;++f){var h=this.getInputData(f);if(null!=h){var k=this.values[f];k.push(h);k.length>c[0]&&k.shift()}}}};c.prototype.onDrawBackground=function(f){if(!this.flags.collapsed){var h=this.size,k=0.5*h[1]/ +this.properties.scale,s=c.colors,l=0.5*h[1];f.fillStyle="#000";f.fillRect(0,0,h[0],h[1]);f.strokeStyle="#555";f.beginPath();f.moveTo(0,l);f.lineTo(h[0],l);f.stroke();if(this.inputs)for(var w=0;4>w;++w){var q=this.values[w];if(this.inputs[w]&&this.inputs[w].link){f.strokeStyle=s[w];f.beginPath();var a=q[0]*k*-1+l;f.moveTo(0,Math.clamp(a,0,h[1]));for(var b=1;b f&&(f=0);if(0!=c.length){var h=[0,0,0];if(0==f)h=c[0];else if(1==f)h=c[c.length-1];else{var k= +(c.length-1)*f,f=c[Math.floor(k)],c=c[Math.floor(k)+1],k=k-Math.floor(k);h[0]=f[0]*(1-k)+c[0]*k;h[1]=f[1]*(1-k)+c[1]*k;h[2]=f[2]*(1-k)+c[2]*k}for(f=0;f =c&&(this._video.currentTime=c*this._video.duration,this._video.pause()); -this._video.dirty=!0;this.setOutputData(0,this._video);this.setOutputData(1,this._video.currentTime);this.setOutputData(2,this._video.duration);this.setDirtyCanvas(!0)}};A.prototype.onStart=function(){this.play()};A.prototype.onStop=function(){this.stop()};A.prototype.loadVideo=function(c){this._video_url=c;var h=c.substr(0,10).indexOf(":"),l="";-1!=h&&(l=c.substr(0,h));h="";l&&(h=c.substr(0,c.indexOf("/",l.length+3)),h=h.substr(l.length+3));this.properties.use_proxy&&l&&f.proxy&&h!=location.host&& -(c=f.proxy+c.substr(c.indexOf(":")+3));this._video=document.createElement("video");this._video.src=c;this._video.type="type=video/mp4";this._video.muted=!0;this._video.autoplay=!0;var r=this;this._video.addEventListener("loadedmetadata",function(c){console.log("Duration: "+this.duration+" seconds");console.log("Size: "+this.videoWidth+","+this.videoHeight);r.setDirtyCanvas(!0);this.width=this.videoWidth;this.height=this.videoHeight});this._video.addEventListener("progress",function(c){console.log("video loading...")}); +this._video.dirty=!0;this.setOutputData(0,this._video);this.setOutputData(1,this._video.currentTime);this.setOutputData(2,this._video.duration);this.setDirtyCanvas(!0)}};A.prototype.onStart=function(){this.play()};A.prototype.onStop=function(){this.stop()};A.prototype.loadVideo=function(c){this._video_url=c;var h=c.substr(0,10).indexOf(":"),k="";-1!=h&&(k=c.substr(0,h));h="";k&&(h=c.substr(0,c.indexOf("/",k.length+3)),h=h.substr(k.length+3));this.properties.use_proxy&&k&&f.proxy&&h!=location.host&& +(c=f.proxy+c.substr(c.indexOf(":")+3));this._video=document.createElement("video");this._video.src=c;this._video.type="type=video/mp4";this._video.muted=!0;this._video.autoplay=!0;var s=this;this._video.addEventListener("loadedmetadata",function(c){console.log("Duration: "+this.duration+" seconds");console.log("Size: "+this.videoWidth+","+this.videoHeight);s.setDirtyCanvas(!0);this.width=this.videoWidth;this.height=this.videoHeight});this._video.addEventListener("progress",function(c){console.log("video loading...")}); this._video.addEventListener("error",function(c){console.error("Error loading video: "+this.src);if(this.error)switch(this.error.code){case this.error.MEDIA_ERR_ABORTED:console.error("You stopped the video.");break;case this.error.MEDIA_ERR_NETWORK:console.error("Network error - please try again later.");break;case this.error.MEDIA_ERR_DECODE:console.error("Video is broken..");break;case this.error.MEDIA_ERR_SRC_NOT_SUPPORTED:console.error("Sorry, your browser can't play this video.")}});this._video.addEventListener("ended", function(c){console.log("Video Ended.");this.play()})};A.prototype.onPropertyChanged=function(c,f){this.properties[c]=f;"url"==c&&""!=f&&this.loadVideo(f);return!0};A.prototype.play=function(){this._video&&this._video.videoWidth&&this._video.play()};A.prototype.playPause=function(){this._video&&(this._video.paused?this.play():this.pause())};A.prototype.stop=function(){this._video&&(this._video.pause(),this._video.currentTime=0)};A.prototype.pause=function(){this._video&&(console.log("Video paused"), this._video.pause())};A.prototype.onWidget=function(c,f){};f.registerNodeType("graphics/video",A);D.title="Webcam";D.desc="Webcam image";D.is_webcam_open=!1;D.prototype.openStream=function(){function c(h){console.log("Webcam rejected",h);f._webcam_stream=!1;D.is_webcam_open=!1;f.boxcolor="red";f.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"](c); @@ -451,19 +452,19 @@ var f=this}};D.prototype.closeStream=function(){if(this._webcam_stream){var c=th c;this.boxcolor="green";var f=this._video;f||(f=document.createElement("video"),f.autoplay=!0,f.srcObject=c,this._video=f,f.onloadedmetadata=function(c){console.log(c);D.is_webcam_open=!0});this.trigger("stream_ready",f)};D.prototype.onExecute=function(){null!=this._webcam_stream||this._waiting_confirmation||this.openStream();if(this._video&&this._video.videoWidth){this._video.frame=++this.frame;this._video.width=this._video.videoWidth;this._video.height=this._video.videoHeight;this.setOutputData(0, this._video);for(var c=1;c =this.size[1]||!this.properties.show|| !this._video||(c.save(),c.drawImage(this._video,0,0,this.size[0],this.size[1]),c.restore())};D.prototype.onGetOutputs=function(){return[["width","number"],["height","number"],["stream_ready",f.EVENT],["stream_closed",f.EVENT],["stream_error",f.EVENT]]};f.registerNodeType("graphics/webcam",D)})(this); -(function(B){function c(){this.addOutput("tex","Texture");this.addOutput("name","string");this.properties={name:"",filter:!0};this.size=[c.image_preview_size,c.image_preview_size]}function l(){this.addInput("Texture","Texture");this.properties={flipY:!1};this.size=[c.image_preview_size,c.image_preview_size]}function u(){this.addInput("Texture","Texture");this.addOutput("tex","Texture");this.addOutput("name","string");this.properties={name:"",generate_mipmaps:!1}}function r(){this.addInput("Texture", +(function(B){function c(){this.addOutput("tex","Texture");this.addOutput("name","string");this.properties={name:"",filter:!0};this.size=[c.image_preview_size,c.image_preview_size]}function k(){this.addInput("Texture","Texture");this.properties={flipY:!1};this.size=[c.image_preview_size,c.image_preview_size]}function u(){this.addInput("Texture","Texture");this.addOutput("tex","Texture");this.addOutput("name","string");this.properties={name:"",generate_mipmaps:!1}}function s(){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 t(){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=t.pixel_shader;this._uniforms={u_value:1,u_color:vec4.create(),in_texture:0,texSize:vec4.create(),time:0}}function h(){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 C(){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 x(){this.addInput("Texture","Texture");this.properties={additive:!1,antialiasing:!1,filter:!0,disable_alpha:!1,gamma:1,viewport:[0,0,1,1]};this.size[0]=130}function G(){this.addInput("Texture", "Texture");this.addOutput("","Texture");this.properties={size:0,generate_mipmaps:!1,precision:c.DEFAULT}}function A(){this.addInput("Texture","Texture");this.addOutput("","Texture");this.properties={iterations:1,generate_mipmaps:!1,precision:c.DEFAULT}}function D(){this.addInput("Texture","Texture");this.addOutput("","Texture");this.properties={size:[512,512],generate_mipmaps:!1,precision:c.DEFAULT}}function f(){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 q(){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 H(){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 w(){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 L(){this.addInput("Image", -"image");this.addOutput("","Texture");this.properties={}}function n(){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};n._shader||(n._shader=new GL.Shader(Shader.SCREEN_VERTEX_SHADER,n.pixel_shader))}function v(){this.addInput("Texture","Texture");this.addInput("Atlas","Texture");this.addOutput("","Texture");this.properties={enabled:!0,num_row_symbols:4, -symbol_size:16,brightness:1,colorize:!1,filter:!1,invert:!1,precision:c.DEFAULT,generate_mipmaps:!1,texture:null};v._shader||(v._shader=new GL.Shader(Shader.SCREEN_VERTEX_SHADER,v.pixel_shader));this._uniforms={u_texture:0,u_textureB:1,u_row_simbols:4,u_simbol_size:16,u_res:vec2.create()}}function k(){this.addInput("Texture","Texture");this.addOutput("R","Texture");this.addOutput("G","Texture");this.addOutput("B","Texture");this.addOutput("A","Texture");k._shader||(k._shader=new GL.Shader(Shader.SCREEN_VERTEX_SHADER, -k.pixel_shader))}function a(){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 b(){this.addOutput("Texture","Texture");this._tex_color=vec4.create();this.properties={color:vec4.create(),precision:c.DEFAULT}}function d(){this.addInput("A", +"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 n(){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 H(){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 v(){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 L(){this.addInput("Image", +"image");this.addOutput("","Texture");this.properties={}}function l(){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};l._shader||(l._shader=new GL.Shader(Shader.SCREEN_VERTEX_SHADER,l.pixel_shader))}function w(){this.addInput("Texture","Texture");this.addInput("Atlas","Texture");this.addOutput("","Texture");this.properties={enabled:!0,num_row_symbols:4, +symbol_size:16,brightness:1,colorize:!1,filter:!1,invert:!1,precision:c.DEFAULT,generate_mipmaps:!1,texture:null};w._shader||(w._shader=new GL.Shader(Shader.SCREEN_VERTEX_SHADER,w.pixel_shader));this._uniforms={u_texture:0,u_textureB:1,u_row_simbols:4,u_simbol_size:16,u_res:vec2.create()}}function q(){this.addInput("Texture","Texture");this.addOutput("R","Texture");this.addOutput("G","Texture");this.addOutput("B","Texture");this.addOutput("A","Texture");q._shader||(q._shader=new GL.Shader(Shader.SCREEN_VERTEX_SHADER, +q.pixel_shader))}function a(){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 b(){this.addOutput("Texture","Texture");this._tex_color=vec4.create();this.properties={color:vec4.create(),precision:c.DEFAULT}}function d(){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};d._shader||(d._shader=new GL.Shader(Shader.SCREEN_VERTEX_SHADER,d.pixel_shader));this._uniforms={u_angle:0,u_colorA:vec3.create(),u_colorB:vec3.create()}}function g(){this.addInput("A","Texture");this.addInput("B","Texture");this.addInput("Mixer","Texture");this.addOutput("Texture","Texture");this.properties={factor:0.5,size_from_biggest:!0,invert:!1,precision:c.DEFAULT}; this._uniforms={u_textureA:0,u_textureB:1,u_textureMix:2,u_mix:vec4.create()}}function e(){this.addInput("Tex.","Texture");this.addOutput("Edges","Texture");this.properties={invert:!0,threshold:!1,factor:1,precision:c.DEFAULT};e._shader||(e._shader=new GL.Shader(Shader.SCREEN_VERTEX_SHADER,e.pixel_shader))}function E(){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 m(){this.addInput("Texture","Texture");this.addOutput("Texture","Texture");this.properties={precision:c.DEFAULT,invert:!1};this._uniforms={u_texture:0,u_camera_planes:null,u_ires:vec2.create()}}function s(){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, +high_precision:!1};this._uniforms={u_texture:0,u_distance:100,u_range:50,u_camera_planes:null}}function m(){this.addInput("Texture","Texture");this.addOutput("Texture","Texture");this.properties={precision:c.DEFAULT,invert:!1};this._uniforms={u_texture:0,u_camera_planes:null,u_ires:vec2.create()}}function r(){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 y(){this.intensity=0.5;this.persistence=0.6;this.iterations=8;this.threshold=0.8;this.scale=1;this.dirt_texture=null;this.dirt_factor=0.5;this._textures=[];this._uniforms={u_intensity:1,u_texture:0,u_glow_texture:1,u_threshold:0,u_texel_size:vec2.create()}}function N(){this.addInput("in","Texture");this.addInput("dirt","Texture");this.addOutput("out","Texture");this.addOutput("glow","Texture");this.properties={enabled:!0,intensity:1,persistence:0.99,iterations:16, threshold:0,scale:1,dirt_factor:0.5,precision:c.DEFAULT};this.fx=new y}function M(){this.addInput("Texture","Texture");this.addOutput("Filtered","Texture");this.properties={intensity:1,radius:5}}function z(){this.addInput("Texture","Texture");this.addOutput("Filtered","Texture");this.properties={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 O(){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 J(){this.addInput("in","");this.properties={precision:c.LOW,width:0,height:0,channels:1};this.addOutput("out","Texture")}function I(){this.addInput("in","Texture");this.addOutput("out","Texture");this.properties={precision:c.LOW,split_channels:!1};this._values=new Uint8Array(1024);this._values.fill(255);this._curve_texture=null; @@ -479,23 +480,23 @@ filter:gl.NEAREST})},c.prototype.onDropFile=function(a,b,d){if(a){var c=null;"st null;"width"==d.name?e=a.width:"height"==d.name?e=a.height:"aspect"==d.name&&(e=a.width/a.height);this.setOutputData(b,e)}}}else this.setOutputData(0,null),this.setOutputData(1,"")},c.prototype.onResourceRenamed=function(a,b){this.properties.name==a&&(this.properties.name=b)},c.prototype.onDrawBackground=function(a){if(!(this.flags.collapsed||20>=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]||""})},K.registerNodeType("texture/texture",c),l.title="Preview",l.desc="Show a texture in the graph canvas",l.allow_preview=!1,l.prototype.onDrawBackground=function(a){if(!this.flags.collapsed&&(a.webgl||l.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()}}}, -K.registerNodeType("texture/preview",l),u.title="Save",u.desc="Save a texture in the repository",u.prototype.getPreviewTexture=function(){return this._texture},u.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),this.setOutputData(1,this.properties.name))},K.registerNodeType("texture/save",u),r.widgets_info={uvcode:{widget:"code"},pixelcode:{widget:"code"},precision:{widget:"combo",values:c.MODE_VALUES}},r.title="Operation",r.desc="Texture shader operation",r.presets={},r.prototype.getExtraMenuOptions=function(a){var b=this;return[{content:b.properties.show?"Hide Texture":"Show Texture",callback:function(){b.properties.show=!b.properties.show}}]},r.prototype.onPropertyChanged= -function(){this.has_error=!1},r.prototype.onDrawBackground=function(a){this.flags.collapsed||20>=this.size[1]||!this.properties.show||!this._tex||this._tex.gl!=a||(a.save(),a.drawImage(this._tex,0,0,this.size[0],this.size[1]),a.restore())},r.prototype.onExecute=function(){var a=this.getInputData(0);if(this.isOutputConnected(0))if(this.properties.precision===c.PASS_THROUGH)this.setOutputData(0,a);else{var b=this.getInputData(1);if(this.properties.uvcode||this.properties.pixelcode){var d=512,e=512; +function(a){a=a.replace(/[\{\}]/g,"");return b[a]||""})},K.registerNodeType("texture/texture",c),k.title="Preview",k.desc="Show a texture in the graph canvas",k.allow_preview=!1,k.prototype.onDrawBackground=function(a){if(!this.flags.collapsed&&(a.webgl||k.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()}}}, +K.registerNodeType("texture/preview",k),u.title="Save",u.desc="Save a texture in the repository",u.prototype.getPreviewTexture=function(){return this._texture},u.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),this.setOutputData(1,this.properties.name))},K.registerNodeType("texture/save",u),s.widgets_info={uvcode:{widget:"code"},pixelcode:{widget:"code"},precision:{widget:"combo",values:c.MODE_VALUES}},s.title="Operation",s.desc="Texture shader operation",s.presets={},s.prototype.getExtraMenuOptions=function(a){var b=this;return[{content:b.properties.show?"Hide Texture":"Show Texture",callback:function(){b.properties.show=!b.properties.show}}]},s.prototype.onPropertyChanged= +function(){this.has_error=!1},s.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())},s.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 h=c.replaceCode(r.pixel_shader,{UV_CODE:g,PIXEL_CODE:f});try{k=new GL.Shader(Shader.SCREEN_VERTEX_SHADER,h),this.boxcolor="#00FF00"}catch(n){GL.Shader.dumpErrorToConsole(n,Shader.SCREEN_VERTEX_SHADER,h);this.boxcolor="#FF0000";this.has_error=!0;return}this._shader=k;this._shader_code=g+"|"+f}if(this._shader){var m=this.getInputData(2);null!=m?this.properties.value= -m:m=parseFloat(this.properties.value);var l=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:m,texSize:[d,e,1/d,1/e],time:l}).draw(c)});this.setOutputData(0,this._tex)}}}},r.pixel_shader="precision highp float;\n\t\t\n\t\tuniform sampler2D u_texture;\n\t\tuniform sampler2D u_textureB;\n\t\tvarying vec2 v_coord;\n\t\tuniform vec4 texSize;\n\t\tuniform float time;\n\t\tuniform float value;\n\t\t\n\t\tvoid main() {\n\t\t\tvec2 uv = v_coord;\n\t\t\t{{UV_CODE}};\n\t\t\tvec4 color4 = texture2D(u_texture, uv);\n\t\t\tvec3 color = color4.rgb;\n\t\t\tvec4 color4B = texture2D(u_textureB, uv);\n\t\t\tvec3 colorB = color4B.rgb;\n\t\t\tvec3 result = color;\n\t\t\tfloat alpha = 1.0;\n\t\t\t{{PIXEL_CODE}};\n\t\t\tgl_FragColor = vec4(result, alpha);\n\t\t}\n\t\t", -r.registerPreset=function(a,b){r.presets[a]=b},r.registerPreset("",""),r.registerPreset("bypass","color"),r.registerPreset("add","color + colorB * value"),r.registerPreset("substract","(color - colorB) * value"),r.registerPreset("mate","mix( color, colorB, color4B.a * value)"),r.registerPreset("invert","vec3(1.0) - color"),r.registerPreset("multiply","color * colorB * value"),r.registerPreset("divide","(color / colorB) / value"),r.registerPreset("difference","abs(color - colorB) * value"),r.registerPreset("max", -"max(color, colorB) * value"),r.registerPreset("min","min(color, colorB) * value"),r.registerPreset("displace","texture2D(u_texture, uv + (colorB.xy - vec2(0.5)) * value).xyz"),r.registerPreset("grayscale","vec3(color.x + color.y + color.z) * value / 3.0"),r.registerPreset("saturation","mix( vec3(color.x + color.y + color.z) / 3.0, color, value )"),r.registerPreset("normalmap","\n\t\tfloat z0 = texture2D(u_texture, uv + vec2(-texSize.z, -texSize.w) ).x;\n\t\tfloat z1 = texture2D(u_texture, uv + vec2(0.0, -texSize.w) ).x;\n\t\tfloat z2 = texture2D(u_texture, uv + vec2(texSize.z, -texSize.w) ).x;\n\t\tfloat z3 = texture2D(u_texture, uv + vec2(-texSize.z, 0.0) ).x;\n\t\tfloat z4 = color.x;\n\t\tfloat z5 = texture2D(u_texture, uv + vec2(texSize.z, 0.0) ).x;\n\t\tfloat z6 = texture2D(u_texture, uv + vec2(-texSize.z, texSize.w) ).x;\n\t\tfloat z7 = texture2D(u_texture, uv + vec2(0.0, texSize.w) ).x;\n\t\tfloat z8 = texture2D(u_texture, uv + vec2(texSize.z, texSize.w) ).x;\n\t\tvec3 normal = vec3( z2 + 2.0*z4 + z7 - z0 - 2.0*z3 - z5, z5 + 2.0*z6 + z7 -z0 - 2.0*z1 - z2, 1.0 );\n\t\tnormal.xy *= value;\n\t\tresult.xyz = normalize(normal) * 0.5 + vec3(0.5);\n\t"), -r.registerPreset("threshold","vec3(color.x > colorB.x * value ? 1.0 : 0.0,color.y > colorB.y * value ? 1.0 : 0.0,color.z > colorB.z * value ? 1.0 : 0.0)"),r.prototype.onInspect=function(a){var b=this;a.addCombo("Presets","",{values:Object.keys(r.presets),callback:function(d){var c=r.presets[d];c&&(b.setProperty("pixelcode",c),b.title=d,a.refresh())}})},K.registerNodeType("texture/operation",r),t.title="Shader",t.desc="Texture shader",t.widgets_info={code:{type:"code",lang:"glsl"},precision:{widget:"combo", +-1!=this.properties.pixelcode.indexOf(";")&&(f=this.properties.pixelcode));var l=this._shader;if(!(this.has_error||l&&this._shader_code==g+"|"+f)){var q=c.replaceCode(s.pixel_shader,{UV_CODE:g,PIXEL_CODE:f});try{l=new GL.Shader(Shader.SCREEN_VERTEX_SHADER,q),this.boxcolor="#00FF00"}catch(h){GL.Shader.dumpErrorToConsole(h,Shader.SCREEN_VERTEX_SHADER,q);this.boxcolor="#FF0000";this.has_error=!0;return}this._shader=l;this._shader_code=g+"|"+f}if(this._shader){var m=this.getInputData(2);null!=m?this.properties.value= +m:m=parseFloat(this.properties.value);var k=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();l.uniforms({u_texture:0,u_textureB:1,value:m,texSize:[d,e,1/d,1/e],time:k}).draw(c)});this.setOutputData(0,this._tex)}}}},s.pixel_shader="precision highp float;\n\t\t\n\t\tuniform sampler2D u_texture;\n\t\tuniform sampler2D u_textureB;\n\t\tvarying vec2 v_coord;\n\t\tuniform vec4 texSize;\n\t\tuniform float time;\n\t\tuniform float value;\n\t\t\n\t\tvoid main() {\n\t\t\tvec2 uv = v_coord;\n\t\t\t{{UV_CODE}};\n\t\t\tvec4 color4 = texture2D(u_texture, uv);\n\t\t\tvec3 color = color4.rgb;\n\t\t\tvec4 color4B = texture2D(u_textureB, uv);\n\t\t\tvec3 colorB = color4B.rgb;\n\t\t\tvec3 result = color;\n\t\t\tfloat alpha = 1.0;\n\t\t\t{{PIXEL_CODE}};\n\t\t\tgl_FragColor = vec4(result, alpha);\n\t\t}\n\t\t", +s.registerPreset=function(a,b){s.presets[a]=b},s.registerPreset("",""),s.registerPreset("bypass","color"),s.registerPreset("add","color + colorB * value"),s.registerPreset("substract","(color - colorB) * value"),s.registerPreset("mate","mix( color, colorB, color4B.a * value)"),s.registerPreset("invert","vec3(1.0) - color"),s.registerPreset("multiply","color * colorB * value"),s.registerPreset("divide","(color / colorB) / value"),s.registerPreset("difference","abs(color - colorB) * value"),s.registerPreset("max", +"max(color, colorB) * value"),s.registerPreset("min","min(color, colorB) * value"),s.registerPreset("displace","texture2D(u_texture, uv + (colorB.xy - vec2(0.5)) * value).xyz"),s.registerPreset("grayscale","vec3(color.x + color.y + color.z) * value / 3.0"),s.registerPreset("saturation","mix( vec3(color.x + color.y + color.z) / 3.0, color, value )"),s.registerPreset("normalmap","\n\t\tfloat z0 = texture2D(u_texture, uv + vec2(-texSize.z, -texSize.w) ).x;\n\t\tfloat z1 = texture2D(u_texture, uv + vec2(0.0, -texSize.w) ).x;\n\t\tfloat z2 = texture2D(u_texture, uv + vec2(texSize.z, -texSize.w) ).x;\n\t\tfloat z3 = texture2D(u_texture, uv + vec2(-texSize.z, 0.0) ).x;\n\t\tfloat z4 = color.x;\n\t\tfloat z5 = texture2D(u_texture, uv + vec2(texSize.z, 0.0) ).x;\n\t\tfloat z6 = texture2D(u_texture, uv + vec2(-texSize.z, texSize.w) ).x;\n\t\tfloat z7 = texture2D(u_texture, uv + vec2(0.0, texSize.w) ).x;\n\t\tfloat z8 = texture2D(u_texture, uv + vec2(texSize.z, texSize.w) ).x;\n\t\tvec3 normal = vec3( z2 + 2.0*z4 + z7 - z0 - 2.0*z3 - z5, z5 + 2.0*z6 + z7 -z0 - 2.0*z1 - z2, 1.0 );\n\t\tnormal.xy *= value;\n\t\tresult.xyz = normalize(normal) * 0.5 + vec3(0.5);\n\t"), +s.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)"),s.prototype.onInspect=function(a){var b=this;a.addCombo("Presets","",{values:Object.keys(s.presets),callback:function(d){var c=s.presets[d];c&&(b.setProperty("pixelcode",c),b.title=d,a.refresh())}})},K.registerNodeType("texture/operation",s),t.title="Shader",t.desc="Texture shader",t.widgets_info={code:{type:"code",lang:"glsl"},precision:{widget:"combo", values:c.MODE_VALUES}},t.prototype.onPropertyChanged=function(a,b){if("code"==a){var d=this.getShader();if(d){var c=d.uniformInfo;if(this.inputs)for(var e={},g=0;gthis.properties.iterations)this.setOutputData(0,a);else{var b=A._shader;b||(A._shader=b=new GL.Shader(GL.Shader.SCREEN_VERTEX_SHADER,A.pixel_shader));var d=a.width|0,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,h= -null,n=[],a={type:g,format:a.format},g=vec2.create(),m={u_offset:g};this._texture&&GL.Texture.releaseTemporary(this._texture);for(var l=0;l >1||0;e=e>>1||0;h=GL.Texture.getTemporary(d,e,a);n.push(h);k.setParameter(GL.TEXTURE_MAG_FILTER,GL.NEAREST);k.copyTo(h,b,m);if(1==d&&1==e)break;k=h}this._texture=n.pop();for(l=0;l this.properties.iterations)this.setOutputData(0,a);else{var b=A._shader;b||(A._shader=b=new GL.Shader(GL.Shader.SCREEN_VERTEX_SHADER,A.pixel_shader));var d=a.width|0,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,l=a,q= +null,h=[],a={type:g,format:a.format},g=vec2.create(),m={u_offset:g};this._texture&&GL.Texture.releaseTemporary(this._texture);for(var k=0;k >1||0;e=e>>1||0;q=GL.Texture.getTemporary(d,e,a);h.push(q);l.setParameter(GL.TEXTURE_MAG_FILTER,GL.NEAREST);l.copyTo(q,b,m);if(1==d&&1==e)break;l=q}this._texture=h.pop();for(k=0;k >=2,c++,1!=d););a.copyTo(this._textures_chain[0]);for(var c=1;c<=this._textures_chain.length;++c)a=this._textures_chain[c];var e=q._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)})}},q.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.registerNodeType("texture/average",f),n.widgets_info={mode:{widget:"combo",values:["min","max","avg"]}},n.title="MinMax",n.desc="Compute the scene min max",n.prototype.onExecute=function(){this.properties.use_previous_frame||this.update();this.setOutputData(0,this._temp_texture);this.setOutputData(1,this._luminance)},n.prototype.onPreRenderExecute=function(){this.update()},n.prototype.update=function(){var a=this.getInputData(0);if(a&&(this.isOutputConnected(0)||this.isOutputConnected(1))){n._shader|| +(n._shader=new GL.Shader(GL.Shader.SCREEN_VERTEX_SHADER,n.pixel_shader));var b=gl.UNSIGNED_BYTE;a.type!=b&&(b=gl.FLOAT);var d=512;if(!this._textures_chain.length||this._textures_chain[0].type!=b)for(;c&&(this._textures_chain[c]=new GL.Texture(d,d,{type:b,format:gl.RGBA,filter:gl.NEAREST}),d>>=2,c++,1!=d););a.copyTo(this._textures_chain[0]);for(var c=1;c<=this._textures_chain.length;++c)a=this._textures_chain[c];var e=n._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)})}},n.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", H.title="Smooth",H.desc="Smooth texture over time",H.prototype.onExecute=function(){var a=this.getInputData(0);if(a&&this.isOutputConnected(0)){H._shader||(H._shader=new GL.Shader(GL.Shader.SCREEN_VERTEX_SHADER,H.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,d=this._temp_texture2,c=H._shader,e=this._uniforms;e.u_factor=1-this.getInputOrProperty("factor");gl.disable(gl.BLEND);gl.disable(gl.DEPTH_TEST);b.drawTo(function(){d.bind(1);a.toViewport(c,e)});this.setOutputData(0,b);this._temp_texture=d;this._temp_texture2=b}},H.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", -K.registerNodeType("texture/temporal_smooth",H),w.title="Lineal Avg Smooth",w.desc="Smooth texture linearly over time",w["@samples"]={type:"number",min:1,max:64,step:1,precision:1},w.prototype.getPreviewTexture=function(){return this._temp_texture2},w.prototype.onExecute=function(){var a=this.getInputData(0);if(a&&this.isOutputConnected(0)){w._shader||(w._shader_copy=new GL.Shader(GL.Shader.SCREEN_VERTEX_SHADER,w.pixel_shader_copy),w._shader_avg=new GL.Shader(GL.Shader.SCREEN_VERTEX_SHADER,w.pixel_shader_avg)); -var b=Math.clamp(this.properties.samples,0,64),d=this.frame,c=this.properties.frames_interval;if(0==c||0==d%c){d=this._temp_texture;d&&d.type==a.type&&d.width==b||(d={type:a.type,format:gl.RGBA,filter:gl.NEAREST},this._temp_texture=new GL.Texture(b,1,d),this._temp_texture2=new GL.Texture(b,1,d),this._temp_texture_out=new GL.Texture(1,1,d));var e=this._temp_texture,g=this._temp_texture2,f=w._shader_copy,k=w._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++}},w.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", -w.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",K.registerNodeType("texture/linear_avg_smooth", -w),L.title="Image to Texture",L.desc="Uploads an image to the GPU",L.prototype.onExecute=function(){var a=this.getInputData(0);if(a){var b=a.videoWidth||a.width,d=a.videoHeight||a.height;if(a.gltexture)this.setOutputData(0,a.gltexture);else{var c=this._temp_texture;c&&c.width==b&&c.height==d||(this._temp_texture=new GL.Texture(b,d,{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)}}},K.registerNodeType("texture/imageToTexture",L),n.widgets_info={texture:{widget:"texture"},precision:{widget:"combo",values:c.MODE_VALUES}},n.title="LUT",n.desc="Apply LUT to Texture",n.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(n._shader,{u_texture:0,u_textureB:1, -u_amount:d})});this.setOutputData(0,this._tex)}else this.setOutputData(0,a)}}},n.pixel_shader="precision highp float;\n\t\tprecision highp float;\n\t\tvarying vec2 v_coord;\n\t\tuniform sampler2D u_texture;\n\t\tuniform 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", -K.registerNodeType("texture/LUT",n),v.widgets_info={texture:{widget:"texture"},precision:{widget:"combo",values:c.MODE_VALUES}},v.title="Encode",v.desc="Apply a texture atlas to encode a texture",v.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, +K.registerNodeType("texture/temporal_smooth",H),v.title="Lineal Avg Smooth",v.desc="Smooth texture linearly over time",v["@samples"]={type:"number",min:1,max:64,step:1,precision:1},v.prototype.getPreviewTexture=function(){return this._temp_texture2},v.prototype.onExecute=function(){var a=this.getInputData(0);if(a&&this.isOutputConnected(0)){v._shader||(v._shader_copy=new GL.Shader(GL.Shader.SCREEN_VERTEX_SHADER,v.pixel_shader_copy),v._shader_avg=new GL.Shader(GL.Shader.SCREEN_VERTEX_SHADER,v.pixel_shader_avg)); +var b=Math.clamp(this.properties.samples,0,64),d=this.frame,c=this.properties.frames_interval;if(0==c||0==d%c){d=this._temp_texture;d&&d.type==a.type&&d.width==b||(d={type:a.type,format:gl.RGBA,filter:gl.NEAREST},this._temp_texture=new GL.Texture(b,1,d),this._temp_texture2=new GL.Texture(b,1,d),this._temp_texture_out=new GL.Texture(1,1,d));var e=this._temp_texture,g=this._temp_texture2,f=v._shader_copy,l=v._shader_avg,q=this._uniforms;q.u_samples=b;q.u_isamples=1/b;gl.disable(gl.BLEND);gl.disable(gl.DEPTH_TEST); +e.drawTo(function(){g.bind(1);a.toViewport(f,q)});this._temp_texture_out.drawTo(function(){e.toViewport(l,q)});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++}},v.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", +v.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",K.registerNodeType("texture/linear_avg_smooth", +v),L.title="Image to Texture",L.desc="Uploads an image to the GPU",L.prototype.onExecute=function(){var a=this.getInputData(0);if(a){var b=a.videoWidth||a.width,d=a.videoHeight||a.height;if(a.gltexture)this.setOutputData(0,a.gltexture);else{var c=this._temp_texture;c&&c.width==b&&c.height==d||(this._temp_texture=new GL.Texture(b,d,{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)}}},K.registerNodeType("texture/imageToTexture",L),l.widgets_info={texture:{widget:"texture"},precision:{widget:"combo",values:c.MODE_VALUES}},l.title="LUT",l.desc="Apply LUT to Texture",l.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(l._shader,{u_texture:0,u_textureB:1, +u_amount:d})});this.setOutputData(0,this._tex)}else this.setOutputData(0,a)}}},l.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", +K.registerNodeType("texture/LUT",l),w.widgets_info={texture:{widget:"texture"},precision:{widget:"combo",values:c.MODE_VALUES}},w.title="Encode",w.desc="Apply a texture atlas to encode a texture",w.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_MAG_FILTER,this.properties.filter?gl.LINEAR:gl.NEAREST);gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MIN_FILTER,this.properties.filter?gl.LINEAR:gl.NEAREST);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._uniforms;d.u_row_simbols=Math.floor(this.properties.num_row_symbols);d.u_symbol_size=this.properties.symbol_size;d.u_brightness=this.properties.brightness; -d.u_invert=this.properties.invert?1:0;d.u_colorize=this.properties.colorize?1:0;this._tex=c.getTargetTexture(a,this._tex,this.properties.precision);d.u_res[0]=this._tex.width;d.u_res[1]=this._tex.height;this._tex.bind(0);gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MAG_FILTER,gl.NEAREST);gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MIN_FILTER,gl.NEAREST);this._tex.drawTo(function(){b.bind(1);a.toViewport(v._shader,d)});this.properties.generate_mipmaps&&(this._tex.bind(0),gl.generateMipmap(this._tex.texture_type), -this._tex.unbind(0));this.setOutputData(0,this._tex)}else this.setOutputData(0,a)}}},v.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_row_simbols;\n\t\tuniform float u_symbol_size;\n\t\tuniform float u_brightness;\n\t\tuniform float u_invert;\n\t\tuniform float u_colorize;\n\t\tuniform vec2 u_res;\n\t\t\n\t\tvoid main() {\n\t\t\tvec2 total_symbols = u_res / u_symbol_size;\n\t\t\tvec2 uv = floor(v_coord * total_symbols) / total_symbols; //pixelate \n\t\t\tvec2 local_uv = mod(v_coord * u_res, u_symbol_size) / u_symbol_size;\n\t\t\tlowp vec4 textureColor = texture2D(u_texture, uv );\n\t\t\tfloat lum = clamp(u_brightness * (textureColor.x + textureColor.y + textureColor.z)/3.0,0.0,1.0);\n\t\t\tif( u_invert == 1.0 ) lum = 1.0 - lum;\n\t\t\tfloat index = floor( lum * (u_row_simbols * u_row_simbols - 1.0));\n\t\t\tfloat col = mod( index, u_row_simbols );\n\t\t\tfloat row = u_row_simbols - floor( index / u_row_simbols ) - 1.0;\n\t\t\tvec2 simbol_uv = ( vec2( col, row ) + local_uv ) / u_row_simbols;\n\t\t\tvec4 color = texture2D( u_textureB, simbol_uv );\n\t\t\tif(u_colorize == 1.0)\n\t\t\t\tcolor *= textureColor;\n\t\t\tgl_FragColor = color;\n\t\t}\n\t\t", -K.registerNodeType("texture/encode",v),k.title="Texture to Channels",k.desc="Split texture channels",k.prototype.onExecute=function(){var a=this.getInputData(0);if(a){this._channels||(this._channels=Array(4));for(var b=gl.RGB,d=0,c=0;4>c;c++)this.isOutputConnected(c)?(this._channels[c]&&this._channels[c].width==a.width&&this._channels[c].height==a.height&&this._channels[c].type==a.type&&this._channels[c].format==b||(this._channels[c]=new GL.Texture(a.width,a.height,{type:a.type,format:b,filter:gl.LINEAR})), -d++):this._channels[c]=null;if(d){gl.disable(gl.BLEND);gl.disable(gl.DEPTH_TEST);for(var e=Mesh.getScreenQuad(),g=k._shader,f=[[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]],c=0;4>c;c++)this._channels[c]&&(this._channels[c].drawTo(function(){a.bind(0);g.uniforms({u_texture:0,u_mask:f[c]}).draw(e)}),this.setOutputData(c,this._channels[c]))}}},k.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", -K.registerNodeType("texture/textureChannels",k),a.title="Channels to Texture",a.desc="Split texture channels",a.widgets_info={precision:{widget:"combo",values:c.MODE_VALUES}},a.prototype.onExecute=function(){var b=c.getWhiteTexture(),d=this.getInputData(0)||b,e=this.getInputData(1)||b,g=this.getInputData(2)||b,f=this.getInputData(3)||b;gl.disable(gl.BLEND);gl.disable(gl.DEPTH_TEST);var k=Mesh.getScreenQuad();a._shader||(a._shader=new GL.Shader(Shader.SCREEN_VERTEX_SHADER,a.pixel_shader));var h=a._shader, -b=Math.max(d.width,e.width,g.width,f.width),n=Math.max(d.height,e.height,g.height,f.height),m=this.properties.precision==c.HIGH?c.HIGH_PRECISION_FORMAT:gl.UNSIGNED_BYTE;this._texture&&this._texture.width==b&&this._texture.height==n&&this._texture.type==m||(this._texture=new GL.Texture(b,n,{type:m,format:gl.RGBA,filter:gl.LINEAR}));b=this._color;b[0]=this.properties.R;b[1]=this.properties.G;b[2]=this.properties.B;b[3]=this.properties.A;var l=this._uniforms;this._texture.drawTo(function(){d.bind(0); -e.bind(1);g.bind(2);f.bind(3);h.uniforms(l).draw(k)});this.setOutputData(0,this._texture)},a.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", +d.u_invert=this.properties.invert?1:0;d.u_colorize=this.properties.colorize?1:0;this._tex=c.getTargetTexture(a,this._tex,this.properties.precision);d.u_res[0]=this._tex.width;d.u_res[1]=this._tex.height;this._tex.bind(0);gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MAG_FILTER,gl.NEAREST);gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MIN_FILTER,gl.NEAREST);this._tex.drawTo(function(){b.bind(1);a.toViewport(w._shader,d)});this.properties.generate_mipmaps&&(this._tex.bind(0),gl.generateMipmap(this._tex.texture_type), +this._tex.unbind(0));this.setOutputData(0,this._tex)}else this.setOutputData(0,a)}}},w.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_row_simbols;\n\t\tuniform float u_symbol_size;\n\t\tuniform float u_brightness;\n\t\tuniform float u_invert;\n\t\tuniform float u_colorize;\n\t\tuniform vec2 u_res;\n\t\t\n\t\tvoid main() {\n\t\t\tvec2 total_symbols = u_res / u_symbol_size;\n\t\t\tvec2 uv = floor(v_coord * total_symbols) / total_symbols; //pixelate \n\t\t\tvec2 local_uv = mod(v_coord * u_res, u_symbol_size) / u_symbol_size;\n\t\t\tlowp vec4 textureColor = texture2D(u_texture, uv );\n\t\t\tfloat lum = clamp(u_brightness * (textureColor.x + textureColor.y + textureColor.z)/3.0,0.0,1.0);\n\t\t\tif( u_invert == 1.0 ) lum = 1.0 - lum;\n\t\t\tfloat index = floor( lum * (u_row_simbols * u_row_simbols - 1.0));\n\t\t\tfloat col = mod( index, u_row_simbols );\n\t\t\tfloat row = u_row_simbols - floor( index / u_row_simbols ) - 1.0;\n\t\t\tvec2 simbol_uv = ( vec2( col, row ) + local_uv ) / u_row_simbols;\n\t\t\tvec4 color = texture2D( u_textureB, simbol_uv );\n\t\t\tif(u_colorize == 1.0)\n\t\t\t\tcolor *= textureColor;\n\t\t\tgl_FragColor = color;\n\t\t}\n\t\t", +K.registerNodeType("texture/encode",w),q.title="Texture to Channels",q.desc="Split texture channels",q.prototype.onExecute=function(){var a=this.getInputData(0);if(a){this._channels||(this._channels=Array(4));for(var b=gl.RGB,d=0,c=0;4>c;c++)this.isOutputConnected(c)?(this._channels[c]&&this._channels[c].width==a.width&&this._channels[c].height==a.height&&this._channels[c].type==a.type&&this._channels[c].format==b||(this._channels[c]=new GL.Texture(a.width,a.height,{type:a.type,format:b,filter:gl.LINEAR})), +d++):this._channels[c]=null;if(d){gl.disable(gl.BLEND);gl.disable(gl.DEPTH_TEST);for(var e=Mesh.getScreenQuad(),g=q._shader,f=[[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]],c=0;4>c;c++)this._channels[c]&&(this._channels[c].drawTo(function(){a.bind(0);g.uniforms({u_texture:0,u_mask:f[c]}).draw(e)}),this.setOutputData(c,this._channels[c]))}}},q.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", +K.registerNodeType("texture/textureChannels",q),a.title="Channels to Texture",a.desc="Split texture channels",a.widgets_info={precision:{widget:"combo",values:c.MODE_VALUES}},a.prototype.onExecute=function(){var b=c.getWhiteTexture(),d=this.getInputData(0)||b,e=this.getInputData(1)||b,g=this.getInputData(2)||b,f=this.getInputData(3)||b;gl.disable(gl.BLEND);gl.disable(gl.DEPTH_TEST);var l=Mesh.getScreenQuad();a._shader||(a._shader=new GL.Shader(Shader.SCREEN_VERTEX_SHADER,a.pixel_shader));var q=a._shader, +b=Math.max(d.width,e.width,g.width,f.width),h=Math.max(d.height,e.height,g.height,f.height),m=this.properties.precision==c.HIGH?c.HIGH_PRECISION_FORMAT:gl.UNSIGNED_BYTE;this._texture&&this._texture.width==b&&this._texture.height==h&&this._texture.type==m||(this._texture=new GL.Texture(b,h,{type:m,format:gl.RGBA,filter:gl.LINEAR}));b=this._color;b[0]=this.properties.R;b[1]=this.properties.G;b[2]=this.properties.B;b[3]=this.properties.A;var k=this._uniforms;this._texture.drawTo(function(){d.bind(0); +e.bind(1);g.bind(2);f.bind(3);q.uniforms(k).draw(l)});this.setOutputData(0,this._texture)},a.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", K.registerNodeType("texture/channelsTexture",a),b.title="Color",b.desc="Generates a 1x1 texture with a constant color",b.widgets_info={precision:{widget:"combo",values:c.MODE_VALUES}},b.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])},b.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 a.width?b: -a,this._tex,this.properties.precision);gl.disable(gl.BLEND);gl.disable(gl.DEPTH_TEST);var f=Mesh.getScreenQuad(),k=null,h=this._uniforms;d?(k=g._shader_tex,k||(k=g._shader_tex=new GL.Shader(Shader.SCREEN_VERTEX_SHADER,g.pixel_shader,{MIX_TEX:""}))):(k=g._shader_factor,k||(k=g._shader_factor=new GL.Shader(Shader.SCREEN_VERTEX_SHADER,g.pixel_shader)),e=null==e?this.properties.factor:e,h.u_mix.set([e,e,e,e]));var n=this.properties.invert;this._tex.drawTo(function(){a.bind(n?1:0);b.bind(n?0:1);d&&d.bind(2); -k.uniforms(h).draw(f)});this.setOutputData(0,this._tex)}}},g.prototype.onGetInputs=function(){return[["factor","number"]]},g.pixel_shader="precision highp float;\n\t\tprecision highp float;\n\t\tvarying vec2 v_coord;\n\t\tuniform sampler2D u_textureA;\n\t\tuniform sampler2D u_textureB;\n\t\t#ifdef MIX_TEX\n\t\t\tuniform sampler2D u_textureMix;\n\t\t#else\n\t\t\tuniform vec4 u_mix;\n\t\t#endif\n\t\t\n\t\tvoid main() {\n\t\t\t#ifdef MIX_TEX\n\t\t\t vec4 f = texture2D(u_textureMix, v_coord);\n\t\t\t#else\n\t\t\t vec4 f = u_mix;\n\t\t\t#endif\n\t\t gl_FragColor = mix( texture2D(u_textureA, v_coord), texture2D(u_textureB, v_coord), f );\n\t\t}\n\t\t", +a,this._tex,this.properties.precision);gl.disable(gl.BLEND);gl.disable(gl.DEPTH_TEST);var f=Mesh.getScreenQuad(),l=null,q=this._uniforms;d?(l=g._shader_tex,l||(l=g._shader_tex=new GL.Shader(Shader.SCREEN_VERTEX_SHADER,g.pixel_shader,{MIX_TEX:""}))):(l=g._shader_factor,l||(l=g._shader_factor=new GL.Shader(Shader.SCREEN_VERTEX_SHADER,g.pixel_shader)),e=null==e?this.properties.factor:e,q.u_mix.set([e,e,e,e]));var h=this.properties.invert;this._tex.drawTo(function(){a.bind(h?1:0);b.bind(h?0:1);d&&d.bind(2); +l.uniforms(q).draw(f)});this.setOutputData(0,this._tex)}}},g.prototype.onGetInputs=function(){return[["factor","number"]]},g.pixel_shader="precision highp float;\n\t\tprecision highp float;\n\t\tvarying vec2 v_coord;\n\t\tuniform sampler2D u_textureA;\n\t\tuniform sampler2D u_textureB;\n\t\t#ifdef MIX_TEX\n\t\t\tuniform sampler2D u_textureMix;\n\t\t#else\n\t\t\tuniform vec4 u_mix;\n\t\t#endif\n\t\t\n\t\tvoid main() {\n\t\t\t#ifdef MIX_TEX\n\t\t\t vec4 f = texture2D(u_textureMix, v_coord);\n\t\t\t#else\n\t\t\t vec4 f = u_mix;\n\t\t\t#endif\n\t\t gl_FragColor = mix( texture2D(u_textureA, v_coord), texture2D(u_textureB, v_coord), f );\n\t\t}\n\t\t", K.registerNodeType("texture/mix",g),e.title="Edges",e.desc="Detects edges",e.widgets_info={precision:{widget:"combo",values:c.MODE_VALUES}},e.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=e._shader,g=this.properties.invert,f=this.properties.factor, -k=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:k,u_invert:g?1:0}).draw(b)});this.setOutputData(0,this._tex)}}},e.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", +l=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:l,u_invert:g?1:0}).draw(b)});this.setOutputData(0,this._tex)}}},e.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", K.registerNodeType("texture/edges",e),E.title="Depth Range",E.desc="Generates a texture with a depth range",E.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 d=this._uniforms,b=this.properties.distance;this.isInputConnected(1)&&(b=this.getInputData(1),this.properties.distance=b);var c=this.properties.range;this.isInputConnected(2)&&(c=this.getInputData(2),this.properties.range=c);d.u_distance=b;d.u_range=c;gl.disable(gl.BLEND);gl.disable(gl.DEPTH_TEST);var e=Mesh.getScreenQuad();E._shader||(E._shader=new GL.Shader(Shader.SCREEN_VERTEX_SHADER,E.pixel_shader),E._shader_onlydepth=new GL.Shader(Shader.SCREEN_VERTEX_SHADER,E.pixel_shader, {ONLY_DEPTH:""}));var g=this.properties.only_depth?E._shader_onlydepth:E._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];d.u_camera_planes=b;this._temp_texture.drawTo(function(){a.bind(0);g.uniforms(d).draw(e)});this._temp_texture.near_far_planes=b;this.setOutputData(0,this._temp_texture)}}},E.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", K.registerNodeType("texture/depth_range",E),m.widgets_info={precision:{widget:"combo",values:c.MODE_VALUES}},m.title="Linear Depth",m.desc="Creates a color texture with linear depth",m.prototype.onExecute=function(){if(this.isOutputConnected(0)){var a=this.getInputData(0);if(a&&(a.format==gl.DEPTH_COMPONENT||a.format==gl.DEPTH_STENCIL)){var b=this.properties.precision==c.HIGH?gl.HIGH_PRECISION_FORMAT:gl.UNSIGNED_BYTE;this._temp_texture&&this._temp_texture.type==b&&this._temp_texture.width==a.width&& this._temp_texture.height==a.height||(this._temp_texture=new GL.Texture(a.width,a.height,{type:b,format:gl.RGB,filter:gl.LINEAR}));var d=this._uniforms;d.u_invert=this.properties.invert?1:0;gl.disable(gl.BLEND);gl.disable(gl.DEPTH_TEST);var e=Mesh.getScreenQuad();m._shader||(m._shader=new GL.Shader(GL.Shader.SCREEN_VERTEX_SHADER,m.pixel_shader));var g=m._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];d.u_camera_planes=b;d.u_ires.set([0,0]);this._temp_texture.drawTo(function(){a.bind(0);g.uniforms(d).draw(e)});this._temp_texture.near_far_planes=b;this.setOutputData(0,this._temp_texture)}}},m.pixel_shader="precision highp float;\n\t\tprecision highp float;\n\t\tvarying vec2 v_coord;\n\t\tuniform sampler2D u_texture;\n\t\tuniform vec2 u_camera_planes;\n\t\tuniform int u_invert;\n\t\tuniform vec2 u_ires;\n\t\t\n\t\tvoid main() {\n\t\t\tfloat zNear = u_camera_planes.x;\n\t\t\tfloat zFar = u_camera_planes.y;\n\t\t\tfloat depth = texture2D(u_texture, v_coord + u_ires*0.5).x * 2.0 - 1.0;\n\t\t\tfloat f = zNear * (depth + 1.0) / (zFar + zNear - depth * (zFar - zNear));\n\t\t\tif( u_invert == 1 )\n\t\t\t\tf = 1.0 - f;\n\t\t\tgl_FragColor = vec4(vec3(f),1.0);\n\t\t}\n\t\t", -K.registerNodeType("texture/linear_depth",m),s.title="Blur",s.desc="Blur a texture",s.widgets_info={precision:{widget:"combo",values:c.MODE_VALUES}},s.max_iterations=20,s.prototype.onExecute=function(){var a=this.getInputData(0);if(a&&this.isOutputConnected(0)){var b=this._final_texture;b&&b.width==a.width&&b.height==a.height&&b.type==a.type||(b=this._final_texture=new GL.Texture(a.width,a.height,{type:a.type,format:gl.RGBA,filter:gl.LINEAR}));var d=this.properties.iterations;this.isInputConnected(1)&& -(d=this.getInputData(1),this.properties.iterations=d);d=Math.min(Math.floor(d),s.max_iterations);if(0==d)this.setOutputData(0,a);else{var c=this.properties.intensity;this.isInputConnected(2)&&(c=this.getInputData(2),this.properties.intensity=c);var e=K.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],c,b);for(a=1;a >=1;1<(g|0)&&(g>>=1);if(2>e)break;m=h[s]=GL.Texture.getTemporary(e,g,f);I[0]=1/l.width;I[1]=1/l.height;l.blit(m,n.uniforms(k));l=m}c&&(I[0]=1/l.width,I[1]=1/l.height,k.u_intensity=q,k.u_delta=1,l.blit(c,n.uniforms(k)));gl.enable(gl.BLEND);gl.blendFunc(gl.ONE,gl.ONE);k.u_intensity=this.persistence; -k.u_delta=0.5;for(s-=2;0<=s;s--)m=h[s],h[s]=null,I[0]=1/l.width,I[1]=1/l.height,l.blit(m,n.uniforms(k)),GL.Texture.releaseTemporary(l),l=m;gl.disable(gl.BLEND);d&&l.blit(d);if(b){var r=this.dirt_texture,J=this.dirt_factor;k.u_intensity=q;n=r?y._dirt_final_shader:y._final_shader;n||(n=r?y._dirt_final_shader=new GL.Shader(GL.Shader.SCREEN_VERTEX_SHADER,y.final_pixel_shader,{USE_DIRT:""}):y._final_shader=new GL.Shader(GL.Shader.SCREEN_VERTEX_SHADER,y.final_pixel_shader));b.drawTo(function(){a.bind(0); -l.bind(1);r&&(n.setUniform("u_dirt_factor",J),n.setUniform("u_dirt_texture",r.bind(2)));n.toViewport(k)})}GL.Texture.releaseTemporary(l)},y.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}",y.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}", +K.registerNodeType("texture/linear_depth",m),r.title="Blur",r.desc="Blur a texture",r.widgets_info={precision:{widget:"combo",values:c.MODE_VALUES}},r.max_iterations=20,r.prototype.onExecute=function(){var a=this.getInputData(0);if(a&&this.isOutputConnected(0)){var b=this._final_texture;b&&b.width==a.width&&b.height==a.height&&b.type==a.type||(b=this._final_texture=new GL.Texture(a.width,a.height,{type:a.type,format:gl.RGBA,filter:gl.LINEAR}));var d=this.properties.iterations;this.isInputConnected(1)&& +(d=this.getInputData(1),this.properties.iterations=d);d=Math.min(Math.floor(d),r.max_iterations);if(0==d)this.setOutputData(0,a);else{var c=this.properties.intensity;this.isInputConnected(2)&&(c=this.getInputData(2),this.properties.intensity=c);var e=K.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],c,b);for(a=1;a >=1;1<(g|0)&&(g>>=1);if(2>e)break;m=q[n]=GL.Texture.getTemporary(e,g,f);w[0]=1/k.width;w[1]=1/k.height;k.blit(m,h.uniforms(l));k=m}c&&(w[0]=1/k.width,w[1]=1/k.height,l.u_intensity=I,l.u_delta=1,k.blit(c,h.uniforms(l)));gl.enable(gl.BLEND);gl.blendFunc(gl.ONE,gl.ONE);l.u_intensity=this.persistence; +l.u_delta=0.5;for(n-=2;0<=n;n--)m=q[n],q[n]=null,w[0]=1/k.width,w[1]=1/k.height,k.blit(m,h.uniforms(l)),GL.Texture.releaseTemporary(k),k=m;gl.disable(gl.BLEND);d&&k.blit(d);if(b){var s=this.dirt_texture,J=this.dirt_factor;l.u_intensity=I;h=s?y._dirt_final_shader:y._final_shader;h||(h=s?y._dirt_final_shader=new GL.Shader(GL.Shader.SCREEN_VERTEX_SHADER,y.final_pixel_shader,{USE_DIRT:""}):y._final_shader=new GL.Shader(GL.Shader.SCREEN_VERTEX_SHADER,y.final_pixel_shader));b.drawTo(function(){a.bind(0); +k.bind(1);s&&(h.setUniform("u_dirt_factor",J),h.setUniform("u_dirt_texture",s.bind(2)));h.toViewport(l)})}GL.Texture.releaseTemporary(k)},y.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}",y.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}", y.final_pixel_shader="precision highp float;\n\tvarying vec2 v_coord;\n\tuniform sampler2D u_texture;\n\tuniform sampler2D u_glow_texture;\n\t#ifdef USE_DIRT\n\t\tuniform sampler2D u_dirt_texture;\n\t#endif\n\tuniform vec2 u_texel_size;\n\tuniform float u_delta;\n\tuniform float u_intensity;\n\tuniform float u_dirt_factor;\n\t\n\tvec4 sampleBox(vec2 uv) {\n\t\tvec4 o = u_texel_size.xyxy * vec2(-u_delta, u_delta).xxyy;\n\t\tvec4 s = texture2D( u_glow_texture, uv + o.xy ) + texture2D( u_glow_texture, uv + o.zy) + texture2D( u_glow_texture, uv + o.xw) + texture2D( u_glow_texture, uv + o.zw);\n\t\treturn s * 0.25;\n\t}\n\tvoid main() {\n\t\tvec4 glow = sampleBox( v_coord );\n\t\t#ifdef USE_DIRT\n\t\t\tglow = mix( glow, glow * texture2D( u_dirt_texture, v_coord ), u_dirt_factor );\n\t\t#endif\n\t\tgl_FragColor = texture2D( u_texture, v_coord ) + u_intensity * glow;\n\t}", N.title="Glow",N.desc="Filters a texture giving it a glow effect",N.widgets_info={iterations:{type:"number",min:0,max:16,step:1,precision:0},threshold:{type:"number",min:0,max:10,step:0.01,precision:2},precision:{widget:"combo",values:c.MODE_VALUES}},N.prototype.onGetInputs=function(){return[["enabled","boolean"],["threshold","number"],["intensity","number"],["persistence","number"],["iterations","number"],["dirt_factor","number"]]},N.prototype.onGetOutputs=function(){return[["average","Texture"]]}, N.prototype.onExecute=function(){var a=this.getInputData(0);if(a&&this.isAnyOutputConnected())if(this.properties.precision===c.PASS_THROUGH||!1===this.getInputOrProperty("enabled"))this.setOutputData(0,a);else{var b=this.fx;b.threshold=this.getInputOrProperty("threshold");b.iterations=this.getInputOrProperty("iterations");b.intensity=this.getInputOrProperty("intensity");b.persistence=this.getInputOrProperty("persistence");b.dirt_texture=this.getInputData(1);b.dirt_factor=this.getInputOrProperty("dirt_factor"); @@ -566,7 +567,7 @@ var f=null;this.isOutputConnected(0)&&(f=this._final_texture,f&&f.width==a.width M.max_radius=10,M._shaders=[],M.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),M.max_radius);if(0==b)this.setOutputData(0,a);else{var d=this.properties.intensity,c=K.camera_aspect;c||void 0===window.gl||(c=gl.canvas.height/gl.canvas.width); c||(c=1);c=this.properties.preserve_aspect?c:1;M._shaders[b]||(M._shaders[b]=new GL.Shader(Shader.SCREEN_VERTEX_SHADER,M.pixel_shader,{RADIUS:b.toFixed(0)}));var e=M._shaders[b],g=GL.Mesh.getScreenQuad();a.bind(0);this._temp_texture.drawTo(function(){e.uniforms({u_texture:0,u_intensity:d,u_resolution:[a.width,a.height],u_iResolution:[1/a.width,1/a.height]}).draw(g)});this.setOutputData(0,this._temp_texture)}}},M.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", K.registerNodeType("texture/kuwahara",M),z.title="XDoG Filter",z.desc="Filters a texture giving an artistic ink style",z.max_radius=10,z._shaders=[],z.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}));z._xdog_shader||(z._xdog_shader=new GL.Shader(Shader.SCREEN_VERTEX_SHADER,z.xdog_pixel_shader)); -var d=z._xdog_shader,c=GL.Mesh.getScreenQuad(),e=this.properties.sigma,g=this.properties.k,f=this.properties.p,k=this.properties.epsilon,h=this.properties.phi;a.bind(0);this._temp_texture.drawTo(function(){d.uniforms({src:0,sigma:e,k:g,p:f,epsilon:k,phi:h,cvsWidth:a.width,cvsHeight:a.height}).draw(c)});this.setOutputData(0,this._temp_texture)}},z.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 d=z._xdog_shader,c=GL.Mesh.getScreenQuad(),e=this.properties.sigma,g=this.properties.k,f=this.properties.p,l=this.properties.epsilon,q=this.properties.phi;a.bind(0);this._temp_texture.drawTo(function(){d.uniforms({src:0,sigma:e,k:g,p:f,epsilon:l,phi:q,cvsWidth:a.width,cvsHeight:a.height}).draw(c)});this.setOutputData(0,this._temp_texture)}},z.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}", K.registerNodeType("texture/xDoG",z),F.title="Webcam",F.desc="Webcam texture",F.is_webcam_open=!1,F.prototype.openStream=function(){function a(d){F.is_webcam_open=!1;console.log("Webcam rejected",d);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, @@ -589,30 +590,30 @@ K.registerNodeType("texture/exposition",S),P.title="Tone Mapping",P.desc="Applie b.height==a.height&&b.type==a.type||(b=this._temp_texture=new GL.Texture(a.width,a.height,{type:a.type,format:gl.RGBA,filter:gl.LINEAR}));var d=this.getInputData(1);null==d&&(d=this.properties.average_lum);var e=this._uniforms,g=null;d.constructor===Number?(this.properties.average_lum=d,e.u_average_lum=this.properties.average_lum,g=P._shader,g||(g=P._shader=new GL.Shader(GL.Shader.SCREEN_VERTEX_SHADER,P.pixel_shader))):d.constructor===GL.Texture&&(e.u_average_texture=d.bind(1),g=P._shader_texture, g||(g=P._shader_texture=new GL.Shader(GL.Shader.SCREEN_VERTEX_SHADER,P.pixel_shader,{AVG_TEXTURE:""})));e.u_lumwhite2=this.properties.lum_white*this.properties.lum_white;e.u_scale=this.properties.scale;e.u_igamma=1/this.properties.gamma;gl.disable(gl.DEPTH_TEST);b.drawTo(function(){a.bind(0);g.uniforms(e).draw(GL.Mesh.getScreenQuad())});this.setOutputData(0,this._temp_texture)}},P.pixel_shader="precision highp float;\n\t\tvarying vec2 v_coord;\n\t\tuniform sampler2D u_texture;\n\t\tuniform float u_scale;\n\t\t#ifdef AVG_TEXTURE\n\t\t\tuniform sampler2D u_average_texture;\n\t\t#else\n\t\t\tuniform float u_average_lum;\n\t\t#endif\n\t\tuniform float u_lumwhite2;\n\t\tuniform float u_igamma;\n\t\tvec3 RGB2xyY (vec3 rgb)\n\t\t{\n\t\t\t const mat3 RGB2XYZ = mat3(0.4124, 0.3576, 0.1805,\n\t\t\t\t\t\t\t\t\t 0.2126, 0.7152, 0.0722,\n\t\t\t\t\t\t\t\t\t 0.0193, 0.1192, 0.9505);\n\t\t\tvec3 XYZ = RGB2XYZ * rgb;\n\t\t\t\n\t\t\tfloat f = (XYZ.x + XYZ.y + XYZ.z);\n\t\t\treturn vec3(XYZ.x / f,\n\t\t\t\t\t\tXYZ.y / f,\n\t\t\t\t\t\tXYZ.y);\n\t\t}\n\t\t\n\t\tvoid main() {\n\t\t\tvec4 color = texture2D( u_texture, v_coord );\n\t\t\tvec3 rgb = color.xyz;\n\t\t\tfloat average_lum = 0.0;\n\t\t\t#ifdef AVG_TEXTURE\n\t\t\t\tvec3 pixel = texture2D(u_average_texture,vec2(0.5)).xyz;\n\t\t\t\taverage_lum = (pixel.x + pixel.y + pixel.z) / 3.0;\n\t\t\t#else\n\t\t\t\taverage_lum = u_average_lum;\n\t\t\t#endif\n\t\t\t//Ld - this part of the code is the same for both versions\n\t\t\tfloat lum = dot(rgb, vec3(0.2126, 0.7152, 0.0722));\n\t\t\tfloat L = (u_scale / average_lum) * lum;\n\t\t\tfloat Ld = (L * (1.0 + L / u_lumwhite2)) / (1.0 + L);\n\t\t\t//first\n\t\t\t//vec3 xyY = RGB2xyY(rgb);\n\t\t\t//xyY.z *= Ld;\n\t\t\t//rgb = xyYtoRGB(xyY);\n\t\t\t//second\n\t\t\trgb = (rgb / lum) * Ld;\n\t\t\trgb = max(rgb,vec3(0.001));\n\t\t\trgb = pow( rgb, vec3( u_igamma ) );\n\t\t\tgl_FragColor = vec4( rgb, color.a );\n\t\t}", K.registerNodeType("texture/tonemapping",P),R.title="Perlin",R.desc="Generates a perlin noise texture",R.widgets_info={precision:{widget:"combo",values:c.MODE_VALUES},width:{type:"number",precision:0,step:1},height:{type:"number",precision:0,step:1},octaves:{type:"number",precision:0,step:1,min:1,max:50}},R.prototype.onGetInputs=function(){return[["seed","number"],["persistence","number"],["octaves","number"],["scale","number"],["amplitude","number"],["offset","vec2"]]},R.prototype.onExecute=function(){if(this.isOutputConnected(0)){var a= -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 g=this.getInputOrProperty("persistence"),f=this.getInputOrProperty("octaves"),k=this.getInputOrProperty("offset"),h=this.getInputOrProperty("scale"),n=this.getInputOrProperty("amplitude"),m=this.getInputOrProperty("seed"), -d=""+a+b+d+g+f+h+m+k[0]+k[1]+n;if(d!=this._key){this._key=d;var l=this._uniforms;l.u_persistence=g;l.u_octaves=f;l.u_offset.set(k);l.u_scale=h;l.u_amplitude=n;l.u_seed=128*m;l.u_viewport[0]=a;l.u_viewport[1]=b;var v=R._shader;v||(v=R._shader=new GL.Shader(GL.Shader.SCREEN_VERTEX_SHADER,R.pixel_shader));gl.disable(gl.BLEND);gl.disable(gl.DEPTH_TEST);e.drawTo(function(){v.uniforms(l).draw(GL.Mesh.getScreenQuad())})}this.setOutputData(0,e)}},R.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}", +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 g=this.getInputOrProperty("persistence"),f=this.getInputOrProperty("octaves"),l=this.getInputOrProperty("offset"),q=this.getInputOrProperty("scale"),h=this.getInputOrProperty("amplitude"),m=this.getInputOrProperty("seed"), +d=""+a+b+d+g+f+q+m+l[0]+l[1]+h;if(d!=this._key){this._key=d;var k=this._uniforms;k.u_persistence=g;k.u_octaves=f;k.u_offset.set(l);k.u_scale=q;k.u_amplitude=h;k.u_seed=128*m;k.u_viewport[0]=a;k.u_viewport[1]=b;var r=R._shader;r||(r=R._shader=new GL.Shader(GL.Shader.SCREEN_VERTEX_SHADER,R.pixel_shader));gl.disable(gl.BLEND);gl.disable(gl.DEPTH_TEST);e.drawTo(function(){r.uniforms(k).draw(GL.Mesh.getScreenQuad())})}this.setOutputData(0,e)}},R.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}", K.registerNodeType("texture/perlin",R),Q.title="Canvas2D",Q.desc="Executes Canvas2D code inside a texture or the viewport.",Q.help="Set width and height to 0 to match viewport size.",Q.default_code="//vars: canvas,ctx,time\nctx.fillStyle='red';\nctx.fillRect(0,0,50,50);\n",Q.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}},Q.prototype.onPropertyChanged=function(a,b){"code"==a&&this.compileCode(b)}, Q.prototype.compileCode=function(a){this._func=null;if(K.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)}},Q.prototype.onExecute=function(){var a=this._func;a&&this.isOutputConnected(0)&&this.executeDraw(a)},Q.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,h=this,n=this.graph.getTime(),m=gl,l=gl.canvas;if(this.properties.use_html_canvas||!B.enableWebGLCanvas)this._canvas?(l=this._canvas,m=this._ctx):(l=this._canvas=createCanvas(b.height),m=this._ctx=l.getContext("2d")),l.width=b,l.height=d;if(m==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(h,l,m,n,a,f):a.call(h,l,m,n,a,f),h.boxcolor="#00FF00"}catch(b){h.boxcolor="#FF0000",console.error("Error executing script"),console.error(b)}gl.finish2D()});else{k.clear&&m.clearRect(0,0,l.width,l.height);try{a.draw?a.draw.call(this,l,m,n,a,f):a.call(this,l,m,n,a,f),this.boxcolor="#00FF00"}catch(v){this.boxcolor="#FF0000",console.error("Error executing script"),console.error(v)}e.uploadImage(l)}this.setOutputData(0,e)},K.registerNodeType("texture/canvas2D",Q),T.title="Matte", +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),l=this.properties,q=this,h=this.graph.getTime(),m=gl,k=gl.canvas;if(this.properties.use_html_canvas||!B.enableWebGLCanvas)this._canvas?(k=this._canvas,m=this._ctx):(k=this._canvas=createCanvas(b.height),m=this._ctx=k.getContext("2d")),k.width=b,k.height=d;if(m==gl)e.drawTo(function(){gl.start2D();l.clear&&(gl.clearColor(0,0,0,0),gl.clear(gl.COLOR_BUFFER_BIT)); +try{a.draw?a.draw.call(q,k,m,h,a,f):a.call(q,k,m,h,a,f),q.boxcolor="#00FF00"}catch(b){q.boxcolor="#FF0000",console.error("Error executing script"),console.error(b)}gl.finish2D()});else{l.clear&&m.clearRect(0,0,k.width,k.height);try{a.draw?a.draw.call(this,k,m,h,a,f):a.call(this,k,m,h,a,f),this.boxcolor="#00FF00"}catch(r){this.boxcolor="#FF0000",console.error("Error executing script"),console.error(r)}e.uploadImage(k)}this.setOutputData(0,e)},K.registerNodeType("texture/canvas2D",Q),T.title="Matte", T.desc="Extracts background",T.widgets_info={key_color:{widget:"color"},precision:{widget:"combo",values:c.MODE_VALUES}},T.prototype.onExecute=function(){if(this.isOutputConnected(0)){var a=this.getInputData(0);if(this.properties.precision===c.PASS_THROUGH)this.setOutputData(0,a);else if(a){this._tex=c.getTargetTexture(a,this._tex,this.properties.precision);gl.disable(gl.BLEND);gl.disable(gl.DEPTH_TEST);this._uniforms||(this._uniforms={u_texture:0,u_key_color:this.properties.key_color,u_threshold:1, u_slope:1});var b=this._uniforms,d=Mesh.getScreenQuad(),e=T._shader;e||(e=T._shader=new GL.Shader(GL.Shader.SCREEN_VERTEX_SHADER,T.pixel_shader));b.u_key_color=this.properties.key_color;b.u_threshold=this.properties.threshold;b.u_slope=this.properties.slope;this._tex.drawTo(function(){a.bind(0);e.uniforms(b).draw(d)});this.setOutputData(0,this._tex)}}},T.pixel_shader="precision highp float;\n\t\tvarying vec2 v_coord;\n\t\tuniform sampler2D u_texture;\n\t\tuniform vec3 u_key_color;\n\t\tuniform float u_threshold;\n\t\tuniform float u_slope;\n\t\t\n\t\tvoid main() {\n\t\t\tvec3 color = texture2D( u_texture, v_coord ).xyz;\n\t\t\tfloat diff = length( normalize(color) - normalize(u_key_color) );\n\t\t\tfloat edge = u_threshold * (1.0 - u_slope);\n\t\t\tfloat alpha = smoothstep( edge, u_threshold, diff);\n\t\t\tgl_FragColor = vec4( color, alpha );\n\t\t}", K.registerNodeType("texture/matte",T),U.title="CubemapToTexture2D",U.desc="Transforms a CUBEMAP texture into a TEXTURE2D in Polar Representation",U.prototype.onExecute=function(){if(this.isOutputConnected(0)){var a=this.getInputData(0);if(a&&a.texture_type==GL.TEXTURE_CUBE_MAP){!this._last_tex||this._last_tex.height==a.height&&this._last_tex.type==a.type||(this._last_tex=null);var b=this.getInputOrProperty("yaw");this._last_tex=GL.Texture.cubemapToTexture2D(a,a.height,this._last_tex,!0,b);this.setOutputData(0, this._last_tex)}}},K.registerNodeType("texture/cubemapToTexture2D",U))})(this); -(function(B){function c(){M.length=0;for(var a in y){var b=y[a],d=b.indexOf(" "),c=b.substr(0,d),e=b.indexOf("(",d),d=b.substr(d,e-d).trim(),b=b.substr(e+1,b.length-e-2).split(","),g;for(g in b)e=b[g].split(" ").filter(function(a){return a}),b[g]={type:e[0].trim(),name:e[1].trim()},"="==e[2]&&(b[g].value=e[3].trim());N[a]={return_type:c,func:d,params:b};M.push(d)}}function l(a,b){b.color=E;b.filter="shader";b.prototype.clearDestination=function(){this.shader_destination={}};b.prototype.propagateDestination= -function(a){this.shader_destination[a]=!0;if(this.inputs)for(var b=0;b d+e.NODE_TITLE_HEIGHT&&a.drawImage(b,10,g,this.size[0]-20,this.size[1]-d-e.NODE_TITLE_HEIGHT);var g=this.size[1]-e.NODE_TITLE_HEIGHT+0.5;c=e.isInsideRectangle(c[0],c[1],this.pos[0],this.pos[1]+g,this.size[0],e.NODE_TITLE_HEIGHT);a.fillStyle=c?"#555":"#222";a.beginPath();this._shape==e.BOX_SHAPE?a.rect(0,g,this.size[0]+1,e.NODE_TITLE_HEIGHT):a.roundRect(0,g,this.size[0]+1,e.NODE_TITLE_HEIGHT,0,8);a.fill();a.textAlign="center";a.font="24px Arial";a.fillStyle=c?"#DDD":"#999"; a.fillText("+",0.5*this.size[0],g+24)}};C.prototype.onMouseDown=function(a,b,d){b[1]>this.size[1]-e.NODE_TITLE_HEIGHT+0.5&&d.showSubgraphPropertiesDialog(this)};C.prototype.onDrawSubgraphBackground=function(a){};C.prototype.getExtraMenuOptions=function(a){var b=this;return[{content:"Print Code",callback:function(){var a=b._context.computeShaderCode();console.log(a.vs_code,a.fs_code)}}]};e.registerNodeType("texture/shaderGraph",C);x.title="Uniform";x.desc="Input data for the shader";x.prototype.getTitle= function(){return this.properties.name&&this.flags.collapsed?this.properties.type+" "+this.properties.name:"Uniform"};x.prototype.onPropertyChanged=function(a,b){this.outputs[0].name=this.properties.type+" "+this.properties.name};x.prototype.onGetCode=function(a){if(this.shader_destination){var b=this.properties.type;if(!b){if(!a.onGetPropertyInfo)return;b=a.onGetPropertyInfo(this.property.name);if(!b)return;b=b.type}"number"==b?b="float":"texture"==b&&(b="sampler2D");-1!=m.GLSL_types.indexOf(b)&& -(a.addUniform("u_"+this.properties.name,b),this.setOutputData(0,b))}};x.prototype.getOutputVarName=function(a){return"u_"+this.properties.name};l("input/uniform",x);G.title="Attribute";G.desc="Input data from mesh attribute";G.prototype.getTitle=function(){return"att. "+this.properties.name};G.prototype.onGetCode=function(a){if(this.shader_destination){var b=this.properties.type;b&&-1!=m.GLSL_types.indexOf(b)&&("number"==b&&(b="float"),"coord"!=this.properties.name&&a.addCode("varying"," varying "+ -b+" v_"+this.properties.name+";"),this.setOutputData(0,b))}};G.prototype.getOutputVarName=function(a){return"v_"+this.properties.name};l("input/attribute",G);A.title="Sampler2D";A.desc="Reads a pixel from a texture";A.prototype.onGetCode=function(a){if(this.shader_destination){var b=r(this,0),d=u(this),c="vec4 "+d+" = vec4(0.0);\n";if(b)var e=r(this,1)||a.buffer_names.uvs,c=c+(d+" = texture2D("+b+","+e+");\n");t(this,0)&&(c+="vec4 "+t(this,0)+" = "+d+";\n");t(this,1)&&(c+="vec3 "+t(this,1)+" = "+ -d+".xyz;\n");a.addCode("code",c,this.shader_destination);this.setOutputData(0,"vec4");this.setOutputData(1,"vec3")}};l("texture/sampler2D",A);D.title="const";D.prototype.getTitle=function(){return this.flags.collapsed?z(this.properties.value,this.properties.type,2):"Const"};D.prototype.onPropertyChanged=function(a,b){"type"==a&&(this.outputs[0].type!=b&&(this.disconnectOutput(0),this.outputs[0].type=b),this.widgets.length=1,this.updateWidgets());"value"==a&&(b.length?(this.widgets[1].value=b[1],2< +(a.addUniform("u_"+this.properties.name,b),this.setOutputData(0,b))}};x.prototype.getOutputVarName=function(a){return"u_"+this.properties.name};k("input/uniform",x);G.title="Attribute";G.desc="Input data from mesh attribute";G.prototype.getTitle=function(){return"att. "+this.properties.name};G.prototype.onGetCode=function(a){if(this.shader_destination){var b=this.properties.type;b&&-1!=m.GLSL_types.indexOf(b)&&("number"==b&&(b="float"),"coord"!=this.properties.name&&a.addCode("varying"," varying "+ +b+" v_"+this.properties.name+";"),this.setOutputData(0,b))}};G.prototype.getOutputVarName=function(a){return"v_"+this.properties.name};k("input/attribute",G);A.title="Sampler2D";A.desc="Reads a pixel from a texture";A.prototype.onGetCode=function(a){if(this.shader_destination){var b=s(this,0),d=u(this),c="vec4 "+d+" = vec4(0.0);\n";if(b)var e=s(this,1)||a.buffer_names.uvs,c=c+(d+" = texture2D("+b+","+e+");\n");t(this,0)&&(c+="vec4 "+t(this,0)+" = "+d+";\n");t(this,1)&&(c+="vec3 "+t(this,1)+" = "+ +d+".xyz;\n");a.addCode("code",c,this.shader_destination);this.setOutputData(0,"vec4");this.setOutputData(1,"vec3")}};k("texture/sampler2D",A);D.title="const";D.prototype.getTitle=function(){return this.flags.collapsed?z(this.properties.value,this.properties.type,2):"Const"};D.prototype.onPropertyChanged=function(a,b){"type"==a&&(this.outputs[0].type!=b&&(this.disconnectOutput(0),this.outputs[0].type=b),this.widgets.length=1,this.updateWidgets());"value"==a&&(b.length?(this.widgets[1].value=b[1],2< b.length&&(this.widgets[2].value=b[2]),3 d;++d)b.push({name:r(this,d),type:this.getInputData(d)||"float"});var c=t(this,0);if(c){for(var e=b[0].type, -g=this.properties.operation,f=[],d=0;2>d;++d){var k=b[d].name;null==k&&(k=null!=p.value?p.value:"(1.0)",b[d].type="float");b[d].type!=e&&("float"!=b[d].type||"*"!=g&&"/"!=g)&&(k=O(k,b[d].type,e));f.push(k)}a.addCode("code",e+" "+c+" = "+f[0]+g+f[1]+";",this.shader_destination);this.setOutputData(0,e)}}};l("math/operation",L);n.title="Func";n.prototype.onPropertyChanged=function(a,b){this.graph&&this.graph._version++;if("func"==a){var d=N[b];if(d){for(var c=d.params.length;c d;++d)b.push({name:r(this,d),type:this.getInputData(d)||"float"});var c=t(this,0);if(c){var e=N[this.properties.func];if(e){var g=b[0].type,f=e.return_type; -"T"==f&&(f=g);for(var k=[],d=0;d d;++d)b.push({name:s(this,d),type:this.getInputData(d)||"float"});var c=t(this,0);if(c){for(var e=b[0].type, +g=this.properties.operation,f=[],d=0;2>d;++d){var l=b[d].name;null==l&&(l=null!=p.value?p.value:"(1.0)",b[d].type="float");b[d].type!=e&&("float"!=b[d].type||"*"!=g&&"/"!=g)&&(l=O(l,b[d].type,e));f.push(l)}a.addCode("code",e+" "+c+" = "+f[0]+g+f[1]+";",this.shader_destination);this.setOutputData(0,e)}}};k("math/operation",L);l.title="Func";l.prototype.onPropertyChanged=function(a,b){this.graph&&this.graph._version++;if("func"==a){var d=N[b];if(d){for(var c=d.params.length;c d;++d)b.push({name:s(this,d),type:this.getInputData(d)||"float"});var c=t(this,0);if(c){var e=N[this.properties.func];if(e){var g=b[0].type,f=e.return_type; +"T"==f&&(f=g);for(var l=[],d=0;d x0.y) ? vec2(1.0, 0.0) : vec2(0.0, 1.0);\n vec4 x12 = x0.xyxy + C.xxzz;\n x12.xy -= i1;\n i = mod(i, 289.0);\n vec3 p = permute( permute( i.y + vec3(0.0, i1.y, 1.0 ))\n + i.x + vec3(0.0, i1.x, 1.0 ));\n vec3 m = max(0.5 - vec3(dot(x0,x0), dot(x12.xy,x12.xy),dot(x12.zw,x12.zw)), 0.0);\n m = m*m ;\n m = m*m ;\n vec3 x = 2.0 * fract(p * C.www) - 1.0;\n vec3 h = abs(x) - 0.5;\n vec3 ox = floor(x + 0.5);\n vec3 a0 = x - ox;\n m *= 1.79284291400159 - 0.85373472095314 * ( a0*a0 + h*h );\n vec3 g;\n g.x = a0.x * x0.x + h.x * x0.y;\n g.yz = a0.yz * x12.xz + h.yz * x12.yw;\n return 130.0 * dot(m, g);\n}\nvec4 permute(vec4 x){return mod(((x*34.0)+1.0)*x, 289.0);}\nvec4 taylorInvSqrt(vec4 r){return 1.79284291400159 - 0.85373472095314 * r;}\n\nfloat snoise(vec3 v){ \n const vec2 C = vec2(1.0/6.0, 1.0/3.0) ;\n const vec4 D = vec4(0.0, 0.5, 1.0, 2.0);\n\n// First corner\n vec3 i = floor(v + dot(v, C.yyy) );\n vec3 x0 = v - i + dot(i, C.xxx) ;\n\n// Other corners\n vec3 g = step(x0.yzx, x0.xyz);\n vec3 l = 1.0 - g;\n vec3 i1 = min( g.xyz, l.zxy );\n vec3 i2 = max( g.xyz, l.zxy );\n\n // x0 = x0 - 0. + 0.0 * C \n vec3 x1 = x0 - i1 + 1.0 * C.xxx;\n vec3 x2 = x0 - i2 + 2.0 * C.xxx;\n vec3 x3 = x0 - 1. + 3.0 * C.xxx;\n\n// Permutations\n i = mod(i, 289.0 ); \n vec4 p = permute( permute( permute( \n i.z + vec4(0.0, i1.z, i2.z, 1.0 ))\n + i.y + vec4(0.0, i1.y, i2.y, 1.0 )) \n + i.x + vec4(0.0, i1.x, i2.x, 1.0 ));\n\n// Gradients\n// ( N*N points uniformly over a square, mapped onto an octahedron.)\n float n_ = 1.0/7.0; // N=7\n vec3 ns = n_ * D.wyz - D.xzx;\n\n vec4 j = p - 49.0 * floor(p * ns.z *ns.z); // mod(p,N*N)\n\n vec4 x_ = floor(j * ns.z);\n vec4 y_ = floor(j - 7.0 * x_ ); // mod(j,N)\n\n vec4 x = x_ *ns.x + ns.yyyy;\n vec4 y = y_ *ns.x + ns.yyyy;\n vec4 h = 1.0 - abs(x) - abs(y);\n\n vec4 b0 = vec4( x.xy, y.xy );\n vec4 b1 = vec4( x.zw, y.zw );\n\n vec4 s0 = floor(b0)*2.0 + 1.0;\n vec4 s1 = floor(b1)*2.0 + 1.0;\n vec4 sh = -step(h, vec4(0.0));\n\n vec4 a0 = b0.xzyw + s0.xzyw*sh.xxyy ;\n vec4 a1 = b1.xzyw + s1.xzyw*sh.zzww ;\n\n vec3 p0 = vec3(a0.xy,h.x);\n vec3 p1 = vec3(a0.zw,h.y);\n vec3 p2 = vec3(a1.xy,h.z);\n vec3 p3 = vec3(a1.zw,h.w);\n\n//Normalise gradients\n vec4 norm = taylorInvSqrt(vec4(dot(p0,p0), dot(p1,p1), dot(p2, p2), dot(p3,p3)));\n p0 *= norm.x;\n p1 *= norm.y;\n p2 *= norm.z;\n p3 *= norm.w;\n\n// Mix final noise value\n vec4 m = max(0.6 - vec4(dot(x0,x0), dot(x1,x1), dot(x2,x2), dot(x3,x3)), 0.0);\n m = m * m;\n return 42.0 * dot( m*m, vec4( dot(p0,x0), dot(p1,x1),dot(p2,x2), dot(p3,x3) ) );\n}\n\nvec3 hash3( vec2 p ){\n vec3 q = vec3( dot(p,vec2(127.1,311.7)), \n\t\t\t\t dot(p,vec2(269.5,183.3)), \n\t\t\t\t dot(p,vec2(419.2,371.9)) );\n\treturn fract(sin(q)*43758.5453);\n}\nvec4 hash4( vec3 p ){\n vec4 q = vec4( dot(p,vec3(127.1,311.7,257.3)), \n\t\t\t\t dot(p,vec3(269.5,183.3,335.1)), \n\t\t\t\t dot(p,vec3(314.5,235.1,467.3)), \n\t\t\t\t dot(p,vec3(419.2,371.9,114.9)) );\n\treturn fract(sin(q)*43758.5453);\n}\n\nfloat iqnoise( in vec2 x, float u, float v ){\n vec2 p = floor(x);\n vec2 f = fract(x);\n\t\n\tfloat k = 1.0+63.0*pow(1.0-v,4.0);\n\t\n\tfloat va = 0.0;\n\tfloat wt = 0.0;\n for( int j=-2; j<=2; j++ )\n for( int i=-2; i<=2; i++ )\n {\n vec2 g = vec2( float(i),float(j) );\n\t\tvec3 o = hash3( p + g )*vec3(u,u,1.0);\n\t\tvec2 r = g - f + o.xy;\n\t\tfloat d = dot(r,r);\n\t\tfloat ww = pow( 1.0-smoothstep(0.0,1.414,sqrt(d)), k );\n\t\tva += o.z*ww;\n\t\twt += ww;\n }\n\t\n return va/wt;\n}\n"; -b.title="Time";b.prototype.onGetCode=function(a){if(this.shader_destination&&this.isOutputConnected(0)){var b=t(this,0);a.addUniform("u_time"+this.id,"float",function(){return 0.001*getTime()});a.addCode("code","float "+b+" = u_time"+this.id+";",this.shader_destination);this.setOutputData(0,"float")}};l("input/time",b);d.title="Dither";d.prototype.onGetCode=function(a){if(this.shader_destination&&this.isOutputConnected(0)){var b=r(this,0),c=t(this,0),e=this.getInputData(0),b=F(b,e,"float");a.addFunction("dither8x8", +b.title="Time";b.prototype.onGetCode=function(a){if(this.shader_destination&&this.isOutputConnected(0)){var b=t(this,0);a.addUniform("u_time"+this.id,"float",function(){return 0.001*getTime()});a.addCode("code","float "+b+" = u_time"+this.id+";",this.shader_destination);this.setOutputData(0,"float")}};k("input/time",b);d.title="Dither";d.prototype.onGetCode=function(a){if(this.shader_destination&&this.isOutputConnected(0)){var b=s(this,0),c=t(this,0),e=this.getInputData(0),b=F(b,e,"float");a.addFunction("dither8x8", d.dither_func);a.addCode("code","float "+c+" = dither8x8("+b+");",this.shader_destination);this.setOutputData(0,"float")}};d.dither_values=[0.515625,0.140625,0.640625,0.046875,0.546875,0.171875,0.671875,0.765625,0.265625,0.890625,0.390625,0.796875,0.296875,0.921875,0.421875,0.203125,0.703125,0.078125,0.578125,0.234375,0.734375,0.109375,0.609375,0.953125,0.453125,0.828125,0.328125,0.984375,0.484375,0.859375,0.359375,0.0625,0.5625,0.1875,0.6875,0.03125,0.53125,0.15625,0.65625,0.8125,0.3125,0.9375,0.4375, 0.78125,0.28125,0.90625,0.40625,0.25,0.75,0.125,0.625,0.21875,0.71875,0.09375,0.59375,1.0001,0.5,0.875,0.375,0.96875,0.46875,0.84375,0.34375];d.dither_func="\n\t\tfloat dither8x8(float brightness) {\n\t\t vec2 position = vec2(0.0);\n\t\t #ifdef FRAGMENT\n\t\t\tposition = gl_FragCoord.xy;\n\t\t #endif\n\t\t int x = int(mod(position.x, 8.0));\n\t\t int y = int(mod(position.y, 8.0));\n\t\t int index = x + y * 8;\n\t\t float limit = 0.0;\n\t\t if (x < 8) {\n\t\t\tif(index==0) limit = 0.015625;\n\t\t\t"+ -d.dither_values.map(function(a,b){return"else if(index== "+(b+1)+") limit = "+a+";"}).join("\n")+"\n\t\t }\n\t\t return brightness < limit ? 0.0 : 1.0;\n\t\t}\n";l("math/dither",d);g.title="Remap";g.prototype.onPropertyChanged=function(){this.graph&&this.graph._version++};g.prototype.onConnectionsChange=function(){var a=this.getInputDataType(0);this.outputs[0].type=a||"T"};g.prototype.onGetCode=function(a){if(this.shader_destination&&this.isOutputConnected(0)){var b=r(this,0),d=t(this,0);if(b|| -d){var c=this.getInputDataType(0);this.outputs[0].type=c;if("T"==c)console.warn("node type is T and cannot be resolved");else if(b){var e=z(this.properties.min_value),g=z(this.properties.max_value),f=z(this.properties.min_value2),k=z(this.properties.max_value2);a.addCode("code",c+" "+d+" = ( ("+b+" - "+e+") / ("+g+" - "+e+") ) * ("+k+" - "+f+") + "+f+";",this.shader_destination);this.setOutputData(0,c)}else a.addCode("code","\t"+c+" "+d+" = "+c+"(0.0);\n")}}};l("math/remap",g)}})(this); -(function(B){function c(){return 1E5*Math.random()|0}function l(){this.addInput("obj","");this.addInput("radius","number");this.addOutput("out","geometry");this.addOutput("points","[vec3]");this.properties={radius:1,num_points:4096,generate_normals:!0,regular:!1,mode:l.SPHERE,force_update:!1};this.points=new Float32Array(3*this.properties.num_points);this.normals=new Float32Array(3*this.properties.num_points);this.must_update=!0;this.version=0;var a=this;this.addWidget("button","update",null,function(){a.must_update= -!0});this.geometry={vertices:null,_id:c()};this._last_radius=this._old_obj=null}function u(a,d){var c=a.length,e=0,f=0,k=c;if(0==c)return-1;if(1==c)return 0;for(;k>=e;){f=0.5*(k+e)|0;c=a[f];if(c==d)break;if(e==k-1)return e;c =e;){f=0.5*(l+e)|0;c=a[f];if(c==d)break;if(e==l-1)return e;c a&&(a=1);this.points&&this.points.length==3*a||(this.points=new Float32Array(3*a));this.properties.generate_normals?this.normals&&this.normals.length==this.points.length||(this.normals=new Float32Array(this.points.length)):this.normals=null;var d=this._last_radius||this.properties.radius,c=this.properties.mode,e=this.getInputData(0);this._old_obj_version=e?e._version:null;this.points=l.generatePoints(d,a,c,this.points, -this.normals,this.properties.regular,e);this.version++};l.generatePoints=function(a,d,c,e,f,k,h){var n=3*d;e&&e.length==n||(e=new Float32Array(n));var v=new Float32Array(3),q=new Float32Array([0,1,0]);if(k)if(c==l.RECTANGLE){n=Math.floor(Math.sqrt(d));for(d=0;d a&&(a=1);this.points&&this.points.length==3*a||(this.points=new Float32Array(3*a));this.properties.generate_normals?this.normals&&this.normals.length==this.points.length||(this.normals=new Float32Array(this.points.length)):this.normals=null;var d=this._last_radius||this.properties.radius,c=this.properties.mode,e=this.getInputData(0);this._old_obj_version=e?e._version:null;this.points=k.generatePoints(d,a,c,this.points, +this.normals,this.properties.regular,e);this.version++};k.generatePoints=function(a,d,c,e,f,l,q){var h=3*d;e&&e.length==h||(e=new Float32Array(h));var w=new Float32Array(3),n=new Float32Array([0,1,0]);if(l)if(c==k.RECTANGLE){h=Math.floor(Math.sqrt(d));for(d=0;d f||w k&&k n))break}this.geometry.indices=this.indices=new Uint32Array(h)}this.indices&&this.indices.length?(this.geometry.indices=this.indices,this.setOutputData(0,this.geometry)):this.setOutputData(0,null)}};w.registerNodeType("geometry/connectPoints",G);"undefined"!=typeof GL&&(A.title="to geometry",A.desc="converts a mesh to geometry",A.prototype.onExecute= -function(){var a=this.getInputData(0);if(a){if(a!=this.last_mesh){this.last_mesh=a;for(i in a.vertexBuffers)this.geometry[i]=a.vertexBuffers[i].data;a.indexBuffers.triangles&&(this.geometry.indices=a.indexBuffers.triangles.data);this.geometry._id=c();this.geometry._version=0}this.setOutputData(0,this.geometry);this.geometry&&this.setOutputData(1,this.geometry.vertices)}},w.registerNodeType("geometry/toGeometry",A),D.title="Geo to Mesh",D.prototype.updateMesh=function(a){this.mesh||(this.mesh=new GL.Mesh); +l=this.vertices;l&&this.vertices.length==a.vertices.length?l.set(a.vertices):l=this.vertices=new Float32Array(a.vertices);for(e=0;e f||v l&&l h))break}this.geometry.indices=this.indices=new Uint32Array(q)}this.indices&&this.indices.length?(this.geometry.indices=this.indices,this.setOutputData(0,this.geometry)):this.setOutputData(0,null)}};v.registerNodeType("geometry/connectPoints",G);"undefined"!=typeof GL&&(A.title="to geometry",A.desc="converts a mesh to geometry",A.prototype.onExecute= +function(){var a=this.getInputData(0);if(a){if(a!=this.last_mesh){this.last_mesh=a;for(i in a.vertexBuffers)this.geometry[i]=a.vertexBuffers[i].data;a.indexBuffers.triangles&&(this.geometry.indices=a.indexBuffers.triangles.data);this.geometry._id=c();this.geometry._version=0}this.setOutputData(0,this.geometry);this.geometry&&this.setOutputData(1,this.geometry.vertices)}},v.registerNodeType("geometry/toGeometry",A),D.title="Geo to Mesh",D.prototype.updateMesh=function(a){this.mesh||(this.mesh=new GL.Mesh); for(var d in a)if("_"!=d[0]){var c=a[d],e=GL.Mesh.common_buffers[d];if(e||"indices"==d){var e=e?e.spacing:3,f=this.mesh.vertexBuffers[d];f&&f.data.length==c.length?(f.data.set(c),f.upload(GL.DYNAMIC_DRAW)):f=new GL.Buffer("indices"==d?GL.ELEMENT_ARRAY_BUFFER:GL.ARRAY_BUFFER,c,e,GL.DYNAMIC_DRAW);this.mesh.addBuffer(d,f)}}if(this.mesh.vertexBuffers.normals&&this.mesh.vertexBuffers.normals.data.length!=this.mesh.vertexBuffers.vertices.data.length){c=new Float32Array([0,1,0]);e=new Float32Array(this.mesh.vertexBuffers.vertices.data.length); -for(d=0;d =c.NOTEON||h<=c.NOTEOFF)this.channel=f&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,f){return c+(f<<7)-8192};c.prototype.setCommandFromString=function(f){this.cmd=c.computeCommandFromString(f)};c.computeCommandFromString=function(f){if(!f)return 0;if(f&&f.constructor===Number)return f;f=f.toUpperCase();switch(f){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(f)}};c.toNoteString=function(f,h){f=Math.round(f);var k,a=Math.floor((f-24)/12+1); -k=(f-21)%12;0>k&&(k=12+k);return c.notes[k]+(h?"":a)};c.NoteStringToPitch=function(f){f=f.toUpperCase();var h=f[0],k=4;"#"==f[1]?(h+="#",2 q&&(q=12+q);return c.notes[q]+(h?"":a)};c.NoteStringToPitch=function(f){f=f.toUpperCase();var h=f[0],q=4;"#"==f[1]?(h+="#",2 this.properties.max_value)return;this.trigger("on_midi",h)}};w.registerNodeType("midi/filter",h);C.title="MIDIEvent";C.desc="Create a MIDI Event";C.color="#243";C.prototype.onAction=function(f,h){"assign"==f?(this.properties.channel=h.channel,this.properties.cmd=h.cmd,this.properties.value1=h.data[1],this.properties.value2=h.data[2],h.cmd== -c.NOTEON?this.gate=!0:h.cmd==c.NOTEOFF&&(this.gate=!1)):(h=this.midi_event,h.channel=this.properties.channel,this.properties.cmd&&this.properties.cmd.constructor===String?h.setCommandFromString(this.properties.cmd):h.cmd=this.properties.cmd,h.data[0]=h.cmd|h.channel,h.data[1]=Number(this.properties.value1),h.data[2]=Number(this.properties.value2),this.trigger("on_midi",h))};C.prototype.onExecute=function(){var f=this.properties;if(this.inputs)for(var h=0;h this.properties.max_value)return;this.trigger("on_midi",h)}};v.registerNodeType("midi/filter",h);C.title="MIDIEvent";C.desc="Create a MIDI Event";C.color="#243";C.prototype.onAction=function(f,h){"assign"==f?(this.properties.channel=h.channel,this.properties.cmd=h.cmd,this.properties.value1=h.data[1],this.properties.value2=h.data[2],h.cmd== +c.NOTEON?this.gate=!0:h.cmd==c.NOTEOFF&&(this.gate=!1)):(h=this.midi_event,h.channel=this.properties.channel,this.properties.cmd&&this.properties.cmd.constructor===String?h.setCommandFromString(this.properties.cmd):h.cmd=this.properties.cmd,h.data[0]=h.cmd|h.channel,h.data[1]=Number(this.properties.value1),h.data[2]=Number(this.properties.value2),this.trigger("on_midi",h))};C.prototype.onExecute=function(){var f=this.properties;if(this.inputs)for(var h=0;h c;++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 f=1;12>f;++f){if(this.valid_notes[(c-f)%12]){this.offset_notes[c]=-f;break}if(this.valid_notes[(c+f)%12]){this.offset_notes[c]=f;break}}};D.prototype.onAction=function(f,h){h&&h.constructor===c&&(h.data[0]==c.NOTEON||h.data[0]==c.NOTEOFF?(this.midi_event=new c,this.midi_event.setup(h.data),this.midi_event.data[1]+=this.offset_notes[c.note_to_index[h.note]], -this.trigger("out",this.midi_event)):this.trigger("out",h))};D.prototype.onExecute=function(){var c=this.getInputData(1);null!=c&&c!=this._current_scale&&this.processScale(c)};w.registerNodeType("midi/quantize",D);f.title="MIDI fromFile";f.desc="Plays a MIDI file";f.color="#243";f.prototype.onAction=function(c){"play"==c?this.play():"pause"==c&&(this._playing=!this._playing)};f.prototype.onPropertyChanged=function(c,f){"url"==c&&this.loadMIDIFile(f)};f.prototype.onExecute=function(){if(this._midi&& -this._playing){this._current_time+=this.graph.elapsed_time;for(var f=100*this._current_time,h=0;h b;b++)for(var d=0;d g+e||c[1]>d))return b}}return-1};H.prototype.onAction=function(f,h){if("reset"==f)for(var k=0;k h[1])){var k=this.getKeyIndex(h);this.keys[k]=!0;this._last_key=k;var k=12*(this.properties.start_octave-1)+29+k,a=new c;a.setup([c.NOTEON,k,100]);this.trigger("note",a);return!0}};H.prototype.onMouseMove=function(f,h){if(!(0>h[1]||-1==this._last_key)){this.setDirtyCanvas(!0); -var k=this.getKeyIndex(h);if(this._last_key==k)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[k]=!0;a=12*(this.properties.start_octave-1)+29+k;b=new c;b.setup([c.NOTEON,a,100]);this.trigger("note",b);this._last_key=k;return!0}};H.prototype.onMouseUp=function(f,h){if(!(0>h[1])){var k=this.getKeyIndex(h);this.keys[k]=!1;this._last_key=-1;var k=12*(this.properties.start_octave-1)+29+ -k,a=new c;a.setup([c.NOTEOFF,k,100]);this.trigger("note",a);return!0}};w.registerNodeType("midi/keys",H)})(this); -(function(B){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=v.getAudioContext().createGain();this.audionode.graphnode=this;this.audionode.gain.value=this.properties.gain;this.properties.src&&this.loadSound(this.properties.src)}function l(){this.properties={gain:0.5};this._audionodes=[];this._media_stream= -null;this.addOutput("out","audio");this.addInput("gain","number");this.audionode=v.getAudioContext().createGain();this.audionode.graphnode=this;this.audionode.gain.value=this.properties.gain}function u(){this.properties={fftSize:2048,minDecibels:-100,maxDecibels:-10,smoothingTimeConstant:0.5};this.audionode=v.getAudioContext().createAnalyser();this.audionode.graphnode=this;this.audionode.fftSize=this.properties.fftSize;this.audionode.minDecibels=this.properties.minDecibels;this.audionode.maxDecibels= -this.properties.maxDecibels;this.audionode.smoothingTimeConstant=this.properties.smoothingTimeConstant;this.addInput("in","audio");this.addOutput("freqs","array");this.addOutput("samples","array");this._time_bin=this._freq_bin=null}function r(){this.properties={gain:1};this.audionode=v.getAudioContext().createGain();this.addInput("in","audio");this.addInput("gain","number");this.addOutput("out","audio")}function t(){this.properties={impulse_src:"",normalize:!0};this.audionode=v.getAudioContext().createConvolver(); -this.addInput("in","audio");this.addOutput("out","audio")}function h(){this.properties={threshold:-50,knee:40,ratio:12,reduction:-20,attack:0,release:0.25};this.audionode=v.getAudioContext().createDynamicsCompressor();this.addInput("in","audio");this.addOutput("out","audio")}function C(){this.properties={};this.audionode=v.getAudioContext().createWaveShaper();this.addInput("in","audio");this.addInput("shape","waveshape");this.addOutput("out","audio")}function x(){this.properties={gain1:0.5,gain2:0.5}; -this.audionode=v.getAudioContext().createGain();this.audionode1=v.getAudioContext().createGain();this.audionode1.gain.value=this.properties.gain1;this.audionode2=v.getAudioContext().createGain();this.audionode2.gain.value=this.properties.gain2;this.audionode1.connect(this.audionode);this.audionode2.connect(this.audionode);this.addInput("in1","audio");this.addInput("in1 gain","number");this.addInput("in2","audio");this.addInput("in2 gain","number");this.addOutput("out","audio")}function G(){this.properties= -{A:0.1,D:0.1,S:0.1,R:0.1};this.audionode=v.getAudioContext().createGain();this.audionode.gain.value=0;this.addInput("in","audio");this.addInput("gate","bool");this.addOutput("out","audio");this.gate=!1}function A(){this.properties={delayTime:0.5};this.audionode=v.getAudioContext().createDelay(10);this.audionode.delayTime.value=this.properties.delayTime;this.addInput("in","audio");this.addInput("time","number");this.addOutput("out","audio")}function D(){this.properties={frequency:350,detune:0,Q:1}; -this.addProperty("type","lowpass","enum",{values:"lowpass highpass bandpass lowshelf highshelf peaking notch allpass".split(" ")});this.audionode=v.getAudioContext().createBiquadFilter();this.addInput("in","audio");this.addOutput("out","audio")}function f(){this.properties={frequency:440,detune:0,type:"sine"};this.addProperty("type","sine","enum",{values:["sine","square","sawtooth","triangle","custom"]});this.audionode=v.getAudioContext().createOscillator();this.addOutput("out","audio")}function q(){this.properties= -{continuous:!0,mark:-1};this.addInput("data","array");this.addInput("mark","number");this.size=[300,200];this._last_buffer=null}function H(){this.properties={band:440,amplitude:1};this.addInput("freqs","array");this.addOutput("signal","number")}function w(){if(!w.default_code){var c=w.default_function.toString(),a=c.indexOf("{")+1,b=c.lastIndexOf("}");w.default_code=c.substr(a,b-a)}this.properties={code:w.default_code};c=v.getAudioContext();c.createScriptProcessor?this.audionode=c.createScriptProcessor(4096, -1,1):(console.warn("ScriptProcessorNode deprecated"),this.audionode=c.createGain());this.processCode();w._bypass_function||(w._bypass_function=this.audionode.onaudioprocess);this.addInput("in","audio");this.addOutput("out","audio")}function L(){this.audionode=v.getAudioContext().destination;this.addInput("in","audio")}var n=B.LiteGraph,v={};B.LGAudio=v;v.getAudioContext=function(){if(!this._audio_context){window.AudioContext=window.AudioContext||window.webkitAudioContext;if(!window.AudioContext)return console.error("AudioContext not supported by browser"), -null;this._audio_context=new AudioContext;this._audio_context.onmessage=function(c){console.log("msg",c)};this._audio_context.onended=function(c){console.log("ended",c)};this._audio_context.oncomplete=function(c){console.log("complete",c)}}return this._audio_context};v.connect=function(c,a){try{c.connect(a)}catch(b){console.warn("LGraphAudio:",b)}};v.disconnect=function(c,a){try{c.disconnect(a)}catch(b){console.warn("LGraphAudio:",b)}};v.changeAllAudiosConnections=function(c,a){if(c.inputs)for(var b= -0;b b;b++)for(var d=0;d g+e||c[1]>d))return b}}return-1};H.prototype.onAction=function(f,h){if("reset"==f)for(var q=0;q h[1])){var q=this.getKeyIndex(h);this.keys[q]=!0;this._last_key=q;var q=12*(this.properties.start_octave-1)+29+q,a=new c;a.setup([c.NOTEON,q,100]);this.trigger("note",a);return!0}};H.prototype.onMouseMove=function(f,h){if(!(0>h[1]||-1==this._last_key)){this.setDirtyCanvas(!0); +var q=this.getKeyIndex(h);if(this._last_key==q)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[q]=!0;a=12*(this.properties.start_octave-1)+29+q;b=new c;b.setup([c.NOTEON,a,100]);this.trigger("note",b);this._last_key=q;return!0}};H.prototype.onMouseUp=function(f,h){if(!(0>h[1])){var q=this.getKeyIndex(h);this.keys[q]=!1;this._last_key=-1;var q=12*(this.properties.start_octave-1)+29+ +q,a=new c;a.setup([c.NOTEOFF,q,100]);this.trigger("note",a);return!0}};v.registerNodeType("midi/keys",H)})(this); +(function(B){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=w.getAudioContext().createGain();this.audionode.graphnode=this;this.audionode.gain.value=this.properties.gain;this.properties.src&&this.loadSound(this.properties.src)}function k(){this.properties={gain:0.5};this._audionodes=[];this._media_stream= +null;this.addOutput("out","audio");this.addInput("gain","number");this.audionode=w.getAudioContext().createGain();this.audionode.graphnode=this;this.audionode.gain.value=this.properties.gain}function u(){this.properties={fftSize:2048,minDecibels:-100,maxDecibels:-10,smoothingTimeConstant:0.5};this.audionode=w.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 s(){this.properties={gain:1};this.audionode=w.getAudioContext().createGain();this.addInput("in","audio");this.addInput("gain","number");this.addOutput("out","audio")}function t(){this.properties={impulse_src:"",normalize:!0};this.audionode=w.getAudioContext().createConvolver(); +this.addInput("in","audio");this.addOutput("out","audio")}function h(){this.properties={threshold:-50,knee:40,ratio:12,reduction:-20,attack:0,release:0.25};this.audionode=w.getAudioContext().createDynamicsCompressor();this.addInput("in","audio");this.addOutput("out","audio")}function C(){this.properties={};this.audionode=w.getAudioContext().createWaveShaper();this.addInput("in","audio");this.addInput("shape","waveshape");this.addOutput("out","audio")}function x(){this.properties={gain1:0.5,gain2:0.5}; +this.audionode=w.getAudioContext().createGain();this.audionode1=w.getAudioContext().createGain();this.audionode1.gain.value=this.properties.gain1;this.audionode2=w.getAudioContext().createGain();this.audionode2.gain.value=this.properties.gain2;this.audionode1.connect(this.audionode);this.audionode2.connect(this.audionode);this.addInput("in1","audio");this.addInput("in1 gain","number");this.addInput("in2","audio");this.addInput("in2 gain","number");this.addOutput("out","audio")}function G(){this.properties= +{A:0.1,D:0.1,S:0.1,R:0.1};this.audionode=w.getAudioContext().createGain();this.audionode.gain.value=0;this.addInput("in","audio");this.addInput("gate","bool");this.addOutput("out","audio");this.gate=!1}function A(){this.properties={delayTime:0.5};this.audionode=w.getAudioContext().createDelay(10);this.audionode.delayTime.value=this.properties.delayTime;this.addInput("in","audio");this.addInput("time","number");this.addOutput("out","audio")}function D(){this.properties={frequency:350,detune:0,Q:1}; +this.addProperty("type","lowpass","enum",{values:"lowpass highpass bandpass lowshelf highshelf peaking notch allpass".split(" ")});this.audionode=w.getAudioContext().createBiquadFilter();this.addInput("in","audio");this.addOutput("out","audio")}function f(){this.properties={frequency:440,detune:0,type:"sine"};this.addProperty("type","sine","enum",{values:["sine","square","sawtooth","triangle","custom"]});this.audionode=w.getAudioContext().createOscillator();this.addOutput("out","audio")}function n(){this.properties= +{continuous:!0,mark:-1};this.addInput("data","array");this.addInput("mark","number");this.size=[300,200];this._last_buffer=null}function H(){this.properties={band:440,amplitude:1};this.addInput("freqs","array");this.addOutput("signal","number")}function v(){if(!v.default_code){var c=v.default_function.toString(),a=c.indexOf("{")+1,b=c.lastIndexOf("}");v.default_code=c.substr(a,b-a)}this.properties={code:v.default_code};c=w.getAudioContext();c.createScriptProcessor?this.audionode=c.createScriptProcessor(4096, +1,1):(console.warn("ScriptProcessorNode deprecated"),this.audionode=c.createGain());this.processCode();v._bypass_function||(v._bypass_function=this.audionode.onaudioprocess);this.addInput("in","audio");this.addOutput("out","audio")}function L(){this.audionode=w.getAudioContext().destination;this.addInput("in","audio")}var l=B.LiteGraph,w={};B.LGAudio=w;w.getAudioContext=function(){if(!this._audio_context){window.AudioContext=window.AudioContext||window.webkitAudioContext;if(!window.AudioContext)return console.error("AudioContext not supported by browser"), +null;this._audio_context=new AudioContext;this._audio_context.onmessage=function(c){console.log("msg",c)};this._audio_context.onended=function(c){console.log("ended",c)};this._audio_context.oncomplete=function(c){console.log("complete",c)}}return this._audio_context};w.connect=function(c,a){try{c.connect(a)}catch(b){console.warn("LGraphAudio:",b)}};w.disconnect=function(c,a){try{c.disconnect(a)}catch(b){console.warn("LGraphAudio:",b)}};w.changeAllAudiosConnections=function(c,a){if(c.inputs)for(var b= +0;b =this.size[0]&&(f=this.size[0]-1),c.strokeStyle="red",c.beginPath(),c.moveTo(f,d),c.lineTo(f,0),c.stroke())}};q.title="Visualization";q.desc="Audio Visualization";n.registerNodeType("audio/visualization",q);H.prototype.onExecute=function(){if(this._freqs=this.getInputData(0)){var c=this.properties.band,a=this.getInputData(1); -void 0!==a&&(c=a);a=v.getAudioContext().sampleRate/this._freqs.length;a=c/a*2;a>=this._freqs.length?a=this._freqs[this._freqs.length-1]:(c=a|0,a-=c,a=this._freqs[c]*(1-a)+this._freqs[c+1]*a);this.setOutputData(0,a/255*this.properties.amplitude)}};H.prototype.onGetInputs=function(){return[["band","number"]]};H.title="Signal";H.desc="extract the signal of some frequency";n.registerNodeType("audio/signal",H);w.prototype.onAdded=function(c){c.status==LGraph.STATUS_RUNNING&&(this.audionode.onaudioprocess= -this._callback)};w["@code"]={widget:"code",type:"code"};w.prototype.onStart=function(){this.audionode.onaudioprocess=this._callback};w.prototype.onStop=function(){this.audionode.onaudioprocess=w._bypass_function};w.prototype.onPause=function(){this.audionode.onaudioprocess=w._bypass_function};w.prototype.onUnpause=function(){this.audionode.onaudioprocess=this._callback};w.prototype.onExecute=function(){};w.prototype.onRemoved=function(){this.audionode.onaudioprocess=w._bypass_function};w.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(c){console.error("Error in onaudioprocess code",c),this._callback=w._bypass_function,this.audionode.onaudioprocess=this._callback}};w.prototype.onPropertyChanged=function(c,a){"code"==c&&(this.properties.code=a,this.processCode(),this.graph&&this.graph.status==LGraph.STATUS_RUNNING&&(this.audionode.onaudioprocess=this._callback))}; -w.default_function=function(){this.onaudioprocess=function(c){var a=c.inputBuffer;c=c.outputBuffer;for(var b=0;b =this.size[0]&&(f=this.size[0]-1),c.strokeStyle="red",c.beginPath(),c.moveTo(f,d),c.lineTo(f,0),c.stroke())}};n.title="Visualization";n.desc="Audio Visualization";l.registerNodeType("audio/visualization",n);H.prototype.onExecute=function(){if(this._freqs=this.getInputData(0)){var c=this.properties.band,a=this.getInputData(1); +void 0!==a&&(c=a);a=w.getAudioContext().sampleRate/this._freqs.length;a=c/a*2;a>=this._freqs.length?a=this._freqs[this._freqs.length-1]:(c=a|0,a-=c,a=this._freqs[c]*(1-a)+this._freqs[c+1]*a);this.setOutputData(0,a/255*this.properties.amplitude)}};H.prototype.onGetInputs=function(){return[["band","number"]]};H.title="Signal";H.desc="extract the signal of some frequency";l.registerNodeType("audio/signal",H);v.prototype.onAdded=function(c){c.status==LGraph.STATUS_RUNNING&&(this.audionode.onaudioprocess= +this._callback)};v["@code"]={widget:"code",type:"code"};v.prototype.onStart=function(){this.audionode.onaudioprocess=this._callback};v.prototype.onStop=function(){this.audionode.onaudioprocess=v._bypass_function};v.prototype.onPause=function(){this.audionode.onaudioprocess=v._bypass_function};v.prototype.onUnpause=function(){this.audionode.onaudioprocess=this._callback};v.prototype.onExecute=function(){};v.prototype.onRemoved=function(){this.audionode.onaudioprocess=v._bypass_function};v.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(c){console.error("Error in onaudioprocess code",c),this._callback=v._bypass_function,this.audionode.onaudioprocess=this._callback}};v.prototype.onPropertyChanged=function(c,a){"code"==c&&(this.properties.code=a,this.processCode(),this.graph&&this.graph.status==LGraph.STATUS_RUNNING&&(this.audionode.onaudioprocess=this._callback))}; +v.default_function=function(){this.onaudioprocess=function(c){var a=c.inputBuffer;c=c.outputBuffer;for(var b=0;b "; + dialog.innerHTML = ""; + //dialog.innerHTML = ""; var title = dialog.querySelector(".name"); title.innerText = property; - var input = dialog.querySelector("input"); + var input = dialog.querySelector(".value"); if (input) { input.value = value; input.addEventListener("blur", function(e) { this.focus(); }); input.addEventListener("keydown", function(e) { - if (e.keyCode != 13) { + if (e.keyCode != 13 && e.target.localName != "textarea") { return; } inner(); @@ -9611,7 +9612,7 @@ LGraphNode.prototype.executeAction = function(action) } }; - LGraphCanvas.prototype.prompt = function(title, value, callback, event) { + LGraphCanvas.prototype.prompt = function(title, value, callback, event, multiline) { var that = this; var input_html = ""; title = title || ""; @@ -9620,8 +9621,10 @@ LGraphNode.prototype.executeAction = function(action) var dialog = document.createElement("div"); dialog.className = "graphdialog rounded"; - dialog.innerHTML = - " "; + if(multiline) + dialog.innerHTML = " "; + else + dialog.innerHTML = " "; dialog.close = function() { that.prompt_box = null; if (dialog.parentNode) { @@ -9653,13 +9656,13 @@ LGraphNode.prototype.executeAction = function(action) var value_element = dialog.querySelector(".value"); value_element.value = value; - var input = dialog.querySelector("input"); + var input = value_element; input.addEventListener("keydown", function(e) { modified = true; if (e.keyCode == 27) { //ESC dialog.close(); - } else if (e.keyCode == 13) { + } else if (e.keyCode == 13 && e.target.localName != "textarea") { if (callback) { callback(this.value); }