diff --git a/build/litegraph.js b/build/litegraph.js index fcc707be4..b7cd561ef 100644 --- a/build/litegraph.js +++ b/build/litegraph.js @@ -8624,6 +8624,7 @@ LGraphNode.prototype.executeAction = function(action) ctx.strokeStyle = outline_color; ctx.fillStyle = "#222"; ctx.textAlign = "left"; + //ctx.lineWidth = 2; if(w.disabled) ctx.globalAlpha *= 0.5; var widget_width = w.width || width; @@ -8771,13 +8772,15 @@ LGraphNode.prototype.executeAction = function(action) else ctx.rect( margin, posY, widget_width - margin * 2, H ); ctx.fill(); - if (show_text) { - ctx.save(); + if (show_text) { + if(!w.disabled) + ctx.stroke(); + ctx.save(); ctx.beginPath(); ctx.rect(margin, posY, widget_width - margin * 2, H); ctx.clip(); - ctx.stroke(); + //ctx.stroke(); ctx.fillStyle = secondary_text_color; if (w.name != null) { ctx.fillText(w.name, margin * 2, y + H * 0.7); @@ -8852,10 +8855,8 @@ LGraphNode.prototype.executeAction = function(action) break; case "slider": var range = w.options.max - w.options.min; - var nvalue = Math.clamp((x - 10) / (widget_width - 20), 0, 1); - w.value = - w.options.min + - (w.options.max - w.options.min) * nvalue; + var nvalue = Math.clamp((x - 15) / (widget_width - 30), 0, 1); + w.value = w.options.min + (w.options.max - w.options.min) * nvalue; if (w.callback) { setTimeout(function() { inner_value_change(w, w.value); @@ -8965,7 +8966,7 @@ LGraphNode.prototype.executeAction = function(action) this.value = v; inner_value_change(this, v); }.bind(w), - event); + event,w.options ? w.options.multiline : false ); } break; default: @@ -9552,18 +9553,18 @@ LGraphNode.prototype.executeAction = function(action) var dialog = document.createElement("div"); dialog.className = "graphdialog"; - dialog.innerHTML = - ""; + 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(); @@ -9613,7 +9614,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 || ""; @@ -9622,8 +9623,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) { @@ -9655,13 +9658,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); } diff --git a/build/litegraph.min.js b/build/litegraph.min.js index b61bf8cd1..b873ea917 100644 --- a/build/litegraph.min.js +++ b/build/litegraph.min.js @@ -1,4 +1,4 @@ -(function(B){function c(a){f.debug&&console.log("Graph created");this.list_of_graphcanvas=null;this.clear();a&&this.configure(a)}function l(a,b,d,g,e,f){this.id=a;this.type=b;this.origin_id=d;this.origin_slot=g;this.target_id=e;this.target_slot=f;this._data=null;this._pos=new Float32Array(2)}function u(a){this._ctor(a)}function r(a){this._ctor(a)}function t(a,b){this.offset=new Float32Array([0,0]);this.scale=1;this.max_scale=10;this.min_scale=0.1;this.onredraw=null;this.enabled=!0;this.last_mouse= +(function(B){function c(a){f.debug&&console.log("Graph created");this.list_of_graphcanvas=null;this.clear();a&&this.configure(a)}function k(a,b,d,g,e,f){this.id=a;this.type=b;this.origin_id=d;this.origin_slot=g;this.target_id=e;this.target_slot=f;this._data=null;this._pos=new Float32Array(2)}function u(a){this._ctor(a)}function s(a){this._ctor(a)}function t(a,b){this.offset=new Float32Array([0,0]);this.scale=1;this.max_scale=10;this.min_scale=0.1;this.onredraw=null;this.enabled=!0;this.last_mouse= [0,0];this.element=null;this.visible_area=new Float32Array(4);a&&(this.element=a,b||this.bindEvents(a))}function h(a,b,d){d=d||{};this.background_image=h.DEFAULT_BACKGROUND_IMAGE;a&&a.constructor===String&&(a=document.querySelector(a));this.ds=new t;this.zoom_modify_alpha=!0;this.title_text_font=""+f.NODE_TEXT_SIZE+"px Arial";this.inner_text_font="normal "+f.NODE_SUBTEXT_SIZE+"px Arial";this.node_title_color=f.NODE_TITLE_COLOR;this.default_link_color=f.LINK_COLOR;this.default_connection_color={input_off:"#778", input_on:"#7F7",output_off:"#778",output_on:"#7F7"};this.highquality_render=!0;this.use_gradients=!1;this.editor_alpha=1;this.pause_rendering=!1;this.clear_background=!0;this.read_only=!1;this.render_only_selected=!0;this.live_mode=!1;this.allow_searchbox=this.allow_interaction=this.allow_dragnodes=this.allow_dragcanvas=this.show_info=!0;this.drag_mode=this.allow_reconnect_links=!1;this.filter=this.dragging_rectangle=null;this.set_canvas_dirty_on_mouse_event=!0;this.always_render_background=!1;this.render_canvas_border= this.render_shadows=!0;this.render_connections_shadows=!1;this.render_connections_border=!0;this.render_connection_arrows=this.render_curved_connections=!1;this.render_collapsed_slots=!0;this.render_execution_order=!1;this.render_link_tooltip=this.render_title_colored=!0;this.links_render_mode=f.SPLINE_LINK;this.mouse=[0,0];this.canvas_mouse=this.graph_mouse=[0,0];this.onAfterChange=this.onBeforeChange=this.onConnectingChange=this.onSelectionChange=this.onNodeMoved=this.onDrawLinkTooltip=this.onDrawOverlay= @@ -6,15 +6,15 @@ this.onDrawForeground=this.onDrawBackground=this.onMouse=this.onSearchBoxSelecti function x(a,b,d,g,e,f){return da&&gb?!0:!1}function G(a,b){var d=a[0]+a[2],g=a[1]+a[3],e=b[1]+b[3];return a[0]>b[0]+b[2]||a[1]>e||ds.width-y.width-10&&(m=s.width-y.width-10);s.height&& -e>s.height-y.height-10&&(e=s.height-y.height-10)}f.style.left=m+"px";f.style.top=e+"px";b.scale&&(f.style.transform="scale("+b.scale+")")}function D(a){this.points=a;this.nearest=this.selected=-1;this.size=null;this.must_update=!0;this.margin=5}var f=B.LiteGraph={VERSION:0.4,CANVAS_GRID_SIZE:10,NODE_TITLE_HEIGHT:30,NODE_TITLE_TEXT_Y:20,NODE_SLOT_HEIGHT:20,NODE_WIDGET_HEIGHT:20,NODE_WIDTH:140,NODE_MIN_WIDTH:50,NODE_COLLAPSED_RADIUS:10,NODE_COLLAPSED_WIDTH:80,NODE_TITLE_COLOR:"#999",NODE_SELECTED_TITLE_COLOR:"#FFF", +"litemenu-title",e.innerHTML=b.title,f.appendChild(e));for(var m=e=0;mr.width-y.width-10&&(m=r.width-y.width-10);r.height&& +e>r.height-y.height-10&&(e=r.height-y.height-10)}f.style.left=m+"px";f.style.top=e+"px";b.scale&&(f.style.transform="scale("+b.scale+")")}function D(a){this.points=a;this.nearest=this.selected=-1;this.size=null;this.must_update=!0;this.margin=5}var f=B.LiteGraph={VERSION:0.4,CANVAS_GRID_SIZE:10,NODE_TITLE_HEIGHT:30,NODE_TITLE_TEXT_Y:20,NODE_SLOT_HEIGHT:20,NODE_WIDGET_HEIGHT:20,NODE_WIDTH:140,NODE_MIN_WIDTH:50,NODE_COLLAPSED_RADIUS:10,NODE_COLLAPSED_WIDTH:80,NODE_TITLE_COLOR:"#999",NODE_SELECTED_TITLE_COLOR:"#FFF", NODE_TEXT_SIZE:14,NODE_TEXT_COLOR:"#AAA",NODE_SUBTEXT_SIZE:12,NODE_DEFAULT_COLOR:"#333",NODE_DEFAULT_BGCOLOR:"#353535",NODE_DEFAULT_BOXCOLOR:"#666",NODE_DEFAULT_SHAPE:"box",NODE_BOX_OUTLINE_COLOR:"#FFF",DEFAULT_SHADOW_COLOR:"rgba(0,0,0,0.5)",DEFAULT_GROUP_FONT:24,WIDGET_BGCOLOR:"#222",WIDGET_OUTLINE_COLOR:"#666",WIDGET_TEXT_COLOR:"#DDD",WIDGET_SECONDARY_TEXT_COLOR:"#999",LINK_COLOR:"#9A9",EVENT_LINK_COLOR:"#A86",CONNECTING_LINK_COLOR:"#AFA",MAX_NUMBER_OF_NODES:1E3,DEFAULT_POSITION:[100,100],VALID_SHAPES:["default", "box","round","card"],BOX_SHAPE:1,ROUND_SHAPE:2,CIRCLE_SHAPE:3,CARD_SHAPE:4,ARROW_SHAPE:5,INPUT:1,OUTPUT:2,EVENT:-1,ACTION:-1,ALWAYS:0,ON_EVENT:1,NEVER:2,ON_TRIGGER:3,UP:1,DOWN:2,LEFT:3,RIGHT:4,CENTER:5,STRAIGHT_LINK:0,LINEAR_LINK:1,SPLINE_LINK:2,NORMAL_TITLE:0,NO_TITLE:1,TRANSPARENT_TITLE:2,AUTOHIDE_TITLE:3,proxy:null,node_images_path:"",debug:!1,catch_exceptions:!0,throw_errors:!0,allow_scripts:!1,registered_node_types:{},node_types_by_file_extension:{},Nodes:{},Globals:{},searchbox_extras:{},auto_sort_node_types:!1, registerNodeType:function(a,b){if(!b.prototype)throw"Cannot register a simple object, it must be a class with a prototype";b.type=a;f.debug&&console.log("Node registered: "+a);a.split("/");var d=b.name,g=a.lastIndexOf("/");b.category=a.substr(0,g);b.title||(b.title=d);if(b.prototype)for(var e in u.prototype)b.prototype[e]||(b.prototype[e]=u.prototype[e]);if(g=this.registered_node_types[a])console.log("replacing node type: "+a);else if(Object.hasOwnProperty(b.prototype,"shape")||Object.defineProperty(b.prototype, "shape",{set:function(a){switch(a){case "default":delete this._shape;break;case "box":this._shape=f.BOX_SHAPE;break;case "round":this._shape=f.ROUND_SHAPE;break;case "circle":this._shape=f.CIRCLE_SHAPE;break;case "card":this._shape=f.CARD_SHAPE;break;default:this._shape=a}},get:function(a){return this._shape},enumerable:!0,configurable:!0}),b.prototype.onPropertyChange&&console.warn("LiteGraph node class "+a+" has onPropertyChange method, it must be called onPropertyChanged with d at the end"),b.supported_extensions)for(e in b.supported_extensions){var E= b.supported_extensions[e];E&&E.constructor===String&&(this.node_types_by_file_extension[E.toLowerCase()]=b)}this.registered_node_types[a]=b;b.constructor.name&&(this.Nodes[d]=b);if(f.onNodeTypeRegistered)f.onNodeTypeRegistered(a,b);if(g&&f.onNodeTypeReplaced)f.onNodeTypeReplaced(a,b,g);b.prototype.onPropertyChange&&console.warn("LiteGraph node class "+a+" has onPropertyChange method, it must be called onPropertyChanged with d at the end");if(b.supported_extensions)for(e=0;em&&(m=e.size[0]),s+=e.size[1]+a+f.NODE_TITLE_HEIGHT;b+=m+a}this.setDirtyCanvas(!0,!0)};c.prototype.getTime=function(){return this.globaltime};c.prototype.getFixedTime=function(){return this.fixedtime};c.prototype.getElapsedTime=function(){return this.elapsed_time}; +this._nodes_executable=[];for(var a=0;am&&(m=e.size[0]),r+=e.size[1]+a+f.NODE_TITLE_HEIGHT;b+=m+a}this.setDirtyCanvas(!0,!0)};c.prototype.getTime=function(){return this.globaltime};c.prototype.getFixedTime=function(){return this.fixedtime};c.prototype.getElapsedTime=function(){return this.elapsed_time}; c.prototype.sendEventToAllNodes=function(a,b,d){d=d||f.ALWAYS;var g=this._nodes_in_order?this._nodes_in_order:this._nodes;if(g)for(var e=0,E=g.length;e=f.MAX_NUMBER_OF_NODES)throw"LiteGraph: max number of nodes in a graph reached";null==a.id||-1==a.id?a.id=++this.last_node_id:this.last_node_id=f.MAX_NUMBER_OF_NODES)throw"LiteGraph: max number of nodes in a graph reached";null==a.id||-1==a.id?a.id=++this.last_node_id:this.last_node_ida.length||(this._pos[0]=a[0],this._pos[1]=a[1])},get:function(){return this._pos},enumerable:!0});this.id=-1;this.type=null;this.inputs=[];this.outputs=[];this.connections=[];this.properties={};this.properties_info=[];this.flags={}};u.prototype.configure=function(a){this.graph&&this.graph._version++; for(var b in a)if("properties"==b)for(var d in a.properties){if(this.properties[d]=a.properties[d],this.onPropertyChanged)this.onPropertyChanged(d,a.properties[d])}else null!=a[b]&&("object"==typeof a[b]?this[b]&&this[b].configure?this[b].configure(a[b]):this[b]=f.cloneObject(a[b],this[b]):this[b]=a[b]);a.title||(this.title=this.constructor.title);if(this.onConnectionsChange){if(this.inputs)for(d=0;d=this.outputs.length)return f.debug&& console.log("Connect: Error, slot number not found"),null;b&&b.constructor===Number&&(b=this.graph.getNodeById(b));if(!b)throw"target node is null";if(b==this)return null;if(d.constructor===String){if(d=b.findInputSlot(d),-1==d)return f.debug&&console.log("Connect: Error, no slot of name "+d),null}else{if(d===f.EVENT)return null;if(!b.inputs||d>=b.inputs.length)return f.debug&&console.log("Connect: Error, slot number not found"),null}var g=!1;null!=b.inputs[d].link&&(this.graph.beforeChange(),b.disconnectInput(d), -g=!0);var e=this.outputs[a];if(b.onConnectInput&&!1===b.onConnectInput(d,e.type,e,this,a))return null;var c=b.inputs[d],m=null;if(!f.isValidConnection(e.type,c.type))return this.setDirtyCanvas(!1,!0),g&&this.graph.connectionChange(this,m),null;g||this.graph.beforeChange();m=new l(++this.graph.last_link_id,c.type,this.id,a,b.id,d);this.graph.links[m.id]=m;null==e.links&&(e.links=[]);e.links.push(m.id);b.inputs[d].link=m.id;this.graph&&this.graph._version++;if(this.onConnectionsChange)this.onConnectionsChange(f.OUTPUT, +g=!0);var e=this.outputs[a];if(b.onConnectInput&&!1===b.onConnectInput(d,e.type,e,this,a))return null;var c=b.inputs[d],m=null;if(!f.isValidConnection(e.type,c.type))return this.setDirtyCanvas(!1,!0),g&&this.graph.connectionChange(this,m),null;g||this.graph.beforeChange();m=new k(++this.graph.last_link_id,c.type,this.id,a,b.id,d);this.graph.links[m.id]=m;null==e.links&&(e.links=[]);e.links.push(m.id);b.inputs[d].link=m.id;this.graph&&this.graph._version++;if(this.onConnectionsChange)this.onConnectionsChange(f.OUTPUT, a,!0,m,e);if(b.onConnectionsChange)b.onConnectionsChange(f.INPUT,d,!0,m,c);this.graph&&this.graph.onNodeConnectionChange&&(this.graph.onNodeConnectionChange(f.INPUT,b,d,this,a),this.graph.onNodeConnectionChange(f.OUTPUT,this,a,b,d));this.setDirtyCanvas(!1,!0);this.graph.afterChange();this.graph.connectionChange(this,m);return m};u.prototype.disconnectOutput=function(a,b){if(a.constructor===String){if(a=this.findOutputSlot(a),-1==a)return f.debug&&console.log("Connect: Error, no slot of name "+a), -!1}else if(!this.outputs||a>=this.outputs.length)return f.debug&&console.log("Connect: Error, slot number not found"),!1;var d=this.outputs[a];if(!d||!d.links||0==d.links.length)return!1;if(b){b.constructor===Number&&(b=this.graph.getNodeById(b));if(!b)throw"Target Node not found";for(var g=0,e=d.links.length;g=this.outputs.length)return f.debug&&console.log("Connect: Error, slot number not found"),!1;var d=this.outputs[a];if(!d||!d.links||0==d.links.length)return!1;if(b){b.constructor===Number&&(b=this.graph.getNodeById(b));if(!b)throw"Target Node not found";for(var g=0,e=d.links.length;g=this.inputs.length)return f.debug&&console.log("Connect: Error, slot number not found"),!1;var b=this.inputs[a];if(!b)return!1;var d=this.inputs[a].link;if(null!=d){this.inputs[a].link=null;var g=this.graph.links[d]; -if(g){var e=this.graph.getNodeById(g.origin_id);if(!e)return!1;var c=e.outputs[g.origin_slot];if(!c||!c.links||0==c.links.length)return!1;for(var m=0,s=c.links.length;mb&&this.inputs[b].pos)return d[0]=this.pos[0]+this.inputs[b].pos[0],d[1]=this.pos[1]+this.inputs[b].pos[1],d;if(!a&&g>b&&this.outputs[b].pos)return d[0]=this.pos[0]+this.outputs[b].pos[0],d[1]=this.pos[1]+this.outputs[b].pos[1],d;if(this.horizontal)return d[0]=this.pos[0]+this.size[0]/g*(b+0.5),d[1]=a?this.pos[1]-f.NODE_TITLE_HEIGHT: this.pos[1]+this.size[1],d;d[0]=a?this.pos[0]+e:this.pos[0]+this.size[0]+1-e;d[1]=this.pos[1]+(b+0.7)*f.NODE_SLOT_HEIGHT+(this.constructor.slot_start_y||0);return d};u.prototype.alignToGrid=function(){this.pos[0]=f.CANVAS_GRID_SIZE*Math.round(this.pos[0]/f.CANVAS_GRID_SIZE);this.pos[1]=f.CANVAS_GRID_SIZE*Math.round(this.pos[1]/f.CANVAS_GRID_SIZE)};u.prototype.trace=function(a){this.console||(this.console=[]);this.console.push(a);this.console.length>u.MAX_CONSOLE&&this.console.shift();if(this.graph.onNodeTrace)this.graph.onNodeTrace(this, a)};u.prototype.setDirtyCanvas=function(a,b){this.graph&&this.graph.sendActionToCanvas("setDirty",[a,b])};u.prototype.loadImage=function(a){var b=new Image;b.src=f.node_images_path+a;b.ready=!1;var d=this;b.onload=function(){this.ready=!0;d.setDirtyCanvas(!0)};return b};u.prototype.captureInput=function(a){if(this.graph&&this.graph.list_of_graphcanvas)for(var b=this.graph.list_of_graphcanvas,d=0;da.length||(this._pos[0]=a[0],this._pos[1]=a[1])},get:function(){return this._pos},enumerable:!0});Object.defineProperty(this,"size",{set:function(a){!a||2>a.length||(this._size[0]=Math.max(140,a[0]),this._size[1]=Math.max(80,a[1]))},get:function(){return this._size}, -enumerable:!0})};r.prototype.configure=function(a){this.title=a.title;this._bounding.set(a.bounding);this.color=a.color;this.font=a.font};r.prototype.serialize=function(){var a=this._bounding;return{title:this.title,bounding:[Math.round(a[0]),Math.round(a[1]),Math.round(a[2]),Math.round(a[3])],color:this.color,font:this.font}};r.prototype.move=function(a,b,d){this._pos[0]+=a;this._pos[1]+=b;if(!d)for(d=0;df.getTime()-this.last_mouseclick;this.mouse[0]=a.localX;this.mouse[1]=a.localY;this.graph_mouse[0]=a.canvasX;this.graph_mouse[1]=a.canvasY;this.last_click_position=[this.mouse[0],this.mouse[1]];this.canvas.focus();f.closeAllContextMenus(b);if(!this.onMouse|| !0!=this.onMouse(a)){if(1==a.which){a.ctrlKey&&(this.dragging_rectangle=new Float32Array(4),this.dragging_rectangle[0]=a.canvasX,this.dragging_rectangle[1]=a.canvasY,this.dragging_rectangle[2]=1,this.dragging_rectangle[3]=1,e=!0);var m=!1;if(g&&this.allow_interaction&&!e&&!this.read_only){this.live_mode||g.flags.pinned||this.bringToFront(g);if(!this.connecting_node&&!g.flags.collapsed&&!this.live_mode)if(!e&&!1!==g.resizable&&x(a.canvasX,a.canvasY,g.pos[0]+g.size[0]-5,g.pos[1]+g.size[1]-5,10,10))this.graph.beforeChange(), -this.resizing_node=g,this.canvas.style.cursor="se-resize",e=!0;else{if(g.outputs)for(var s=0,y=g.outputs.length;sg.size[0]-f.NODE_TITLE_HEIGHT&&0>y[1]&&(d=this,setTimeout(function(){d.openSubgraph(g.subgraph)},10)),this.live_mode&& -(s=m=!0));s||(this.allow_dragnodes&&(this.graph.beforeChange(),this.node_dragged=g),this.selected_nodes[g.id]||this.processNodeSelected(g,a));this.dirty_canvas=!0}}else{if(!this.read_only)for(s=0;sy[0]+4||a.canvasYy[1]+4)){this.showLinkMenu(m,a);this.over_link_center=null;break}this.selected_group=this.graph.getGroupOnPos(a.canvasX,a.canvasY);this.selected_group_resizing=!1;this.selected_group&& +this.resizing_node=g,this.canvas.style.cursor="se-resize",e=!0;else{if(g.outputs)for(var r=0,y=g.outputs.length;rg.size[0]-f.NODE_TITLE_HEIGHT&&0>y[1]&&(d=this,setTimeout(function(){d.openSubgraph(g.subgraph)},10)),this.live_mode&& +(r=m=!0));r||(this.allow_dragnodes&&(this.graph.beforeChange(),this.node_dragged=g),this.selected_nodes[g.id]||this.processNodeSelected(g,a));this.dirty_canvas=!0}}else{if(!this.read_only)for(r=0;ry[0]+4||a.canvasYy[1]+4)){this.showLinkMenu(m,a);this.over_link_center=null;break}this.selected_group=this.graph.getGroupOnPos(a.canvasX,a.canvasY);this.selected_group_resizing=!1;this.selected_group&& !this.read_only&&(a.ctrlKey&&(this.dragging_rectangle=null),10>C([a.canvasX,a.canvasY],[this.selected_group.pos[0]+this.selected_group.size[0],this.selected_group.pos[1]+this.selected_group.size[1]])*this.ds.scale?this.selected_group_resizing=!0:this.selected_group.recomputeInsideNodes());c&&!this.read_only&&this.allow_searchbox&&this.showSearchBox(a);m=!0}!e&&m&&this.allow_dragcanvas&&(this.dragging_canvas=!0)}else 2!=a.which&&3==a.which&&(this.read_only||this.processContextMenu(g,a));this.last_mouse[0]= a.localX;this.last_mouse[1]=a.localY;this.last_mouseclick=f.getTime();this.last_mouse_dragging=!0;this.graph.change();(!b.document.activeElement||"input"!=b.document.activeElement.nodeName.toLowerCase()&&"textarea"!=b.document.activeElement.nodeName.toLowerCase())&&a.preventDefault();a.stopPropagation();if(this.onMouseDown)this.onMouseDown(a);return!1}}};h.prototype.processMouseMove=function(a){this.autoresize&&this.resize();this.set_canvas_dirty_on_mouse_event&&(this.dirty_canvas=!0);if(this.graph){h.active_canvas= this;this.adjustMouseEvent(a);var b=[a.localX,a.localY];this.mouse[0]=b[0];this.mouse[1]=b[1];var d=[b[0]-this.last_mouse[0],b[1]-this.last_mouse[1]];this.last_mouse=b;this.graph_mouse[0]=a.canvasX;this.graph_mouse[1]=a.canvasY;if(this.block_click)return a.preventDefault(),!1;a.dragging=this.last_mouse_dragging;this.node_widget&&(this.processNodeWidgets(this.node_widget[0],this.graph_mouse,a,this.node_widget[1]),this.dirty_canvas=!0);if(this.dragging_rectangle)this.dragging_rectangle[2]=a.canvasX- @@ -136,13 +136,13 @@ a.canvasY,this.visible_nodes))this.connecting_output.type==f.EVENT&&this.isOverN g,0)));this.connecting_node=this.connecting_pos=this.connecting_output=null;this.connecting_slot=-1}else if(this.resizing_node)this.dirty_bgcanvas=this.dirty_canvas=!0,this.graph.afterChange(this.resizing_node),this.resizing_node=null;else if(this.node_dragged){(g=this.node_dragged)&&300>a.click_time&&x(a.canvasX,a.canvasY,g.pos[0],g.pos[1]-f.NODE_TITLE_HEIGHT,f.NODE_TITLE_HEIGHT,f.NODE_TITLE_HEIGHT)&&g.collapse();this.dirty_bgcanvas=this.dirty_canvas=!0;this.node_dragged.pos[0]=Math.round(this.node_dragged.pos[0]); this.node_dragged.pos[1]=Math.round(this.node_dragged.pos[1]);this.graph.config.align_to_grid&&this.node_dragged.alignToGrid();if(this.onNodeMoved)this.onNodeMoved(this.node_dragged);this.graph.afterChange(this.node_dragged);this.node_dragged=null}else{g=this.graph.getNodeOnPos(a.canvasX,a.canvasY,this.visible_nodes);!g&&300>a.click_time&&this.deselectAllNodes();this.dirty_canvas=!0;this.dragging_canvas=!1;if(this.node_over&&this.node_over.onMouseUp)this.node_over.onMouseUp(a,[a.canvasX-this.node_over.pos[0], a.canvasY-this.node_over.pos[1]],this);if(this.node_capturing_input&&this.node_capturing_input.onMouseUp)this.node_capturing_input.onMouseUp(a,[a.canvasX-this.node_capturing_input.pos[0],a.canvasY-this.node_capturing_input.pos[1]])}}else 2==a.which?(this.dirty_canvas=!0,this.dragging_canvas=!1):3==a.which&&(this.dirty_canvas=!0,this.dragging_canvas=!1);this.graph.change();a.stopPropagation();a.preventDefault();return!1}};h.prototype.processMouseWheel=function(a){if(this.graph&&this.allow_dragcanvas){var b= -null!=a.wheelDeltaY?a.wheelDeltaY:-60*a.detail;this.adjustMouseEvent(a);var d=this.ds.scale;0b&&(d*=1/1.1);this.ds.changeScale(d,[a.localX,a.localY]);this.graph.change();a.preventDefault();return!1}};h.prototype.isOverNodeBox=function(a,b,d){var g=f.NODE_TITLE_HEIGHT;return x(b,d,a.pos[0]+2,a.pos[1]+2-g,g-4,g-4)?!0:!1};h.prototype.isOverNodeInput=function(a,b,d,g){if(a.inputs)for(var e=0,f=a.inputs.length;eb&&(d*=1/1.1);this.ds.changeScale(d,[a.localX,a.localY]);this.graph.change();a.preventDefault();return!1}};h.prototype.isOverNodeBox=function(a,b,d){var g=f.NODE_TITLE_HEIGHT;return x(b,d,a.pos[0]+2,a.pos[1]+2-g,g-4,g-4)?!0:!1};h.prototype.isOverNodeInput=function(a,b,d,g){if(a.inputs)for(var e=0,f=a.inputs.length;ed-this.graph._last_trigger_time)&&this.drawBackCanvas(); +return this.convertCanvasToOffset([a.clientX-b.left,a.clientY-b.top])};h.prototype.bringToFront=function(a){var b=this.graph._nodes.indexOf(a);-1!=b&&(this.graph._nodes.splice(b,1),this.graph._nodes.push(a))};h.prototype.sendToBack=function(a){var b=this.graph._nodes.indexOf(a);-1!=b&&(this.graph._nodes.splice(b,1),this.graph._nodes.unshift(a))};var n=new Float32Array(4);h.prototype.computeVisibleNodes=function(a,b){var d=b||[];d.length=0;a=a||this.graph._nodes;for(var g=0,e=a.length;gd-this.graph._last_trigger_time)&&this.drawBackCanvas(); (this.dirty_canvas||a)&&this.drawFrontCanvas();this.fps=this.render_time?1/this.render_time:0;this.frame+=1}};h.prototype.drawFrontCanvas=function(){this.dirty_canvas=!1;this.ctx||(this.ctx=this.bgcanvas.getContext("2d"));var a=this.ctx;if(a){a.start2D&&a.start2D();var b=this.canvas;a.restore();a.setTransform(1,0,0,1,0,0);this.dirty_area&&(a.save(),a.beginPath(),a.rect(this.dirty_area[0],this.dirty_area[1],this.dirty_area[2],this.dirty_area[3]),a.clip());this.clear_background&&a.clearRect(0,0,b.width, b.height);this.bgcanvas==this.canvas?this.drawBackCanvas():a.drawImage(this.bgcanvas,0,0);if(this.onRender)this.onRender(b,a);this.show_info&&this.renderInfo(a);if(this.graph){a.save();this.ds.toCanvasContext(a);for(var b=this.computeVisibleNodes(null,this.visible_nodes),d=0;d> ";b.fillText(g+d.getTitle(),0.5*a.width,40);b.restore()}d=!1;this.onRenderBackground&&(d=this.onRenderBackground(a,b));b.restore();b.setTransform(1,0,0,1,0,0);this.visible_links.length=0;if(this.graph){b.save();this.ds.toCanvasContext(b);if(this.background_image&&0.5this.ds.scale;if(this.live_mode){if(!a.flags.collapsed&&(b.shadowColor="transparent",a.onDrawForeground))a.onDrawForeground(b, -this,this.canvas)}else{var c=this.editor_alpha;b.globalAlpha=c;this.render_shadows&&!e?(b.shadowColor=f.DEFAULT_SHADOW_COLOR,b.shadowOffsetX=2*this.ds.scale,b.shadowOffsetY=2*this.ds.scale,b.shadowBlur=3*this.ds.scale):b.shadowColor="transparent";if(!a.flags.collapsed||!a.onDrawCollapsed||!0!=a.onDrawCollapsed(b,this)){var m=a._shape||f.BOX_SHAPE;H.set(a.size);var s=a.horizontal;if(a.flags.collapsed){b.font=this.inner_text_font;var y=a.getTitle?a.getTitle():a.title;null!=y&&(a._collapsed_width=Math.min(a.size[0], -b.measureText(y).width+2*f.NODE_TITLE_HEIGHT),H[0]=a._collapsed_width,H[1]=0)}a.clip_area&&(b.save(),b.beginPath(),m==f.BOX_SHAPE?b.rect(0,0,H[0],H[1]):m==f.ROUND_SHAPE?b.roundRect(0,0,H[0],H[1],10):m==f.CIRCLE_SHAPE&&b.arc(0.5*H[0],0.5*H[1],0.5*H[0],0,2*Math.PI),b.clip());a.has_errors&&(g="red");this.drawNodeShape(a,b,H,d,g,a.is_selected,a.mouseOver);b.shadowColor="transparent";if(a.onDrawForeground)a.onDrawForeground(b,this,this.canvas);b.textAlign=s?"center":"left";b.font=this.inner_text_font; -g=!e;m=this.connecting_output;b.lineWidth=1;var y=0,k=new Float32Array(2);if(!a.flags.collapsed){if(a.inputs)for(d=0;dthis.ds.scale,y=a._shape||a.constructor.shape||f.ROUND_SHAPE,k=a.constructor.title_mode,q=!0;k== -f.TRANSPARENT_TITLE?q=!1:k==f.AUTOHIDE_TITLE&&m&&(q=!0);w[0]=0;w[1]=q?-e:0;w[2]=d[0]+1;w[3]=q?d[1]+e:d[1];m=b.globalAlpha;b.beginPath();y==f.BOX_SHAPE||s?b.fillRect(w[0],w[1],w[2],w[3]):y==f.ROUND_SHAPE||y==f.CARD_SHAPE?b.roundRect(w[0],w[1],w[2],w[3],this.round_radius,y==f.CARD_SHAPE?0:this.round_radius):y==f.CIRCLE_SHAPE&&b.arc(0.5*d[0],0.5*d[1],0.5*d[0],0,2*Math.PI);b.fill();a.flags.collapsed||(b.shadowColor="transparent",b.fillStyle="rgba(0,0,0,0.2)",b.fillRect(0,-1,w[2],2));b.shadowColor="transparent"; -if(a.onDrawBackground)a.onDrawBackground(b,this,this.canvas,this.graph_mouse);if(q||k==f.TRANSPARENT_TITLE){if(a.onDrawTitleBar)a.onDrawTitleBar(b,e,d,this.ds.scale,g);else if(k!=f.TRANSPARENT_TITLE&&(a.constructor.title_color||this.render_title_colored)){q=a.constructor.title_color||g;a.flags.collapsed&&(b.shadowColor=f.DEFAULT_SHADOW_COLOR);if(this.use_gradients){var z=h.gradients[q];z||(z=h.gradients[q]=b.createLinearGradient(0,0,400,0),z.addColorStop(0,q),z.addColorStop(1,"#000"));b.fillStyle= -z}else b.fillStyle=q;b.beginPath();y==f.BOX_SHAPE||s?b.rect(0,-e,d[0]+1,e):y!=f.ROUND_SHAPE&&y!=f.CARD_SHAPE||b.roundRect(0,-e,d[0]+1,e,this.round_radius,a.flags.collapsed?this.round_radius:0);b.fill();b.shadowColor="transparent"}if(a.onDrawTitleBox)a.onDrawTitleBox(b,e,d,this.ds.scale);else y==f.ROUND_SHAPE||y==f.CIRCLE_SHAPE||y==f.CARD_SHAPE?(s&&(b.fillStyle="black",b.beginPath(),b.arc(0.5*e,-0.5*e,6,0,2*Math.PI),b.fill()),b.fillStyle=a.boxcolor||f.NODE_DEFAULT_BOXCOLOR,s?b.fillRect(0.5*e-5,-0.5* -e-5,10,10):(b.beginPath(),b.arc(0.5*e,-0.5*e,5,0,2*Math.PI),b.fill())):(s&&(b.fillStyle="black",b.fillRect(0.5*(e-10)-1,-0.5*(e+10)-1,12,12)),b.fillStyle=a.boxcolor||f.NODE_DEFAULT_BOXCOLOR,b.fillRect(0.5*(e-10),-0.5*(e+10),10,10));b.globalAlpha=m;if(a.onDrawTitleText)a.onDrawTitleText(b,e,d,this.ds.scale,this.title_text_font,c);!s&&(b.font=this.title_text_font,m=String(a.getTitle()))&&(b.fillStyle=c?f.NODE_SELECTED_TITLE_COLOR:a.constructor.title_text_color||this.node_title_color,a.flags.collapsed? -(b.textAlign="left",b.measureText(m),b.fillText(m.substr(0,20),e,f.NODE_TITLE_TEXT_Y-e),b.textAlign="left"):(b.textAlign="left",b.fillText(m,e,f.NODE_TITLE_TEXT_Y-e)));a.flags.collapsed||!a.subgraph||a.skip_subgraph_button||(m=f.NODE_TITLE_HEIGHT,q=a.size[0]-m,z=f.isInsideRectangle(this.graph_mouse[0]-a.pos[0],this.graph_mouse[1]-a.pos[1],q+2,-m+2,m-4,m-4),b.fillStyle=z?"#888":"#555",y==f.BOX_SHAPE||s?b.fillRect(q+2,-m+2,m-4,m-4):(b.beginPath(),b.roundRect(q+2,-m+2,m-4,m-4,4),b.fill()),b.fillStyle= -"#333",b.beginPath(),b.moveTo(q+0.2*m,0.6*-m),b.lineTo(q+0.8*m,0.6*-m),b.lineTo(q+0.5*m,0.3*-m),b.fill());if(a.onDrawTitle)a.onDrawTitle(b)}if(c){if(a.onBounding)a.onBounding(w);k==f.TRANSPARENT_TITLE&&(w[1]-=e,w[3]+=e);b.lineWidth=1;b.globalAlpha=0.8;b.beginPath();y==f.BOX_SHAPE?b.rect(-6+w[0],-6+w[1],12+w[2],12+w[3]):y==f.ROUND_SHAPE||y==f.CARD_SHAPE&&a.flags.collapsed?b.roundRect(-6+w[0],-6+w[1],12+w[2],12+w[3],2*this.round_radius):y==f.CARD_SHAPE?b.roundRect(-6+w[0],-6+w[1],12+w[2],12+w[3],2* -this.round_radius,2):y==f.CIRCLE_SHAPE&&b.arc(0.5*d[0],0.5*d[1],0.5*d[0]+6,0,2*Math.PI);b.strokeStyle=f.NODE_BOX_OUTLINE_COLOR;b.stroke();b.strokeStyle=g;b.globalAlpha=1}};var L=new Float32Array(4),n=new Float32Array(4),v=new Float32Array(2),k=new Float32Array(2);h.prototype.drawConnections=function(a){var b=f.getTime(),d=this.visible_area;L[0]=d[0]-20;L[1]=d[1]-20;L[2]=d[2]+40;L[3]=d[3]+40;a.lineWidth=this.connections_width;a.fillStyle="#AAA";a.strokeStyle="#AAA";a.globalAlpha=this.editor_alpha; -for(var d=this.graph._nodes,g=0,e=d.length;gn[2]&&(n[0]+=n[2],n[2]=Math.abs(n[2]));0>n[3]&&(n[1]+=n[3],n[3]=Math.abs(n[3]));if(G(n, -L)){var F=y.outputs[q],q=c.inputs[m];if(F&&q&&(y=F.dir||(y.horizontal?f.DOWN:f.RIGHT),q=q.dir||(c.horizontal?f.UP:f.LEFT),this.renderLink(a,h,z,s,!1,0,null,y,q),s&&s._last_time&&1E3>b-s._last_time)){var F=2-0.002*(b-s._last_time),r=a.globalAlpha;a.globalAlpha=r*F;this.renderLink(a,h,z,s,!0,F,"white",y,q);a.globalAlpha=r}}}}}}a.globalAlpha=1};h.prototype.renderLink=function(a,b,d,g,e,c,m,s,y,k){g&&this.visible_links.push(g);!m&&g&&(m=g.color||h.link_type_colors[g.type]);m||(m=this.default_link_color); -null!=g&&this.highlighted_links[g.id]&&(m="#FFF");s=s||f.RIGHT;y=y||f.LEFT;var q=C(b,d);this.render_connections_border&&0.6b[1]?0:Math.PI,a.save(),a.translate(z[0],z[1]),a.rotate(F),a.beginPath(),a.moveTo(-5,-3),a.lineTo(0,7),a.lineTo(5,-3),a.fill(),a.restore(),a.save(),a.translate(k[0], -k[1]),a.rotate(n),a.beginPath(),a.moveTo(-5,-3),a.lineTo(0,7),a.lineTo(5,-3),a.fill(),a.restore()),a.beginPath(),a.arc(e[0],e[1],5,0,2*Math.PI),a.fill());if(c)for(a.fillStyle=m,z=0;5>z;++z)c=(0.001*f.getTime()+0.2*z)%1,e=this.computeConnectionPoint(b,d,c,s,y),a.beginPath(),a.arc(e[0],e[1],5,0,2*Math.PI),a.fill()};h.prototype.computeConnectionPoint=function(a,b,d,g,e){g=g||f.RIGHT;e=e||f.LEFT;var c=C(a,b),m=[a[0],a[1]],s=[b[0],b[1]];switch(g){case f.LEFT:m[0]+=-0.25*c;break;case f.RIGHT:m[0]+=0.25* -c;break;case f.UP:m[1]+=-0.25*c;break;case f.DOWN:m[1]+=0.25*c}switch(e){case f.LEFT:s[0]+=-0.25*c;break;case f.RIGHT:s[0]+=0.25*c;break;case f.UP:s[1]+=-0.25*c;break;case f.DOWN:s[1]+=0.25*c}g=(1-d)*(1-d)*(1-d);e=3*(1-d)*(1-d)*d;c=3*(1-d)*d*d;d*=d*d;return[g*a[0]+e*m[0]+c*s[0]+d*b[0],g*a[1]+e*m[1]+c*s[1]+d*b[1]]};h.prototype.drawExecutionOrder=function(a){a.shadowColor="transparent";a.globalAlpha=0.25;a.textAlign="center";a.strokeStyle="white";a.globalAlpha=0.75;for(var b=this.visible_nodes,d=0;d< +3,a.fillStyle="#454",a.beginPath(),a.roundRect(d[0]-0.5*g,d[1]-15-24,g,24,3,3),a.moveTo(d[0]-10,d[1]-15),a.lineTo(d[0]+10,d[1]-15),a.lineTo(d[0],d[1]-5),a.fill(),a.shadowColor="transparent",a.textAlign="center",a.fillStyle="#CEC",a.fillText(e,d[0],d[1]-15-24*0.3))}};var v=new Float32Array(4);h.prototype.drawNodeShape=function(a,b,d,g,e,c,m){b.strokeStyle=g;b.fillStyle=e;e=f.NODE_TITLE_HEIGHT;var r=0.5>this.ds.scale,y=a._shape||a.constructor.shape||f.ROUND_SHAPE,q=a.constructor.title_mode,n=!0;q== +f.TRANSPARENT_TITLE?n=!1:q==f.AUTOHIDE_TITLE&&m&&(n=!0);v[0]=0;v[1]=n?-e:0;v[2]=d[0]+1;v[3]=n?d[1]+e:d[1];m=b.globalAlpha;b.beginPath();y==f.BOX_SHAPE||r?b.fillRect(v[0],v[1],v[2],v[3]):y==f.ROUND_SHAPE||y==f.CARD_SHAPE?b.roundRect(v[0],v[1],v[2],v[3],this.round_radius,y==f.CARD_SHAPE?0:this.round_radius):y==f.CIRCLE_SHAPE&&b.arc(0.5*d[0],0.5*d[1],0.5*d[0],0,2*Math.PI);b.fill();a.flags.collapsed||(b.shadowColor="transparent",b.fillStyle="rgba(0,0,0,0.2)",b.fillRect(0,-1,v[2],2));b.shadowColor="transparent"; +if(a.onDrawBackground)a.onDrawBackground(b,this,this.canvas,this.graph_mouse);if(n||q==f.TRANSPARENT_TITLE){if(a.onDrawTitleBar)a.onDrawTitleBar(b,e,d,this.ds.scale,g);else if(q!=f.TRANSPARENT_TITLE&&(a.constructor.title_color||this.render_title_colored)){n=a.constructor.title_color||g;a.flags.collapsed&&(b.shadowColor=f.DEFAULT_SHADOW_COLOR);if(this.use_gradients){var z=h.gradients[n];z||(z=h.gradients[n]=b.createLinearGradient(0,0,400,0),z.addColorStop(0,n),z.addColorStop(1,"#000"));b.fillStyle= +z}else b.fillStyle=n;b.beginPath();y==f.BOX_SHAPE||r?b.rect(0,-e,d[0]+1,e):y!=f.ROUND_SHAPE&&y!=f.CARD_SHAPE||b.roundRect(0,-e,d[0]+1,e,this.round_radius,a.flags.collapsed?this.round_radius:0);b.fill();b.shadowColor="transparent"}if(a.onDrawTitleBox)a.onDrawTitleBox(b,e,d,this.ds.scale);else y==f.ROUND_SHAPE||y==f.CIRCLE_SHAPE||y==f.CARD_SHAPE?(r&&(b.fillStyle="black",b.beginPath(),b.arc(0.5*e,-0.5*e,6,0,2*Math.PI),b.fill()),b.fillStyle=a.boxcolor||f.NODE_DEFAULT_BOXCOLOR,r?b.fillRect(0.5*e-5,-0.5* +e-5,10,10):(b.beginPath(),b.arc(0.5*e,-0.5*e,5,0,2*Math.PI),b.fill())):(r&&(b.fillStyle="black",b.fillRect(0.5*(e-10)-1,-0.5*(e+10)-1,12,12)),b.fillStyle=a.boxcolor||f.NODE_DEFAULT_BOXCOLOR,b.fillRect(0.5*(e-10),-0.5*(e+10),10,10));b.globalAlpha=m;if(a.onDrawTitleText)a.onDrawTitleText(b,e,d,this.ds.scale,this.title_text_font,c);!r&&(b.font=this.title_text_font,m=String(a.getTitle()))&&(b.fillStyle=c?f.NODE_SELECTED_TITLE_COLOR:a.constructor.title_text_color||this.node_title_color,a.flags.collapsed? +(b.textAlign="left",b.measureText(m),b.fillText(m.substr(0,20),e,f.NODE_TITLE_TEXT_Y-e),b.textAlign="left"):(b.textAlign="left",b.fillText(m,e,f.NODE_TITLE_TEXT_Y-e)));a.flags.collapsed||!a.subgraph||a.skip_subgraph_button||(m=f.NODE_TITLE_HEIGHT,n=a.size[0]-m,z=f.isInsideRectangle(this.graph_mouse[0]-a.pos[0],this.graph_mouse[1]-a.pos[1],n+2,-m+2,m-4,m-4),b.fillStyle=z?"#888":"#555",y==f.BOX_SHAPE||r?b.fillRect(n+2,-m+2,m-4,m-4):(b.beginPath(),b.roundRect(n+2,-m+2,m-4,m-4,4),b.fill()),b.fillStyle= +"#333",b.beginPath(),b.moveTo(n+0.2*m,0.6*-m),b.lineTo(n+0.8*m,0.6*-m),b.lineTo(n+0.5*m,0.3*-m),b.fill());if(a.onDrawTitle)a.onDrawTitle(b)}if(c){if(a.onBounding)a.onBounding(v);q==f.TRANSPARENT_TITLE&&(v[1]-=e,v[3]+=e);b.lineWidth=1;b.globalAlpha=0.8;b.beginPath();y==f.BOX_SHAPE?b.rect(-6+v[0],-6+v[1],12+v[2],12+v[3]):y==f.ROUND_SHAPE||y==f.CARD_SHAPE&&a.flags.collapsed?b.roundRect(-6+v[0],-6+v[1],12+v[2],12+v[3],2*this.round_radius):y==f.CARD_SHAPE?b.roundRect(-6+v[0],-6+v[1],12+v[2],12+v[3],2* +this.round_radius,2):y==f.CIRCLE_SHAPE&&b.arc(0.5*d[0],0.5*d[1],0.5*d[0]+6,0,2*Math.PI);b.strokeStyle=f.NODE_BOX_OUTLINE_COLOR;b.stroke();b.strokeStyle=g;b.globalAlpha=1}};var L=new Float32Array(4),l=new Float32Array(4),w=new Float32Array(2),q=new Float32Array(2);h.prototype.drawConnections=function(a){var b=f.getTime(),d=this.visible_area;L[0]=d[0]-20;L[1]=d[1]-20;L[2]=d[2]+40;L[3]=d[3]+40;a.lineWidth=this.connections_width;a.fillStyle="#AAA";a.strokeStyle="#AAA";a.globalAlpha=this.editor_alpha; +for(var d=this.graph._nodes,g=0,e=d.length;gl[2]&&(l[0]+=l[2],l[2]=Math.abs(l[2]));0>l[3]&&(l[1]+=l[3],l[3]=Math.abs(l[3]));if(G(l, +L)){var F=y.outputs[n],n=c.inputs[m];if(F&&n&&(y=F.dir||(y.horizontal?f.DOWN:f.RIGHT),n=n.dir||(c.horizontal?f.UP:f.LEFT),this.renderLink(a,h,z,r,!1,0,null,y,n),r&&r._last_time&&1E3>b-r._last_time)){var F=2-0.002*(b-r._last_time),s=a.globalAlpha;a.globalAlpha=s*F;this.renderLink(a,h,z,r,!0,F,"white",y,n);a.globalAlpha=s}}}}}}a.globalAlpha=1};h.prototype.renderLink=function(a,b,d,g,e,c,m,r,y,q){g&&this.visible_links.push(g);!m&&g&&(m=g.color||h.link_type_colors[g.type]);m||(m=this.default_link_color); +null!=g&&this.highlighted_links[g.id]&&(m="#FFF");r=r||f.RIGHT;y=y||f.LEFT;var n=C(b,d);this.render_connections_border&&0.6b[1]?0:Math.PI,a.save(),a.translate(z[0],z[1]),a.rotate(F),a.beginPath(),a.moveTo(-5,-3),a.lineTo(0,7),a.lineTo(5,-3),a.fill(),a.restore(),a.save(),a.translate(q[0], +q[1]),a.rotate(l),a.beginPath(),a.moveTo(-5,-3),a.lineTo(0,7),a.lineTo(5,-3),a.fill(),a.restore()),a.beginPath(),a.arc(e[0],e[1],5,0,2*Math.PI),a.fill());if(c)for(a.fillStyle=m,z=0;5>z;++z)c=(0.001*f.getTime()+0.2*z)%1,e=this.computeConnectionPoint(b,d,c,r,y),a.beginPath(),a.arc(e[0],e[1],5,0,2*Math.PI),a.fill()};h.prototype.computeConnectionPoint=function(a,b,d,g,e){g=g||f.RIGHT;e=e||f.LEFT;var c=C(a,b),m=[a[0],a[1]],r=[b[0],b[1]];switch(g){case f.LEFT:m[0]+=-0.25*c;break;case f.RIGHT:m[0]+=0.25* +c;break;case f.UP:m[1]+=-0.25*c;break;case f.DOWN:m[1]+=0.25*c}switch(e){case f.LEFT:r[0]+=-0.25*c;break;case f.RIGHT:r[0]+=0.25*c;break;case f.UP:r[1]+=-0.25*c;break;case f.DOWN:r[1]+=0.25*c}g=(1-d)*(1-d)*(1-d);e=3*(1-d)*(1-d)*d;c=3*(1-d)*d*d;d*=d*d;return[g*a[0]+e*m[0]+c*r[0]+d*b[0],g*a[1]+e*m[1]+c*r[1]+d*b[1]]};h.prototype.drawExecutionOrder=function(a){a.shadowColor="transparent";a.globalAlpha=0.25;a.textAlign="center";a.strokeStyle="white";a.globalAlpha=0.75;for(var b=this.visible_nodes,d=0;d< b.length;++d){var g=b[d];a.fillStyle="black";a.fillRect(g.pos[0]-f.NODE_TITLE_HEIGHT,g.pos[1]-f.NODE_TITLE_HEIGHT,f.NODE_TITLE_HEIGHT,f.NODE_TITLE_HEIGHT);0==g.order&&a.strokeRect(g.pos[0]-f.NODE_TITLE_HEIGHT+0.5,g.pos[1]-f.NODE_TITLE_HEIGHT+0.5,f.NODE_TITLE_HEIGHT,f.NODE_TITLE_HEIGHT);a.fillStyle="#FFF";a.fillText(g.order,g.pos[0]+-0.5*f.NODE_TITLE_HEIGHT,g.pos[1]-6)}a.globalAlpha=1};h.prototype.drawNodeWidgets=function(a,b,d,g){if(!a.widgets||!a.widgets.length)return 0;var e=a.size[0],c=a.widgets; -b+=2;var m=f.NODE_WIDGET_HEIGHT,s=0.5c||c>h-12||mn.last_y+F)){g=n.value;switch(n.type){case "button":if("mousemove"===d.type)break;n.callback&&setTimeout(function(){n.callback(n,y,a,b,d)},20);this.dirty_canvas=n.clicked=!0;break;case "slider":k=Math.clamp((c-10)/(h-20),0,1);n.value=n.options.min+(n.options.max-n.options.min)*k;n.callback&&setTimeout(function(){e(n, -n.value)},20);this.dirty_canvas=!0;break;case "number":case "combo":g=n.value;if("mousemove"==d.type&&"number"==n.type)n.value+=0.1*d.deltaX*(n.options.step||1),null!=n.options.min&&n.valuen.options.max&&(n.value=n.options.max);else if("mousedown"==d.type){var J=n.options.values;J&&J.constructor===Function&&(J=n.options.values(n,a));var I=null;"number"!=n.type&&(I=J.constructor===Array?J:Object.keys(J));c=40>c?-1:c>h-40?1:0;if("number"== -n.type)n.value+=0.1*c*(n.options.step||1),null!=n.options.min&&n.valuen.options.max&&(n.value=n.options.max);else if(c)k=-1,this.last_mouseclick=0,k=J.constructor===Object?I.indexOf(String(n.value))+c:I.indexOf(n.value)+c,k>=I.length&&(k=I.length-1),0>k&&(k=0),n.value=J.constructor===Array?J[k]:k;else{var v=J!=I?Object.values(J):J;new f.ContextMenu(v,{scale:Math.max(1,this.ds.scale),event:d,className:"dark",callback:r.bind(n)},k); -var r=function(a,b,d){J!=I&&(a=v.indexOf(a));this.value=a;e(this,a);y.dirty_canvas=!0;return!1}}}else"mouseup"==d.type&&"number"==n.type&&(c=40>c?-1:c>h-40?1:0,200>d.click_time&&0==c&&this.prompt("Value",n.value,function(a){this.value=Number(a);e(this,this.value)}.bind(n),d));g!=n.value&&setTimeout(function(){e(this,this.value)}.bind(n),20);this.dirty_canvas=!0;break;case "toggle":"mousedown"==d.type&&(n.value=!n.value,setTimeout(function(){e(n,n.value)},20));break;case "string":case "text":"mousedown"== -d.type&&this.prompt("Value",n.value,function(a){this.value=a;e(this,a)}.bind(n),d);break;default:n.mouse&&(this.dirty_canvas=n.mouse(d,[c,m],a))}if(g!=n.value){if(a.onWidgetChanged)a.onWidgetChanged(n.name,n.value,g,n);a.graph._version++}return n}}}return null};h.prototype.drawGroups=function(a,b){if(this.graph){var d=this.graph._groups;b.save();b.globalAlpha=0.5*this.editor_alpha;for(var g=0;gd&&0.01>b.editor_alpha&&(clearInterval(g),1>d&&(b.live_mode=!0));1"+(n.label?n.label:k)+""+a+"",value:k})}if(s.length)return new f.ContextMenu(s,{event:d,callback:c,parentMenu:g,allow_html:!0,node:e},b),!1}};h.decodeHTML=function(a){var b= -document.createElement("div");b.innerText=a;return b.innerHTML};h.onResizeNode=function(a,b,d,g,e){if(e){e.size=e.computeSize();if(e.onResize)e.onResize(e.size);e.setDirtyCanvas(!0,!0)}};h.prototype.showLinkMenu=function(a,b){var d=this;console.log(a);var g=new f.ContextMenu(["Add Node",null,"Delete"],{event:b,title:null!=a.data?a.data.constructor.name:null,callback:function(b,f,c){switch(b){case "Add Node":h.onMenuAdd(null,null,c,g,function(b){console.log("node autoconnect");var e=d.graph.getNodeById(a.origin_id), -g=d.graph.getNodeById(a.target_id);b.inputs&&b.inputs.length&&b.outputs&&b.outputs.length&&e.outputs[a.origin_slot].type==b.inputs[0].type&&b.outputs[0].type==g.inputs[0].type&&(e.connect(a.origin_slot,b,0),b.connect(0,g,a.target_slot),b.pos[0]-=0.5*b.size[0])});break;case "Delete":d.graph.removeLink(a.id)}}});return!1};h.onShowPropertyEditor=function(a,b,d,g,e){function f(){var b=k.value;"Number"==a.type?b=Number(b):"Boolean"==a.type&&(b=Boolean(b));e[c]=b;s.parentNode&&s.parentNode.removeChild(s); -e.setDirtyCanvas(!0,!0)}var c=a.property||"title";b=e[c];var s=document.createElement("div");s.className="graphdialog";s.innerHTML="";s.querySelector(".name").innerText=c;var k=s.querySelector("input");k&&(k.value=b,k.addEventListener("blur",function(a){this.focus()}),k.addEventListener("keydown",function(a){13==a.keyCode&&(f(),a.preventDefault(),a.stopPropagation())}));b=h.active_canvas.canvas;d=b.getBoundingClientRect(); -var n=g=-20;d&&(g-=d.left,n-=d.top);event?(s.style.left=event.clientX+g+"px",s.style.top=event.clientY+n+"px"):(s.style.left=0.5*b.width+g+"px",s.style.top=0.5*b.height+n+"px");s.querySelector("button").addEventListener("click",f);b.parentNode.appendChild(s)};h.prototype.prompt=function(a,b,d,g){var e=this;a=a||"";var f=!1,c=document.createElement("div");c.className="graphdialog rounded";c.innerHTML=" "; -c.close=function(){e.prompt_box=null;c.parentNode&&c.parentNode.removeChild(c)};1h.search_limit)break}}k= -null;if(Array.prototype.filter)k=Object.keys(f.registered_node_types).filter(y);else for(m in k=[],f.registered_node_types)y(m)&&k.push(m);for(m=0;mh.search_limit);m++);var y=function(a){var b=f.registered_node_types[a];return s&&b.filter!=s?!1:-1!==a.toLowerCase().indexOf(d)}}}var e=this,c=h.active_canvas,m=c.canvas,s=m.ownerDocument||document,k=document.createElement("div");k.className="litegraph litesearchbox graphdialog rounded";k.innerHTML="Search
"; -k.close=function(){e.search_box=null;s.body.focus();s.body.style.overflow="";setTimeout(function(){e.canvas.focus()},20);k.parentNode&&k.parentNode.removeChild(k)};var n=null;1m.height-200&&(q.style.maxHeight=m.height-a.layerY-20+"px");J.focus();return k};h.prototype.showEditPropertyValue=function(a,b,d){function g(){e(h.value)}function e(e){f&&f.values&&f.values.constructor===Object&&void 0!=f.values[e]&&(e=f.values[e]);"number"==typeof a.properties[b]&&(e=Number(e));if("array"==c||"object"==c)e=JSON.parse(e);a.properties[b]= -e;a.graph&&a.graph._version++;if(a.onPropertyChanged)a.onPropertyChanged(b,e);if(d.onclose)d.onclose();q.close();a.setDirtyCanvas(!0,!0)}if(a&&void 0!==a.properties[b]){d=d||{};var f=a.getPropertyInfo(b),c=f.type,s="";if("string"==c||"number"==c||"array"==c||"object"==c)s="";else if("enum"!=c&&"combo"!=c||!f.values)if("boolean"==c)s="";else{console.warn("unknown type: "+c); -return}else{var s=""}var q=this.createDialog(""+(f.label?f.label:b)+""+s+"",d);if("enum"!=c&&"combo"!=c||!f.values)if("boolean"==c)(h=q.querySelector("input"))&&h.addEventListener("click",function(a){e(!!h.checked)});else{if(h=q.querySelector("input"))h.addEventListener("blur", -function(a){this.focus()}),n=void 0!==a.properties[b]?a.properties[b]:"","string"!==c&&(n=JSON.stringify(n)),h.value=n,h.addEventListener("keydown",function(a){13==a.keyCode&&(g(),a.preventDefault(),a.stopPropagation())})}else{var h=q.querySelector("select");h.addEventListener("change",function(a){e(a.target.value)})}q.querySelector("button").addEventListener("click",g);return q}};h.prototype.createDialog=function(a,b){b=b||{};var d=document.createElement("div");d.className="graphdialog";d.innerHTML= -a;var g=this.canvas.getBoundingClientRect(),e=-20,f=-20;g&&(e-=g.left,f-=g.top);b.position?(e+=b.position[0],f+=b.position[1]):b.event?(e+=b.event.clientX,f+=b.event.clientY):(e+=0.5*this.canvas.width,f+=0.5*this.canvas.height);d.style.left=e+"px";d.style.top=f+"px";this.canvas.parentNode.appendChild(d);d.close=function(){this.parentNode&&this.parentNode.removeChild(this)};return d};h.prototype.createPanel=function(a,b){b=b||{};var d=b.window||window,g=document.createElement("div");g.className="litegraph dialog"; -g.innerHTML="
";g.header=g.querySelector(".dialog-header");b.width&&(g.style.width=b.width+(b.width.constructor===Number?"px":""));b.height&&(g.style.height=b.height+(b.height.constructor===Number?"px":""));if(b.closable){var e=document.createElement("span");e.innerHTML="✕";e.classList.add("close");e.addEventListener("click",function(){g.close()});g.header.appendChild(e)}g.title_element= -g.querySelector(".dialog-title");g.title_element.innerText=a;g.content=g.querySelector(".dialog-content");g.footer=g.querySelector(".dialog-footer");g.close=function(){this.parentNode.removeChild(this)};g.clear=function(){this.content.innerHTML=""};g.addHTML=function(a,b,d){var e=document.createElement("div");b&&(e.className=b);e.innerHTML=a;d?g.footer.appendChild(e):g.content.appendChild(e);return e};g.addButton=function(a,b,d){var e=document.createElement("button");e.innerText=a;e.options=d;e.classList.add("btn"); -e.addEventListener("click",b);g.footer.appendChild(e);return e};g.addSeparator=function(){var a=document.createElement("div");a.className="separator";g.content.appendChild(a)};g.addWidget=function(a,b,e,c,k){function n(a,b){console.log("change",a,b);c.callback&&c.callback(a,b);k&&k(a,b)}c=c||{};var q=String(e);a=a.toLowerCase();"number"==a&&(q=e.toFixed(3));var F=document.createElement("div");F.className="property";F.innerHTML=""; -F.querySelector(".property_name").innerText=b;var v=F.querySelector(".property_value");v.innerText=q;F.dataset.property=b;F.dataset.type=c.type||a;F.options=c;F.value=e;if("boolean"==a)F.classList.add("boolean"),e&&F.classList.add("bool-on"),F.addEventListener("click",function(){var a=this.dataset.property;this.value=!this.value;this.classList.toggle("bool-on");this.querySelector(".property_value").innerText=this.value?"true":"false";n(a,this.value)});else if("string"==a||"number"==a)v.setAttribute("contenteditable", -!0),v.addEventListener("keydown",function(a){"Enter"==a.code&&(a.preventDefault(),this.blur())}),v.addEventListener("blur",function(){var a=this.innerText,b=this.parentNode.dataset.property;"number"==this.parentNode.dataset.type&&(a=Number(a));n(b,a)});else if("enum"==a||"combo"==a)q=h.getPropertyPrintableValue(e,c.values);v.innerText=q;v.addEventListener("click",function(a){var b=this.parentNode.dataset.property,e=this;new f.ContextMenu(c.values||[],{event:a,className:"dark",callback:function(a, -d,g){e.innerText=a;n(b,a);return!1}},d)});g.content.appendChild(F);return F};return g};h.getPropertyPrintableValue=function(a,b){if(!b||b.constructor===Array)return String(a);if(b.constructor===Object){var d="",g;for(g in b)if(b[g]==a){d=g;break}return String(a)+" ("+d+")"}};h.prototype.showShowNodePanel=function(a){window.SELECTED_NODE=a;var b=document.querySelector("#node-panel");b&&b.close();var d=this.getCanvasWindow(),b=this.createPanel(a.title||"",{closable:!0,window:d});b.id="node-panel";b.node= -a;b.classList.add("settings");var g=this;(function(){b.content.innerHTML="";b.addHTML(""+a.type+""+(a.constructor.desc||"")+"");b.addHTML("

Properties

");for(var d in a.properties){var f=a.properties[d],c=a.getPropertyInfo(d);a.onAddPropertyToPanel&&a.onAddPropertyToPanel(d,b)||b.addWidget(c.widget||c.type,d,f,c,function(b,d){g.graph.beforeChange(a);a.setProperty(b,d);g.graph.afterChange();g.dirty_canvas= -!0})}b.addSeparator();if(a.onShowCustomPanelInfo)a.onShowCustomPanelInfo(b);b.addButton("Delete",function(){a.block_delete||(a.graph.remove(a),b.close())}).classList.add("delete")})();this.canvas.parentNode.appendChild(b)};h.prototype.showSubgraphPropertiesDialog=function(a){function b(){g.clear();if(a.inputs)for(var d=0;d", -"subgraph_property");c.dataset.name=f.name;c.dataset.slot=d;c.querySelector(".name").innerText=f.name;c.querySelector(".type").innerText=f.type;c.querySelector("button").addEventListener("click",function(d){a.removeInput(Number(this.parentNode.dataset.slot));b()})}}}console.log("showing subgraph properties dialog");var d=this.canvas.parentNode.querySelector(".subgraph_dialog");d&&d.close();var g=this.createPanel("Subgraph Inputs",{closable:!0,width:500});g.node=a;g.classList.add("subgraph_dialog"); -g.addHTML(" + NameType","subgraph_property extra",!0).querySelector("button").addEventListener("click",function(d){d=this.parentNode;var g=d.querySelector(".name").value,f=d.querySelector(".type").value;g&&-1==a.findInputSlot(g)&&(a.addInput(g,f),d.querySelector(".name").value="",d.querySelector(".type").value="",b())});b();this.canvas.parentNode.appendChild(g);return g};h.prototype.checkPanels= -function(){if(this.canvas)for(var a=this.canvas.parentNode.querySelectorAll(".litegraph.dialog"),b=0;bNo color"});for(var c in h.node_colors)a=h.node_colors[c],a={value:c,content:""+c+""},b.push(a);new f.ContextMenu(b,{event:d,callback:function(a){e&&((a=a.value?h.node_colors[a.value]:null)?e.constructor===f.LGraphGroup?e.color=a.groupcolor:(e.color=a.color,e.bgcolor=a.bgcolor):(delete e.color,delete e.bgcolor),e.setDirtyCanvas(!0,!0))},parentMenu:g,node:e});return!1};h.onMenuNodeShapes=function(a,b,d,g,e){if(!e)throw"no node passed";new f.ContextMenu(f.VALID_SHAPES,{event:d,callback:function(a){e&&(e.graph.beforeChange(e),e.shape=a,e.graph.afterChange(e),e.setDirtyCanvas(!0))}, -parentMenu:g,node:e});return!1};h.onMenuNodeRemove=function(a,b,d,g,e){if(!e)throw"no node passed";!1!==e.removable&&(a=e.graph,a.beforeChange(),a.remove(e),a.afterChange(),e.setDirtyCanvas(!0,!0))};h.onMenuNodeToSubgraph=function(a,b,d,g,e){a=e.graph;if(b=h.active_canvas)d=Object.values(b.selected_nodes||{}),d.length||(d=[e]),g=f.createNode("graph/subgraph"),g.pos=e.pos.concat(),a.add(g),g.buildFromNodes(d),b.deselectAllNodes(),e.setDirtyCanvas(!0,!0)};h.onMenuNodeClone=function(a,b,d,g,e){!1!=e.clonable&& -(a=e.clone())&&(a.pos=[e.pos[0]+5,e.pos[1]+5],e.graph.beforeChange(),e.graph.add(a),e.graph.afterChange(),e.setDirtyCanvas(!0,!0))};h.node_colors={red:{color:"#322",bgcolor:"#533",groupcolor:"#A88"},brown:{color:"#332922",bgcolor:"#593930",groupcolor:"#b06634"},green:{color:"#232",bgcolor:"#353",groupcolor:"#8A8"},blue:{color:"#223",bgcolor:"#335",groupcolor:"#88A"},pale_blue:{color:"#2a363b",bgcolor:"#3f5159",groupcolor:"#3f789e"},cyan:{color:"#233",bgcolor:"#355",groupcolor:"#8AA"},purple:{color:"#323", -bgcolor:"#535",groupcolor:"#a1309b"},yellow:{color:"#432",bgcolor:"#653",groupcolor:"#b58b2a"},black:{color:"#222",bgcolor:"#000",groupcolor:"#444"}};h.prototype.getCanvasMenuOptions=function(){var a=null;this.getMenuOptions?a=this.getMenuOptions():(a=[{content:"Add Node",has_submenu:!0,callback:h.onMenuAdd},{content:"Add Group",callback:h.onGroupAdd}],this._graph_stack&&0Name",e),k=c.querySelector("input");k&&f&&(k.value=f.label||"");c.querySelector("button").addEventListener("click",function(a){k.value&&(f&&(f.label=k.value),d.setDirty(!0));c.close()})}},extra:a};a&&(c.title=a.type);var k=null;a&&(k=a.getSlotInPosition(b.canvasX,b.canvasY),h.active_node=a);if(k){e=[];if(a.getSlotMenuOptions)e=a.getSlotMenuOptions(k);else{k&&k.output&&k.output.links&&k.output.links.length&& -e.push({content:"Disconnect Links",slot:k});var s=k.input||k.output;e.push(s.locked?"Cannot remove":{content:"Remove Slot",slot:k});e.push(s.nameLocked?"Cannot rename":{content:"Rename Slot",slot:k})}c.title=(k.input?k.input.type:k.output.type)||"*";k.input&&k.input.type==f.ACTION&&(c.title="Action");k.output&&k.output.type==f.EVENT&&(c.title="Event")}else a?e=this.getNodeMenuOptions(a):(e=this.getCanvasMenuOptions(),(k=this.graph.getGroupOnPos(b.canvasX,b.canvasY))&&e.push(null,{content:"Edit Group", -has_submenu:!0,submenu:{title:"Group",extra:k,options:this.getGroupMenuOptions(k)}}));e&&new f.ContextMenu(e,c,g)};"undefined"!=typeof window&&window.CanvasRenderingContext2D&&(window.CanvasRenderingContext2D.prototype.roundRect=function(a,b,d,g,e,f){void 0===e&&(e=5);void 0===f&&(f=e);this.moveTo(a+e,b);this.lineTo(a+d-e,b);this.quadraticCurveTo(a+d,b,a+d,b+e);this.lineTo(a+d,b+g-f);this.quadraticCurveTo(a+d,b+g,a+d-f,b+g);this.lineTo(a+f,b+g);this.quadraticCurveTo(a,b+g,a,b+g-f);this.lineTo(a,b+ -e);this.quadraticCurveTo(a,b,a+e,b)});f.compareObjects=function(a,b){for(var d in a)if(a[d]!=b[d])return!1;return!0};f.distance=C;f.colorToString=function(a){return"rgba("+Math.round(255*a[0]).toFixed()+","+Math.round(255*a[1]).toFixed()+","+Math.round(255*a[2]).toFixed()+","+(4==a.length?a[3].toFixed(2):"1.0")+")"};f.isInsideRectangle=x;f.growBounding=function(a,b,d){ba[2]&&(a[2]=b);da[3]&&(a[3]=d)};f.isInsideBounding=function(a,b){return a[0]b[1][0]||a[1]>b[1][1]?!1:!0};f.overlapBounding=G;f.hex2num=function(a){"#"==a.charAt(0)&&(a=a.slice(1));a=a.toUpperCase();for(var b=Array(3),d=0,g,e,f=0;6>f;f+=2)g="0123456789ABCDEF".indexOf(a.charAt(f)),e="0123456789ABCDEF".indexOf(a.charAt(f+1)),b[d]=16*g+e,d++;return b};f.num2hex=function(a){for(var b="#",d,g,e=0;3>e;e++)d=a[e]/16,g=a[e]%16,b+="0123456789ABCDEF".charAt(d)+"0123456789ABCDEF".charAt(g);return b};A.prototype.addItem=function(a,b,d){function g(a){var b=this.value;b&&b.has_submenu&& -e.call(this,a)}function e(a){var b=this.value,e=!0;f.current_submenu&&f.current_submenu.close(a);if(d.callback){var g=d.callback.call(this,b,d,a,f,d.node);!0===g&&(e=!1)}if(b&&(b.callback&&!d.ignore_item_callbacks&&!0!==b.disabled&&(g=b.callback.call(this,b,d,a,f,d.extra),!0===g&&(e=!1)),b.submenu)){if(!b.submenu.options)throw"ContextMenu submenu needs options";new f.constructor(b.submenu.options,{callback:b.submenu.callback,event:a,parentMenu:f,ignore_item_callbacks:b.submenu.ignore_item_callbacks, -title:b.submenu.title,extra:b.submenu.extra,autoopen:d.autoopen});e=!1}e&&!f.lock&&f.close()}var f=this;d=d||{};var c=document.createElement("div");c.className="litemenu-entry submenu";var k=!1;if(null===b)c.classList.add("separator");else{c.innerHTML=b&&b.title?b.title:a;if(c.value=b)b.disabled&&(k=!0,c.classList.add("disabled")),(b.submenu||b.has_submenu)&&c.classList.add("has_submenu");"function"==typeof b?(c.dataset.value=a,c.onclick_callback=b):c.dataset.value=b;b.className&&(c.className+=" "+ -b.className)}this.root.appendChild(c);k||c.addEventListener("click",e);d.autoopen&&c.addEventListener("mouseenter",g);return c};A.prototype.close=function(a,b){this.root.parentNode&&this.root.parentNode.removeChild(this.root);this.parentMenu&&!b&&(this.parentMenu.lock=!1,this.parentMenu.current_submenu=null,void 0===a?this.parentMenu.close():a&&!A.isCursorOverElement(a,this.parentMenu.root)&&A.trigger(this.parentMenu.root,"mouseleave",a));this.current_submenu&&this.current_submenu.close(a,!0);this.root.closing_timer&& -clearTimeout(this.root.closing_timer)};A.trigger=function(a,b,d,g){var e=document.createEvent("CustomEvent");e.initCustomEvent(b,!0,!0,d);e.srcElement=g;a.dispatchEvent?a.dispatchEvent(e):a.__events&&a.__events.dispatchEvent(e);return e};A.prototype.getTopMenu=function(){return this.options.parentMenu?this.options.parentMenu.getTopMenu():this};A.prototype.getFirstEvent=function(){return this.options.parentMenu?this.options.parentMenu.getFirstEvent():this.options.event};A.isCursorOverElement=function(a, -b){var d=a.clientX,g=a.clientY,e=b.getBoundingClientRect();return e?g>e.top&&ge.left&&dMath.abs(d))return g[1];d=(a-g[0])/d;return g[1]*(1-d)+e[1]*d}}return 0}};D.prototype.draw=function(a,b,d,g,e,f){if(d=this.points){this.size= -b;var c=b[0]-2*this.margin;b=b[1]-2*this.margin;e=e||"#666";a.save();a.translate(this.margin,this.margin);g&&(a.fillStyle="#111",a.fillRect(0,0,c,b),a.fillStyle="#222",a.fillRect(0.5*c,0,1,b),a.strokeStyle="#333",a.strokeRect(0,0,c,b));a.strokeStyle=e;f&&(a.globalAlpha=0.5);a.beginPath();for(g=0;ga[1])){var g=this.size[0]-2*this.margin,e=this.size[1]-2*this.margin,f=a[0]-this.margin,c=a[1]-this.margin;this.selected=this.getCloserPoint([f,c],30/b.ds.scale);-1==this.selected&&(g=[f/g,1-c/e],d.push(g),d.sort(function(a,b){return a[0]-b[0]}),this.selected=d.indexOf(g),this.must_update=!0);if(-1!=this.selected)return!0}};D.prototype.onMouseMove=function(a,b){var d=this.points;if(d){var g= -this.selected;if(!(0>g)){var e=(a[0]-this.margin)/(this.size[0]-2*this.margin),f=(a[1]-this.margin)/(this.size[1]-2*this.margin);this._nearest=this.getCloserPoint([a[0]-this.margin,a[1]-this.margin],30/b.ds.scale);var c=d[g];if(c){var k=0==g||g==d.length-1;!k&&(-10>a[0]||a[0]>this.size[0]+10||-10>a[1]||a[1]>this.size[1]+10)?(d.splice(g,1),this.selected=-1):(c[0]=k?0==g?0:1:Math.clamp(e,0,1),c[1]=1-Math.clamp(f,0,1),d.sort(function(a,b){return a[0]-b[0]}),this.selected=d.indexOf(c),this.must_update= -!0)}}}};D.prototype.onMouseUp=function(a,b){this.selected=-1;return!1};D.prototype.getCloserPoint=function(a,b){var d=this.points;if(!d)return-1;b=b||30;for(var g=this.size[0]-2*this.margin,e=this.size[1]-2*this.margin,f=d.length,c=[0,0],k=1E6,n=-1,q=0;qk||h>b||(n=q,k=h)}return n};f.CurveEditor=D;f.getParameterNames=function(a){return(a+"").replace(/[/][/].*$/gm,"").replace(/\s+/g,"").replace(/[/][*][^/*]*[*][/]/g,"").split("){", -1)[0].replace(/^[^(]*[(]/,"").replace(/=[^,]+/g,"").split(",").filter(Boolean)};Math.clamp=function(a,b,d){return b>a?b:dc||c>h-12||ml.last_y+F)){g=l.value;switch(l.type){case "button":if("mousemove"===d.type)break;l.callback&&setTimeout(function(){l.callback(l,y,a,b,d)},20);this.dirty_canvas=l.clicked=!0;break;case "slider":q=Math.clamp((c-15)/(h-30),0,1);l.value=l.options.min+(l.options.max- +l.options.min)*q;l.callback&&setTimeout(function(){e(l,l.value)},20);this.dirty_canvas=!0;break;case "number":case "combo":g=l.value;if("mousemove"==d.type&&"number"==l.type)l.value+=0.1*d.deltaX*(l.options.step||1),null!=l.options.min&&l.valuel.options.max&&(l.value=l.options.max);else if("mousedown"==d.type){var J=l.options.values;J&&J.constructor===Function&&(J=l.options.values(l,a));var I=null;"number"!=l.type&&(I=J.constructor=== +Array?J:Object.keys(J));c=40>c?-1:c>h-40?1:0;if("number"==l.type)l.value+=0.1*c*(l.options.step||1),null!=l.options.min&&l.valuel.options.max&&(l.value=l.options.max);else if(c)q=-1,this.last_mouseclick=0,q=J.constructor===Object?I.indexOf(String(l.value))+c:I.indexOf(l.value)+c,q>=I.length&&(q=I.length-1),0>q&&(q=0),l.value=J.constructor===Array?J[q]:q;else{var w=J!=I?Object.values(J):J;new f.ContextMenu(w,{scale:Math.max(1,this.ds.scale), +event:d,className:"dark",callback:s.bind(l)},q);var s=function(a,b,d){J!=I&&(a=w.indexOf(a));this.value=a;e(this,a);y.dirty_canvas=!0;return!1}}}else"mouseup"==d.type&&"number"==l.type&&(c=40>c?-1:c>h-40?1:0,200>d.click_time&&0==c&&this.prompt("Value",l.value,function(a){this.value=Number(a);e(this,this.value)}.bind(l),d));g!=l.value&&setTimeout(function(){e(this,this.value)}.bind(l),20);this.dirty_canvas=!0;break;case "toggle":"mousedown"==d.type&&(l.value=!l.value,setTimeout(function(){e(l,l.value)}, +20));break;case "string":case "text":"mousedown"==d.type&&this.prompt("Value",l.value,function(a){this.value=a;e(this,a)}.bind(l),d,l.options?l.options.multiline:!1);break;default:l.mouse&&(this.dirty_canvas=l.mouse(d,[c,m],a))}if(g!=l.value){if(a.onWidgetChanged)a.onWidgetChanged(l.name,l.value,g,l);a.graph._version++}return l}}}return null};h.prototype.drawGroups=function(a,b){if(this.graph){var d=this.graph._groups;b.save();b.globalAlpha=0.5*this.editor_alpha;for(var g=0;gd&&0.01>b.editor_alpha&&(clearInterval(g),1>d&&(b.live_mode=!0));1"+(q.label?q.label:l)+""+a+"",value:l})}if(r.length)return new f.ContextMenu(r,{event:d,callback:c, +parentMenu:g,allow_html:!0,node:e},b),!1}};h.decodeHTML=function(a){var b=document.createElement("div");b.innerText=a;return b.innerHTML};h.onResizeNode=function(a,b,d,g,e){if(e){e.size=e.computeSize();if(e.onResize)e.onResize(e.size);e.setDirtyCanvas(!0,!0)}};h.prototype.showLinkMenu=function(a,b){var d=this;console.log(a);var g=new f.ContextMenu(["Add Node",null,"Delete"],{event:b,title:null!=a.data?a.data.constructor.name:null,callback:function(b,f,c){switch(b){case "Add Node":h.onMenuAdd(null, +null,c,g,function(b){console.log("node autoconnect");var e=d.graph.getNodeById(a.origin_id),g=d.graph.getNodeById(a.target_id);b.inputs&&b.inputs.length&&b.outputs&&b.outputs.length&&e.outputs[a.origin_slot].type==b.inputs[0].type&&b.outputs[0].type==g.inputs[0].type&&(e.connect(a.origin_slot,b,0),b.connect(0,g,a.target_slot),b.pos[0]-=0.5*b.size[0])});break;case "Delete":d.graph.removeLink(a.id)}}});return!1};h.onShowPropertyEditor=function(a,b,d,g,e){function f(){var b=l.value;"Number"==a.type? +b=Number(b):"Boolean"==a.type&&(b=Boolean(b));e[c]=b;r.parentNode&&r.parentNode.removeChild(r);e.setDirtyCanvas(!0,!0)}var c=a.property||"title";b=e[c];var r=document.createElement("div");r.className="graphdialog";r.innerHTML="";r.querySelector(".name").innerText=c;var l=r.querySelector(".value");l&&(l.value=b,l.addEventListener("blur",function(a){this.focus()}),l.addEventListener("keydown",function(a){if(13== +a.keyCode||"textarea"==a.target.localName)f(),a.preventDefault(),a.stopPropagation()}));b=h.active_canvas.canvas;d=b.getBoundingClientRect();var q=g=-20;d&&(g-=d.left,q-=d.top);event?(r.style.left=event.clientX+g+"px",r.style.top=event.clientY+q+"px"):(r.style.left=0.5*b.width+g+"px",r.style.top=0.5*b.height+q+"px");r.querySelector("button").addEventListener("click",f);b.parentNode.appendChild(r)};h.prototype.prompt=function(a,b,d,g,e){var f=this;a=a||"";var c=!1,r=document.createElement("div");r.className= +"graphdialog rounded";r.innerHTML=e?" ":" ";r.close=function(){f.prompt_box=null;r.parentNode&&r.parentNode.removeChild(r)};1h.search_limit)break}}l=null;if(Array.prototype.filter)l=Object.keys(f.registered_node_types).filter(y);else for(r in l=[],f.registered_node_types)y(r)&&l.push(r);for(r=0;rh.search_limit);r++);var y=function(a){var b= +f.registered_node_types[a];return m&&b.filter!=m?!1:-1!==a.toLowerCase().indexOf(d)}}}var e=this,c=h.active_canvas,m=c.canvas,r=m.ownerDocument||document,l=document.createElement("div");l.className="litegraph litesearchbox graphdialog rounded";l.innerHTML="Search
";l.close=function(){e.search_box=null;r.body.focus();r.body.style.overflow="";setTimeout(function(){e.canvas.focus()},20);l.parentNode&& +l.parentNode.removeChild(l)};var q=null;1 +m.height-200&&(n.style.maxHeight=m.height-a.layerY-20+"px");J.focus();return l};h.prototype.showEditPropertyValue=function(a,b,d){function g(){e(h.value)}function e(e){f&&f.values&&f.values.constructor===Object&&void 0!=f.values[e]&&(e=f.values[e]);"number"==typeof a.properties[b]&&(e=Number(e));if("array"==c||"object"==c)e=JSON.parse(e);a.properties[b]=e;a.graph&&a.graph._version++;if(a.onPropertyChanged)a.onPropertyChanged(b,e);if(d.onclose)d.onclose();n.close();a.setDirtyCanvas(!0,!0)}if(a&&void 0!== +a.properties[b]){d=d||{};var f=a.getPropertyInfo(b),c=f.type,r="";if("string"==c||"number"==c||"array"==c||"object"==c)r="";else if("enum"!=c&&"combo"!=c||!f.values)if("boolean"==c)r="";else{console.warn("unknown type: "+c);return}else{var r=""}var n=this.createDialog(""+(f.label?f.label:b)+""+r+"",d);if("enum"!=c&&"combo"!=c||!f.values)if("boolean"==c)(h=n.querySelector("input"))&&h.addEventListener("click",function(a){e(!!h.checked)});else{if(h=n.querySelector("input"))h.addEventListener("blur",function(a){this.focus()}),q=void 0!==a.properties[b]?a.properties[b]:"","string"!==c&&(q=JSON.stringify(q)),h.value= +q,h.addEventListener("keydown",function(a){13==a.keyCode&&(g(),a.preventDefault(),a.stopPropagation())})}else{var h=n.querySelector("select");h.addEventListener("change",function(a){e(a.target.value)})}n.querySelector("button").addEventListener("click",g);return n}};h.prototype.createDialog=function(a,b){b=b||{};var d=document.createElement("div");d.className="graphdialog";d.innerHTML=a;var g=this.canvas.getBoundingClientRect(),e=-20,f=-20;g&&(e-=g.left,f-=g.top);b.position?(e+=b.position[0],f+=b.position[1]): +b.event?(e+=b.event.clientX,f+=b.event.clientY):(e+=0.5*this.canvas.width,f+=0.5*this.canvas.height);d.style.left=e+"px";d.style.top=f+"px";this.canvas.parentNode.appendChild(d);d.close=function(){this.parentNode&&this.parentNode.removeChild(this)};return d};h.prototype.createPanel=function(a,b){b=b||{};var d=b.window||window,g=document.createElement("div");g.className="litegraph dialog";g.innerHTML="
"; +g.header=g.querySelector(".dialog-header");b.width&&(g.style.width=b.width+(b.width.constructor===Number?"px":""));b.height&&(g.style.height=b.height+(b.height.constructor===Number?"px":""));if(b.closable){var e=document.createElement("span");e.innerHTML="✕";e.classList.add("close");e.addEventListener("click",function(){g.close()});g.header.appendChild(e)}g.title_element=g.querySelector(".dialog-title");g.title_element.innerText=a;g.content=g.querySelector(".dialog-content");g.footer=g.querySelector(".dialog-footer"); +g.close=function(){this.parentNode.removeChild(this)};g.clear=function(){this.content.innerHTML=""};g.addHTML=function(a,b,d){var e=document.createElement("div");b&&(e.className=b);e.innerHTML=a;d?g.footer.appendChild(e):g.content.appendChild(e);return e};g.addButton=function(a,b,d){var e=document.createElement("button");e.innerText=a;e.options=d;e.classList.add("btn");e.addEventListener("click",b);g.footer.appendChild(e);return e};g.addSeparator=function(){var a=document.createElement("div");a.className= +"separator";g.content.appendChild(a)};g.addWidget=function(a,b,e,c,l){function q(a,b){console.log("change",a,b);c.callback&&c.callback(a,b);l&&l(a,b)}c=c||{};var n=String(e);a=a.toLowerCase();"number"==a&&(n=e.toFixed(3));var F=document.createElement("div");F.className="property";F.innerHTML="";F.querySelector(".property_name").innerText=b;var w=F.querySelector(".property_value");w.innerText=n;F.dataset.property=b;F.dataset.type= +c.type||a;F.options=c;F.value=e;if("boolean"==a)F.classList.add("boolean"),e&&F.classList.add("bool-on"),F.addEventListener("click",function(){var a=this.dataset.property;this.value=!this.value;this.classList.toggle("bool-on");this.querySelector(".property_value").innerText=this.value?"true":"false";q(a,this.value)});else if("string"==a||"number"==a)w.setAttribute("contenteditable",!0),w.addEventListener("keydown",function(a){"Enter"==a.code&&(a.preventDefault(),this.blur())}),w.addEventListener("blur", +function(){var a=this.innerText,b=this.parentNode.dataset.property;"number"==this.parentNode.dataset.type&&(a=Number(a));q(b,a)});else if("enum"==a||"combo"==a)n=h.getPropertyPrintableValue(e,c.values);w.innerText=n;w.addEventListener("click",function(a){var b=this.parentNode.dataset.property,e=this;new f.ContextMenu(c.values||[],{event:a,className:"dark",callback:function(a,d,g){e.innerText=a;q(b,a);return!1}},d)});g.content.appendChild(F);return F};return g};h.getPropertyPrintableValue=function(a, +b){if(!b||b.constructor===Array)return String(a);if(b.constructor===Object){var d="",g;for(g in b)if(b[g]==a){d=g;break}return String(a)+" ("+d+")"}};h.prototype.showShowNodePanel=function(a){window.SELECTED_NODE=a;var b=document.querySelector("#node-panel");b&&b.close();var d=this.getCanvasWindow(),b=this.createPanel(a.title||"",{closable:!0,window:d});b.id="node-panel";b.node=a;b.classList.add("settings");var g=this;(function(){b.content.innerHTML="";b.addHTML(""+a.type+ +""+(a.constructor.desc||"")+"");b.addHTML("

Properties

");for(var d in a.properties){var f=a.properties[d],c=a.getPropertyInfo(d);a.onAddPropertyToPanel&&a.onAddPropertyToPanel(d,b)||b.addWidget(c.widget||c.type,d,f,c,function(b,d){g.graph.beforeChange(a);a.setProperty(b,d);g.graph.afterChange();g.dirty_canvas=!0})}b.addSeparator();if(a.onShowCustomPanelInfo)a.onShowCustomPanelInfo(b);b.addButton("Delete",function(){a.block_delete|| +(a.graph.remove(a),b.close())}).classList.add("delete")})();this.canvas.parentNode.appendChild(b)};h.prototype.showSubgraphPropertiesDialog=function(a){function b(){g.clear();if(a.inputs)for(var d=0;d","subgraph_property");c.dataset.name=f.name;c.dataset.slot=d;c.querySelector(".name").innerText=f.name;c.querySelector(".type").innerText= +f.type;c.querySelector("button").addEventListener("click",function(d){a.removeInput(Number(this.parentNode.dataset.slot));b()})}}}console.log("showing subgraph properties dialog");var d=this.canvas.parentNode.querySelector(".subgraph_dialog");d&&d.close();var g=this.createPanel("Subgraph Inputs",{closable:!0,width:500});g.node=a;g.classList.add("subgraph_dialog");g.addHTML(" + NameType", +"subgraph_property extra",!0).querySelector("button").addEventListener("click",function(d){d=this.parentNode;var g=d.querySelector(".name").value,f=d.querySelector(".type").value;g&&-1==a.findInputSlot(g)&&(a.addInput(g,f),d.querySelector(".name").value="",d.querySelector(".type").value="",b())});b();this.canvas.parentNode.appendChild(g);return g};h.prototype.checkPanels=function(){if(this.canvas)for(var a=this.canvas.parentNode.querySelectorAll(".litegraph.dialog"),b=0;bNo color"});for(var c in h.node_colors)a=h.node_colors[c],a={value:c,content:""+c+""},b.push(a);new f.ContextMenu(b,{event:d,callback:function(a){e&&((a=a.value?h.node_colors[a.value]:null)? +e.constructor===f.LGraphGroup?e.color=a.groupcolor:(e.color=a.color,e.bgcolor=a.bgcolor):(delete e.color,delete e.bgcolor),e.setDirtyCanvas(!0,!0))},parentMenu:g,node:e});return!1};h.onMenuNodeShapes=function(a,b,d,g,e){if(!e)throw"no node passed";new f.ContextMenu(f.VALID_SHAPES,{event:d,callback:function(a){e&&(e.graph.beforeChange(e),e.shape=a,e.graph.afterChange(e),e.setDirtyCanvas(!0))},parentMenu:g,node:e});return!1};h.onMenuNodeRemove=function(a,b,d,g,e){if(!e)throw"no node passed";!1!==e.removable&& +(a=e.graph,a.beforeChange(),a.remove(e),a.afterChange(),e.setDirtyCanvas(!0,!0))};h.onMenuNodeToSubgraph=function(a,b,d,g,e){a=e.graph;if(b=h.active_canvas)d=Object.values(b.selected_nodes||{}),d.length||(d=[e]),g=f.createNode("graph/subgraph"),g.pos=e.pos.concat(),a.add(g),g.buildFromNodes(d),b.deselectAllNodes(),e.setDirtyCanvas(!0,!0)};h.onMenuNodeClone=function(a,b,d,g,e){!1!=e.clonable&&(a=e.clone())&&(a.pos=[e.pos[0]+5,e.pos[1]+5],e.graph.beforeChange(),e.graph.add(a),e.graph.afterChange(), +e.setDirtyCanvas(!0,!0))};h.node_colors={red:{color:"#322",bgcolor:"#533",groupcolor:"#A88"},brown:{color:"#332922",bgcolor:"#593930",groupcolor:"#b06634"},green:{color:"#232",bgcolor:"#353",groupcolor:"#8A8"},blue:{color:"#223",bgcolor:"#335",groupcolor:"#88A"},pale_blue:{color:"#2a363b",bgcolor:"#3f5159",groupcolor:"#3f789e"},cyan:{color:"#233",bgcolor:"#355",groupcolor:"#8AA"},purple:{color:"#323",bgcolor:"#535",groupcolor:"#a1309b"},yellow:{color:"#432",bgcolor:"#653",groupcolor:"#b58b2a"},black:{color:"#222", +bgcolor:"#000",groupcolor:"#444"}};h.prototype.getCanvasMenuOptions=function(){var a=null;this.getMenuOptions?a=this.getMenuOptions():(a=[{content:"Add Node",has_submenu:!0,callback:h.onMenuAdd},{content:"Add Group",callback:h.onGroupAdd}],this._graph_stack&&0Name", +e),r=c.querySelector("input");r&&f&&(r.value=f.label||"");c.querySelector("button").addEventListener("click",function(a){r.value&&(f&&(f.label=r.value),d.setDirty(!0));c.close()})}},extra:a};a&&(c.title=a.type);var l=null;a&&(l=a.getSlotInPosition(b.canvasX,b.canvasY),h.active_node=a);if(l){e=[];if(a.getSlotMenuOptions)e=a.getSlotMenuOptions(l);else{l&&l.output&&l.output.links&&l.output.links.length&&e.push({content:"Disconnect Links",slot:l});var r=l.input||l.output;e.push(r.locked?"Cannot remove": +{content:"Remove Slot",slot:l});e.push(r.nameLocked?"Cannot rename":{content:"Rename Slot",slot:l})}c.title=(l.input?l.input.type:l.output.type)||"*";l.input&&l.input.type==f.ACTION&&(c.title="Action");l.output&&l.output.type==f.EVENT&&(c.title="Event")}else a?e=this.getNodeMenuOptions(a):(e=this.getCanvasMenuOptions(),(l=this.graph.getGroupOnPos(b.canvasX,b.canvasY))&&e.push(null,{content:"Edit Group",has_submenu:!0,submenu:{title:"Group",extra:l,options:this.getGroupMenuOptions(l)}}));e&&new f.ContextMenu(e, +c,g)};"undefined"!=typeof window&&window.CanvasRenderingContext2D&&(window.CanvasRenderingContext2D.prototype.roundRect=function(a,b,d,g,e,f){void 0===e&&(e=5);void 0===f&&(f=e);this.moveTo(a+e,b);this.lineTo(a+d-e,b);this.quadraticCurveTo(a+d,b,a+d,b+e);this.lineTo(a+d,b+g-f);this.quadraticCurveTo(a+d,b+g,a+d-f,b+g);this.lineTo(a+f,b+g);this.quadraticCurveTo(a,b+g,a,b+g-f);this.lineTo(a,b+e);this.quadraticCurveTo(a,b,a+e,b)});f.compareObjects=function(a,b){for(var d in a)if(a[d]!=b[d])return!1;return!0}; +f.distance=C;f.colorToString=function(a){return"rgba("+Math.round(255*a[0]).toFixed()+","+Math.round(255*a[1]).toFixed()+","+Math.round(255*a[2]).toFixed()+","+(4==a.length?a[3].toFixed(2):"1.0")+")"};f.isInsideRectangle=x;f.growBounding=function(a,b,d){ba[2]&&(a[2]=b);da[3]&&(a[3]=d)};f.isInsideBounding=function(a,b){return a[0]b[1][0]||a[1]>b[1][1]?!1:!0};f.overlapBounding=G;f.hex2num=function(a){"#"==a.charAt(0)&&(a=a.slice(1));a=a.toUpperCase(); +for(var b=Array(3),d=0,g,e,f=0;6>f;f+=2)g="0123456789ABCDEF".indexOf(a.charAt(f)),e="0123456789ABCDEF".indexOf(a.charAt(f+1)),b[d]=16*g+e,d++;return b};f.num2hex=function(a){for(var b="#",d,g,e=0;3>e;e++)d=a[e]/16,g=a[e]%16,b+="0123456789ABCDEF".charAt(d)+"0123456789ABCDEF".charAt(g);return b};A.prototype.addItem=function(a,b,d){function g(a){var b=this.value;b&&b.has_submenu&&e.call(this,a)}function e(a){var b=this.value,e=!0;f.current_submenu&&f.current_submenu.close(a);if(d.callback){var g=d.callback.call(this, +b,d,a,f,d.node);!0===g&&(e=!1)}if(b&&(b.callback&&!d.ignore_item_callbacks&&!0!==b.disabled&&(g=b.callback.call(this,b,d,a,f,d.extra),!0===g&&(e=!1)),b.submenu)){if(!b.submenu.options)throw"ContextMenu submenu needs options";new f.constructor(b.submenu.options,{callback:b.submenu.callback,event:a,parentMenu:f,ignore_item_callbacks:b.submenu.ignore_item_callbacks,title:b.submenu.title,extra:b.submenu.extra,autoopen:d.autoopen});e=!1}e&&!f.lock&&f.close()}var f=this;d=d||{};var c=document.createElement("div"); +c.className="litemenu-entry submenu";var r=!1;if(null===b)c.classList.add("separator");else{c.innerHTML=b&&b.title?b.title:a;if(c.value=b)b.disabled&&(r=!0,c.classList.add("disabled")),(b.submenu||b.has_submenu)&&c.classList.add("has_submenu");"function"==typeof b?(c.dataset.value=a,c.onclick_callback=b):c.dataset.value=b;b.className&&(c.className+=" "+b.className)}this.root.appendChild(c);r||c.addEventListener("click",e);d.autoopen&&c.addEventListener("mouseenter",g);return c};A.prototype.close= +function(a,b){this.root.parentNode&&this.root.parentNode.removeChild(this.root);this.parentMenu&&!b&&(this.parentMenu.lock=!1,this.parentMenu.current_submenu=null,void 0===a?this.parentMenu.close():a&&!A.isCursorOverElement(a,this.parentMenu.root)&&A.trigger(this.parentMenu.root,"mouseleave",a));this.current_submenu&&this.current_submenu.close(a,!0);this.root.closing_timer&&clearTimeout(this.root.closing_timer)};A.trigger=function(a,b,d,g){var e=document.createEvent("CustomEvent");e.initCustomEvent(b, +!0,!0,d);e.srcElement=g;a.dispatchEvent?a.dispatchEvent(e):a.__events&&a.__events.dispatchEvent(e);return e};A.prototype.getTopMenu=function(){return this.options.parentMenu?this.options.parentMenu.getTopMenu():this};A.prototype.getFirstEvent=function(){return this.options.parentMenu?this.options.parentMenu.getFirstEvent():this.options.event};A.isCursorOverElement=function(a,b){var d=a.clientX,g=a.clientY,e=b.getBoundingClientRect();return e?g>e.top&&ge.left&&dMath.abs(d))return g[1];d=(a-g[0])/d;return g[1]*(1-d)+e[1]*d}}return 0}};D.prototype.draw=function(a,b,d,g,e,f){if(d=this.points){this.size=b;var c=b[0]-2*this.margin;b=b[1]-2*this.margin;e=e||"#666";a.save();a.translate(this.margin, +this.margin);g&&(a.fillStyle="#111",a.fillRect(0,0,c,b),a.fillStyle="#222",a.fillRect(0.5*c,0,1,b),a.strokeStyle="#333",a.strokeRect(0,0,c,b));a.strokeStyle=e;f&&(a.globalAlpha=0.5);a.beginPath();for(g=0;ga[1])){var g=this.size[0]-2*this.margin,e=this.size[1]-2*this.margin,f=a[0]-this.margin,c=a[1]-this.margin;this.selected=this.getCloserPoint([f,c],30/b.ds.scale);-1==this.selected&&(g=[f/g,1-c/e],d.push(g),d.sort(function(a,b){return a[0]-b[0]}),this.selected=d.indexOf(g),this.must_update=!0);if(-1!=this.selected)return!0}};D.prototype.onMouseMove=function(a,b){var d=this.points;if(d){var g=this.selected;if(!(0>g)){var e=(a[0]-this.margin)/(this.size[0]-2*this.margin),f=(a[1]- +this.margin)/(this.size[1]-2*this.margin);this._nearest=this.getCloserPoint([a[0]-this.margin,a[1]-this.margin],30/b.ds.scale);var c=d[g];if(c){var r=0==g||g==d.length-1;!r&&(-10>a[0]||a[0]>this.size[0]+10||-10>a[1]||a[1]>this.size[1]+10)?(d.splice(g,1),this.selected=-1):(c[0]=r?0==g?0:1:Math.clamp(e,0,1),c[1]=1-Math.clamp(f,0,1),d.sort(function(a,b){return a[0]-b[0]}),this.selected=d.indexOf(c),this.must_update=!0)}}}};D.prototype.onMouseUp=function(a,b){this.selected=-1;return!1};D.prototype.getCloserPoint= +function(a,b){var d=this.points;if(!d)return-1;b=b||30;for(var g=this.size[0]-2*this.margin,e=this.size[1]-2*this.margin,f=d.length,c=[0,0],r=1E6,l=-1,q=0;qr||n>b||(l=q,r=n)}return l};f.CurveEditor=D;f.getParameterNames=function(a){return(a+"").replace(/[/][/].*$/gm,"").replace(/\s+/g,"").replace(/[/][*][^/*]*[*][/]/g,"").split("){",1)[0].replace(/^[^(]*[(]/,"").replace(/=[^,]+/g,"").split(",").filter(Boolean)};Math.clamp=function(a, +b,d){return b>a?b:d -this.size[1]-m.NODE_TITLE_HEIGHT+0.5&&d.showSubgraphPropertiesDialog(this)};l.prototype.computeSize=function(){return[200,Math.max(this.inputs?this.inputs.length:0,this.outputs?this.outputs.length:0)*m.NODE_SLOT_HEIGHT+m.NODE_TITLE_HEIGHT]};l.prototype.onSubgraphTrigger=function(a,b){var d=this.findOutputSlot(a);-1!=d&&this.triggerSlot(d)};l.prototype.onSubgraphNewInput=function(a,b){-1==this.findInputSlot(a)&&this.addInput(a,b)};l.prototype.onSubgraphRenamedInput=function(a,b){var d=this.findInputSlot(a); --1!=d&&(this.getInputInfo(d).name=b)};l.prototype.onSubgraphTypeChangeInput=function(a,b){var d=this.findInputSlot(a);-1!=d&&(this.getInputInfo(d).type=b)};l.prototype.onSubgraphRemovedInput=function(a){a=this.findInputSlot(a);-1!=a&&this.removeInput(a)};l.prototype.onSubgraphNewOutput=function(a,b){-1==this.findOutputSlot(a)&&this.addOutput(a,b)};l.prototype.onSubgraphRenamedOutput=function(a,b){var d=this.findOutputSlot(a);-1!=d&&(this.getOutputInfo(d).name=b)};l.prototype.onSubgraphTypeChangeOutput= -function(a,b){var d=this.findOutputSlot(a);-1!=d&&(this.getOutputInfo(d).type=b)};l.prototype.onSubgraphRemovedOutput=function(a){a=this.findInputSlot(a);-1!=a&&this.removeOutput(a)};l.prototype.getExtraMenuOptions=function(a){var b=this;return[{content:"Open",callback:function(){a.openSubgraph(b.subgraph)}}]};l.prototype.onResize=function(a){a[1]+=20};l.prototype.serialize=function(){var a=m.LGraphNode.prototype.serialize.call(this);a.subgraph=this.subgraph.serialize();return a};l.prototype.clone= -function(){var a=m.createNode(this.type),b=this.serialize();delete b.id;delete b.inputs;delete b.outputs;a.configure(b);return a};l.prototype.buildFromNodes=function(a){for(var b={},d=0,e=0;e +this.size[1]-m.NODE_TITLE_HEIGHT+0.5&&d.showSubgraphPropertiesDialog(this)};k.prototype.computeSize=function(){return[200,Math.max(this.inputs?this.inputs.length:0,this.outputs?this.outputs.length:0)*m.NODE_SLOT_HEIGHT+m.NODE_TITLE_HEIGHT]};k.prototype.onSubgraphTrigger=function(a,b){var d=this.findOutputSlot(a);-1!=d&&this.triggerSlot(d)};k.prototype.onSubgraphNewInput=function(a,b){-1==this.findInputSlot(a)&&this.addInput(a,b)};k.prototype.onSubgraphRenamedInput=function(a,b){var d=this.findInputSlot(a); +-1!=d&&(this.getInputInfo(d).name=b)};k.prototype.onSubgraphTypeChangeInput=function(a,b){var d=this.findInputSlot(a);-1!=d&&(this.getInputInfo(d).type=b)};k.prototype.onSubgraphRemovedInput=function(a){a=this.findInputSlot(a);-1!=a&&this.removeInput(a)};k.prototype.onSubgraphNewOutput=function(a,b){-1==this.findOutputSlot(a)&&this.addOutput(a,b)};k.prototype.onSubgraphRenamedOutput=function(a,b){var d=this.findOutputSlot(a);-1!=d&&(this.getOutputInfo(d).name=b)};k.prototype.onSubgraphTypeChangeOutput= +function(a,b){var d=this.findOutputSlot(a);-1!=d&&(this.getOutputInfo(d).type=b)};k.prototype.onSubgraphRemovedOutput=function(a){a=this.findInputSlot(a);-1!=a&&this.removeOutput(a)};k.prototype.getExtraMenuOptions=function(a){var b=this;return[{content:"Open",callback:function(){a.openSubgraph(b.subgraph)}}]};k.prototype.onResize=function(a){a[1]+=20};k.prototype.serialize=function(){var a=m.LGraphNode.prototype.serialize.call(this);a.subgraph=this.subgraph.serialize();return a};k.prototype.clone= +function(){var a=m.createNode(this.type),b=this.serialize();delete b.id;delete b.inputs;delete b.outputs;a.configure(b);return a};k.prototype.buildFromNodes=function(a){for(var b={},d=0,e=0;e=q?this.trigger(null,f):this._pending.push([q,f])};C.prototype.onExecute=function(){var c=1E3*this.graph.elapsed_time;this.isInputConnected(1)&&(this.properties.time_in_ms= -this.getInputData(1));for(var f=0;f=n?this.trigger(null,f):this._pending.push([n,f])};C.prototype.onExecute=function(){var c=1E3*this.graph.elapsed_time;this.isInputConnected(1)&&(this.properties.time_in_ms= +this.getInputData(1));for(var f=0;fq[1]))return this.old_y=c.canvasY,this.captureInput(!0),this.mouse_captured=!0};u.prototype.onMouseMove=function(c){if(this.mouse_captured){var q=this.old_y-c.canvasY;c.shiftKey&&(q*=10);if(c.metaKey||c.altKey)q*=0.1;this.old_y=c.canvasY;c=this._remainder+q/u.pixels_threshold;this._remainder=c%1;c=Math.clamp(this.properties.value+ -(c|0)*this.properties.step,this.properties.min,this.properties.max);this.properties.value=c;this.graph._version++;this.setDirtyCanvas(!0)}};u.prototype.onMouseUp=function(c,q){200>c.click_time&&(this.properties.value=Math.clamp(this.properties.value+(q[1]>0.5*this.size[1]?-1:1)*this.properties.step,this.properties.min,this.properties.max),this.graph._version++,this.setDirtyCanvas(!0));this.mouse_captured&&(this.mouse_captured=!1,this.captureInput(!1))};D.registerNodeType("widget/number",u);r.title= -"Combo";r.desc="Widget to select from a list";r.prototype.onExecute=function(){this.setOutputData(0,this.properties.value)};r.prototype.onPropertyChanged=function(c,q){"values"==c?(this._values=q.split(";"),this.widget.options.values=this._values):"value"==c&&(this.widget.value=q)};D.registerNodeType("widget/combo",r);t.title="Knob";t.desc="Circular controller";t.size=[80,100];t.prototype.onDrawForeground=function(c){if(!this.flags.collapsed){-1==this.value&&(this.value=(this.properties.value-this.properties.min)/ -(this.properties.max-this.properties.min));var q=0.5*this.size[0],h=0.5*this.size[1],r=0.5*Math.min(this.size[0],this.size[1])-5;c.globalAlpha=1;c.save();c.translate(q,h);c.rotate(0.75*Math.PI);c.fillStyle="rgba(0,0,0,0.5)";c.beginPath();c.moveTo(0,0);c.arc(0,0,r,0,1.5*Math.PI);c.fill();c.strokeStyle="black";c.fillStyle=this.properties.color;c.lineWidth=2;c.beginPath();c.moveTo(0,0);c.arc(0,0,r-4,0,1.5*Math.PI*Math.max(0.01,this.value));c.closePath();c.fill();c.lineWidth=1;c.globalAlpha=1;c.restore(); -c.fillStyle="black";c.beginPath();c.arc(q,h,0.75*r,0,2*Math.PI,!0);c.fill();c.fillStyle=this.mouseOver?"white":this.properties.color;c.beginPath();var l=this.value*Math.PI*1.5+0.75*Math.PI;c.arc(q+Math.cos(l)*r*0.65,h+Math.sin(l)*r*0.65,0.05*r,0,2*Math.PI,!0);c.fill();c.fillStyle=this.mouseOver?"white":"#AAA";c.font=Math.floor(0.5*r)+"px Arial";c.textAlign="center";c.fillText(this.properties.value.toFixed(this.properties.precision),q,h+0.15*r)}};t.prototype.onExecute=function(){this.setOutputData(0, +(f.fillStyle="black",f.fillRect(11,11,this.size[0]-20,this.size[1]-20),f.fillStyle="#AAF",f.fillRect(9,9,this.size[0]-20,this.size[1]-20),f.fillStyle=this.clicked?"white":this.mouseOver?"#668":"#334",f.fillRect(10,10,this.size[0]-20,this.size[1]-20),this.properties.text||0===this.properties.text)){var n=this.properties.font_size||30;f.textAlign="center";f.fillStyle=this.clicked?"black":"white";f.font=n+"px "+c.font;f.fillText(this.properties.text,0.5*this.size[0],0.5*this.size[1]+0.3*n);f.textAlign= +"left"}};c.prototype.onMouseDown=function(f,c){if(1n[1]))return this.old_y=c.canvasY,this.captureInput(!0),this.mouse_captured=!0};u.prototype.onMouseMove=function(c){if(this.mouse_captured){var n=this.old_y-c.canvasY;c.shiftKey&&(n*=10);if(c.metaKey||c.altKey)n*=0.1;this.old_y=c.canvasY;c=this._remainder+n/u.pixels_threshold;this._remainder=c%1;c=Math.clamp(this.properties.value+ +(c|0)*this.properties.step,this.properties.min,this.properties.max);this.properties.value=c;this.graph._version++;this.setDirtyCanvas(!0)}};u.prototype.onMouseUp=function(c,n){200>c.click_time&&(this.properties.value=Math.clamp(this.properties.value+(n[1]>0.5*this.size[1]?-1:1)*this.properties.step,this.properties.min,this.properties.max),this.graph._version++,this.setDirtyCanvas(!0));this.mouse_captured&&(this.mouse_captured=!1,this.captureInput(!1))};D.registerNodeType("widget/number",u);s.title= +"Combo";s.desc="Widget to select from a list";s.prototype.onExecute=function(){this.setOutputData(0,this.properties.value)};s.prototype.onPropertyChanged=function(c,n){"values"==c?(this._values=n.split(";"),this.widget.options.values=this._values):"value"==c&&(this.widget.value=n)};D.registerNodeType("widget/combo",s);t.title="Knob";t.desc="Circular controller";t.size=[80,100];t.prototype.onDrawForeground=function(c){if(!this.flags.collapsed){-1==this.value&&(this.value=(this.properties.value-this.properties.min)/ +(this.properties.max-this.properties.min));var n=0.5*this.size[0],h=0.5*this.size[1],s=0.5*Math.min(this.size[0],this.size[1])-5;c.globalAlpha=1;c.save();c.translate(n,h);c.rotate(0.75*Math.PI);c.fillStyle="rgba(0,0,0,0.5)";c.beginPath();c.moveTo(0,0);c.arc(0,0,s,0,1.5*Math.PI);c.fill();c.strokeStyle="black";c.fillStyle=this.properties.color;c.lineWidth=2;c.beginPath();c.moveTo(0,0);c.arc(0,0,s-4,0,1.5*Math.PI*Math.max(0.01,this.value));c.closePath();c.fill();c.lineWidth=1;c.globalAlpha=1;c.restore(); +c.fillStyle="black";c.beginPath();c.arc(n,h,0.75*s,0,2*Math.PI,!0);c.fill();c.fillStyle=this.mouseOver?"white":this.properties.color;c.beginPath();var k=this.value*Math.PI*1.5+0.75*Math.PI;c.arc(n+Math.cos(k)*s*0.65,h+Math.sin(k)*s*0.65,0.05*s,0,2*Math.PI,!0);c.fill();c.fillStyle=this.mouseOver?"white":"#AAA";c.font=Math.floor(0.5*s)+"px Arial";c.textAlign="center";c.fillText(this.properties.value.toFixed(this.properties.precision),n,h+0.15*s)}};t.prototype.onExecute=function(){this.setOutputData(0, this.properties.value);this.boxcolor=D.colorToString([this.value,this.value,this.value])};t.prototype.onMouseDown=function(c){this.center=[0.5*this.size[0],0.5*this.size[1]+20];this.radius=0.5*this.size[0];if(20>c.canvasY-this.pos[1]||D.distance([c.canvasX,c.canvasY],[this.pos[0]+this.center[0],this.pos[1]+this.center[1]])>this.radius)return!1;this.oldmouse=[c.canvasX-this.pos[0],c.canvasY-this.pos[1]];this.captureInput(!0);return!0};t.prototype.onMouseMove=function(c){if(this.oldmouse){c=[c.canvasX- -this.pos[0],c.canvasY-this.pos[1]];var q=this.value,q=q-0.01*(c[1]-this.oldmouse[1]);1q&&(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];1q&&(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;sr?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;rl;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;tt)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;ts?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;sk;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;tt)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;ba&&(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;0this._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;cB":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;cB":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;tf;++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;bf&&(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;ff;++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;bf&&(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\t

uv: 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;lthis.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;ba.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;bd+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]),3d;++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;cd;++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;dd;++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;cd;++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=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;ca&&(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;da&&(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;df||wk&&kn))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;ef||vl&&lh))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+="#",2q&&(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+="#",2this.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;hthis.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;hc;++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;hb;b++)for(var d=0;dg+e||c[1]>d))return b}}return-1};H.prototype.onAction=function(f,h){if("reset"==f)for(var k=0;kh[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;bb;b++)for(var d=0;dg+e||c[1]>d))return b}}return-1};H.prototype.onAction=function(f,h){if("reset"==f)for(var q=0;qh[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); }