diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c0971cb --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +.svn +.DS_Store +__MACOSX +node_modules/ + + diff --git a/README.md b/README.md index bd79a0f..19bd263 100644 --- a/README.md +++ b/README.md @@ -104,6 +104,21 @@ or images that are served from the same domain, unless they are served with [CORS headers](http://hacks.mozilla.org/2011/11/using-cors-to-load-webgl-textures-from-cross-domain-images/). Firefox, Chrome and Opera support CORS for video, but Safari and Internet Explorer do not, and videos served with CORS are rare. So for now, it is best to host your own video files. +##Building for deployment + +``` +gulp build +``` + +or for custom builds + +``` +gulp build --inc "invert hue-saturation" +gulp build --exc "sketch" +``` + + + ## Contributing Bug fixes, new features, effects and examples are welcome and appreciated. Please follow the [Contributing Guidelines](https://github.com/brianchirls/Seriously.js/wiki/Contributing). diff --git a/bower.json b/bower.json new file mode 100644 index 0000000..606c2b3 --- /dev/null +++ b/bower.json @@ -0,0 +1,26 @@ +{ + "name": "Seriously.js", + "main": "Seriously.js", + "version": "0.1", + "homepage": "http://seriouslyjs.org/", + "authors": [ + "brian at chirls dot com" + ], + "description": "Seriously.js is a real-time, node-based video compositor for the web. Inspired by professional software such as After Effects and Nuke, Seriously.js renders high-quality video effects, but allows them to be dynamic and interactive.", + "moduleType": [ + "amd" + ], + "keywords": [ + "video", + "compositor", + "webgl" + ], + "license": "MIT", + "ignore": [ + "**/.*", + "node_modules", + "bower_components", + "test", + "tests" + ] +} diff --git a/build/seriously.min.js b/build/seriously.min.js new file mode 100755 index 0000000..a5433e9 --- /dev/null +++ b/build/seriously.min.js @@ -0,0 +1,7 @@ +!function(e,t){"use strict";"function"==typeof define&&define.amd?define("seriously",function(){var i=t(e);return e.Seriously||(e.Seriously=i),i}):"object"==typeof exports?module.exports=t(e):"function"!=typeof e.Seriously&&(e.Seriously=t(e))}(window,function(e){"use strict";function t(e,t){var i,r;if("string"==typeof e)i=C.querySelector(e);else if(!e)return!1;return e.tagName&&(i=e),i?(r=i.tagName.toLowerCase(),t&&t.indexOf(r)<0?e:i):e}function i(e,t){var r,o;e.prototype&&t.prototype&&e.prototype!==t.prototype&&i(e.prototype,t.prototype);for(r in t)t.hasOwnProperty(r)&&(o=Object.getOwnPropertyDescriptor(t,r),o.get||o.set?Object.defineProperty(e,r,{configurable:!0,enumerable:!0,get:o.get,set:o.set}):e[r]=t[r]);return e}function r(e){var t;if(!E)return O;if("function"==typeof E[e])t=E[e];else{if("function"!=typeof E.log)return O;t=E.log}return t.bind?t.bind(E):function(){t.apply(E,arguments)}}function o(t,i){if(i||(i="HTMLElement"),t instanceof e[i])return!0;if(!t||"object"!=typeof t)return!1;for(;t;)if(t=Object.getPrototypeOf(t),t&&t.constructor.name===i)return!0;return!1}function n(e,t,i,r,o){function n(e,t,i){return i%=1,0>i&&(i+=1),1/6>i?e+(t-e)*i*6:.5>i?t:2/3>i?e+(t-e)*(2/3-i)*6:e}var s,a;return a=.5>i?i*(t+1):i+t-i*t,s=2*i-a,o||(o=[]),o[0]=n(s,a,e+1/3),o[1]=n(s,a,e),o[2]=n(s,a,e-1/3),o[3]=r,o}function s(e){var t,i,r,o="#",n=e[3]<1?4:3;for(t=0;n>t;t++)i=Math.min(255,Math.round(255*e[t]||0)),r=i.toString(16),16>i&&(r="0"+r),o+=r;return o}function a(e){return Array.isArray(e)||e&&e.BYTES_PER_ELEMENT&&"length"in e}function u(t){function i(){B.length&&B.shift()()}if("function"!=typeof t)throw new Error("setTimeoutZero argument is not a function");return B.push(t),"file:"===e.location.protocol?void setTimeout(i,0):void e.postMessage("seriously-timeout-message",e.location)}function l(t,i){var r;try{r=e.WebGLDebugUtils&&i&&i.debugContext?e.WebGLDebugUtils.makeDebugContext(t.getContext("webgl",i)):t.getContext("webgl",i)}catch(o){}if(!r)try{r=t.getContext("experimental-webgl",i)}catch(n){}return r}function f(){var t;return v&&v.getError()===v.CONTEXT_LOST_WEBGL&&(v=void 0),v||!e.WebGLRenderingContext||y?v:(t=C.createElement("canvas"),v=l(t),v?t.addEventListener("webglcontextlost",function i(e){e.preventDefault(),v&&v.canvas===this&&(v=void 0,t.removeEventListener("webglcontextlost",i,!1))},!1):p.logger.warn("Unable to access WebGL."),v)}function c(i){var r,o,n,s;if(r=t(i,["img","canvas","video"]),!r)return!1;if(o=C.createElement("canvas"),!o)return p.logger.warn("Browser does not support canvas or Seriously.js"),!1;if(0===r.naturalWidth&&"IMG"===r.tagName)return p.logger.warn("Image not loaded"),!1;if(0===r.readyState&&0===r.videoWidth&&"VIDEO"===r.tagName)return p.logger.warn("Video not loaded"),!1;if(n=f()){s=n.createTexture(),s||p.logger.error("Test WebGL context has been lost"),n.bindTexture(n.TEXTURE_2D,s);try{n.texImage2D(n.TEXTURE_2D,0,n.RGBA,n.RGBA,n.UNSIGNED_BYTE,r)}catch(a){return a.code===e.DOMException.SECURITY_ERR?p.logger.log("Unable to access cross-domain image"):p.logger.error("Error storing image to texture: "+a.message),n.deleteTexture(s),!1}n.deleteTexture(s)}else{n=o.getContext("2d");try{n.drawImage(r,0,0),n.getImageData(0,0,1,1)}catch(u){return u.code===e.DOMException.SECURITY_ERR?p.logger.log("Unable to access cross-domain image"):p.logger.error("Error drawing image to canvas: "+u.message),!1}}return!0}function d(e){function t(e,t){var i,n;a(e)?(i=e[0],n=e[1]||i):i=e,"string"==typeof i?i=i.toLowerCase():"number"==typeof i?i=String(i):i||(i=""),o[i]=n,t||(r.firstValue=i)}function i(e){return e}var r,o,n;for(n in e.inputs)if(e.inputs.hasOwnProperty(n)){if(e.reserved.indexOf(n)>=0||Object.prototype[n])throw new Error("Reserved input name: "+n);r=e.inputs[n],r.name=n,isNaN(r.min)&&(r.min=-(1/0)),isNaN(r.max)&&(r.max=1/0),isNaN(r.minCount)&&(r.minCount=-(1/0)),isNaN(r.maxCount)&&(r.maxCount=1/0),isNaN(r.step)&&(r.step=0),isNaN(r.mod)&&(r.mod=0),"enum"===r.type&&r.options&&a(r.options)&&r.options.length&&(o={},r.options.forEach(t),r.options=o),"vector"===r.type?r.dimensions<2?r.dimensions=2:r.dimensions>4?r.dimensions=4:!r.dimensions||isNaN(r.dimensions)?r.dimensions=4:r.dimensions=Math.round(r.dimensions):r.dimensions=1,r.shaderDirty=!!r.shaderDirty,"function"!=typeof r.validate&&(r.validate=p.inputValidators[r.type]||i),e.defaultImageInput||"image"!==r.type||(e.defaultImageInput=n)}}function h(e,t,i,r){var o,n,s,a,u=r===!0?r:r&&r.useFloat;u=!1,u?this.type=e.FLOAT:this.type=e.UNSIGNED_BYTE,o=e.createFramebuffer(),e.bindFramebuffer(e.FRAMEBUFFER,o),r&&r.texture?(this.texture=r.texture,e.bindTexture(e.TEXTURE_2D,this.texture),this.ownTexture=!1):(this.texture=e.createTexture(),e.bindTexture(e.TEXTURE_2D,this.texture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!1),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),this.ownTexture=!0);try{this.type===e.FLOAT?(s=new Float32Array(t*i*4),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,t,i,0,e.RGBA,e.FLOAT,s)):(e.texImage2D(e.TEXTURE_2D,0,e.RGBA,t,i,0,e.RGBA,e.UNSIGNED_BYTE,null),this.type=e.UNSIGNED_BYTE)}catch(l){this.type=e.UNSIGNED_BYTE,s=new Uint8Array(t*i*4),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,t,i,0,e.RGBA,e.UNSIGNED_BYTE,s)}if(n=e.createRenderbuffer(),e.bindRenderbuffer(e.RENDERBUFFER,n),e.renderbufferStorage(e.RENDERBUFFER,e.DEPTH_COMPONENT16,t,i),e.framebufferRenderbuffer(e.FRAMEBUFFER,e.DEPTH_ATTACHMENT,e.RENDERBUFFER,n),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,this.texture,0),a=e.checkFramebufferStatus(e.FRAMEBUFFER),a===e.FRAMEBUFFER_INCOMPLETE_ATTACHMENT)throw new Error("Incomplete framebuffer: FRAMEBUFFER_INCOMPLETE_ATTACHMENT");if(a===e.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT)throw new Error("Incomplete framebuffer: FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT");if(a===e.FRAMEBUFFER_INCOMPLETE_DIMENSIONS)throw new Error("Incomplete framebuffer: FRAMEBUFFER_INCOMPLETE_DIMENSIONS");if(a===e.FRAMEBUFFER_UNSUPPORTED)throw new Error("Incomplete framebuffer: FRAMEBUFFER_UNSUPPORTED");if(a!==e.FRAMEBUFFER_COMPLETE)throw new Error("Incomplete framebuffer: "+a);e.bindTexture(e.TEXTURE_2D,null),e.bindRenderbuffer(e.RENDERBUFFER,null),e.bindFramebuffer(e.FRAMEBUFFER,null),this.gl=e,this.frameBuffer=o,this.renderBuffer=n,this.width=t,this.height=i}function m(e,t,i){function r(t,i){var r,o;if(r=i?e.createShader(e.FRAGMENT_SHADER):e.createShader(e.VERTEX_SHADER),e.shaderSource(r,t),e.compileShader(r),!e.getShaderParameter(r,e.COMPILE_STATUS)){for(t=t.split(/[\n\r]/),o=0;o1?function(t){e.uniform1iv(i,t)}:function(t){e.uniform1i(i,t)};if(t.type===e.FLOAT)return t.size>1?function(t){e.uniform1fv(i,t)}:function(t){e.uniform1f(i,t)};if(t.type===e.FLOAT_VEC2)return function(t){e.uniform2f(i,t[0],t[1])};if(t.type===e.FLOAT_VEC3)return function(t){e.uniform3f(i,t[0],t[1],t[2])};if(t.type===e.FLOAT_VEC4)return function(t){e.uniform4f(i,t[0],t[1],t[2],t[3])};if(t.type===e.FLOAT_MAT3)return function(t){e.uniformMatrix3fv(i,!1,t)};if(t.type===e.FLOAT_MAT4)return function(t){e.uniformMatrix4fv(i,!1,t)};throw new Error("Unknown shader uniform type: "+t.type)}function n(t){return function(){return e.getUniform(s,t)}}var s,a,u,l,f,c,d,h,m="";if(a=r(t),u=r(i,!0),s=e.createProgram(),e.attachShader(s,a),l=e.getShaderInfoLog(a),l&&(m+="Vertex shader error: "+l+"\n"),e.attachShader(s,u),l=e.getShaderInfoLog(u),l&&(m+="Fragment shader error: "+l+"\n"),e.linkProgram(s),!e.getProgramParameter(s,e.LINK_STATUS))throw m+=e.getProgramInfoLog(s),e.deleteProgram(s),e.deleteShader(a),e.deleteShader(u),d=k.exec(t)||k.exec(i),d&&(m="Shader = "+d[1]+"\n"+m),H.forEach(function(t){m+="\n"+t+": "+e.getParameter(e[t])}),new Error("Could not initialize shader:\n"+m);for(e.useProgram(s),this.uniforms={},c=e.getProgramParameter(s,e.ACTIVE_UNIFORMS),f=0;c>f;++f)h={info:e.getActiveUniform(s,f)},h.name=h.info.name.replace(/\[0\]$/,""),h.loc=e.getUniformLocation(s,h.name),h.set=o(h.info,h.loc),h.get=n(h.loc),this.uniforms[h.name]=h,this[h.name]||(this[h.name]=h);for(this.attributes={},this.location={},c=e.getProgramParameter(s,e.ACTIVE_ATTRIBUTES),f=0;c>f;++f)h={info:e.getActiveAttrib(s,f)},h.name=h.info.name,h.location=e.getAttribLocation(s,h.name),this.attributes[h.name]=h,this.location[h.name]=h.location;this.gl=e,this.program=s,this.destroy=function(){var t;e&&(e.deleteProgram(s),e.deleteShader(a),e.deleteShader(u));for(t in this)this.hasOwnProperty(t)&&delete this[t];s=null,a=null,u=null}}function p(r){function n(e,t){var i,r,o;return t?(i=t.createBuffer(),t.bindBuffer(t.ARRAY_BUFFER,i),t.bufferData(t.ARRAY_BUFFER,e.vertices,t.STATIC_DRAW),i.size=3,r=t.createBuffer(),t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,r),t.bufferData(t.ELEMENT_ARRAY_BUFFER,e.indices,t.STATIC_DRAW),o=t.createBuffer(),t.bindBuffer(t.ARRAY_BUFFER,o),t.bufferData(t.ARRAY_BUFFER,e.coords,t.STATIC_DRAW),o.size=2,{vertex:i,index:r,texCoord:o,length:e.indices.length,mode:e.mode||t.TRIANGLES}):!1}function a(e){var t={};return t.vertices=new Float32Array([-1,-1,0,1,-1,0,1,1,0,-1,1,0]),t.indices=new Uint16Array([0,1,2,0,2,3]),t.coords=new Float32Array([0,0,1,0,1,1,0,1]),n(t,e)}function f(e){var t,i;if(!A){if(e.canvas.addEventListener("webglcontextlost",v,!1),e.canvas.addEventListener("webglcontextrestored",c,!1),e.isContextLost())return void p.logger.warn("Unable to attach lost WebGL context. Will try again when context is restored.");for(A=e,B=e.canvas,j=a(A),V=new m(A,"#define SHADER_NAME seriously.base\n"+w,"#define SHADER_NAME seriously.base\n"+T),t=0;tr&&i.push(t))},U.prototype.off=function(e,t){var i,r=-1;e&&"function"==typeof t&&(i=this.listeners[e],i&&(r=i.indexOf(t),r>=0&&i.splice(r,1)))},U.prototype.emit=function(e){var t,i=this.listeners[e];if(i&&i.length)for(t=0;t=0&&oe.splice(e,1),delete ne[this.id],this.isDestroyed=!0},J=function(e){function r(e,i){var r,n,a;return a=c.effect.inputs[e],r=c.inputElements[e],"string"==typeof i&&isNaN(i)&&("enum"===a.type?a.options.hasOwnProperty(i)||(i=t(i,["select"])):"number"===a.type||"boolean"===a.type?i=t(i,["input","select"]):"image"===a.type&&(i=t(i,["canvas","img","video"]))),o(i,"HTMLInputElement")||o(i,"HTMLSelectElement")?(n=i.value,r&&r.element!==i&&(r.element.removeEventListener("change",r.listener,!0),r.element.removeEventListener("input",r.listener,!0),delete c.inputElements[e],r=null),r||(r={element:i,listener:function(e,t){return function(){var r,o;r="checkbox"===i.type?i.checked:t.value,o=c.setInput(e,r),"color"===a.type&&(o=s(o).substr(0,7)),o!==r&&(t.value=o)}}(e,i)},c.inputElements[e]=r,"range"===i.type?(i.addEventListener("input",r.listener,!0),i.addEventListener("change",r.listener,!0)):i.addEventListener("change",r.listener,!0)),r&&"checkbox"===i.type&&(n=i.checked)):(r&&(r.element.removeEventListener("change",r.listener,!0),r.element.removeEventListener("input",r.listener,!0),delete c.inputElements[e]),n=i),c.setInput(e,n),c.inputs[e]}function n(e){return function(t){var i=r(e,t);return i&&i.pub}}function a(e){return function(){var t=c.inputs[e];return t&&t.pub}}function u(e){return function(t){return r(e,t)}}function l(e){return function(){return c.inputs[e]}}var f,c=e;for(f in c.effect.inputs)if(c.effect.inputs.hasOwnProperty(f)){if(void 0!==this[f])throw new Error("Cannot overwrite Seriously."+f);"image"===c.effect.inputs[f].type?Object.defineProperty(this,f,{configurable:!0,enumerable:!0,get:a(f),set:n(f)}):Object.defineProperty(this,f,{configurable:!0,enumerable:!0,get:l(f),set:u(f)})}Object.defineProperties(this,{effect:{enumerable:!0,configurable:!0,get:function(){return c.hook}},title:{enumerable:!0,configurable:!0,get:function(){return c.effect.title||c.hook}},width:{enumerable:!0,configurable:!0,get:function(){return c.width}},height:{enumerable:!0,configurable:!0,get:function(){return c.height}},id:{enumerable:!0,configurable:!0,get:function(){return c.id}}}),this.render=function(){return c.render(),this},this.readPixels=function(e,t,i,r,o){return c.readPixels(e,t,i,r,o)},this.on=function(e,t){c.on(e,t)},this.off=function(e,t){c.off(e,t)},this.inputs=function(e){var t,r,o,n;if(o=c.effect.inputs,e)return(r=o[e])?(t={type:r.type,defaultValue:r.defaultValue,title:r.title||e},"number"===r.type?(t.min=r.min,t.max=r.max,t.step=r.step,t.mod=r.mod):"enum"===r.type?t.options=i({},r.options):"vector"===r.type&&(t.dimensions=r.dimensions),r.description&&(t.description=r.description),t):null;t={};for(n in o)o.hasOwnProperty(n)&&(t[n]=this.inputs(n));return t},this.alias=function(e,t){return c.alias(e,t),this},this.matte=function(e){c.matte(e)},this.destroy=function(){var e,t;c.destroy();for(e in this)this.hasOwnProperty(e)&&"isDestroyed"!==e&&"id"!==e&&(t=Object.getOwnPropertyDescriptor(this,e),t.get||t.set||"function"!=typeof this[e]?delete this[e]:this[e]=O)},this.isDestroyed=function(){return c.isDestroyed},this.isReady=function(){return c.ready}},H=function(e,t){var r,o,n,s,a={};U.call(this,t),this.gl=A,this.effectRef=S[e],this.sources={},this.targets=[],this.inputElements={},this.dirty=!0,this.shaderDirty=!0,this.hook=e,this.options=t,this.transform=null,this.effect=i({},this.effectRef),this.effectRef.definition&&i(this.effect,this.effectRef.definition.call(this,t)),d(this.effect),this.uniforms.transform=x,this.inputs={},s=me[e];for(r in this.effect.inputs)this.effect.inputs.hasOwnProperty(r)&&(o=this.effect.inputs[r],(void 0===o.defaultValue||null===o.defaultValue)&&("number"===o.type?o.defaultValue=Math.min(Math.max(0,o.min),o.max):"color"===o.type?o.defaultValue=[0,0,0,0]:"boolean"===o.type?o.defaultValue=!1:"string"===o.type?o.defaultValue="":"enum"===o.type&&(o.defaultValue=o.firstValue)),n=o.validate.call(this,o.defaultValue,o),s&&void 0!==s[r]&&(n=o.validate.call(this,s[r],o,o.defaultValue,n),s[r]=n,"image"===o.type&&(a[r]=n)),this.inputs[r]=n,o.uniform&&(this.uniforms[o.uniform]=o.defaultValue));A&&(this.initialize(),this.effect.commonShader&&this.buildShader()),this.updateReady(),this.inPlace=this.effect.inPlace,this.pub=new J(this),oe.push(this),ne[this.id]=this,fe.push(this),_[e].push(this);for(r in a)a.hasOwnProperty(r)&&this.setInput(r,a[r])},H.prototype=Object.create(U.prototype),H.prototype.constructor=H,H.prototype.initialize=function(){if(!this.initialized){var e=this;this.baseShader=V,this.shape?this.model=n(this.shape,this.gl):this.model=j,"function"==typeof this.effect.initialize?this.effect.initialize.call(this,function(){e.initFrameBuffer(!0)},A):this.initFrameBuffer(!0),this.frameBuffer&&(this.texture=this.frameBuffer.texture),this.initialized=!0}},H.prototype.resize=function(){var e;for(U.prototype.resize.call(this),this.effect.resize&&this.effect.resize.call(this),e=0;e=0&&this.targets.splice(t,1)},H.prototype.removeSource=function(e){var t,i=e&&e.pub;for(t in this.inputs)!this.inputs.hasOwnProperty(t)||this.inputs[t]!==e&&this.inputs[t]!==i||(this.inputs[t]=null);for(t in this.sources)!this.sources.hasOwnProperty(t)||this.sources[t]!==e&&this.sources[t]!==i||(this.sources[t]=null)},H.prototype.buildShader=function(){function e(e){return k.test(e)?e:"#define SHADER_NAME seriously."+r.hook+"\n"+e}var t,i=this.effect,r=this;this.shaderDirty&&(i.commonShader&&pe[this.hook]?(this.shader||pe[this.hook].count++,this.shader=pe[this.hook].shader):i.shader?(this.shader&&!i.commonShader&&this.shader.destroy(),t=i.shader.call(this,this.inputs,{vertex:w,fragment:T},p.util),t instanceof m?this.shader=t:t&&t.vertex&&t.fragment?this.shader=new m(A,e(t.vertex),e(t.fragment)):this.shader=V,i.commonShader&&(pe[this.hook]={count:1,shader:this.shader})):this.shader=V,this.shaderDirty=!1)},H.prototype.render=function(){function e(e,t,i,r,o,s){y(e,t,i,r,o||n,s)}var t,i,r,o=this.effect,n=this;if(A){if(this.initialized||this.initialize(),this.shaderDirty&&this.buildShader(),this.dirty&&this.ready){for(t in this.sources)!this.sources.hasOwnProperty(t)||o.requires&&!o.requires.call(this,t,this.inputs)||(r="function"==typeof this.inPlace?this.inPlace(t):this.inPlace,this.sources[t].render(!r));this.frameBuffer&&(i=this.frameBuffer.frameBuffer),"function"==typeof o.draw?(o.draw.call(this,this.shader,this.model,this.uniforms,i,e),this.emit("render")):i&&(y(this.shader,this.model,this.uniforms,i,this),this.emit("render")),this.dirty=!1}return this.texture}},H.prototype.setInput=function(e,t){function i(){var t,i=u.sources[e];if(i){for(t in u.sources)if(t!==e&&u.sources.hasOwnProperty(t)&&u.sources[t]===i)return;i.removeTarget(u)}}var r,o,n,s,a,u=this;if(this.effect.inputs.hasOwnProperty(e)){if(r=this.effect.inputs[e],"image"===r.type){if(t){if(t=b(t),t!==this.sources[e]){if(i(),E(t,this))throw new Error("Attempt to make cyclical connection.");this.sources[e]=t,t.addTarget(this)}}else delete this.sources[e],t=!1;o=this.sources[e],n=Object.keys(this.sources),this.inPlace===!0&&1===n.length?(s=this.sources[n[0]],this.uniforms.transform=s&&s.cumulativeMatrix||x):this.uniforms.transform=x}else a=me[this.hook]&&void 0!==me[this.hook][e]?me[this.hook][e]:r.defaultValue,t=r.validate.call(this,t,r,a,this.inputs[e]),o=t;return this.inputs[e]===t&&"color"!==r.type&&"vector"!==r.type?t:(this.inputs[e]=t,r.uniform&&(this.uniforms[r.uniform]=o),"image"===r.type?(this.resize(),this.updateReady()):r.updateSources&&this.updateReady(),r.shaderDirty&&(this.shaderDirty=!0),this.setDirty(),r.update&&r.update.call(this,t),t)}},H.prototype.alias=function(e,t){var i=this;if(Z.indexOf(t)>=0)throw new Error("'"+t+"' is a reserved name and cannot be used as an alias.");return this.effect.inputs.hasOwnProperty(e)&&(t||(t=e),re.removeAlias(t),ce[t]={node:this,input:e},Object.defineProperty(re,t,{configurable:!0,enumerable:!0,get:function(){return i.inputs[e]},set:function(t){return i.setInput(e,t)}})),this},H.prototype.matte=function(e){function t(e){return e&&e.length&&Array.isArray(e)?Array.isArray(e[0])?Array.isArray(e[0])&&!isNaN(e[0][0])?[e]:e:[e]:[]}function i(e,t,i,r){var o,n,s,a,u;return o=(r.x-i.x)*(e.y-i.y)-(r.y-i.y)*(e.x-i.x),n=(t.x-e.x)*(e.y-i.y)-(t.y-e.y)*(e.x-i.x),s=(r.y-i.y)*(t.x-e.x)-(r.x-i.x)*(t.y-e.y),s&&(a=o/s,u=n/s,a>0&&1>=a&&u>0&&1>=u)?{x:e.x+a*(t.x-e.x),y:e.y+a*(t.y-e.y)}:!1}function r(e){var t,r,o,n,s,a,u,l,f,c,d,h=[];if(!e.simple){for(t=0;ti;t=i,i++)r=e.vertices[t],o=e.vertices[i],s+=r.x*o.y-o.x*r.y;return s>0}function s(e){function t(e,t,i,r){var o,n,s,a,u,l,f,c,d,h,m,p,v,g,y;return o=i.x-t.x,n=i.y-t.y,s=e.x-i.x,a=e.y-i.y,u=t.x-e.x,l=t.y-e.y,f=r.x-e.x,c=r.y-e.y,d=r.x-t.x,h=r.y-t.y,m=r.x-i.x,p=r.y-i.y,y=o*h-n*d,v=u*c-l*f,g=s*p-a*m,y>=0&&g>=0&&v>=0}function i(e,i,r,o,n){var s,a,u,l,f;if(a=v[n[e]],u=v[n[i]],l=v[n[r]],0>(u.x-a.x)*(l.y-a.y)-(u.y-a.y)*(l.x-a.x))return!1;for(s=0;o>s;s++)if(s!==e&&s!==i&&s!==r&&(f=v[n[s]],t(a,u,l,f)))return!1;return!0}var r,o,n,s,a,l,f,c,d,h,m,p,v=e.vertices,g=[],y=[];if(o=v.length,e.clockWise)for(r=0;o>r;r++)g[r]=r;else for(r=0;o>r;r++)g[r]=o-1-r;for(n=o,s=2*n,a=0,r=n-1;n>2;){if(s--<=0)return y;if(l=r,l>=n&&(l=0),r=l+1,r>=n&&(r=0),f=r+1,f>n&&(f=0),i(l,r,f,n,g)){for(c=g[l],d=g[r],h=g[f],e.clockWise?(y.push(v[c]),y.push(v[d]),y.push(v[h])):(y.push(v[h]),y.push(v[d]),y.push(v[c])),a++,m=r,p=r+1;n>p;m++,p++)g[m]=g[p];n--,s=2*n}}u.indices=y}var a,u,l,f,c,d,h,m=[],p=[],v={};for(a=t(e),l=0;l=2&&!isNaN(c[0])&&!isNaN(c[1])&&(d={x:c[0],y:c[1],id:p.length}):d={x:c.x,y:c.y,id:p.length},d&&(h?(h.next=d,d.prev=h,d.next=u.vertices[0],u.vertices[0].prev=d):(u.head=d,d.next=d,d.prev=d),p.push(d),u.vertices.push(d),h=d);if(u.vertices.length>2)for(3===u.vertices.length&&(u.simple=!0),m.push(u),f=0;f=0;l--)u=m[l],r(u);for(l=0;l=0&&fe.splice(e,1),e=_[r].indexOf(this),e>=0&&_[r].splice(e,1),U.prototype.destroy.call(this)},Q=function(e){var t=e;Object.defineProperties(this,{original:{enumerable:!0,configurable:!0,get:function(){return t.source}},id:{enumerable:!0,configurable:!0,get:function(){return t.id}},width:{enumerable:!0,configurable:!0,get:function(){return t.width}},height:{enumerable:!0,configurable:!0,get:function(){return t.height}}}),this.render=function(){t.render()},this.update=function(){t.setDirty()},this.readPixels=function(e,i,r,o,n){return t.readPixels(e,i,r,o,n)},this.on=function(e,i){t.on(e,i)},this.off=function(e,i){t.off(e,i)},this.destroy=function(){var e,i;t.destroy();for(e in this)this.hasOwnProperty(e)&&"isDestroyed"!==e&&"id"!==e&&(i=Object.getOwnPropertyDescriptor(this,e),i.get||i.set||"function"!=typeof this[e]?delete this[e]:this[e]=O)},this.isDestroyed=function(){return t.isDestroyed},this.isReady=function(){return t.ready}},I=function(e,r,n){function s(e,t,r,o){var n=D[e];if(n.definition){if(n=n.definition.call(p,t,r,o),!n)return null;n=i(i({},D[e]),n)}return n}function a(e){return p.source===e}var u,l,f=n||{},c=void 0===f.flip?!0:f.flip,d=f.width,h=f.height,m=!1,p=this,v=!1;if(U.call(this),(e&&"string"!=typeof e||!r&&0!==r)&&(n&&"object"==typeof n||(n=r),r=e),"string"==typeof r&&isNaN(r)&&(r=t(r,["canvas","img","video"])),"string"==typeof e&&D[e]&&(l=s(e,r,n,!0),l&&(this.hook=e,v=!0,m=l.deferTexture,this.plugin=l,this.compare=l.compare,this.checkDirty=l.checkDirty,l.source&&(r=l.source))),!l&&o(r))"CANVAS"===r.tagName?(this.width=r.width,this.height=r.height,this.render=this.renderImageCanvas,v=!0,this.hook="canvas",this.compare=a):"IMG"===r.tagName&&(this.width=r.naturalWidth||1,this.height=r.naturalHeight||1,r.complete&&r.naturalWidth||(m=!0),r.addEventListener("load",function(){p.isDestroyed||((p.width!==r.naturalWidth||p.height!==r.naturalHeight)&&(p.width=r.naturalWidth,p.height=r.naturalHeight,p.resize()),p.setDirty(),p.setReady())},!0),this.render=this.renderImageCanvas,v=!0,this.hook="image",this.compare=a);else if(!l&&o(r,"WebGLTexture")){ +if(A&&!A.isTexture(r))throw new Error("Not a valid WebGL texture.");isNaN(d)?isNaN(h)||(d=h):isNaN(h)&&(h=d),this.width=d,this.height=h,void 0===f.flip&&(c=!1),v=!0,this.texture=r,this.initialized=!0,this.hook="texture",this.compare=a,this.render=function(){}}if(!v&&!l)for(u in D)if(D.hasOwnProperty(u)&&D[u]&&(l=s(u,r,n,!1))){this.hook=u,v=!0,m=l.deferTexture,this.plugin=l,this.compare=l.compare,this.checkDirty=l.checkDirty,l.source&&(r=l.source);break}if(!v)throw new Error("Unknown source type");this.source=r,void 0===this.flip&&(this.flip=c),this.targets=[],m||p.setReady(),this.pub=new Q(this),oe.push(this),ne[this.id]=this,ae.push(this),z[this.hook].push(this),ae.length&&!te&&g()},I.prototype=Object.create(U.prototype),I.prototype.constructor=I,I.prototype.initialize=function(){var e;A&&!this.texture&&this.ready&&(e=A.createTexture(),A.bindTexture(A.TEXTURE_2D,e),A.pixelStorei(A.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!1),A.texParameteri(A.TEXTURE_2D,A.TEXTURE_MAG_FILTER,A.LINEAR),A.texParameteri(A.TEXTURE_2D,A.TEXTURE_MIN_FILTER,A.LINEAR),A.texParameteri(A.TEXTURE_2D,A.TEXTURE_WRAP_S,A.CLAMP_TO_EDGE),A.texParameteri(A.TEXTURE_2D,A.TEXTURE_WRAP_T,A.CLAMP_TO_EDGE),A.bindTexture(A.TEXTURE_2D,null),this.texture=e,this.initialized=!0,this.allowRefresh=!0,this.setDirty())},I.prototype.initFrameBuffer=function(e){A&&(this.frameBuffer=new h(A,this.width,this.height,{texture:this.texture,useFloat:e}))},I.prototype.addTarget=function(e){var t;for(t=0;t=0&&this.targets.splice(t,1)},I.prototype.resize=function(){var e,t;if(this.uniforms.resolution[0]=this.width,this.uniforms.resolution[1]=this.height,this.framebuffer&&this.framebuffer.resize(this.width,this.height),this.emit("resize"),this.setDirty(),this.targets)for(e=0;e=0&&ae.splice(e,1),e=z[this.hook].indexOf(this),e>=0&&z[this.hook].splice(e,1);for(t in this)this.hasOwnProperty(t)&&"id"!==t&&delete this[t];U.prototype.destroy.call(this)},ee=function(e){var t=e;Object.defineProperties(this,{source:{enumerable:!0,configurable:!0,get:function(){return t.source?t.source.pub:void 0},set:function(e){t.setSource(e)}},original:{enumerable:!0,configurable:!0,get:function(){return t.target}},width:{enumerable:!0,configurable:!0,get:function(){return t.width},set:function(e){!isNaN(e)&&e>0&&t.width!==e&&(t.width=e,t.resize(),t.setTransformDirty())}},height:{enumerable:!0,configurable:!0,get:function(){return t.height},set:function(e){!isNaN(e)&&e>0&&t.height!==e&&(t.height=e,t.resize(),t.setTransformDirty())}},id:{enumerable:!0,configurable:!0,get:function(){return t.id}}}),this.render=function(){t.render()},this.readPixels=function(e,i,r,o,n){return t.readPixels(e,i,r,o,n)},this.on=function(e,i){t.on(e,i)},this.off=function(e,i){t.off(e,i)},this.go=function(e){t.go(e)},this.stop=function(){t.stop()},this.getTexture=function(){return t.frameBuffer.texture},this.destroy=function(){var e,i;t.destroy();for(e in this)this.hasOwnProperty(e)&&"isDestroyed"!==e&&"id"!==e&&(i=Object.getOwnPropertyDescriptor(this,e),i.get||i.set||"function"!=typeof this[e]?delete this[e]:this[e]=O)},this.inputs=function(e){return{source:{type:"image"}}},this.isDestroyed=function(){return t.isDestroyed},this.isReady=function(){return t.ready}},K=function(e,t,r){function n(e,t,r,o){var n=P[e];if(n.definition){if(n=n.definition.call(C,t,r,o),!n)return null;n=i(i({},P[e]),n),C.hook=b,E=!0,C.plugin=n,C.compare=n.compare,n.target&&(t=n.target),n.gl&&!C.gl&&(C.gl=n.gl,A||f(n.gl)),C.gl===A&&(C.model=j,C.shader=V)}return n}var s,u,c,d,v,g,y,x,b,C=this,E=!1,S=!1;if(U.call(this),(e&&"string"!=typeof e||!t&&0!==t)&&(r&&"object"==typeof r||(r=t),t=e),s=r||{},u=void 0===s.flip?!0:s.flip,c=parseInt(s.width,10),d=parseInt(s.height,10),g=s.debugContext,"string"==typeof e&&P[e]&&n(e,t,s,!0),this.renderToTexture=s.renderToTexture,o(t,"WebGLFramebuffer"))if(y=t,o(s,"HTMLCanvasElement"))t=s;else if(o(s,"WebGLRenderingContext"))t=s.canvas;else if(o(s.canvas,"HTMLCanvasElement"))t=s.canvas;else{if(!o(s.context,"WebGLRenderingContext"))throw new Error("Must provide a canvas with WebGLFramebuffer target");t=s.context.canvas}if(o(t,"HTMLCanvasElement")){if(c=t.width,d=t.height,(!A||A.canvas!==t&&s.allowSecondaryWebGL)&&(S=!0,v=l(t,{alpha:!0,premultipliedAlpha:!0,preserveDrawingBuffer:!0,stencil:!0,debugContext:g})),v)A&&A!==v?(this.gl=v,this.frameBuffer={frameBuffer:y||null},this.shader=new m(this.gl,w,T),this.model=a.call(this,this.gl),this.pixels=null,this.texture=this.gl.createTexture(),this.gl.bindTexture(A.TEXTURE_2D,this.texture),this.gl.texParameteri(A.TEXTURE_2D,A.TEXTURE_MAG_FILTER,A.LINEAR),this.gl.texParameteri(A.TEXTURE_2D,A.TEXTURE_MIN_FILTER,A.LINEAR),this.gl.texParameteri(A.TEXTURE_2D,A.TEXTURE_WRAP_S,A.CLAMP_TO_EDGE),this.gl.texParameteri(A.TEXTURE_2D,A.TEXTURE_WRAP_T,A.CLAMP_TO_EDGE),this.render=this.renderSecondaryWebGL):(N||(N=this),A||f(v),this.render=this.renderWebGL,s.renderToTexture?A&&(this.frameBuffer=new h(A,c,d,!1)):this.frameBuffer={frameBuffer:y||null});else{if(!s.allowSecondaryWebGL&&A&&A.canvas!==t)throw new Error("Only one WebGL target canvas allowed. Set allowSecondaryWebGL option to create secondary context.");this.render=O,p.logger.log("Unable to create WebGL context.")}E=!0}if(!E)for(b in P)if(P.hasOwnProperty(b)&&P[b]&&n(b,t,s,!1))break;if(!E)throw new Error("Unknown target type");M&&(x=M.get(t),x?p.logger.warn("Target already in use by another instance",t,Object.keys(x).map(function(e){return x[e]})):(x={},M.set(t,x)),x[re.id]=re),this.target=t,this.transform=null,this.transformDirty=!0,this.flip=u,c&&(this.width=c),d&&(this.height=d),this.uniforms.resolution[0]=this.width,this.uniforms.resolution[1]=this.height,void 0!==s.auto?this.auto=s.auto:this.auto=ve,this.frames=0,this.pub=new ee(this),oe.push(this),ne[this.id]=this,ue.push(this)},K.prototype=Object.create(U.prototype),K.prototype.constructor=K,K.prototype.setSource=function(e){var t;t=b(e),t!==this.source&&(this.source&&this.source.removeTarget(this),this.source=t,t.addTarget(this),t&&(this.resize(),t.ready?this.setReady():this.setUnready()),this.setDirty())},K.prototype.setDirty=function(){this.dirty=!0,this.auto&&!te&&(te=X(g))},K.prototype.resize=function(){o(this.target,"HTMLCanvasElement")?(this.width!==this.target.width||this.height!==this.target.height)&&(this.target.width=this.width,this.target.height=this.height,this.uniforms.resolution[0]=this.width,this.uniforms.resolution[1]=this.height,this.emit("resize"),this.setTransformDirty()):this.plugin&&this.plugin.resize&&this.plugin.resize.call(this),!this.source||this.source.width===this.width&&this.source.height===this.height||this.transform||(this.transform=new Float32Array(16))},K.prototype.setTransformDirty=function(){this.transformDirty=!0,this.setDirty()},K.prototype.go=function(){this.auto=!0,this.setDirty()},K.prototype.stop=function(){this.auto=!1},K.prototype.render=function(){A&&this.plugin&&this.plugin.render&&this.plugin.render.call(this,y,V,j)},K.prototype.renderWebGL=function(){var e,t,i;if(this.resize(),A&&this.dirty&&this.ready){if(!this.source)return;this.source.render(),this.uniforms.source=this.source.texture,this.source.width===this.width&&this.source.height===this.height?this.uniforms.transform=this.source.cumulativeMatrix||x:this.transformDirty&&(e=this.transform,q.copy(e,this.source.cumulativeMatrix||x),t=this.source.width/this.width,i=this.source.height/this.height,e[0]*=t,e[1]*=t,e[2]*=t,e[3]*=t,e[4]*=i,e[5]*=i,e[6]*=i,e[7]*=i,this.uniforms.transform=e,this.transformDirty=!1),y(V,j,this.uniforms,this.frameBuffer.frameBuffer,this,G),this.emit("render"),this.dirty=!1}},K.prototype.renderSecondaryWebGL=function(){var e,t,i,r,o;this.dirty&&this.ready&&this.source&&(this.emit("render"),this.source.render(!0),e=this.source.width,t=this.source.height,this.pixels&&this.pixels.length===e*t*4||(this.pixels=new Uint8Array(e*t*4)),this.source.readPixels(0,0,e,t,this.pixels),this.gl.texImage2D(this.gl.TEXTURE_2D,0,this.gl.RGBA,e,t,0,this.gl.RGBA,this.gl.UNSIGNED_BYTE,this.pixels),e===this.width&&t===this.height?this.uniforms.transform=x:this.transformDirty&&(i=this.transform,q.copy(i,x),r=this.source.width/this.width,o=this.source.height/this.height,i[0]*=r,i[1]*=r,i[2]*=r,i[3]*=r,i[4]*=o,i[5]*=o,i[6]*=o,i[7]*=o,this.uniforms.transform=i,this.transformDirty=!1),this.uniforms.source=this.texture,y(this.shader,this.model,this.uniforms,null,this,G),this.dirty=!1)},K.prototype.removeSource=function(e){(this.source===e||this.source===e.pub)&&(this.source=null)},K.prototype.destroy=function(){var e,t;this.source&&this.source.removeTarget&&this.source.removeTarget(this),M&&(t=M.get(this.target),delete t[re.id],Object.keys(t).length||M["delete"](this.target)),this.plugin&&this.plugin.destroy&&this.plugin.destroy.call(this),delete this.source,delete this.target,delete this.pub,delete this.uniforms,delete this.pixels,delete this.auto,e=ue.indexOf(this),e>=0&&ue.splice(e,1),U.prototype.destroy.call(this),this===N&&(B.removeEventListener("webglcontextrestored",c,!1),v(),N=null)},$=function(e){function r(e,i,r){var n,a;n=l.inputElements[e],"string"==typeof r&&isNaN(r)&&("enum"===i.type?i.options.hasOwnProperty(r)||(r=t(r,["select"])):"number"===i.type||"boolean"===i.type?r=t(r,["input","select"]):"image"===i.type&&(r=t(r,["canvas","img","video"]))),o(r,"HTMLInputElement")||o(r,"HTMLSelectElement")?(a=r.value,n&&n.element!==r&&(n.element.removeEventListener("change",n.listener,!0),n.element.removeEventListener("input",n.listener,!0),delete l.inputElements[e],n=null),n||(n={element:r,listener:function(t){return function(){var i,o;i="checkbox"===r.type?r.checked:t.value,o=l.setInput(e,i),"color"===r.type&&(o=s(o)),o!==i&&(t.value=o)}}(r)},l.inputElements[e]=n,"range"===r.type?(r.addEventListener("input",n.listener,!0),r.addEventListener("change",n.listener,!0)):r.addEventListener("change",n.listener,!0)),n&&"checkbox"===r.type&&(a=r.checked)):(n&&(n.element.removeEventListener("change",n.listener,!0),n.element.removeEventListener("input",n.listener,!0),delete l.inputElements[e]),a=r),l.setInput(e,a)}function n(e,t){Object.defineProperty(f,e,{configurable:!0,enumerable:!0,get:function(){return t.get.call(l)},set:function(i){r(e,t,i)}})}function a(e){return function(){e.apply(l,arguments)&&l.setTransformDirty()}}var u,l=e,f=this;Object.defineProperties(this,{transform:{enumerable:!0,configurable:!0,get:function(){return l.hook}},title:{enumerable:!0,configurable:!0,get:function(){return l.plugin.title||l.hook}},width:{enumerable:!0,configurable:!0,get:function(){return l.width}},height:{enumerable:!0,configurable:!0,get:function(){return l.height}},id:{enumerable:!0,configurable:!0,get:function(){return l.id}},source:{enumerable:!0,configurable:!0,get:function(){return l.source&&l.source.pub},set:function(e){l.setSource(e)}}});for(u in l.methods)l.methods.hasOwnProperty(u)&&(this[u]=a(l.methods[u]));for(u in l.inputs)l.inputs.hasOwnProperty(u)&&n(u,l.inputs[u]);this.update=function(){l.setDirty()},this.inputs=function(e){var t,r,o,n;if(o=l.plugin.inputs,e)return r=o[e],!r||r.method?null:(t={type:r.type,defaultValue:r.defaultValue,title:r.title||e},"number"===r.type?(t.min=r.min,t.max=r.max,t.step=r.step,t.mod=r.mod):"enum"===r.type?t.options=i({},r.options):"vector"===r.type&&(t.dimensions=r.dimensions),r.description&&(t.description=r.description),t);t={};for(n in o)o.hasOwnProperty(n)&&!o[n].method&&(t[n]=this.inputs(n));return t},this.alias=function(e,t){return l.alias(e,t),this},this.on=function(e,t){l.on(e,t)},this.off=function(e,t){l.off(e,t)},this.destroy=function(){var e,t;l.destroy();for(e in this)this.hasOwnProperty(e)&&"isDestroyed"!==e&&"id"!==e&&(t=Object.getOwnPropertyDescriptor(this,e),t.get||t.set||"function"!=typeof this[e]?delete this[e]:this[e]=O)},this.isDestroyed=function(){return l.isDestroyed},this.isReady=function(){return l.ready}},Y=function(e,t){var r,o,n,s,a;this.matrix=new Float32Array(16),this.cumulativeMatrix=new Float32Array(16),this.ready=!1,this.width=1,this.height=1,this.seriously=re,this.transformRef=R[e],this.hook=e,this.id=se,se++,this.options=t,this.sources=null,this.targets=[],this.inputElements={},this.inputs={},this.methods={},this.listeners={},this.texture=null,this.frameBuffer=null,this.uniforms=null,this.dirty=!0,this.transformDirty=!0,this.renderDirty=!1,this.isDestroyed=!1,this.transformed=!1,this.plugin=i({},this.transformRef),this.transformRef.definition&&i(this.plugin,this.transformRef.definition.call(this,t));for(r in this.plugin.inputs)this.plugin.inputs.hasOwnProperty(r)&&(o=this.plugin.inputs[r],o.method&&"function"==typeof o.method?this.methods[r]=o.method:"function"==typeof o.set&&"function"==typeof o.get&&(this.inputs[r]=o));d(this.plugin),a=me[e];for(r in this.plugin.inputs)this.plugin.inputs.hasOwnProperty(r)&&(o=this.plugin.inputs[r],"function"==typeof o.set&&"function"==typeof o.get&&"function"!=typeof o.method&&(n=o.get.call(this),s=void 0===o.defaultValue?n:o.defaultValue,s=o.validate.call(this,s,o,n),a&&void 0!==a[r]&&(s=o.validate.call(this,a[r],o,o.defaultValue,s),a[r]=s),s!==n&&o.set.call(this,s)));oe.push(this),ne[this.id]=this,this.pub=new $(this),le.push(this),F[e].push(this)},Y.prototype=Object.create(U.prototype),Y.prototype.constructor=Y,Y.prototype.setDirty=function(){this.renderDirty=!0,U.prototype.setDirty.call(this)},Y.prototype.setTransformDirty=function(){var e,t;for(this.transformDirty=!0,this.dirty=!0,this.renderDirty=!0,e=0;e=0&&this.targets.splice(t,1),this.targets&&this.targets.length&&this.resize()},Y.prototype.setInput=function(e,t){var i,r,o;return this.plugin.inputs.hasOwnProperty(e)?(i=this.plugin.inputs[e],r=me[this.hook]&&void 0!==me[this.hook][e]?me[this.hook][e]:i.defaultValue,o=i.get.call(this),void 0===r&&(r=o),t=i.validate.call(this,t,i,r,o),i.set.call(this,t)&&this.setTransformDirty(),i.get.call(this)):void 0},Y.prototype.alias=function(e,t){var i,r,o=this;if(Z.indexOf(t)>=0)throw new Error("'"+t+"' is a reserved name and cannot be used as an alias.");return this.plugin.inputs.hasOwnProperty(e)&&(t||(t=e),re.removeAlias(t),i=this.inputs[e],i?(r=o.inputs[e],Object.defineProperty(re,t,{configurable:!0,enumerable:!0,get:function(){return r.get.call(o)},set:function(e){r.set.call(o,e)&&o.setTransformDirty()}})):(i=this.methods[e],i&&(r=i,re[t]=function(){r.apply(o,arguments)&&o.setTransformDirty()})),i&&(ce[t]={node:this,input:e})),this},Y.prototype.render=function(e){return this.source?(this.source.render(),this.transformDirty&&(this.transformed?this.source.cumulativeMatrix?q.multiply(this.cumulativeMatrix,this.matrix,this.source.cumulativeMatrix):q.copy(this.cumulativeMatrix,this.matrix):q.copy(this.cumulativeMatrix,this.source.cumulativeMatrix||x),this.transformDirty=!1),e&&A?(this.renderDirty&&(this.frameBuffer||(this.uniforms={resolution:[this.width,this.height]},this.frameBuffer=new h(A,this.width,this.height)),this.uniforms.source=this.source.texture,this.uniforms.transform=this.cumulativeMatrix||x,y(V,j,this.uniforms,this.frameBuffer.frameBuffer,this),this.renderDirty=!1),this.texture=this.frameBuffer.texture):this.source?this.texture=this.source.texture:this.texture=null,this.dirty=!1,this.texture):(this.transformDirty&&(q.copy(this.cumulativeMatrix,this.matrix),this.transformDirty=!1),this.texture=null,void(this.dirty=!1))},Y.prototype.readPixels=function(e,t,i,r,n){var s=this.gl||A;if(!A)throw new Error("Cannot read pixels until a canvas is connected");if(this.render(!0),void 0===n)n=new Uint8Array(i*r*4);else if(!o(n,"Uint8Array"))throw new Error("Incompatible array type");return s.bindFramebuffer(A.FRAMEBUFFER,this.frameBuffer.frameBuffer),s.readPixels(e,t,i,r,A.RGBA,A.UNSIGNED_BYTE,n),n},Y.prototype.destroy=function(){var e,t,i,r=this.hook;this.plugin.destroy&&"function"==typeof this.plugin.destroy&&this.plugin.destroy.call(this),delete this.effect,this.frameBuffer&&(this.frameBuffer.destroy(),delete this.frameBuffer,delete this.texture);for(e in this.inputElements)this.inputElements.hasOwnProperty(e)&&(i=this.inputElements[e],i.element.removeEventListener("change",i.listener,!0),i.element.removeEventListener("input",i.listener,!0));for(this.source&&this.source.removeTarget(this);this.targets.length;)i=this.targets.pop(),i&&i.removeSource&&i.removeSource(this);for(t in this)this.hasOwnProperty(t)&&"id"!==t&&delete this[t];for(t in ce)ce.hasOwnProperty(t)&&(i=ce[t],i.node===this&&re.removeAlias(t));e=le.indexOf(this),e>=0&&le.splice(e,1),e=F[r].indexOf(this),e>=0&&F[r].splice(e,1),U.prototype.destroy.call(this)},Y.prototype.setReady=U.prototype.setReady,Y.prototype.setUnready=U.prototype.setUnready,Y.prototype.on=U.prototype.on,Y.prototype.off=U.prototype.off,Y.prototype.emit=U.prototype.emit,r=o(r,"HTMLCanvasElement")?{canvas:r}:r||{},r.canvas,this.effect=function(e,t){if(!S[e])throw new Error("Unknown effect: "+e);var i=new H(e,t);return i.pub},this.source=function(e,t,i){var r=b(e,t,i);return r.pub},this.transform=function(e,t){var i;if("string"!=typeof e&&(t=e,e=!1),e){if(!R[e])throw new Error("Unknown transform: "+e)}else if(e=r&&r.defaultTransform||"2d",!R[e])throw new Error("No transform specified");return i=new Y(e,t),i.pub},this.target=function(e,t,i){var r,o,n;for(e&&"string"==typeof e&&!P[e]&&(o=C.querySelector(e)),("string"!=typeof e||!t&&0!==t||o)&&(i&&"object"==typeof i||(i=t),t=o||e,e=null),"string"==typeof t&&isNaN(t)&&(t=C.querySelector(t)),n=0;n0)){var i=B.shift();i()}},!0),h.prototype.resize=function(e,t){var i=this.gl;(this.width!==e||this.height!==t)&&(this.width=e,this.height=t,i&&(i.bindTexture(i.TEXTURE_2D,this.texture),i.bindFramebuffer(i.FRAMEBUFFER,this.frameBuffer),i.bindRenderbuffer(i.RENDERBUFFER,this.renderBuffer),i.texImage2D(i.TEXTURE_2D,0,i.RGBA,e,t,0,i.RGBA,i.UNSIGNED_BYTE,null),i.renderbufferStorage(i.RENDERBUFFER,i.DEPTH_COMPONENT16,e,t),i.framebufferTexture2D(i.FRAMEBUFFER,i.COLOR_ATTACHMENT0,i.TEXTURE_2D,this.texture,0),i.bindTexture(i.TEXTURE_2D,null),i.bindRenderbuffer(i.RENDERBUFFER,null),i.bindFramebuffer(i.FRAMEBUFFER,null)))},h.prototype.destroy=function(){var e=this.gl;e&&(e.deleteFramebuffer(this.frameBuffer),e.deleteRenderbuffer(this.renderBuffer),this.ownTexture&&e.deleteTexture(this.texture)),delete this.frameBuffer,delete this.renderBuffer,delete this.texture,delete this.gl},m.prototype.use=function(){this.gl.useProgram(this.program)},p.incompatible=function(t){var i,r,o;if(void 0===y&&(i=C.createElement("canvas"),i&&i.getContext?e.WebGLRenderingContext?(r=f(),r||(y="context")):y="webgl":y="canvas"),y)return y;if(t){if(o=S[t],o&&"function"==typeof o.compatible&&!o.compatible(r))return"plugin-"+t;if(o=D[t],o&&"function"==typeof o.compatible&&!o.compatible(r))return"source-"+t}return!1},p.plugin=function(e,t,r){var o;return S[e]?void p.logger.warn("Effect ["+e+"] already loaded"):(void 0===r&&"object"==typeof t&&(r=t),r?(o=i({},r),"function"==typeof t&&(o.definition=t),o.reserved=Y,o.inputs&&d(o),o.title||(o.title=e),S[e]=o,_[e]=[],o):void 0)},p.removePlugin=function(e){var t,i,r;if(!e)return this;if(r=S[e],!r)return this;if(t=_[e]){for(;t.length;)i=t.shift(),i.destroy();delete _[e]}return delete S[e],this},p.source=function(e,t,r){var o;return D[e]?void p.logger.warn("Source ["+e+"] already loaded"):(void 0===r&&"object"==typeof t&&(r=t),r||t?(o=i({},r),"function"==typeof t&&(o.definition=t),o.title||(o.title=e),D[e]=o,z[e]=[],o):void 0)},p.removeSource=function(e){var t,i,r;if(!e)return this;if(r=D[e],!r)return this;if(t=z[e]){for(;t.length;)i=t.shift(),i.destroy();delete z[e]}return delete D[e],this},p.transform=function(e,t,r){var o;return R[e]?void p.logger.warn("Transform ["+e+"] already loaded"):(void 0===r&&"object"==typeof t&&(r=t),r||t?(o=i({},r),"function"==typeof t&&(o.definition=t),o.reserved=K,o.inputs&&d(o),o.title||(o.title=e),R[e]=o,F[e]=[],o):void 0)},p.removeTransform=function(e){var t,i,r;if(!e)return this;if(r=R[e],!r)return this;if(t=F[e]){for(;t.length;)i=t.shift(),i.destroy();delete F[e]}return delete R[e],this},p.target=function(e,t,r){var o;return P[e]?void p.logger.warn("Target ["+e+"] already loaded"):(void 0===r&&"object"==typeof t&&(r=t),r||t?(o=i({},r),"function"==typeof t&&(o.definition=t),o.title||(o.title=e),P[e]=o,A[e]=[],o):void 0)},p.removeTarget=function(e){var t,i,r;if(!e)return this;if(r=P[e],!r)return this;if(t=A[e]){for(;t.length;)i=t.shift(),i.destroy();delete A[e]}return delete P[e],this},p.inputValidators={color:function(e,t,i,r){var o,s,u,l;if(s=r||[],"string"==typeof e){if(u=j.exec(e),u&&u.length){if(u.length<3)return s[0]=s[1]=s[2]=s[3]=0,s;for(s[3]=1,l=0;3>l;l++)s[l]=parseFloat(u[l+2])/255;return isNaN(u[6])||(s[3]=parseFloat(u[6])),"hsl"===u[1].toLowerCase()?n(s[0],s[1],s[2],s[3],s):s}if(u=V.exec(e),u&&u.length)return o=u[1],3===o.length?(s[0]=parseInt(o[0],16)/15,s[1]=parseInt(o[1],16)/15,s[2]=parseInt(o[2],16)/15,s[3]=1):4===o.length?(s[0]=parseInt(o[0],16)/15,s[1]=parseInt(o[1],16)/15,s[2]=parseInt(o[2],16)/15,s[3]=parseInt(o[3],16)/15):6===o.length?(s[0]=parseInt(o.substr(0,2),16)/255,s[1]=parseInt(o.substr(2,2),16)/255,s[2]=parseInt(o.substr(4,2),16)/255,s[3]=1):8===o.length?(s[0]=parseInt(o.substr(0,2),16)/255,s[1]=parseInt(o.substr(2,2),16)/255,s[2]=parseInt(o.substr(4,2),16)/255,s[3]=parseInt(o.substr(6,2),16)/255):s[0]=s[1]=s[2]=s[3]=0,s;if(u=N[e.toLowerCase()]){for(l=0;4>l;l++)s[l]=u[l];return s}return g||(g=C.createElement("canvas").getContext("2d")),g.fillStyle=e,o=g.fillStyle,o&&"#000000"!==o?p.inputValidators.color(o,t,i,r):(s[0]=s[1]=s[2]=s[3]=0,s)}if(a(e)){if(s=e,s.length<3)return s[0]=s[1]=s[2]=s[3]=0,s;for(l=0;3>l;l++)if(isNaN(s[l]))return s[0]=s[1]=s[2]=s[3]=0,s;return s.length<4&&s.push(1),s}if("number"==typeof e)return s[0]=s[1]=s[2]=e,s[3]=1,s;if("object"==typeof e){for(l=0;4>l;l++)o=I[l],null===e[o]||isNaN(e[o])?s[l]=3===l?1:0:s[l]=e[o];return s}return s[0]=s[1]=s[2]=s[3]=0,s},number:function(e,t,i){return e=parseFloat(e),isNaN(e)?i||0:(t.mod&&(e-=t.mod*Math.floor(e/t.mod)),et.max?t.max:t.step?Math.round(e/t.step)*t.step:e)},"enum":function(e,t,i){var r=t.options||[];return"string"==typeof e?e=e.toLowerCase():"number"==typeof e?e=e.toString():e||(e=""),r.hasOwnProperty(e)?e:i||""},vector:function(e,t,i,r){var o,n,s,u=t.dimensions||4;if(o=r||[],a(e)){for(n=0;u>n;n++)o[n]=e[n]||0;return o}if("object"==typeof e){for(n=0;u>n;n++)s=U[n],void 0===e[s]&&(s=I[n]),o[n]=e[s]||0;return o}for(e=parseFloat(e)||0,n=0;u>n;n++)o[n]=e;return o},"boolean":function(e){return e?e&&e.toLowerCase&&"false"===e.toLowerCase()?!1:!0:!1},string:function(e){return"string"==typeof e?e:0===e||e?e.toString?e.toString():String(e):""}},p.prototype.effects=p.effects=function(){var e,t,i,r,o,n={};for(e in S)if(S.hasOwnProperty(e)){t=S[e],i={title:t.title||e,description:t.description||"",inputs:{}};for(o in t.inputs)t.inputs.hasOwnProperty(o)&&(r=t.inputs[o],i.inputs[o]={type:r.type,defaultValue:r.defaultValue,step:r.step,min:r.min,max:r.max,mod:r.mod,minCount:r.minCount,maxCount:r.maxCount,dimensions:r.dimensions,title:r.title||o,description:r.description||"",options:r.options||[]});n[e]=i}return n},e.Float32Array&&(x=new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1])),e.Seriously&&"object"==typeof e.Seriously&&!function(){var t;for(t in e.Seriously)e.Seriously.hasOwnProperty(t)&&"plugin"!==t&&"object"==typeof e.Seriously[t]&&p.plugin(t,e.Seriously[t])}(),p.logger={log:r("log"),info:r("info"),warn:r("warn"),error:r("error")},p.util={mat4:q,checkSource:c,hslToRgb:n,colors:N,setTimeoutZero:u,ShaderProgram:m,FrameBuffer:h,requestAnimationFrame:X,shader:{makeNoise:"float makeNoise(float u, float v, float timer) {\n float x = u * v * mod(timer * 1000.0, 100.0);\n x = mod(x, 13.0) * mod(x, 127.0);\n float dx = mod(x, 0.01);\n return clamp(0.1 + dx * 100.0, 0.0, 1.0);\n}\n",random:"#ifndef RANDOM\n#define RANDOM\nfloat random(vec2 n) {\n return 0.5 + 0.5 * fract(sin(dot(n.xy, vec2(12.9898, 78.233)))* 43758.5453);\n}\n#endif\n"}},p.source("video",function(t,i,r){function n(){t.removeEventListener("loadedmetadata",n,!0),c||(t.videoWidth?((f.width!==t.videoWidth||f.height!==t.videoHeight)&&(f.width=t.videoWidth,f.height=t.videoHeight,f.resize()),d&&f.setReady()):(d=!0,setTimeout(n,50)))}function s(){h=!0}function a(){h=!1,f.setDirty()}var u,l,f=this,c=!1,d=!1,h=!1,m=0;return o(t,"HTMLVideoElement")?(t.readyState?n():(d=!0,t.addEventListener("loadedmetadata",n,!0)),t.addEventListener("seeking",s,!1),t.addEventListener("seeked",a,!1), +{deferTexture:d,source:t,render:function v(i){var r,o;if(m=t.currentTime,!t.videoHeight||!t.videoWidth)return!1;b?(l||(l=C.createElement("canvas").getContext("2d"),u=l.canvas,u.width=f.width,u.height=f.height),r=u,l.drawImage(t,0,0,f.width,f.height)):r=t,i.bindTexture(i.TEXTURE_2D,f.texture),i.pixelStorei(i.UNPACK_FLIP_Y_WEBGL,f.flip),i.pixelStorei(i.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!1);try{if(i.texImage2D(i.TEXTURE_2D,0,i.RGBA,i.RGBA,i.UNSIGNED_BYTE,r),void 0===b){if(o=i.getError(),o===i.INVALID_VALUE)return b=!0,v(i);b=!1}return!0}catch(n){n.code===e.DOMException.SECURITY_ERR?(f.allowRefresh=!1,p.logger.error("Unable to access cross-domain image")):p.logger.error("Error rendering video source",n)}return!1},checkDirty:function(){return!h&&t.currentTime!==m},compare:function(e){return f.source===e},destroy:function(){c=!0,t.removeEventListener("seeking",s,!1),t.removeEventListener("seeked",a,!1),t.removeEventListener("loadedmetadata",n,!0)}}):void 0},{title:"Video"}),p.transform("2d",function(e){function t(){function e(e,t){C[12]=C[0]*e+C[4]*t+C[12],C[13]=C[1]*e+C[5]*t+C[13],C[14]=C[2]*e+C[6]*t+C[14],C[15]=C[3]*e+C[7]*t+C[15]}var t,h,m,p,v,g,y,x,b,w,T,C=i.matrix;return u||l||f||c||d||1!==s||1!==a?(q.identity(C),e(u+o,l+n),c&&(C[4]=c/i.width),d&&(C[1]=d/i.height),f&&(p=C[0],v=C[1],g=C[2],y=C[3],x=C[4],b=C[5],w=C[6],T=C[7],t=-(r?f*Math.PI/180:f),h=Math.sin(t),m=Math.cos(t),C[0]=p*m+x*h,C[1]=v*m+b*h,C[2]=g*m+w*h,C[3]=y*m+T*h,C[4]=x*m-p*h,C[5]=b*m-v*h,C[6]=w*m-g*h,C[7]=T*m-y*h),1!==s&&(C[0]*=s,C[1]*=s,C[2]*=s,C[3]*=s),1!==a&&(C[4]*=a,C[5]*=a,C[6]*=a,C[7]*=a),e(-o,-n),void(i.transformed=!0)):void(i.transformed=!1)}var i=this,r=!(e&&e.radians),o=0,n=0,s=1,a=1,u=0,l=0,f=0,c=0,d=0;return{inputs:{reset:{method:function(){return o=0,n=0,s=1,a=1,u=0,l=0,f=0,c=0,d=0,i.transformed?(i.transformed=!1,!0):!1}},translate:{method:function(e,i){return isNaN(e)&&(e=u),isNaN(i)&&(i=l),e===u&&i===l?!1:(u=e,l=i,t(),!0)},type:["number","number"]},translateX:{get:function(){return u},set:function(e){return e===u?!1:(u=e,t(),!0)},type:"number"},translateY:{get:function(){return l},set:function(e){return e===l?!1:(l=e,t(),!0)},type:"number"},rotation:{get:function(){return f},set:function(e){return e===f?!1:(f=parseFloat(e),t(),!0)},type:"number"},center:{method:function(e,i){return isNaN(e)&&(e=o),isNaN(i)&&(i=n),e===o&&i===n?!1:(o=e,n=i,t(),!0)},type:["number","number"]},centerX:{get:function(){return o},set:function(e){return e===o?!1:(o=e,t(),!0)},type:"number"},centerY:{get:function(){return n},set:function(e){return e===n?!1:(n=e,t(),!0)},type:"number"},skew:{method:function(e,i){return isNaN(e)&&(e=c),isNaN(i)&&(i=d),e===c&&i===d?!1:(c=e,d=i,t(),!0)},type:["number","number"]},skewX:{get:function(){return c},set:function(e){return e===c?!1:(c=e,t(),!0)},type:"number"},skewY:{get:function(){return d},set:function(e){return e===d?!1:(d=e,t(),!0)},type:"number"},scale:{method:function(e,i){var r,o;if(r=isNaN(e)?s:e,isNaN(i)){if(isNaN(e))return!1;o=r}else o=i;return r===s&&o===a?!1:(s=r,a=o,t(),!0)},type:["number","number"]},scaleX:{get:function(){return s},set:function(e){return e===s?!1:(s=e,t(),!0)},type:"number"},scaleY:{get:function(){return a},set:function(e){return e===a?!1:(a=e,t(),!0)},type:"number"}}}},{title:"2D Transform",description:"Translate, Rotate, Scale, Skew"}),p.transform("flip",function(){function e(){var e=t.matrix;i?(e[0]=-1,e[5]=1):(e[0]=1,e[5]=-1)}var t=this,i=!0;return q.identity(t.matrix),e(),t.transformDirty=!0,t.transformed=!0,{inputs:{direction:{get:function(){return i?"horizontal":"vertical"},set:function(t){var r;return r="vertical"===t?!1:!0,r===i?!1:(i=r,e(),!0)},type:"string"}}}},{title:"Flip",description:"Flip Horizontal/Vertical"}),p.transform("reformat",function(){function e(){var e,t,i,a,u=n.matrix,l=r||n.width,f=o||n.height,c=n.source,d=c&&c.width||1,h=c&&c.height||1;return"distort"===s||l===d&&f===h?void(n.transformed=!1):(i=d/h,a=l/f,"none"===s?(e=d/l,t=h/f):"width"===s||"contain"===s&&i>=a?(e=1,t=a/i):"height"===s||"contain"===s&&a>i?(e=i/a,t=1):a>i?(e=1,t=a/i):(e=i/a,t=1),1===e&&1===t?void(n.transformed=!1):(q.identity(u),1!==e&&(u[0]*=e,u[1]*=e,u[2]*=e,u[3]*=e),1!==t&&(u[4]*=t,u[5]*=t,u[6]*=t,u[7]*=t),void(n.transformed=!0)))}function t(){return r||n.source&&n.source.width||1}function i(){return o||n.source&&n.source.height||1}var r,o,n=this,s="contain";return this.resize=function(){var r,o=t(),n=i();if(this.width!==o||this.height!==n)for(this.width=o,this.height=n,this.uniforms&&this.uniforms.resolution&&(this.uniforms.resolution[0]=o,this.uniforms.resolution[1]=n),this.frameBuffer&&this.frameBuffer.resize&&this.frameBuffer.resize(o,n),r=0;r 1.0)"," hsl.x -= 1.0;"," }"," return hsl;","}","float HueToRGB(float f1, float f2, float hue) {"," if (hue < 0.0)"," hue += 1.0;"," else if (hue > 1.0)"," hue -= 1.0;"," float res;"," if ((6.0 * hue) < 1.0)"," res = f1 + (f2 - f1) * 6.0 * hue;"," else if ((2.0 * hue) < 1.0)"," res = f2;"," else if ((3.0 * hue) < 2.0)"," res = f1 + (f2 - f1) * ((2.0 / 3.0) - hue) * 6.0;"," else"," res = f1;"," return res;","}","vec3 HSLToRGB(vec3 hsl) {"," vec3 rgb;"," if (hsl.y == 0.0)"," rgb = vec3(hsl.z);"," else {"," float f2;"," if (hsl.z < 0.5)"," f2 = hsl.z * (1.0 + hsl.y);"," else"," f2 = (hsl.z + hsl.y) - (hsl.y * hsl.z);"," float f1 = 2.0 * hsl.z - f2;"," rgb.r = HueToRGB(f1, f2, hsl.x + (1.0/3.0));"," rgb.g = HueToRGB(f1, f2, hsl.x);"," rgb.b= HueToRGB(f1, f2, hsl.x - (1.0/3.0));"," }"," return rgb;","}","vec3 BlendHue(vec3 base, vec3 blend) {"," vec3 baseHSL = RGBToHSL(base);"," return HSLToRGB(vec3(RGBToHSL(blend).r, baseHSL.g, baseHSL.b));","}","vec3 BlendSaturation(vec3 base, vec3 blend) {"," vec3 baseHSL = RGBToHSL(base);"," return HSLToRGB(vec3(baseHSL.r, RGBToHSL(blend).g, baseHSL.b));","}","vec3 BlendColor(vec3 base, vec3 blend) {"," vec3 blendHSL = RGBToHSL(blend);"," return HSLToRGB(vec3(blendHSL.r, blendHSL.g, RGBToHSL(base).b));","}","vec3 BlendLuminosity(vec3 base, vec3 blend) {"," vec3 baseHSL = RGBToHSL(base);"," return HSLToRGB(vec3(baseHSL.r, baseHSL.g, RGBToHSL(blend).b));","}","vec3 BlendLighterColor(vec3 base, vec3 blend) {"," float baseTotal = base.r + base.g + base.b;"," float blendTotal = blend.r + blend.g + blend.b;"," return blendTotal > baseTotal ? blend : base;","}","vec3 BlendDarkerColor(vec3 base, vec3 blend) {"," float baseTotal = base.r + base.g + base.b;"," float blendTotal = blend.r + blend.g + blend.b;"," return blendTotal < baseTotal ? blend : base;","}","#define BlendFunction(base, blend) "+i[o],r[o]?"#define MIX_ALPHA":"","varying vec2 vTexCoord;","uniform sampler2D source;","uniform sampler2D previous;","uniform float opacity;","uniform float blendGamma;","vec3 BlendOpacity(vec4 base, vec4 blend, float opacity) {"," vec3 blendedColor = BlendFunction(base.rgb, blend.rgb);"," return mix(base.rgb, blendedColor, opacity * blend.a);","}","vec4 linear(vec4 color, vec3 gamma) {"," return vec4(pow(color.rgb, gamma), color.a);","}","void main(void) {"," vec3 exp = vec3(blendGamma);"," vec4 topPixel = linear(texture2D(source, vTexCoord), exp);"," vec4 bottomPixel = texture2D(previous, vTexCoord);"," if (topPixel.a == 0.0) {"," gl_FragColor = bottomPixel;"," } else {"," float alpha;","#ifdef MIX_ALPHA"," alpha = topPixel.a * opacity;"," alpha = alpha + bottomPixel.a * (1.0 - alpha);","#else"," alpha = bottomPixel.a;","#endif"," bottomPixel = linear(bottomPixel, exp);"," gl_FragColor = vec4(pow(BlendOpacity(bottomPixel, topPixel, opacity), 1.0 / exp), alpha);"," }","}"].join("\n"),t},resize:function(){!o||this.width===u&&this.height===l||(u=this.width,l=this.height,o[0].resize(u,l),o[1].resize(u,l),t())},draw:function(e,i,r,a,u){var l;return this.uniforms.previous=this.frameBuffer.texture,s=(s+1)%2,l=o[s],this.frameBuffer=l,this.texture=l.texture,this.inputs.clear?(t(),void u(this.baseShader,i,r,l.frameBuffer,null)):void u(e,i,r,l.frameBuffer,null,n)},destroy:function(){o&&(o[0].destroy(),o[1].destroy(),o.length=0)}}},{inPlace:!1,title:"Accumulator",description:"Draw on top of previous frame",inputs:{source:{type:"image",uniform:"source"},clear:{type:"boolean",defaultValue:!1},startColor:{type:"color",defaultValue:[0,0,0,0]},opacity:{type:"number",uniform:"opacity",defaultValue:1,min:0,max:1},blendGamma:{type:"number",uniform:"blendGamma",defaultValue:2.2,min:0,max:4},blendMode:{type:"enum",shaderDirty:!0,defaultValue:"normal",options:[["normal","Normal"],["lighten","Lighten"],["darken","Darken"],["multiply","Multiply"],["average","Average"],["add","Add"],["subtract","Subtract"],["divide","Divide"],["difference","Difference"],["negation","Negation"],["exclusion","Exclusion"],["screen","Screen"],["overlay","Overlay"],["softlight","Soft Light"],["hardlight","Hard Light"],["colordodge","Color Dodge"],["colorburn","Color Burn"],["lineardodge","Linear Dodge"],["linearburn","Linear Burn"],["linearlight","Linear Light"],["vividlight","Vivid Light"],["pinlight","Pin Light"],["hardmix","Hard Mix"],["reflect","Reflect"],["glow","Glow"],["phoenix","Phoenix"],["hue","Hue"],["saturation","Saturation"],["color","color"],["luminosity","Luminosity"],["darkercolor","Darker Color"],["lightercolor","Lighter Color"]]}}})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";var t,i;i=document.createElement("img"),i.src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAvAAAAAICAYAAACf+MsnAAAFY0lEQVR4Xu2Z644bOwyDN+//0NsOigEMQdRHyU6CFDnA+bHVWNaFojiTx8/Pz+/f/4/89/v7z9Xj8Tjib3XyTN9usFcMz8gt3h9zXf/O6nD/W1V7Vb9uXad+nHucZ9xenX7OqTHdSfmRXfmPsSn8xPMrllcfCkdVfHSe7Ned0/yp7jv2GPfqK+MCByc0zzvxKi5RPq8cuvE4+JrwpFM7N78K2yu+qb9kd3qV+ZjUx5n/+xnXP81ctW/UHQ5P3Gd360vxKf+n8dGpxXTeKu6h2ansFT6pvo5G2/FP99NsUf9d/xleInfetcj629m9cf9WOV5K+78R8ERGRLYO8VQiecd/1vwKEJV46JBJRzhRfXftVL/MTgM48UmL0l2OSmzs9kctAJfE4/1KkNFzbj8cjFHsJ/u460vhnPDfqddujJ27poLCWWBuHt0YKr/ki+yOKJnk5Z7pPLfLf4TZif+qvi7XuDWg+HbtNEe79ds9H7m1m2/3+YzLK5Hc9e/gYxdfNP+ZfdV9lT3usWn+9310/qiAdxa1O5gTEqVhoLudxVwVNPrvCqDp/ZX4d0Uk1Y7sbgyU4zooCk8nB3i9Y61V5wWpIjDlP+ZJsxPvmLxEOD2sntk5Pz1LBOb0L+sPfQGs6ksYpt7QAiHuUwtkgl+F3Qyf2YxTX53+Vdjfjc8VYIq7KT+abzof7ervZ8fX8d/Jyc3PmTcnRrrPEbyVTnD8T+Y38pH624mfNIr6muzO95S/sh1Gvog/XmW/a6N+scww43zgqLjcOX9cwFeESQK3Gpx32QggTlwk8Ei8OXfE4VMLeCLQiLBjfJM7VA069XefnZBGJz7Vr24dK3GwEoqLD7p/1+4IMWdRdxaMK9CmP4E62F7nm8S7s4B3BMCkBzQPVQ0IM06+2WLvzlDlI+NfF4d0ljiHuF/Zb/4m/4ojTgnA6f0qfiWA135P5l/NoFv/7txm+5ZyyOw0e1R/skd8ZKKwwnjXf9xLrkBV+2x3Pib9Vz3JOMaNL/KZ+oCkXhDUTLxEwLsC41OfI5DEYe9+mXfr0l2mJH5ISHTOUw2U8IjD5LyVUtxEmrvi4V5ejvijWNWicBbOyfsrYejkMMXmdIFEAZH19ASWnNyrPlBdKH+yU3y0gGjGKf4Mv51ft9zzKk83vul5qr9r7+CT9gHx2zvs0/yofpGX1AuC4svqhYJeJJydNZk/urcSxet91dfiUy94HX6oBHCHi5+F38svCeg1h+zZ6nyF5VUzVC8Q0X9LwE/IkMjmpJ3i27XvxuqQ0c4dp/JTfnb9T847AoNIW/nokIYrYKvnJvln/siPwtD0XAeTU+x0luEugWdLNeY4ecl260vxK8Efl3OnZi4uaZZIMBFeJ/hw6xrFvppvV1Q559d8MwwR50cskIBQ2KhE3y7/ZeddAUjxOr3diZ/8U3+I953z7uzR7Lj4rvjl9HxXvaHaOflSfSkf93y24xx94PpX89I5H2t9+fwK+KVzNOwdIeM+e905+ZqqRIj7pYHiU3FNFnBnkO+41EKige3cpX7GunwoARfjIwKrxNhEJFLfMrsbI+G/smfkojAa60vxPcNeCZCqhjSra6ydBaAWSFzaqnb01c4VEdVCWWPM7svstKDWuKrZpwUb7dVsOzPcxUeGdYdfdgV8Vr+Mv1R8Tn/iHcSNWR8jjjv9URzama9qbp0XlBP4y2Jw6u/E577AZTVz/BM/OfySzSjl79o73FRxaFdfuPG5/XE58PbXEvAT8UBn1HKuSIB8ThYwiZfJnd8z768Aib/3R/iN4J0VeMXcVwvynbl/735OBV6BKTfyT+e/T4/f7dP3uW8F3Aqs/PIHbWXeeeKjnSsAAAAASUVORK5CYII=",t=new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]),e.plugin("ascii",function(){function r(){l=h.height,u=h.width,f=Math.ceil(u/8),c=Math.ceil(l/8),d.resolution=h.uniforms.resolution,d.transform=t,n&&n.resize(f,c)}var o,n,s,a,u,l,f,c,d={},h=this;return{initialize:function(u){function l(){a.bindTexture(a.TEXTURE_2D,s),a.texParameteri(a.TEXTURE_2D,a.TEXTURE_MAG_FILTER,a.NEAREST),a.texParameteri(a.TEXTURE_2D,a.TEXTURE_MIN_FILTER,a.NEAREST),a.texParameteri(a.TEXTURE_2D,a.TEXTURE_WRAP_S,a.CLAMP_TO_EDGE),a.texParameteri(a.TEXTURE_2D,a.TEXTURE_WRAP_T,a.CLAMP_TO_EDGE),a.pixelStorei(a.UNPACK_FLIP_Y_WEBGL,!0),a.texImage2D(a.TEXTURE_2D,0,a.RGBA,a.RGBA,a.UNSIGNED_BYTE,i),a.bindTexture(a.TEXTURE_2D,null)}var h=this;u(),this.texture=this.frameBuffer.texture,a=this.gl,s=a.createTexture(),i.naturalWidth?l():i.addEventListener("load",function(){l(),h.setDirty()}),d.letters=s,a.bindTexture(a.TEXTURE_2D,this.texture||this.frameBuffer&&this.frameBuffer.texture),a.texParameteri(a.TEXTURE_2D,a.TEXTURE_MAG_FILTER,a.NEAREST),a.bindTexture(a.TEXTURE_2D,null),r(),n=new e.util.FrameBuffer(a,f,c),a.bindTexture(a.TEXTURE_2D,n.texture),a.texParameteri(a.TEXTURE_2D,a.TEXTURE_MAG_FILTER,a.NEAREST),this.uniforms.transform=t,o=this.baseShader},commonShader:!0,shader:function(e,t){return t.fragment=["precision mediump float;","varying vec2 vTexCoord;","uniform sampler2D source;","uniform sampler2D letters;","uniform vec4 background;","uniform vec2 resolution;","const vec3 lumcoeff = vec3(0.2125, 0.7154, 0.0721);","const vec2 fontSize = vec2(8.0, 8.0);","vec4 lookup(float ascii) {"," vec2 pos = mod(vTexCoord * resolution, fontSize) / vec2(752.0, fontSize.x) + vec2(ascii, 0.0);"," return texture2D(letters, pos);","}","void main(void) {"," vec4 sample = texture2D(source, vTexCoord);"," vec4 clamped = vec4(floor(sample.rgb * 8.0) / 8.0, sample.a);"," float luma = dot(sample.rgb,lumcoeff);"," float char = floor(luma * 94.0) / 94.0;"," gl_FragColor = mix(background, clamped, lookup(char).r);","}"].join("\n"),t},resize:r,draw:function(e,t,i,r,s){s(o,t,i,n.frameBuffer,!1,{width:f,height:c,blend:!1}),d.source=n.texture,d.background=i.background,s(e,t,d,r)},destroy:function(){n&&n.destroy(),a&&s&&a.deleteTexture(s)}}},{inPlace:!1,inputs:{source:{type:"image",uniform:"source",shaderDirty:!1},background:{type:"color",uniform:"background",defaultValue:[0,0,0,1]}},description:"Display image as ascii text in 8-bit color.",title:"Ascii Text"})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";e.plugin("bleach-bypass",{commonShader:!0,shader:function(e,t){return t.fragment=["precision mediump float;","varying vec2 vTexCoord;","uniform sampler2D source;","uniform float amount;","const vec4 one = vec4(1.0);","const vec4 two = vec4(2.0);","const vec4 lumcoeff = vec4(0.2125,0.7154,0.0721,0.0);","vec4 overlay(vec4 myInput, vec4 previousmix, vec4 amount) {"," float luminance = dot(previousmix,lumcoeff);"," float mixamount = clamp((luminance - 0.45) * 10.0, 0.0, 1.0);"," vec4 branch1 = two * previousmix * myInput;"," vec4 branch2 = one - (two * (one - previousmix) * (one - myInput));"," vec4 result = mix(branch1, branch2, vec4(mixamount) );"," return mix(previousmix, result, amount);","}","void main (void) {"," vec4 pixel = texture2D(source, vTexCoord);"," vec4 luma = vec4(vec3(dot(pixel,lumcoeff)), pixel.a);"," gl_FragColor = overlay(luma, pixel, vec4(amount));","}"].join("\n"),t},inPlace:!0,inputs:{source:{type:"image",uniform:"source",shaderDirty:!1},amount:{type:"number",uniform:"amount",defaultValue:1,min:0,max:1}},title:"Bleach Bypass",categories:["film"],description:["Bleach Bypass film treatment","http://en.wikipedia.org/wiki/Bleach_bypass",'see: "Saving Private Ryan", "Minority Report"'].join("\n")})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";function t(e,t,i){function r(e){var r={base:(t||"base")+"."+e,blend:(i||"blend")+"."+e};return function(e){return r[e]||e}}return"vec3("+e.replace(/blend|base/g,r("r"))+", "+e.replace(/blend|base/g,r("g"))+", "+e.replace(/blend|base/g,r("b"))+")"}var i={normal:"blend",lighten:"max(blend, base)",darken:"min(blend, base)",multiply:"(base * blend)",average:"(base + blend / TWO)",add:"min(base + blend, ONE)",subtract:"max(base - blend, ZERO)",divide:"base / blend",difference:"abs(base - blend)",negation:"(ONE - abs(ONE - base - blend))",exclusion:"(base + blend - TWO * base * blend)",screen:"(ONE - ((ONE - base) * (ONE - blend)))",lineardodge:"min(base + blend, ONE)",phoenix:"(min(base, blend) - max(base, blend) + ONE)",linearburn:"max(base + blend - ONE, ZERO)",hue:"BlendHue(base, blend)",saturation:"BlendSaturation(base, blend)",color:"BlendColor(base, blend)",luminosity:"BlendLuminosity(base, blend)",darkercolor:"BlendDarkerColor(base, blend)",lightercolor:"BlendLighterColor(base, blend)",overlay:t("base < 0.5 ? (2.0 * base * blend) : (1.0 - 2.0 * (1.0 - base) * (1.0 - blend))"),softlight:t("blend < 0.5 ? (2.0 * base * blend + base * base * (1.0 - 2.0 * blend)) : (sqrt(base) * (2.0 * blend - 1.0) + 2.0 * base * (1.0 - blend))"),hardlight:t("base < 0.5 ? (2.0 * base * blend) : (1.0 - 2.0 * (1.0 - base) * (1.0 - blend))","blend","base"),colordodge:t("blend == 1.0 ? blend : min(base / (1.0 - blend), 1.0)"),colorburn:t("blend == 0.0 ? blend : max((1.0 - ((1.0 - base) / blend)), 0.0)"),linearlight:t("BlendLinearLightf(base, blend)"),vividlight:t("BlendVividLightf(base, blend)"),pinlight:t("BlendPinLightf(base, blend)"),hardmix:t("BlendHardMixf(base, blend)"),reflect:t("BlendReflectf(base, blend)"),glow:t("BlendReflectf(blend, base)")},r={},o=new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]);e.plugin("blend",function(){function e(){var e=s&&r[s.mode];e&&a&&(u.blendEquation=a[e[0]],u.srcRGB=a[e[1]],u.dstRGB=a[e[2]],u.srcAlpha=a[e[3]],u.dstAlpha=a[e[4]])}var t,n,s,a,u={clear:!1};return this.resize=function(){var e,i,r,o,s,a=this.inputs.sizeMode,u=this.inputs.bottom,l=this.inputs.top;for("bottom"===a||"top"===a?(r=this.inputs[a],r?(e=r.width,i=r.height):(e=1,i=1)):u?l?(o="union"===a?Math.max:Math.min,e=o(u.width,l.width),i=o(u.height,l.height)):(e=u.width,i=u.height):l?(e=l.width,i=l.height):(e=1,i=1),(this.width!==e||this.height!==i)&&(this.width=e,this.height=i,this.uniforms.resolution[0]=e,this.uniforms.resolution[1]=i,this.frameBuffer&&this.frameBuffer.resize(e,i),this.emit("resize"),this.setDirty()),this.uniforms.resBottom[0]=u&&u.width||1,this.uniforms.resBottom[1]=u&&u.height||1,this.uniforms.resTop[0]=l&&l.width||1,this.uniforms.resTop[1]=l&&l.height||1,t&&(u&&(n.resolution[0]=u.width,n.resolution[1]=u.height),l&&(t.resolution[0]=l.width,t.resolution[1]=l.height)),s=0;s 1.0)"," hsl.x -= 1.0;"," }"," return hsl;","}","float HueToRGB(float f1, float f2, float hue) {"," if (hue < 0.0)"," hue += 1.0;"," else if (hue > 1.0)"," hue -= 1.0;"," float res;"," if ((6.0 * hue) < 1.0)"," res = f1 + (f2 - f1) * 6.0 * hue;"," else if ((2.0 * hue) < 1.0)"," res = f2;"," else if ((3.0 * hue) < 2.0)"," res = f1 + (f2 - f1) * ((2.0 / 3.0) - hue) * 6.0;"," else"," res = f1;"," return res;","}","vec3 HSLToRGB(vec3 hsl) {"," vec3 rgb;"," if (hsl.y == 0.0)"," rgb = vec3(hsl.z);"," else {"," float f2;"," if (hsl.z < 0.5)"," f2 = hsl.z * (1.0 + hsl.y);"," else"," f2 = (hsl.z + hsl.y) - (hsl.y * hsl.z);"," float f1 = 2.0 * hsl.z - f2;"," rgb.r = HueToRGB(f1, f2, hsl.x + (1.0/3.0));"," rgb.g = HueToRGB(f1, f2, hsl.x);"," rgb.b= HueToRGB(f1, f2, hsl.x - (1.0/3.0));"," }"," return rgb;","}","vec3 BlendHue(vec3 base, vec3 blend) {"," vec3 baseHSL = RGBToHSL(base);"," return HSLToRGB(vec3(RGBToHSL(blend).r, baseHSL.g, baseHSL.b));","}","vec3 BlendSaturation(vec3 base, vec3 blend) {"," vec3 baseHSL = RGBToHSL(base);"," return HSLToRGB(vec3(baseHSL.r, RGBToHSL(blend).g, baseHSL.b));","}","vec3 BlendColor(vec3 base, vec3 blend) {"," vec3 blendHSL = RGBToHSL(blend);"," return HSLToRGB(vec3(blendHSL.r, blendHSL.g, RGBToHSL(base).b));","}","vec3 BlendLuminosity(vec3 base, vec3 blend) {"," vec3 baseHSL = RGBToHSL(base);"," return HSLToRGB(vec3(baseHSL.r, baseHSL.g, RGBToHSL(blend).b));","}","vec3 BlendLighterColor(vec3 base, vec3 blend) {"," float baseTotal = base.r + base.g + base.b;"," float blendTotal = blend.r + blend.g + blend.b;"," return blendTotal > baseTotal ? blend : base;","}","vec3 BlendDarkerColor(vec3 base, vec3 blend) {"," float baseTotal = base.r + base.g + base.b;"," float blendTotal = blend.r + blend.g + blend.b;"," return blendTotal < baseTotal ? blend : base;","}","#define BlendFunction(base, blend) "+i[u],"varying vec2 texCoordBottom;","varying vec2 texCoordTop;","uniform sampler2D top;","uniform sampler2D bottom;","uniform float opacity;","uniform float blendGamma;","vec3 BlendOpacity(vec4 base, vec4 blend, float opacity) {"," vec3 blendedColor = BlendFunction(base.rgb, blend.rgb);"," return mix(base.rgb, blendedColor, opacity * blend.a);","}","vec4 linear(vec4 color, vec3 gamma) {"," return vec4(pow(color.rgb, gamma), color.a);","}","void main(void) {"," vec3 exp = vec3(blendGamma);"," vec4 topPixel = linear(texture2D(top, texCoordTop), exp);"," vec4 bottomPixel = texture2D(bottom, texCoordBottom);"," if (topPixel.a == 0.0) {"," gl_FragColor = bottomPixel;"," } else {"," bottomPixel = linear(bottomPixel, exp);"," gl_FragColor = vec4(pow(BlendOpacity(bottomPixel, topPixel, opacity), 1.0 / exp), bottomPixel.a);"," }","}"].join("\n"),s)},draw:function(e,i,o,s,l){r[this.inputs.mode]?(this.inputs.bottom?l(e,i,n,s):(a.viewport(0,0,this.width,this.height),a.bindFramebuffer(a.FRAMEBUFFER,s),a.clearColor(0,0,0,0),a.clear(a.COLOR_BUFFER_BIT|a.DEPTH_BUFFER_BIT)),this.inputs.top&&this.inputs.opacity&&l(e,i,t,s,null,u)):l(e,i,o,s)},requires:function(e){return this.inputs.opacity||"top"!==e?!0:!1},inputs:{top:{type:"image",uniform:"top",update:function(){t&&(t.source=this.inputs.top,t.transform=this.inputs.top.cumulativeMatrix||o),this.resize()}},bottom:{type:"image",uniform:"bottom",update:function(){n&&(n.source=this.inputs.bottom,n.transform=this.inputs.bottom.cumulativeMatrix||o),this.resize()}},opacity:{type:"number",uniform:"opacity",defaultValue:1,min:0,max:1,updateSources:!0,update:function(e){t&&(t.opacity=e)}},blendGamma:{type:"number",uniform:"blendGamma",defaultValue:2.2,min:0,max:4},sizeMode:{type:"enum",defaultValue:"bottom",options:["bottom","top","union","intersection"],update:function(){this.resize()}},mode:{type:"enum",shaderDirty:!0,defaultValue:"normal",options:[["normal","Normal"],["lighten","Lighten"],["darken","Darken"],["multiply","Multiply"],["average","Average"],["add","Add"],["subtract","Subtract"],["divide","Divide"],["difference","Difference"],["negation","Negation"],["exclusion","Exclusion"],["screen","Screen"],["overlay","Overlay"],["softlight","Soft Light"],["hardlight","Hard Light"],["colordodge","Color Dodge"],["colorburn","Color Burn"],["lineardodge","Linear Dodge"],["linearburn","Linear Burn"],["linearlight","Linear Light"],["vividlight","Vivid Light"],["pinlight","Pin Light"],["hardmix","Hard Mix"],["reflect","Reflect"],["glow","Glow"],["phoenix","Phoenix"],["hue","Hue"],["saturation","Saturation"],["color","color"],["luminosity","Luminosity"],["darkercolor","Darker Color"],["lightercolor","Lighter Color"]],update:function(){e()}}}}},{inPlace:function(){return!!r[this.inputs.mode]},description:"Blend two layers",title:"Blend"})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";var t=[.2,.3,.5,.8,1],i=t.length-1,r=[1,0],o=[0,1],n=new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]);e.plugin("blur",function(s){var a,u,l,f={amount:0,blendGamma:2,inputScale:1,resolution:[this.width,this.height],transform:n,direction:null};return{initialize:function(t){var i;t(),i=this.gl,i&&(l=this.baseShader,a=new e.util.FrameBuffer(i,this.width,this.height),u=new e.util.FrameBuffer(i,this.width,this.height))},commonShader:!0,shader:function(e,t){this.gl;return t.vertex=["precision mediump float;","attribute vec4 position;","attribute vec2 texCoord;","uniform vec2 resolution;","uniform mat4 transform;","uniform vec2 direction;","uniform float amount;","uniform float inputScale;","const vec2 zero = vec2(0.0);","varying vec2 vTexCoord;","varying vec4 vTexCoords[4];","void main(void) {"," vec4 screenPosition = vec4(position.xy * resolution / 2.0, position.z, position.w);"," screenPosition = transform * screenPosition;"," gl_Position = screenPosition;"," gl_Position.xy = screenPosition.xy * 2.0 / resolution;"," gl_Position.z = screenPosition.z * 2.0 / (resolution.x / resolution.y);"," vTexCoord = texCoord;"," vec2 one = vec2(1.0) * inputScale;"," if (inputScale < 1.0) {"," one -= 1.0 / resolution;"," }"," vTexCoord = max(zero, min(one, texCoord.st * inputScale));"," vec2 amount = direction * (inputScale * amount * 5.0 / resolution);"," for (int i = 0; i < 4; i++) {"," float s = pow(3.0, float(i));"," vTexCoords[i].xy = max(zero, min(one, vTexCoord + amount * s));"," vTexCoords[i].zw = max(zero, min(one, vTexCoord - amount * s));"," }","}"].join("\n"),t.fragment=["precision mediump float;\n","uniform sampler2D source;","uniform float blendGamma;","varying vec2 vTexCoord;","varying vec4 vTexCoords[4];","vec3 exp;","vec4 sample(sampler2D sampler, vec2 coord) {"," vec4 pixel = texture2D(sampler, coord);"," pixel.rgb = pow(pixel.rgb, exp);"," return pixel;","}","void main(void) {"," exp = vec3(blendGamma);"," gl_FragColor = sample(source, vTexCoord) / 9.0;"," for (int i = 0; i < 4; i++) {"," gl_FragColor += sample(source, vTexCoords[i].xy) / 9.0;"," gl_FragColor += sample(source, vTexCoords[i].zw) / 9.0;"," }"," gl_FragColor.rgb = pow(gl_FragColor.rgb, 1.0 / exp);","}"].join("\n"),t},draw:function(e,n,s,c,d){var h,m,p,v,g,y={width:0,height:0,blend:!1},x=1;if(p=this.inputs.amount,!p)return s.source=this.inputs.source.texture,void d(l,n,s,c);if(.01>=p)return s.inputScale=1,s.direction=r,s.source=this.inputs.source.texture,d(e,n,s,a.frameBuffer),s.direction=o,s.source=a.texture,void d(e,n,s,c);for(f.amount=p,f.blendGamma=s.blendGamma,f.source=this.inputs.source.texture,h=0;ho&&(o=parseFloat(e))):o=e,0===o||1===o||2===o||3===o?o:l.inputs[r]}function o(){var e,t,i,r,o=l.inputs;for(e=0;et;t++)r[t]=0;r[o.red]=o.redSource===i?1:0,r[4+o.green]=o.greenSource===i?1:0,r[8+o.blue]=o.blueSource===i?1:0,r[12+o.alpha]=o.alphaSource===i?1:0}}function n(){function e(e){var i,r;i=t[e],i||(i=l.sources[e]=t[e]=t.source),r=s.indexOf(i),0>r&&(r=s.length,s.push(i),l.uniforms["source"+r]=i)}var t=l.inputs;s.length=0,e("redSource"),e("greenSource"),e("blueSource"),e("alphaSource"),l.resize(),o()}var s=[],a=[],u=[],l=this;return this.resize=function(){var e,t,i,r,o,n=this.inputs.sizeMode;if(s.length)if(1===s.length)o=s[0],e=o.width,t=o.height;else if("union"===n)for(e=0,t=0,i=0;i 0.0) {"," if (hsl.z < 0.5) {"," hsl.y = delta / (maxColor + minColor);"," } else {"," hsl.y = delta / (2.0 - maxColor - minColor);"," }"," if (c.r == maxColor) {"," hsl.x = (c.g - c.b) / delta;"," } else if (c.g == maxColor) {"," hsl.x = 2.0 + (c.b - c.r) / delta;"," } else {"," hsl.x = 4.0 + (c.r - c.g) / delta;"," }"," hsl.x = hsl.x * 360.0 / 6.0;"," if (hsl.x < 0.0) {"," hsl.x += 360.0;"," } else {"," hsl.x = mod(hsl.x, 360.0);"," }"," }"," return hsl;","}","void main(void) {"," vec4 color = texture2D(source, vTexCoord);"," vec3 hsl = calcHSL(color.rgb);"," float adjustedHue = mod(hsl.x - adjustedHueRange.x, 360.0);"," float maskValue;"," if (adjustedHue < adjustedHueRange.y) {"," maskValue = smoothstep(0.0, adjustedHueRange.y, adjustedHue);"," } else if (adjustedHue < adjustedHueRange.z) {"," maskValue = 1.0;"," } else {"," maskValue = 1.0 - smoothstep(adjustedHueRange.z, adjustedHueRange.w, adjustedHue);"," }"," if (maskValue > 0.0) {"," if (hsl.y < saturationRange.y) {"," maskValue = min(maskValue, smoothstep(saturationRange.x, saturationRange.y, hsl.y));"," } else {"," maskValue = min(maskValue, 1.0 - smoothstep(saturationRange.z, saturationRange.w, hsl.y));"," }"," }"," if (maskValue > 0.0) {"," if (hsl.z < lightnessRange.y) {"," maskValue = min(maskValue, smoothstep(lightnessRange.x, lightnessRange.z, hsl.y));"," } else {"," maskValue = min(maskValue, 1.0 - smoothstep(lightnessRange.z, lightnessRange.w, hsl.z));"," }"," }"," if (mask) {"," gl_FragColor = vec4(maskValue, maskValue, maskValue, 1.0);"," } else {"," color.a = min(color.a, maskValue);"," gl_FragColor = color;"," }","}"].join("\n"),t},inPlace:!0,inputs:{source:{type:"image",uniform:"source"},hueMin:{type:"number",uniform:"hueMin",defaultValue:0},hueMax:{type:"number",uniform:"hueMax",defaultValue:360},hueMinFalloff:{type:"number",uniform:"hueMinFalloff",defaultValue:0,min:0},hueMaxFalloff:{type:"number",uniform:"hueMaxFalloff",defaultValue:0,min:0},saturationMin:{type:"number",uniform:"saturationMin",defaultValue:0,min:0,max:1},saturationMax:{type:"number",uniform:"saturationMax",defaultValue:1,min:0,max:1},saturationMinFalloff:{type:"number",uniform:"saturationMinFalloff",defaultValue:0,min:0},saturationMaxFalloff:{type:"number",uniform:"saturationMaxFalloff",defaultValue:0,min:0},lightnessMin:{type:"number",uniform:"lightnessMin",defaultValue:0,min:0,max:1},lightnessMax:{type:"number",uniform:"lightnessMax",defaultValue:1,min:0,max:1},lightnessMinFalloff:{type:"number",uniform:"lightnessMinFalloff",defaultValue:0,min:0},lightnessMaxFalloff:{type:"number",uniform:"lightnessMaxFalloff",defaultValue:0,min:0},mask:{type:"boolean",defaultValue:!1,uniform:"mask"}},title:"Color Select",description:"Create a mask by hue, saturation and lightness range."})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";e.plugin("color",function(){function t(){i.resize()}var i=this,r={width:1,height:1},o=!0;return this.resize=function(){var e,t,i,r;for(this.inputs&&this.inputs.width?(e=this.inputs.width,t=this.inputs.height||e):this.inputs&&this.inputs.height?e=t=this.inputs.height:(e=1,t=1),e=Math.floor(e),t=Math.floor(t),(this.width!==e||this.height!==t)&&(this.width=e,this.height=t,this.emit("resize"),this.setDirty()),i=0;i 0.5 ? 1.0 - dist1 : dist1;"," float dist2 = abs(hsv.x - hsvPole2.x);"," dist2 = dist2 > 0.5 ? 1.0 - dist2 : dist2;"," float descent = smoothstep(0.0, correlation, hsv.y);"," vec3 outputHsv = hsv;"," vec3 pole = dist1 < dist2 ? hsvPole1 : hsvPole2;"," float dist = min(dist1, dist2);"," float c = descent * amount * (1.0 - pow((dist * 2.0), 1.0 / concentration));"," outputHsv.x = hueLerp(hsv.x, pole.x, c);"," outputHsv.y = mix(hsv.y, pole.y, c);"," gl_FragColor = vec4(hsvToRgb(outputHsv), pixel.a);","}"].join("\n"),t},inPlace:!0,inputs:{source:{type:"image",uniform:"source"},amount:{type:"number",uniform:"amount",min:0,max:1,defaultValue:.8},concentration:{type:"number",uniform:"concentration",min:.1,max:4,defaultValue:2},correlation:{type:"number",uniform:"correlation",min:0,max:1,defaultValue:.5},guideColor:{type:"color",uniform:"guideColor",defaultValue:[1,.5,0,1]}},title:"Color Complements",categories:["color"],description:"http://theabyssgazes.blogspot.com/2010/03/teal-and-orange-hollywood-please-stop.html"})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";e.plugin("colorcube",{commonShader:!0,shader:function(e,t){return t.fragment=["precision mediump float;","uniform sampler2D source;","uniform sampler2D colorCube;","varying vec2 vTexCoord;","vec3 sampleAs3DTexture(sampler2D tex, vec3 coord, float size) {"," float sliceSize = 1.0 / size;"," float slicePixelSize = sliceSize / size;"," float sliceInnerSize = slicePixelSize * (size - 1.0);"," float zSlice0 = min(floor(coord.z * size), size - 1.0);"," float zSlice1 = min(zSlice0 + 1.0, size - 1.0);"," float xOffset = slicePixelSize * 0.5 + coord.x * sliceInnerSize;"," float s0 = xOffset + (zSlice0 * sliceSize);"," float s1 = xOffset + (zSlice1 * sliceSize);"," vec3 slice0Color = texture2D(tex, vec2(s0, 1.0 - coord.y)).rgb;"," vec3 slice1Color = texture2D(tex, vec2(s1, 1.0 - coord.y)).rgb;"," float zOffset = mod(coord.z * size, 1.0);"," return mix(slice0Color, slice1Color, zOffset);","}","void main(void) {"," vec4 originalColor = texture2D(source, vTexCoord);"," vec3 color = sampleAs3DTexture(colorCube, originalColor.rgb, 8.0);"," gl_FragColor = vec4(color, originalColor.a);","}"].join("\n"),t},inPlace:!0,inputs:{source:{type:"image",uniform:"source"},cube:{type:"image",uniform:"colorCube"}},title:"Color Cube",description:"" +})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";e.plugin("crop",function(){function e(){var e,i,r=1,o=1;t.inputs.source;for(t.source?(r=t.source.width,o=t.source.height):t.sources&&t.sources.source&&(r=t.sources.source.width,o=t.sources.source.height),r=r-t.inputs.left-t.inputs.right,o=o-t.inputs.top-t.inputs.bottom,r=Math.max(1,Math.floor(r)),o=Math.max(1,Math.floor(o)),(t.width!==r||t.height!==o)&&(t.width=r,t.height=o,t.uniforms.resolution[0]=r,t.uniforms.resolution[1]=o,t.frameBuffer&&t.frameBuffer.resize(t.width,t.height),t.emit("resize"),t.setDirty()),i=0;i 0.33 && cbtype < 0.66) {"," lms = vec3( LMS.r, (0.494207 * LMS.r) + (1.24827 * LMS.b), LMS.b );"," }"," if (cbtype > 0.66) {"," lms = vec3( LMS.r, LMS.g, (-0.395913 * LMS.r) + (0.801109 * LMS.g) );"," }"," const mat3 LMSRGB = mat3( 0.0809444479, -0.130504409, 0.116721066, -0.0102485335, 0.0540193266, -0.113614708, -0.000365296938, -0.00412161469, 0.693511405 );"," vec3 RGB = lms * LMSRGB;"," RGB.rgb = color.rgb - RGB.rgb;"," RGB.g = 0.7*RGB.r + RGB.g;"," RGB.b = 0.7*RGB.r + RGB.b;"," color.rgb = color.rgb + RGB.rgb;"," gl_FragColor = color;","}"].join("\n"),t},inPlace:!0,inputs:{source:{type:"image",uniform:"source"},type:{title:"Type",type:"enum",uniform:"cbtype",defaultValue:"0.2",options:[["0.0","Off"],["0.2","Protanope"],["0.6","Deuteranope"],["0.8","Tritanope"]]}},title:"Daltonize",description:"Add contrast to colours to assist CVD (colour-blind) users."})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";var t=[.2,.3,.5,.8],i=new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]);e.plugin("directionblur",function(r){var o,n,s={amount:0,blendGamma:2,angle:0,inputScale:1,resolution:[this.width,this.height],transform:i,projection:new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1])};return{initialize:function(t){var i;t(),i=this.gl,i&&(o=[new e.util.FrameBuffer(i,this.width,this.height),new e.util.FrameBuffer(i,this.width,this.height)])},commonShader:!0,shader:function(e,t){this.gl;return n=this.baseShader,t.vertex=["precision mediump float;","attribute vec4 position;","attribute vec2 texCoord;","uniform vec2 resolution;","uniform mat4 projection;","uniform mat4 transform;","uniform float angle;","uniform float amount;","uniform float inputScale;","const vec2 zero = vec2(0.0);","varying vec2 vTexCoord;","varying vec4 vTexCoords[4];","void main(void) {"," vec4 screenPosition = vec4(position.xy * resolution / 2.0, position.z, position.w);"," screenPosition = transform * screenPosition;"," gl_Position = screenPosition;"," gl_Position.xy = screenPosition.xy * 2.0 / resolution;"," gl_Position.z = screenPosition.z * 2.0 / (resolution.x / resolution.y);"," vTexCoord = texCoord;"," vec2 one = vec2(1.0) * inputScale;"," if (inputScale < 1.0) {"," one -= 1.0 / resolution;"," }"," vTexCoord = max(zero, min(one, texCoord.st * inputScale));"," vec2 amount = vec2(cos(angle), sin(angle)) * amount * 5.0 / resolution;"," for (int i = 0; i < 4; i++) {"," float s = pow(3.0, float(i));"," vTexCoords[i].xy = max(zero, min(one, vTexCoord + amount * s));"," vTexCoords[i].zw = max(zero, min(one, vTexCoord - amount * s));"," }","}"].join("\n"),t.fragment=["precision mediump float;\n","uniform sampler2D source;","uniform float angle;","uniform float amount;","uniform float blendGamma;","varying vec2 vTexCoord;","varying vec4 vTexCoords[4];","vec3 exp;","vec4 sample(sampler2D sampler, vec2 coord) {"," vec4 pixel = texture2D(sampler, coord);"," pixel.rgb = pow(pixel.rgb, exp);"," return pixel;","}","void main(void) {"," exp = vec3(blendGamma);"," gl_FragColor = sample(source, vTexCoord) / 9.0;"," for (int i = 0; i < 4; i++) {"," gl_FragColor += sample(source, vTexCoords[i].xy) / 9.0;"," gl_FragColor += sample(source, vTexCoords[i].zw) / 9.0;"," }"," gl_FragColor.rgb = pow(gl_FragColor.rgb, 1.0 / exp);","}"].join("\n"),t},draw:function(e,i,r,a,u){var l,f,c,d,h,m,p={width:0,height:0,blend:!1},v=1;if(d=this.inputs.amount,!d)return void u(n,i,r,a);if(.01>=d)return void u(e,i,r,a);for(s.amount=d,s.angle=this.inputs.angle,s.projection[0]=this.height/this.width,l=0;l 1.0 || pos.y < 0.0 || pos.y > 1.0) {"," "+r," }"," gl_FragColor = texture2D(source, pos);","}"].join("\n"),i},requires:function(e){return this.inputs.mapScale||"map"!==e?!0:!1},resize:function(){var e=this.inputs.source,t=this.inputs.map;e?(this.uniforms.resSource[0]=e.width,this.uniforms.resSource[1]=e.height):(this.uniforms.resSource[0]=1,this.uniforms.resSource[1]=1),t?(this.uniforms.resMap[0]=t.width,this.uniforms.resMap[1]=t.height):(this.uniforms.resMap[0]=1,this.uniforms.resMap[1]=1)}}},{inputs:{source:{type:"image",uniform:"source"},map:{type:"image",uniform:"map"},xChannel:{type:"enum",defaultValue:"red",options:["red","green","blue","alpha","luma","lightness","none"],update:function(e){this.uniforms.xVector=i[e]}},yChannel:{type:"enum",defaultValue:"green",options:["red","green","blue","alpha","luma","lightness","none"],update:function(e){this.uniforms.yVector=i[e]}},fillMode:{type:"enum",shaderDirty:!0,defaultValue:"color",options:["color","wrap","clamp","ignore"]},color:{type:"color",uniform:"color",defaultValue:[0,0,0,0]},offset:{type:"number",uniform:"offset",defaultValue:.5},mapScale:{type:"vector",dimensions:2,uniform:"mapScale",defaultValue:[1,1],updateSources:!0},amount:{type:"number",uniform:"amount",defaultValue:1}},title:"Displacement Map",description:""})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";e.plugin("dither",{commonShader:!0,shader:function(e,t){return t.fragment=["precision mediump float;","#define mod4(a) (a >= 4 ? a - 4 : a)","varying vec2 vTexCoord;","uniform sampler2D source;","uniform vec2 resolution;","const mat4 dither = mat4(1.0, 33.0, 9.0, 41.0,49.0, 17.0, 57.0, 25.0,13.0, 45.0, 5.0, 37.0,61.0, 29.0, 53.0, 21.0);","float find_closest(int x, int y, float c0) {"," float limit = 0.0;"," int x4 = mod4(x);"," int y4 = mod4(y);"," for (int i = 0; i < 4; i++) {"," if (i == x4) {"," for (int j = 0; j < 4; j++) {"," if (j == y4) {"," limit = dither[i][j];"," break;"," }"," }"," }"," }"," if (x < 4) {"," if (y >= 4) {"," limit += 3.0;"," }"," } else {"," if (y >= 4) {"," limit += 1.0;"," } else {"," limit += 2.0;"," }"," }"," limit /= 65.0;"," return c0 < limit ? 0.0 : 1.0;","}","void main (void) {"," vec4 pixel = texture2D(source, vTexCoord);"," vec2 coord = vTexCoord * resolution;"," int x = int(mod(coord.x, 8.0));"," int y = int(mod(coord.y, 8.0));"," pixel.r = find_closest(x, y, pixel.r);"," pixel.g = find_closest(x, y, pixel.g);"," pixel.b = find_closest(x, y, pixel.b);"," gl_FragColor = pixel;","}"].join("\n"),t},inPlace:!1,inputs:{source:{type:"image",uniform:"source"}},title:"Dither"})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";function t(e,t){var i;for(i=0;i 0.5 ? d / (2.0 - hi - lo) : d / (hi + lo);","}"].join("\n"),global:!0},lightness:{source:["float lightness(float r, float g, float b) {"," float lo = min(r, min(g, b));"," float hi = max(r, max(g, b));"," return (lo + hi) / 2.0;","}"].join("\n"),global:!0},hue:{source:["float hue(float r, float g, float b) {"," float h;"," if (r > g && r > b) {"," h = (g - b) / d + (g < b ? 6.0 : 0.0);"," } else if (g > r && g > b) {"," h = (b - r) / d + 2.0;"," } else {"," h = (r - g) / d + 4.0;"," }"," return h / 6.0;","}"].join("\n"),global:!0}},u={radians:1,degrees:1,sin:1,cos:1,tan:1,asin:1,acos:1,atan:1,pow:2,exp:1,log:1,exp2:1,log2:1,sqrt:1,inversesqrt:1,abs:1,sign:1,floor:1,ceil:1,fract:1,mod:2,min:2,max:2,clamp:3,mix:3,step:2,smoothstep:3,and:2,or:2,atan2:2,hue:3,saturation:3,lightness:3,luminance:3},l={"-":!0,"!":!0,"+":!0},f={"+":!1,"-":!1,"*":!1,"/":!1,"%":"mod","&&":"and","||":"or","===":"==","==":!0,"!==":"!=","!=":!0,">=":!0,"<=":!0,"<":!0,">":!0};["E","LN2","LN10","LOG2E","LOG10E","PI","SQRT1_2","SQRT2"].forEach(function(e){s[e]=e,a[e]={source:"const float "+e+" = "+Math[e]+";",global:!0}});for(r in s)s.hasOwnProperty(r)&&(o=s[r],"string"==typeof o&&(o=[o]),i=o[0].split("."),i.length>1&&o.push(i[0]),s[r]=o);for(r in a)a.hasOwnProperty(r)&&(o=a[r],"string"==typeof o&&(a[r]={source:o,global:!1}));e.plugin("expression",function(){function e(){var e=i.inputs;e.blue===e.red&&e.green===e.blue?e.rgb=e.red:e.rgb=""}var i=this;return{shader:function(e,i){function r(e){var i,n,c,d;if("MemberExpression"===e.type)throw new Error('Expression Error: Unknown object "'+(e.object.name||"this")+'"');if("BinaryExpression"===e.type||"LogicalExpression"===e.type){if(!e.right)throw new Error("Expression Error: Bad binary expression");if(!e.left)return e.type="UnaryExpression",e.argument=e.right,r(e);if(i=e.operator,n=f[i],void 0===n)throw new Error('Expression Error: Unknown operator "'+i+'"');if("string"==typeof n)if(n in f)i=f[n],n=f[i];else if(2===u[n])return o[n]=!0,n+"("+r(e.left)+", "+r(e.right)+")";return(n?"float":"")+"("+r(e.left)+" "+i+" "+r(e.right)+")"}if("CallExpression"===e.type){if("Identifier"!==e.callee.type)throw new Error("Expression Error: Unknown function");if(i=e.callee.name,n=u[i],void 0===n)throw new Error('Expression Error: Unknown function "'+i+'"');if(n>e.arguments.length)throw new Error('Expression Error: Function "'+i+'" requires at least '+n+" arguments");for(d=[],c=0;n>c;c++)d.push(r(e.arguments[c]));return o[i]=!0,i+"("+d.join(", ")+")"}if("Identifier"===e.type){if(d=s[e.name],!d)throw new Error('Expression Error: Unknown identifier "'+e.name+'"');for(c=d.length-1;c>=0;c--)n=d[c],a[n]&&(o[n]=!0);return d[0]}if("Literal"===e.type){if("true"===e.raw)return 1;if("true"===e.raw)return 0;if("number"!=typeof e.value||isNaN(e.value))throw new Error("Expression Error: Invalid literal "+e.raw);return t(e.value)}if("UnaryExpression"===e.type){if(i=e.operator,n=l[i],!n)throw new Error('Expression Error: Unknown operator "'+i+'"');return i+"("+r(e.argument)+")"}}var o,c,d,h,m,p={},v={red:"",green:"",blue:"",alpha:""},g={},y=[],x=[],b=[];for(d in v)v.hasOwnProperty(d)&&(c=e[d]||d,v[d]=c,p[c]="");for(c in p)if(p.hasOwnProperty(c))try{o={},m=n(c),p[c]=r(m);for(d in o)o.hasOwnProperty(d)&&(g[d]=o[d]);o.luma&&(g.rgba=!0)}catch(w){console.log(w.message),p[c]="0.0"}for(d in g)g.hasOwnProperty(d)&&(o=a[d],o&&(o.global?y.push(o.source):x.push(" "+o.source)));for(d in v)v.hasOwnProperty(d)&&(c=v[d],b.push(p[c]));return h=["precision mediump float;","varying vec2 vTexCoord;","varying vec4 vPosition;","uniform sampler2D source;","uniform float a, b, c, d;","uniform vec2 resolution;",y.join("\n"),"void main(void) {",x.join("\n")," gl_FragColor = vec4("," "+b.join(",\n ")," );","}"],i.fragment=h.join("\n"),i},inputs:{source:{type:"image",uniform:"source",shaderDirty:!0},a:{type:"number",uniform:"a",defaultValue:0},b:{type:"number",uniform:"b",defaultValue:0},c:{type:"number",uniform:"c",defaultValue:0},d:{type:"number",uniform:"d",defaultValue:0},rgb:{type:"string",update:function(e){var t=i.inputs;t.red=t.green=t.blue=e},shaderDirty:!0},red:{type:"string",update:e,shaderDirty:!0},green:{type:"string",update:e,shaderDirty:!0},blue:{type:"string",update:e,shaderDirty:!0},alpha:{type:"string",shaderDirty:!0}}}},{inPlace:!1,title:"Expression"}),!function(e){var t="Compound",i="Identifier",r="MemberExpression",o="Literal",n="ThisExpression",s="CallExpression",a="UnaryExpression",u="BinaryExpression",l="LogicalExpression",f=!0,c={"-":f,"!":f,"~":f,"+":f},d={"||":1,"&&":2,"|":3,"^":4,"&":5,"==":6,"!=":6,"===":6,"!==":6,"<":7,">":7,"<=":7,">=":7,"<<":8,">>":8,">>>":8,"+":9,"-":9,"*":10,"/":10,"%":10},h=function(e){var t,i=0;for(var r in e)(t=r.length)>i&&e.hasOwnProperty(r)&&(i=t);return i},m=h(c),p=h(d),v={"true":!0,"false":!1,"null":null},g="this",y=function(e){return d[e]||0},x=function(e,t,i){var r="||"===e||"&&"===e?l:u;return{type:r,operator:e,left:t,right:i}},b=function(e){return e>=48&&57>=e},w=function(e){return 36===e||95===e||e>=65&&90>=e||e>=97&&122>=e},T=function(e){return 36===e||95===e||e>=65&&90>=e||e>=97&&122>=e||e>=48&&57>=e},C=function(e){for(var u,l,f=0,h=e.charAt,C=e.charCodeAt,E=function(t){return h.call(e,t)},S=function(t){return C.call(e,t)},R=e.length,D=function(){for(var e=S(f);32===e||9===e;)e=S(++f)},P=function(){D();for(var t=e.substr(f,p),i=t.length;i>0;){if(d.hasOwnProperty(t))return f+=i,t;t=t.substr(0,--i)}return!1},B=function(){var e,t,i,r,o,n,s,a;if(n=_(),t=P(),!t)return n;if(o={value:t,prec:y(t)},s=_(),!s)throw new Error("Expected expression after "+t+" at character "+f);for(r=[n,o,s];(t=P())&&(i=y(t),0!==i);){for(o={value:t,prec:i};r.length>2&&i<=r[r.length-2].prec;)s=r.pop(),t=r.pop().value,n=r.pop(),e=x(t,n,s),r.push(e);if(e=_(),!e)throw new Error("Expected expression after "+t+" at character "+f);r.push(o),r.push(e)}for(a=r.length-1,e=r[a];a>1;)e=x(r[a-1].value,r[a-2],e),a-=2;return e},_=function(){var t,i,r;if(D(),t=S(f),b(t)||46===t)return F();if(39===t||34===t)return z();if(w(t))return L();if(40===t)return O();for(i=e.substr(f,m),r=i.length;r>0;){if(c.hasOwnProperty(i))return f+=r,{type:a,operator:i,argument:_(),prefix:!0};i=i.substr(0,--r)}return!1},F=function(){for(var e="";b(S(f));)e+=E(f++);if("."===E(f))for(e+=E(f++);b(S(f));)e+=E(f++);if("e"===E(f)||"E"===E(f)){for(e+=E(f++),("+"===E(f)||"-"===E(f))&&(e+=E(f++));b(S(f));)e+=E(f++);if(!b(S(f-1)))throw new Error("Expected exponent ("+e+E(f)+") at character "+f)}if(w(S(f)))throw new Error("Variable names cannot start with a number ("+e+E(f)+") at character "+f);return{type:o,value:parseFloat(e),raw:e}},z=function(){for(var e,t="",i=E(f++),r=!1;R>f;){if(e=E(f++),e===i){r=!0;break}if("\\"===e)switch(e=E(f++)){case"n":t+="\n";break;case"r":t+="\r";break;case"t":t+=" ";break;case"b":t+="\b";break;case"f":t+="\f";break;case"v":t+=" "}else t+=e}if(!r)throw new Error('Unclosed quote after "'+t+'"');return{type:o,value:t,raw:i+t+i}},A=function(){var t,r=S(f),s=f;if(!w(r))throw new Error("Unexpected "+E(f)+"at character "+f);for(f++;R>f&&(r=S(f),T(r));)f++;return t=e.slice(s,f),v.hasOwnProperty(t)?{type:o,value:v[t],raw:t}:t===g?{type:n}:{type:i,name:t}},M=function(){for(var e,i,r=[];R>f;){if(D(),e=E(f),")"===e){f++;break}if(","===e)f++;else{if(i=B(),!i||i.type===t)throw new Error("Expected comma at character "+f);r.push(i)}}return r},L=function(){var e,t,i;for(t=A(),D(),e=E(f);"."===e||"["===e||"("===e;){if("."===e)f++,D(),t={type:r,computed:!1,object:t,property:A()};else if("["===e){if(i=f,f++,t={type:r,computed:!0,object:t,property:B()},D(),e=E(f),"]"!==e)throw new Error("Unclosed [ at character "+f);f++,D()}else"("===e&&(f++,t={type:s,arguments:M(),callee:t});D(),e=E(f)}return t},O=function(){f++;var e=B();if(D(),")"===E(f))return f++,e;throw new Error("Unclosed ( at character "+f)},N=[];R>f;)if(u=E(f),";"===u||","===u)f++;else if(l=B())N.push(l);else if(R>f)throw new Error("Unexpected '"+E(f)+"' at character "+f);return 1===N.length?N[0]:{type:t,body:N}};if(C.version="0.2.9",C.toString=function(){return"JavaScript Expression Parser (JSEP) v"+C.version},C.addUnaryOp=function(e){return c[e]=f,this},C.addBinaryOp=function(e,t){return p=Math.max(e.length,p),d[e]=t,this},C.removeUnaryOp=function(e){return delete c[e],e.length===m&&(m=h(c)),this},C.removeBinaryOp=function(e){return delete d[e],e.length===p&&(p=h(d)),this},"undefined"==typeof exports){var E=e.jsep;e.jsep=C,C.noConflict=function(){return e.jsep===C&&(e.jsep=E),C}}else"undefined"!=typeof module&&module.exports?exports=module.exports=C:exports.parse=C}(window),n=window.jsep.noConflict()}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";e.plugin("fader",{commonShader:!0,shader:function(e,t){return t.fragment=["precision mediump float;","varying vec2 vTexCoord;","uniform sampler2D source;","uniform vec4 color;","uniform float amount;","void main(void) {"," gl_FragColor = texture2D(source, vTexCoord);"," gl_FragColor = mix(gl_FragColor, color, amount);","}"].join("\n"),t},requires:function(e,t){return t.amount<1},inPlace:!0,inputs:{source:{type:"image",uniform:"source"},color:{type:"color",uniform:"color",defaultValue:[0,0,0,1]},amount:{type:"number",uniform:"amount",defaultValue:.5,min:0,max:1}},title:"Fader",description:"Fade image to a color"})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";e.plugin("falsecolor",{commonShader:!0,shader:function(e,t){return t.fragment=["precision mediump float;","varying vec2 vTexCoord;","uniform sampler2D source;","uniform float amount;","uniform vec4 black;","uniform vec4 white;","const vec3 luma = vec3(0.2125, 0.7154, 0.0721);","void main(void) {"," vec4 pixel = texture2D(source, vTexCoord);"," float luminance = dot(pixel.rgb, luma);"," vec4 result = mix(black, white, luminance);"," gl_FragColor = vec4(result.rgb, pixel.a * result.a);","}"].join("\n"),t},inPlace:!0,inputs:{source:{type:"image",uniform:"source",shaderDirty:!1},black:{type:"color",uniform:"black",defaultValue:[0,0,.5,1]},white:{type:"color",uniform:"white",defaultValue:[1,0,0,1]}},title:"False Color"})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";e.plugin("filmgrain",{commonShader:!0,shader:function(e,t){return t.fragment=["precision mediump float;","varying vec2 vTexCoord;","uniform sampler2D source;","uniform vec2 resolution;","uniform float time;","uniform float amount;","uniform bool colored;","float timer;","const float permTexUnit = 1.0/256.0;","const float permTexUnitHalf = 0.5/256.0;","vec4 rnm(in vec2 tc) {"," float noise = sin(dot(tc + vec2(timer,timer),vec2(12.9898,78.233))) * 43758.5453;"," float noiseR = fract(noise)*2.0-1.0;"," float noiseG = fract(noise*1.2154)*2.0-1.0; "," float noiseB = fract(noise*1.3453)*2.0-1.0;"," float noiseA = fract(noise*1.3647)*2.0-1.0;"," "," return vec4(noiseR,noiseG,noiseB,noiseA);","}","float fade(in float t) {"," return t*t*t*(t*(t*6.0-15.0)+10.0);","}","float pnoise3D(in vec3 p) {"," vec3 pi = permTexUnit*floor(p)+permTexUnitHalf;"," vec3 pf = fract(p);"," float perm00 = rnm(pi.xy).a ;"," vec3 grad000 = rnm(vec2(perm00, pi.z)).rgb * 4.0 - 1.0;"," float n000 = dot(grad000, pf);"," vec3 grad001 = rnm(vec2(perm00, pi.z + permTexUnit)).rgb * 4.0 - 1.0;"," float n001 = dot(grad001, pf - vec3(0.0, 0.0, 1.0));"," float perm01 = rnm(pi.xy + vec2(0.0, permTexUnit)).a ;"," vec3 grad010 = rnm(vec2(perm01, pi.z)).rgb * 4.0 - 1.0;"," float n010 = dot(grad010, pf - vec3(0.0, 1.0, 0.0));"," vec3 grad011 = rnm(vec2(perm01, pi.z + permTexUnit)).rgb * 4.0 - 1.0;"," float n011 = dot(grad011, pf - vec3(0.0, 1.0, 1.0));"," float perm10 = rnm(pi.xy + vec2(permTexUnit, 0.0)).a ;"," vec3 grad100 = rnm(vec2(perm10, pi.z)).rgb * 4.0 - 1.0;"," float n100 = dot(grad100, pf - vec3(1.0, 0.0, 0.0));"," vec3 grad101 = rnm(vec2(perm10, pi.z + permTexUnit)).rgb * 4.0 - 1.0;"," float n101 = dot(grad101, pf - vec3(1.0, 0.0, 1.0));"," float perm11 = rnm(pi.xy + vec2(permTexUnit, permTexUnit)).a ;"," vec3 grad110 = rnm(vec2(perm11, pi.z)).rgb * 4.0 - 1.0;"," float n110 = dot(grad110, pf - vec3(1.0, 1.0, 0.0));"," vec3 grad111 = rnm(vec2(perm11, pi.z + permTexUnit)).rgb * 4.0 - 1.0;"," float n111 = dot(grad111, pf - vec3(1.0, 1.0, 1.0));"," vec4 n_x = mix(vec4(n000, n001, n010, n011), vec4(n100, n101, n110, n111), fade(pf.x));"," vec2 n_xy = mix(n_x.xy, n_x.zw, fade(pf.y));"," float n_xyz = mix(n_xy.x, n_xy.y, fade(pf.z));"," return n_xyz;","}","void main(void) {"," timer = mod(time, 10000.0) / 10000.0;"," vec4 pixel = texture2D(source, vTexCoord);"," vec3 noise = vec3(pnoise3D(vec3(vTexCoord * resolution, timer + 0.0)));"," if (colored) {"," noise.g = pnoise3D(vec3(vTexCoord * resolution, timer + 1.0));"," noise.b = pnoise3D(vec3(vTexCoord * resolution, timer + 2.0));"," }"," gl_FragColor = vec4(pixel.rgb + noise * amount, pixel.a);","}"].join("\n"),t},inPlace:!0,inputs:{source:{type:"image",uniform:"source", +shaderDirty:!1},time:{type:"number",uniform:"time",mod:65536},amount:{type:"number",uniform:"amount",min:0,max:1,defaultValue:.03},colored:{type:"boolean",uniform:"colored",defaultValue:!1}},title:"Film Grain",description:"Don't over-do it."})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";e.plugin("freeze",{draw:function(e,t,i,r,o){this.inputs.frozen||o(e,t,i,r)},requires:function(){return!this.inputs.frozen},inPlace:!0,inputs:{source:{type:"image",uniform:"source"},frozen:{type:"boolean",defaultValue:!1,updateSources:!0}},title:"Freeze",description:"Freeze Frame"})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";e.plugin("fxaa",{commonShader:!0,shader:function(e,t){return t.vertex=["precision mediump float;","attribute vec4 position;","attribute vec2 texCoord;","uniform vec2 resolution;","uniform mat4 transform;","varying vec2 vTexCoord;","varying vec2 vTexCoordNW;","varying vec2 vTexCoordNE;","varying vec2 vTexCoordSW;","varying vec2 vTexCoordSE;","const vec2 diag = vec2(1.0, -1.0);","void main(void) {"," vec4 screenPosition = vec4(position.xy * resolution / 2.0, position.z, position.w);"," screenPosition = transform * screenPosition;"," gl_Position.xy = screenPosition.xy * 2.0 / resolution;"," gl_Position.z = screenPosition.z * 2.0 / (resolution.x / resolution.y);"," gl_Position.w = screenPosition.w;"," vTexCoord = texCoord;"," vec2 invRes = 1.0 / resolution;"," vTexCoordNW = texCoord - invRes;"," vTexCoordNE = texCoord + invRes * diag;"," vTexCoordSW = texCoord - invRes * diag;"," vTexCoordSE = texCoord + invRes;","}\n"].join("\n"),t.fragment=["precision mediump float;","#define FXAA_REDUCE_MIN (1.0 / 128.0)","#define FXAA_REDUCE_MUL (1.0 / 8.0)","#define FXAA_SPAN_MAX 8.0","varying vec2 vTexCoord;","varying vec2 vTexCoordNW;","varying vec2 vTexCoordNE;","varying vec2 vTexCoordSW;","varying vec2 vTexCoordSE;","uniform vec2 resolution;","uniform sampler2D source;","const vec3 luma = vec3(0.299, 0.587, 0.114);","void main(void) {"," vec4 original = texture2D(source, vTexCoord);"," vec3 rgbNW = texture2D(source, vTexCoordNW).rgb;"," vec3 rgbNE = texture2D(source, vTexCoordNE).rgb;"," vec3 rgbSW = texture2D(source, vTexCoordSW).rgb;"," vec3 rgbSE = texture2D(source, vTexCoordSE).rgb;"," float lumaNW = dot(rgbNW, luma);"," float lumaNE = dot(rgbNE, luma);"," float lumaSW = dot(rgbSW, luma);"," float lumaSE = dot(rgbSE, luma);"," float lumaM = dot(original.rgb, luma);"," float lumaMin = min(lumaM, min(min(lumaNW, lumaNE), min(lumaSW, lumaSE)));"," float lumaMax = max(lumaM, max(max(lumaNW, lumaNE), max(lumaSW, lumaSE)));"," vec2 dir = vec2(-((lumaNW + lumaNE) - (lumaSW + lumaSE)), ((lumaNW + lumaSW) - (lumaNE + lumaSE)));"," float dirReduce = max((lumaNW + lumaNE + lumaSW + lumaSE) * 0.25 * FXAA_REDUCE_MUL, FXAA_REDUCE_MIN);"," float rcpDirMin = 1.0 / (min(abs(dir.x), abs(dir.y)) + dirReduce);"," dir = min(vec2(FXAA_SPAN_MAX), max(vec2(-FXAA_SPAN_MAX), dir * rcpDirMin)) / resolution;"," vec3 rgbA = 0.5 * ("," texture2D(source, vTexCoord + dir * (1.0 / 3.0 - 0.5)).rgb +"," texture2D(source, vTexCoord + dir * (2.0 / 3.0 - 0.5)).rgb);"," vec3 rgbB = rgbA * 0.5 + 0.25 * ("," texture2D(source, vTexCoord - dir * 0.5).rgb +"," texture2D(source, vTexCoord + dir * 0.5).rgb);"," float lumaB = dot(rgbB, luma);"," if (lumaB < lumaMin || lumaB > lumaMax) {"," gl_FragColor = vec4(rgbA, original.a);"," } else {"," gl_FragColor = vec4(rgbB, original.a);"," }","}"].join("\n"),t},inPlace:!0,inputs:{source:{type:"image",uniform:"source",shaderDirty:!1}},title:"FXAA",description:"Fast approximate anti-aliasing"})}),function(e,t){"use strict";"object"==typeof exports?t(require("seriously")):"function"==typeof define&&define.amd?define(["seriously"],t):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";e.plugin("gradientwipe",function(){return this.uniforms.resGradient=[1,1],this.uniforms.resSource=[1,1],{shader:function(e,t){return t.vertex=["precision mediump float;","attribute vec4 position;","attribute vec2 texCoord;","uniform vec2 resolution;","uniform vec2 resSource;","uniform vec2 resGradient;","varying vec2 texCoordSource;","varying vec2 texCoordGradient;","const vec2 HALF = vec2(0.5);","void main(void) {"," gl_Position = position;"," vec2 adjusted = (texCoord - HALF) * resolution;"," texCoordSource = adjusted / resSource + HALF;"," texCoordGradient = adjusted / resGradient + HALF;","}"].join("\n"),t.fragment=["precision mediump float;\n","varying vec2 texCoordSource;","varying vec2 texCoordGradient;","uniform sampler2D source;","uniform sampler2D gradient;","uniform float transition;","uniform float smoothness;","uniform bool invert;","const vec3 lumcoeff = vec3(0.2125,0.7154,0.0721);","void main(void) {"," float gradientVal = 1.0 - dot(texture2D(gradient, texCoordGradient).rgb, lumcoeff);"," if (invert) {"," gradientVal = 1.0 - gradientVal;"," }"," float amount = 1.0 - transition;"," float mn = (amount - smoothness * (1.0 - amount));"," float mx = (amount + smoothness * amount);"," if (gradientVal <= mn) {"," gl_FragColor = texture2D(source, texCoordSource);"," return;"," }"," if (gradientVal >= mx) {"," gl_FragColor = vec4(0.0);"," return;"," }"," float alpha = mix(1.0, 0.0, smoothstep(mn, mx, gradientVal));"," vec4 pixel = texture2D(source, texCoordSource);"," gl_FragColor = vec4(pixel.rgb, pixel.a * alpha);","}"].join("\n"),t},draw:function(e,t,i,r,o){var n;return i.transition<=0?void o(this.baseShader,t,i,r):i.transition>=1?(n=this.gl,n.viewport(0,0,this.width,this.height),n.bindFramebuffer(n.FRAMEBUFFER,r),n.clearColor(0,0,0,0),void n.clear(n.COLOR_BUFFER_BIT|n.DEPTH_BUFFER_BIT)):void o(e,t,i,r)},inPlace:!1,requires:function(e,t){return"source"===e&&t.transition>=1?!1:"gradient"===e&&(t.transition<=0||t.transition>=1)?!1:!0},resize:function(){var e=this.inputs.source,t=this.inputs.gradient;e?(this.uniforms.resSource[0]=e.width,this.uniforms.resSource[1]=e.height):(this.uniforms.resSource[0]=1,this.uniforms.resSource[1]=1),t?(this.uniforms.resGradient[0]=t.width,this.uniforms.resGradient[1]=t.height):(this.uniforms.resGradient[0]=1,this.uniforms.resGradient[1]=1)}}},{inputs:{source:{type:"image",uniform:"source"},gradient:{type:"image",uniform:"gradient"},transition:{type:"number",uniform:"transition",defaultValue:0},invert:{type:"boolean",uniform:"invert",defaultValue:!1},smoothness:{type:"number",uniform:"smoothness",defaultValue:0,min:0,max:1}},title:"Gradient Wipe"})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";e.plugin("hex",{commonShader:!0,shader:function(e,t){return t.fragment=["precision mediump float;\n","varying vec2 vTexCoord;","uniform sampler2D source;","uniform vec2 resolution;","uniform vec2 center;","uniform float size;","void main(void) {"," vec2 aspect = normalize(resolution);"," vec2 tex = (vTexCoord * aspect - center) / size;"," tex.y /= 0.866025404;"," tex.x -= tex.y * 0.5;"," vec2 a;"," if (tex.x + tex.y - floor(tex.x) - floor(tex.y) < 1.0) {"," a = vec2(floor(tex.x), floor(tex.y));"," } else {"," a = vec2(ceil(tex.x), ceil(tex.y));"," }"," vec2 b = vec2(ceil(tex.x), floor(tex.y));"," vec2 c = vec2(floor(tex.x), ceil(tex.y));"," vec3 tex3 = vec3(tex.x, tex.y, 1.0 - tex.x - tex.y);"," vec3 a3 = vec3(a.x, a.y, 1.0 - a.x - a.y);"," vec3 b3 = vec3(b.x, b.y, 1.0 - b.x - b.y);"," vec3 c3 = vec3(c.x, c.y, 1.0 - c.x - c.y);"," float alen =length(tex3 - a3);"," float blen =length(tex3 - b3);"," float clen =length(tex3 - c3);"," vec2 choice;"," if (alen < blen) {"," if (alen < clen) {"," choice = a;"," } else {"," choice = c;"," }"," } else {"," if (blen < clen) {"," choice = b;"," } else {"," choice = c;"," }"," }"," choice.x += choice.y * 0.5;"," choice.y *= 0.866025404;"," choice *= size / aspect;"," gl_FragColor = texture2D(source, choice + center / aspect);","}"].join("\n"),t},inPlace:!1,inputs:{source:{type:"image",uniform:"source",shaderDirty:!1},size:{type:"number",uniform:"size",min:0,max:.4,defaultValue:.01},center:{type:"vector",uniform:"center",dimensions:2,defaultValue:[0,0]}},title:"Hex",description:"Hexagonal Pixelate"})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";e.plugin("highlights-shadows",{commonShader:!0,shader:function(e,t){return t.fragment=["precision mediump float;","varying vec2 vTexCoord;","uniform sampler2D source;","uniform float shadows;","uniform float highlights;","const vec3 luma = vec3(0.2125, 0.7154, 0.0721);","void main(void) {"," vec4 pixel = texture2D(source, vTexCoord);"," float luminance = dot(pixel.rgb, luma);"," float shadow = clamp((pow(luminance, 1.0 / (shadows + 1.0)) + (-0.76) * pow(luminance, 2.0 / (shadows + 1.0))) - luminance, 0.0, 1.0);"," float highlight = clamp((1.0 - (pow(1.0 - luminance, 1.0 / (2.0 - highlights)) + (-0.8) * pow(1.0 - luminance, 2.0 / (2.0 - highlights)))) - luminance, -1.0, 0.0);"," vec3 rgb = (luminance + shadow + highlight) * (pixel.rgb / vec3(luminance));"," gl_FragColor = vec4(rgb, pixel.a);","}"].join("\n"),t},inPlace:!0,inputs:{source:{type:"image",uniform:"source",shaderDirty:!1},highlights:{type:"number",uniform:"highlights",min:0,max:1,defaultValue:1},shadows:{type:"number",uniform:"shadows",min:0,max:1,defaultValue:0}},title:"Highlights/Shadows",description:"Darken highlights, lighten shadows"})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";e.plugin("hue-saturation",{commonShader:!0,shader:function(e,t){return t.vertex=["precision mediump float;","attribute vec4 position;","attribute vec2 texCoord;","uniform vec2 resolution;","uniform mat4 projection;","uniform mat4 transform;","uniform float hue;","uniform float saturation;","varying vec2 vTexCoord;","varying vec3 weights;","void main(void) {"," float angle = hue * 3.14159265358979323846264;"," float s = sin(angle);"," float c = cos(angle);"," weights = (vec3(2.0 * c, -sqrt(3.0) * s - c, sqrt(3.0) * s - c) + 1.0) / 3.0;"," vec4 screenPosition = vec4(position.xy * resolution / 2.0, position.z, position.w);"," screenPosition = transform * screenPosition;"," gl_Position = screenPosition;"," gl_Position.xy = screenPosition.xy * 2.0 / resolution;"," gl_Position.z = screenPosition.z * 2.0 / (resolution.x / resolution.y);"," vTexCoord = texCoord;","}"].join("\n"),t.fragment=["precision mediump float;","varying vec2 vTexCoord;","varying vec3 weights;","uniform sampler2D source;","uniform float hue;","uniform float saturation;","void main(void) {"," vec4 color = texture2D(source, vTexCoord);"," float len = length(color.rgb);"," color.rgb = vec3(dot(color.rgb, weights.xyz), dot(color.rgb, weights.zxy), dot(color.rgb, weights.yzx) );"," vec3 adjustment = (color.r + color.g + color.b) / 3.0 - color.rgb;"," if (saturation > 0.0) {"," adjustment *= (1.0 - 1.0 / (1.0 - saturation));"," } else {"," adjustment *= (-saturation);"," }"," color.rgb += adjustment;"," gl_FragColor = color;","}"].join("\n"),t},inPlace:!0,inputs:{source:{type:"image",uniform:"source"},hue:{type:"number",uniform:"hue",defaultValue:.4,min:-1,max:1},saturation:{type:"number",uniform:"saturation",defaultValue:0,min:-1,max:1}},title:"Hue/Saturation",description:"Rotate hue and multiply saturation."})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";e.plugin("invert",{commonShader:!0,shader:function(e,t){return t.fragment=["precision mediump float;","varying vec2 vTexCoord;","uniform sampler2D source;","void main(void) {"," gl_FragColor = texture2D(source, vTexCoord);"," gl_FragColor = vec4(1.0 - gl_FragColor.rgb, gl_FragColor.a);","}"].join("\n"),t},inPlace:!0,inputs:{source:{type:"image",uniform:"source",shaderDirty:!1}},title:"Invert",description:"Invert image color"})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";e.plugin("kaleidoscope",{commonShader:!0,shader:function(e,t){return t.fragment=["precision mediump float;","varying vec2 vTexCoord;","uniform sampler2D source;","uniform float segments;","uniform float offset;","const float PI = "+Math.PI+";","const float TAU = 2.0 * PI;","void main(void) {"," if (segments == 0.0) {"," gl_FragColor = texture2D(source, vTexCoord);"," } else {"," vec2 centered = vTexCoord - 0.5;"," float r = length(centered);"," float theta = atan(centered.y, centered.x);"," theta = mod(theta, TAU / segments);"," theta = abs(theta - PI / segments);"," vec2 newCoords = r * vec2(cos(theta), sin(theta)) + 0.5;"," gl_FragColor = texture2D(source, mod(newCoords - offset, 1.0));"," }","}"].join("\n"),t},inPlace:!0,inputs:{source:{type:"image",uniform:"source",shaderDirty:!1},segments:{type:"number",uniform:"segments",defaultValue:6},offset:{type:"number",uniform:"offset",defaultValue:0}},title:"Kaleidoscope"})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";var t=new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]),i=/\d+/;e.plugin("layers",function(e){function r(){a.resize()}var o,n,s,a=this,u={clear:!1};for("number"==typeof e&&e>=2?o=e:(o=e&&e.count||4,o=Math.max(2,o)),s={sizeMode:{type:"enum",defaultValue:"0",options:["union","intersection"],update:function(){this.resize()}}},n=0;o>n;n++)s.sizeMode.options.push(n.toString()),s.sizeMode.options.push("source"+n),s["source"+n]={type:"image",update:r},s["opacity"+n]={type:"number",defaultValue:1,min:0,max:1,updateSources:!0};return this.uniforms.layerResolution=[1,1],this.resize=function(){var e,t,r,n,s,a,u=this.inputs.sizeMode;if("union"===u)for(e=0,t=0,r=0;o>r;r++)s=this.inputs["source"+r],s&&(e=Math.max(e,s.width),t=Math.max(t,s.height));else if("intersection"===u)for(e=1/0,t=1/0,r=0;o>r;r++)s=this.inputs["source"+r],s&&(e=Math.min(e,s.width),t=Math.min(t,s.height));else e=1,t=1,n=o-1,a=i.exec(this.inputs.sizeMode),a&&(n=Math.min(parseInt(a[0],10),n)),s=this.inputs["source"+n],s&&(e=s.width,t=s.height);if(this.width!==e||this.height!==t)for(this.width=e,this.height=t,this.uniforms.resolution[0]=e,this.uniforms.resolution[1]=t,this.frameBuffer&&this.frameBuffer.resize(e,t),this.emit("resize"),this.setDirty(),r=0;r=o?!1:!(!t[e]||!t["opacity"+n])},draw:function(e,i,r,n,s){var a,l,f,c=this.gl;for(c.viewport(0,0,this.width,this.height),c.bindFramebuffer(c.FRAMEBUFFER,n),c.clearColor(0,0,0,0),c.clear(c.COLOR_BUFFER_BIT|c.DEPTH_BUFFER_BIT),a=0;o>a;a++)f=this.inputs["source"+a],l=this.inputs["opacity"+a],f&&l&&(r.opacity=l,r.layerResolution[0]=f.width,r.layerResolution[1]=f.height,r.source=f,r.transform=f.cumulativeMatrix||t,s(e,i,r,n,null,u))},inputs:s}},{inPlace:!0,description:"Multiple layers",title:"Layers"})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";e.plugin("linear-transfer",{commonShader:!0,shader:function(e,t){return t.fragment=["precision mediump float;","varying vec2 vTexCoord;","uniform sampler2D source;","uniform vec4 slope;","uniform vec4 intercept;","const vec3 half3 = vec3(0.5);","void main(void) {"," vec4 pixel = texture2D(source, vTexCoord);"," gl_FragColor = pixel * slope + intercept;","}"].join("\n"),t},inPlace:!0,inputs:{source:{type:"image",uniform:"source"},slope:{type:"vector",dimensions:4,uniform:"slope",defaultValue:[1,1,1,1]},intercept:{type:"vector",uniform:"intercept",dimensions:4,defaultValue:[0,0,0,0]}},title:"Linear Transfer",description:"For each color channel: [slope] * [value] + [intercept]"})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";e.plugin("lumakey",{commonShader:!0,shader:function(e,t){return t.fragment=["precision mediump float;","varying vec2 vTexCoord;","uniform sampler2D source;","uniform float threshold;","uniform float clipBlack;","uniform float clipWhite;","uniform bool invert;","const vec3 lumcoeff = vec3(0.2125,0.7154,0.0721);","void main (void) {"," vec4 pixel = texture2D(source, vTexCoord);"," float luma = dot(pixel.rgb,lumcoeff);"," float alpha = 1.0 - smoothstep(clipBlack, clipWhite, luma);"," if (invert) alpha = 1.0 - alpha;"," gl_FragColor = vec4(pixel.rgb, min(pixel.a, alpha) );","}"].join("\n"),t},inPlace:!0,inputs:{source:{type:"image",uniform:"source",shaderDirty:!1},clipBlack:{type:"number",uniform:"clipBlack",defaultValue:.9,min:0,max:1},clipWhite:{type:"number",uniform:"clipWhite",defaultValue:1,min:0,max:1},invert:{type:"boolean",uniform:"invert",defaultValue:!1}},title:"Luma Key",categories:["key"],description:""})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";e.plugin("lut",{commonShader:!0,shader:function(e,t){return t.fragment=["precision mediump float;","varying vec2 vTexCoord;","uniform sampler2D source;","uniform sampler2D lut;","uniform float amount;","void main(void) {"," vec4 textureColor = texture2D(source, vTexCoord);"," textureColor = clamp(textureColor, 0.0, 1.0);"," float blueColor = textureColor.b * 63.0;"," vec2 quad1;"," quad1.y = floor(floor(blueColor) / 8.0);"," quad1.x = floor(blueColor) - (quad1.y * 8.0);"," vec2 quad2;"," quad2.y = floor(ceil(blueColor) / 8.0);"," quad2.x = ceil(blueColor) - (quad2.y * 8.0);"," vec2 texPos1;"," texPos1 = (quad1 * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.rg);"," vec2 texPos2;"," texPos2 = (quad2 * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.rg);"," lowp vec4 newColor1 = texture2D(lut, vec2(texPos1.x, 1.0 - texPos1.y));"," lowp vec4 newColor2 = texture2D(lut, vec2(texPos2.x, 1.0 - texPos2.y));"," vec4 newColor = mix(newColor1, newColor2, fract(blueColor));"," gl_FragColor = mix(textureColor, newColor, amount);","}"].join("\n"),t},inPlace:!0,inputs:{source:{type:"image",uniform:"source"},lut:{type:"image",uniform:"lut"},amount:{type:"number",uniform:"amount",min:0,max:1,defaultValue:1}},title:"Color Look-Up Table",description:""})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";e.plugin("mirror",{commonShader:!0,shader:function(e,t){return t.fragment=["precision mediump float;","uniform vec2 resolution;","uniform sampler2D source;","varying vec2 vTexCoord;","void main(void) {"," gl_FragColor = texture2D(source, vec2(0.5 - abs(0.5 - vTexCoord.x), vTexCoord.y));","}"].join("\n"),t},inPlace:!0,inputs:{source:{type:"image",uniform:"source"}},title:"Mirror",description:"Shader Mirror Effect"})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";e.plugin("nightvision",{commonShader:!0,shader:function(e,t,i){return t.fragment=["precision mediump float;","varying vec2 vTexCoord;","uniform sampler2D source;","uniform float time;","uniform float luminanceThreshold;","uniform float amplification;","uniform vec3 nightVisionColor;",i.shader.makeNoise,"void main(void) {"," vec3 noise = vec3(makeNoise(vTexCoord.x, vTexCoord.y, time), makeNoise(vTexCoord.x, vTexCoord.y, time * 200.0 + 1.0), makeNoise(vTexCoord.x, vTexCoord.y, time * 100.0 + 3.0));"," vec4 pixel = texture2D(source, vTexCoord + noise.xy * 0.0025);"," float luminance = dot(vec3(0.299, 0.587, 0.114), pixel.rgb);"," pixel.rgb *= step(luminanceThreshold, luminance) * amplification;"," gl_FragColor = vec4( (pixel.rgb + noise * 0.1) * nightVisionColor, pixel.a);","}"].join("\n"),t},inputs:{source:{type:"image",uniform:"source",shaderDirty:!1},time:{type:"number",uniform:"time",defaultValue:0,mod:65536},luminanceThreshold:{type:"number",uniform:"luminanceThreshold",defaultValue:.1,min:0,max:1},amplification:{type:"number",uniform:"amplification",defaultValue:1.4,min:0},color:{type:"color",uniform:"nightVisionColor",defaultValue:[.1,.95,.2]}},title:"Night Vision",description:""})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";e.plugin("noise",{shader:function(e,t,i){var r=["precision mediump float;","#define Blend(base, blend, funcf) vec3(funcf(base.r, blend.r), funcf(base.g, blend.g), funcf(base.b, blend.b))","#define BlendOverlayf(base, blend) (base < 0.5 ? (2.0 * base * blend) : (1.0 - 2.0 * (1.0 - base) * (1.0 - blend)))","#define BlendOverlay(base, blend) Blend(base, blend, BlendOverlayf)","varying vec2 vTexCoord;","uniform sampler2D source;","uniform vec2 resolution;","uniform float amount;","uniform float time;",i.shader.noiseHelpers,i.shader.snoise3d,i.shader.random,"void main(void) {"," vec4 pixel = texture2D(source, vTexCoord);"," float r = random(vec2(time * vTexCoord.xy));"," float noise = snoise(vec3(vTexCoord * (1024.4 + r * 512.0), time)) * 0.5;"];return e.overlay?(r.push(" vec3 overlay = BlendOverlay(pixel.rgb, vec3(noise));"),r.push(" pixel.rgb = mix(pixel.rgb, overlay, amount);")):r.push(" pixel.rgb += noise * amount;"),r.push(" gl_FragColor = pixel;}"),t.fragment=r.join("\n"),t},inPlace:!0,inputs:{source:{type:"image",uniform:"source",shaderDirty:!1},overlay:{type:"boolean",shaderDirty:!0,defaultValue:!0},amount:{type:"number",uniform:"amount",min:0,max:1,defaultValue:1},time:{type:"number",uniform:"time",defaultValue:0,mod:65536}},title:"Noise",description:"Add noise"})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";e.plugin("opticalflow",function(){var t,i;return{initialize:function(r){t=new e.util.FrameBuffer(this.gl,this.width,this.height),r(),i=this.baseShader},resize:function(){t.resize(this.width,this.height)},commonShader:!0,shader:function(e,t){return t.fragment=["precision mediump float;","varying vec2 vTexCoord;","uniform sampler2D source;","uniform sampler2D previous;","uniform vec2 resolution;","uniform vec2 scale;","uniform float offsetX;","uniform float lambda;","void main() {"," vec4 a = texture2D(previous, vTexCoord);"," vec4 b = texture2D(source, vTexCoord);"," vec2 offset = offsetX / resolution;"," vec2 x1 = vec2(offset.x, 0.0);"," vec2 y1 = vec2(0.0, offset.y);"," vec4 curdif = b - a;"," vec4 gradx = texture2D(source, vTexCoord + x1) - texture2D(source, vTexCoord - x1);"," gradx += texture2D(previous, vTexCoord + x1) - texture2D(previous, vTexCoord - x1);"," vec4 grady = texture2D(source, vTexCoord + y1) - texture2D(source, vTexCoord - y1);"," grady += texture2D(previous, vTexCoord + y1) - texture2D(previous, vTexCoord - y1);"," vec4 gradmag = sqrt((gradx * gradx) + (grady * grady) + vec4(lambda));"," vec4 vx = curdif * (gradx / gradmag);"," float vxd = vx.r;"," vec2 xout = vec2(max(vxd, 0.0), abs(min(vxd, 0.0))) * scale.x;"," vec4 vy = curdif * (grady / gradmag);"," float vyd = vy.r;"," vec2 yout = vec2(max(vyd, 0.0), abs(min(vyd, 0.0))) * scale.y;"," gl_FragColor = clamp(vec4(xout.xy, yout.xy), 0.0, 1.0);"," gl_FragColor.a = 1.0;","}"].join("\n"),t},draw:function(e,r,o,n,s){o.previous=t.texture,s(e,r,o,n),s(i,r,o,t.frameBuffer)},destroy:function(){t&&(t.destroy(),t=null)}}},{inPlace:!1,inputs:{source:{type:"image",uniform:"source",shaderDirty:!1},lambda:{type:"number",uniform:"lambda",min:0,defaultValue:0,description:"noise limiting"},scaleResult:{type:"vector",dimensions:2,uniform:"scale",defaultValue:[1,1]},offset:{type:"number",uniform:"offsetX",defaultValue:1,min:1,max:100,description:"distance between texel samples for gradient calculation"}},description:"Horn-Schunke Optical Flow",title:"Optical Flow"})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";e.plugin("panorama",function(){function e(){t.resize()}var t=this;return this.resize=function(){var e,i=this.width,r=this.height,o=t.inputs.source;for(this.source?(i=this.source.width,r=this.source.height):this.sources&&this.sources.source?(i=this.sources.source.width,r=this.sources.source.height):(i=1,r=1),t.inputs.width?(i=t.inputs.width,t.inputs.height?r=t.inputs.height:o&&(r=i*o.height/o.width)):t.inputs.height&&(r=t.inputs.height,o&&(i=r*o.width/o.height)),i=Math.floor(i),r=Math.floor(r),o&&(this.uniforms.resolution[0]=i,this.uniforms.resolution[1]=r),(this.width!==i||this.height!==r)&&(this.width=i,this.height=r,this.frameBuffer&&this.frameBuffer.resize(this.width,this.height),this.emit("resize"),this.setDirty()),e=0;e=0;u--)a(e,o,n,s,null,r),u&&i.multiply(n.transform,c,n.transform)},inputs:{source:{type:"image",uniform:"source",update:function(){e(),this.uniforms.transform=o}},transform:{type:"image"},repeat:{type:"number",step:1,min:0,defaultValue:8},width:{type:"number",min:0,step:1,update:e,defaultValue:0},height:{type:"number",min:0,step:1,update:e,defaultValue:0}}}},{inPlace:!0,description:"Draw image multiple times, transforming each time",title:"Repeat"})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";e.plugin("ripple",{commonShader:!0,shader:function(e,t){return t.fragment=["precision mediump float;","varying vec2 vTexCoord;","uniform sampler2D source;","uniform float wave;","uniform float distortion;","uniform vec2 center;","void main(void) {"," float scalar = abs(1.0 - abs(distance(vTexCoord, center)));"," float sinOffset = sin(wave / scalar);"," sinOffset = clamp(sinOffset, 0.0, 1.0);"," float sinSign = cos(wave / scalar);"," sinOffset = sinOffset * distortion / 32.0;"," gl_FragColor = texture2D(source, vTexCoord + sinOffset * sinSign);","}"].join("\n"),t},inPlace:!1,inputs:{source:{type:"image",uniform:"source"},wave:{type:"number",uniform:"wave",defaultValue:Math.PI/.75},distortion:{type:"number",uniform:"distortion",defaultValue:1},center:{type:"vector",uniform:"center",dimensions:2,defaultValue:[.5,.5]}},title:"Ripple Distortion",description:""})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";e.plugin("scanlines",{commonShader:!0,shader:function(e,t){return t.fragment=["precision mediump float;","varying vec2 vTexCoord;","uniform sampler2D source;","uniform float lines;","uniform float width;","uniform float intensity;","void main(void) {"," vec4 pixel = texture2D(source, vTexCoord);"," float darken = 2.0 * abs( fract(vTexCoord.y * lines / 2.0) - 0.5);"," darken = clamp(darken - width + 0.5, 0.0, 1.0);"," darken = 1.0 - ((1.0 - darken) * intensity);"," gl_FragColor = vec4(pixel.rgb * darken, 1.0);","}"].join("\n"),t},inPlace:!0,inputs:{source:{type:"image",uniform:"source"},lines:{type:"number",uniform:"lines",defaultValue:60},size:{type:"number",uniform:"size",defaultValue:.2,min:0,max:1},intensity:{type:"number",uniform:"intensity",defaultValue:.1,min:0,max:1}},title:"Scan Lines",description:""})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";var t=/\d+/;e.plugin("select",function(e){function i(){a.resize()}function r(){var e,t=a.inputs.active;e=a.inputs["source"+t],a.texture=e&&e.texture,i()}var o,n,s,a=this;for("number"==typeof e&&e>=2?o=e:(o=e&&e.count||4,o=Math.max(2,o)),s={active:{type:"number",step:1,min:0,max:o-1,defaultValue:0,update:r,updateSources:!0},sizeMode:{type:"enum",defaultValue:"0",options:["union","intersection","active"],update:i}},n=0;o>n;n++)s.sizeMode.options.push(n.toString()),s.sizeMode.options.push("source"+n),s["source"+n]={type:"image",update:r};return this.uniforms.layerResolution=[1,1],this.resize=function(){var e,i,r,n,s,a,u=this.inputs.sizeMode;if("union"===u)for(e=0,i=0,r=0;o>r;r++)s=this.inputs["source"+r],s&&(e=Math.max(e,s.width),i=Math.max(i,s.height));else if("intersection"===u)for(e=1/0,i=1/0,r=0;o>r;r++)s=this.inputs["source"+r],s&&(e=Math.min(e,s.width),i=Math.min(i,s.height));else if("active"===u)r=this.inputs.active,s=this.inputs["source"+r],e=Math.max(1,s&&s.width||1),i=Math.max(1,s&&s.height||1);else for(e=1,i=1,n=o-1,a=t.exec(this.inputs.sizeMode),a&&(n=Math.min(parseInt(a[0],10),n)),r=0;n>=r;r++)if(s=this.inputs["source"+r]){e=s.width,i=s.height;break}for((this.width!==e||this.height!==i)&&(this.width=e,this.height=i,this.emit("resize"),this.setDirty()),r=0;r=1?(r.source=r.sourceB,void n(e,i,r,o)):r.split<=0?(r.source=r.sourceA,void n(e,i,r,o)):void n(t,i,r,o)},inPlace:!1,requires:function(e,t){return"sourceA"===e&&t.split>=1?!1:"sourceB"===e&&t.split<=0?!1:!0}}},{inputs:{sourceA:{type:"image",uniform:"sourceA",shaderDirty:!1,update:function(){this.resize()}},sourceB:{type:"image",uniform:"sourceB",shaderDirty:!1,update:function(){this.resize()}},sizeMode:{type:"enum",defaultValue:"a",options:["a","b","union","intersection"],update:function(){this.resize()}},split:{type:"number",uniform:"split",defaultValue:.5,min:0,max:1,updateSources:!0},angle:{type:"number",uniform:"angle",defaultValue:0},fuzzy:{type:"number",uniform:"fuzzy",defaultValue:0,min:0,max:1},blendGamma:{type:"number",uniform:"blendGamma",defaultValue:2.2,min:0,max:4}},description:"Split screen or wipe",title:"Split"})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";e.plugin("temperature",{commonShader:!0,shader:function(e,t){return t.vertex=["precision mediump float;","attribute vec4 position;","attribute vec2 texCoord;","uniform vec2 resolution;","uniform mat4 transform;","uniform float temperature;","varying vec2 vTexCoord;","varying vec3 tempFactor;","const vec3 luma = vec3(0.2125,0.7154,0.0721);","vec3 temperatureRGB(float t) {"," float temp = t / 100.0;"," vec3 color = vec3(1.0);"," if (temp < 66.0) {"," color.g = 0.3900815787690196 * log(temp) - 0.6318414437886275;"," color.b = 0.543206789110196 * log(temp - 10.0) - 1.19625408914;"," } else {"," color.r = 1.292936186062745 * pow(temp - 60.0, -0.1332047592);"," color.g = 1.129890860895294 * pow(temp - 60.0, -0.0755148492);"," }"," return color;","}","void main(void) {"," vec4 screenPosition = vec4(position.xy * resolution / 2.0, position.z, position.w);"," screenPosition = transform * screenPosition;"," gl_Position.xy = screenPosition.xy * 2.0 / resolution;"," gl_Position.z = screenPosition.z * 2.0 / (resolution.x / resolution.y);"," gl_Position.w = screenPosition.w;"," vTexCoord = texCoord;"," vec3 tempColor = temperatureRGB(temperature);"," tempFactor = dot(tempColor, luma) / tempColor;","}\n"].join("\n"),t.fragment=["precision mediump float;","varying vec2 vTexCoord;","varying vec3 tempFactor;","uniform sampler2D source;","void main(void) {"," vec4 pixel = texture2D(source, vTexCoord);"," gl_FragColor = vec4(pixel.rgb * tempFactor, pixel.a);","}"].join("\n"),t},inPlace:!0,inputs:{source:{type:"image",uniform:"source"},temperature:{type:"number",uniform:"temperature",defaultValue:6500,min:3e3,max:25e3}},title:"Color Temperature",description:""})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";e.plugin("throttle",function(){var e=0;return{draw:function(t,i,r,o,n){this.inputs.frameRate&&Date.now()-e>=1e3/this.inputs.frameRate&&(n(t,i,r,o),e=Date.now())},requires:function(t,i){return i.frameRate&&Date.now()-e>=1e3/i.frameRate?!0:!1}}},{inPlace:!0,commonShader:!0,title:"Throttle",description:"Throttle frame rate",inputs:{source:{type:"image",uniform:"source"},frameRate:{type:"number",uniform:"opacity",defaultValue:15,min:0}}})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";e.plugin("tone",{commonShader:!0,shader:function(e,t){return t.fragment=["precision mediump float;","varying vec2 vTexCoord;","uniform sampler2D source;","uniform vec4 light;","uniform vec4 dark;","uniform float desat;","uniform float toned;","const vec3 lumcoeff = vec3(0.2125,0.7154,0.0721);","void main(void) {"," vec4 sourcePixel = texture2D(source, vTexCoord);"," vec3 sceneColor = light.rgb * sourcePixel.rgb;"," vec3 gray = vec3(dot(lumcoeff, sceneColor));"," vec3 muted = mix(sceneColor, gray, desat);"," vec3 tonedColor = mix(dark.rgb, light.rgb, gray);"," gl_FragColor = vec4(mix(muted, tonedColor, toned), sourcePixel.a);","}"].join("\n"),t},inPlace:!0,inputs:{source:{type:"image",uniform:"source"},light:{type:"color",uniform:"light",defaultValue:[1,.9,.5,1]},dark:{type:"color",uniform:"dark",defaultValue:[.2,.05,0,1]},toned:{type:"number",uniform:"toned",defaultValue:1,minimumRange:0,maximumRange:1},desat:{type:"number",uniform:"desat",defaultValue:.5,minimumRange:0,maximumRange:1}},title:"Tone",description:""})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";var t=.2,i=.8,r=.02,o=.3,n=20;e.plugin("tvglitch",function(){var s,a,u,l,f,c;return{initialize:function(a){var d,h,m,p,v,g;for(c=this.gl,s=this.height,g=[],h=o-r,m=i-t,d=0;n>d;d++)g.push(2*Math.random()-1),g.push(Math.random()*m+t),g.push(Math.random()*h+r),g.push(.2*Math.random());u=c.createBuffer(),c.bindBuffer(c.ARRAY_BUFFER,u),c.bufferData(c.ARRAY_BUFFER,new Float32Array(g),c.STATIC_DRAW),u.itemSize=4,u.numItems=n,p=["#define SHADER_NAME seriously.tvglitch.particle","precision mediump float;","attribute vec4 particle;","uniform float time;","uniform float height;","varying float intensity;","void main(void) {"," float y = particle.x + time * particle.y;"," y = fract((y + 1.0) / 2.0) * 4.0 - 2.0;"," intensity = particle.w;"," gl_Position = vec4(0.0, -y , 1.0, 2.0);"," gl_PointSize = height * particle.z;","}"].join("\n"),v=["#define SHADER_NAME seriously.tvglitch.particle","precision mediump float;","varying float intensity;","void main(void) {"," gl_FragColor = vec4(1.0);"," gl_FragColor.a = 2.0 * intensity * (1.0 - abs(gl_PointCoord.y - 0.5));","}"].join("\n"),l=new e.util.ShaderProgram(c,p,v),f=new e.util.FrameBuffer(c,1,Math.max(1,this.height/2)),a()},commonShader:!0,shader:function(t,i){return i.fragment=["precision mediump float;","#define HardLight(top, bottom) (1.0 - 2.0 * (1.0 - top) * (1.0 - bottom))","varying vec2 vTexCoord;","uniform sampler2D source;","uniform sampler2D particles;","uniform float time;","uniform float scanlines;","uniform float lineSync;","uniform float lineHeight;","uniform float distortion;","uniform float vsync;","uniform float bars;","uniform float frameSharpness;","uniform float frameShape;","uniform float frameLimit;","uniform vec4 frameColor;",e.util.shader.noiseHelpers+e.util.shader.snoise2d+"void main(void) {"," vec2 texCoord = vTexCoord;"," float drandom = snoise(vec2(time * 10.0, texCoord.y /lineHeight));"," float distortAmount = distortion * (drandom - 0.25) * 0.5;"," vec4 particleOffset = texture2D(particles, vec2(0.0, texCoord.y));"," distortAmount -= lineSync * (2.0 * particleOffset.a - 0.5);"," texCoord.x -= distortAmount;"," texCoord.x = mod(texCoord.x, 1.0);"," float roll;"," if (vsync != 0.0) {"," roll = fract(time / vsync);"," texCoord.y = mod(texCoord.y - roll, 1.0);"," }"," vec4 pixel = texture2D(source, texCoord);"," float barsAmount = particleOffset.r;"," if (barsAmount > 0.0) {"," pixel = vec4(pixel.r + bars * barsAmount,pixel.g + bars * barsAmount,pixel.b + bars * barsAmount,pixel.a);"," }"," if (mod(texCoord.y / lineHeight, 2.0) < 1.0 ) {"," pixel.rgb *= (1.0 - scanlines);"," }"," float f = (1.0 - gl_FragCoord.x * gl_FragCoord.x) * (1.0 - gl_FragCoord.y * gl_FragCoord.y);"," float frame = clamp( frameSharpness * (pow(f, frameShape) - frameLimit), 0.0, 1.0);"," gl_FragColor = mix(frameColor, pixel, frame);","}"].join("\n"),i},resize:function(){f&&f.resize(1,Math.max(1,this.height/2))},draw:function(e,t,i,r,o){var d,h=a!==this.inputs.time;s!==this.height&&(s=this.height,h=!0),i.lineHeight=1/this.height,this.inputs.verticalSync?(d=.2/this.inputs.verticalSync,i.vsync=d):(d=1,i.vsync=0),i.time=this.inputs.time%(1e3*d),i.distortion=Math.random()*this.inputs.distortion,h&&(this.inputs.lineSync||this.inputs.bars)&&(l.use(),c.viewport(0,0,1,this.height/2),c.bindFramebuffer(c.FRAMEBUFFER,f.frameBuffer),c.clear(c.COLOR_BUFFER_BIT|c.DEPTH_BUFFER_BIT),c.enableVertexAttribArray(l.location.particle),c.bindBuffer(c.ARRAY_BUFFER,u),c.vertexAttribPointer(l.location.particle,u.itemSize,c.FLOAT,!1,0,0),c.enable(c.BLEND),c.blendFunc(c.SRC_ALPHA,c.ONE),l.time.set(i.time*this.inputs.barsRate),l.height.set(this.height),c.drawArrays(c.POINTS,0,n),a=this.inputs.time),i.particles=f.texture,o(e,t,i,r)},destroy:function(){u=null,f&&(f.destroy(),f=null)}}},{inPlace:!1,inputs:{source:{type:"image",uniform:"source",shaderDirty:!1},time:{type:"number",defaultValue:0},distortion:{type:"number",defaultValue:.1,min:0,max:1},verticalSync:{type:"number",defaultValue:.1,min:0,max:1},lineSync:{type:"number",uniform:"lineSync",defaultValue:.2,min:0,max:1},scanlines:{type:"number",uniform:"scanlines",defaultValue:.3,min:0,max:1},bars:{type:"number",uniform:"bars",defaultValue:0,min:0,max:1},barsRate:{type:"number",defaultValue:1},frameShape:{type:"number",uniform:"frameShape",min:0,max:2,defaultValue:.27},frameLimit:{type:"number",uniform:"frameLimit",min:-1,max:1,defaultValue:.34},frameSharpness:{type:"number",uniform:"frameSharpness",min:0,max:40,defaultValue:8.4},frameColor:{type:"color",uniform:"frameColor",defaultValue:[0,0,0,1]}},title:"TV Glitch"})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";e.plugin("vibrance",{commonShader:!0,shader:function(e,t){return t.fragment=["precision mediump float;","varying vec2 vTexCoord;","uniform sampler2D source;","uniform float amount;","void main(void) {"," vec4 color = texture2D(source, vTexCoord);"," float average = (color.r + color.g + color.b) / 3.0;"," float mx = max(color.r, max(color.g, color.b));"," float amt = (mx - average) * (-3.0 * amount);"," color.rgb = mix(color.rgb, vec3(mx), amt);"," gl_FragColor = color;","}"].join("\n"),t},inPlace:!0,inputs:{source:{type:"image",uniform:"source"},amount:{type:"number",uniform:"amount",defaultValue:0,min:-1,max:1}},title:"Vibrance",description:"Non-peaking saturation effect"})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";e.plugin("vignette",{commonShader:!0,shader:function(e,t){return t.fragment=["precision mediump float;","varying vec2 vTexCoord;","uniform sampler2D source;","uniform float amount;","void main(void) {"," vec4 pixel = texture2D(source, vTexCoord);"," vec2 pos = vTexCoord.xy - 0.5;"," float vignette = 1.0 - (dot(pos, pos) * amount);"," gl_FragColor = vec4(pixel.rgb * vignette, pixel.a);","}"].join("\n"),t},inPlace:!1,inputs:{source:{type:"image",uniform:"source"},amount:{type:"number",uniform:"amount",defaultValue:1,min:0}},title:"Vignette",description:"Vignette"})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";var t=new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]);e.plugin("whitebalance",function(){function i(i,r){var a,d,h,m;if((o!==i||n!==r)&&(o=i,n=r,d=Math.ceil(Math.log(Math.max(r,i))/f),a=Math.pow(2,d),a>u&&(d=Math.ceil(Math.log(u)/f),a=u),d++,s!==a)){for(s=a;l.length>d;)l.pop().fb.destroy();for(;l.length=0;)a=l[s],n(r,t,a.uniforms,a.fb.frameBuffer,null,a.opts),s--;i.whiteSource=l[0].fb.texture}n(e,t,i,o)},destroy:function(){for(;l.length;)l.pop().destroy()},inPlace:!1,inputs:{source:{type:"image",uniform:"source",shaderDirty:!1},white:{type:"color",uniform:"white",defaultValue:[1,1,1]},auto:{type:"boolean",shaderDirty:!0,defaultValue:!0}}}},{title:"White Balance"})}); \ No newline at end of file diff --git a/build/seriously.min.js.gz b/build/seriously.min.js.gz new file mode 100755 index 0000000..06976e5 Binary files /dev/null and b/build/seriously.min.js.gz differ diff --git a/gulpfile.js b/gulpfile.js new file mode 100644 index 0000000..b884351 --- /dev/null +++ b/gulpfile.js @@ -0,0 +1,110 @@ + +var gulp = require('gulp'), + rjs = require('gulp-requirejs'), + concat = require('gulp-concat'), + uglify = require('gulp-uglify'), + gzip = require('gulp-gzip'), + rimraf = require('gulp-rimraf'), + gutil = require('gulp-util'), + argv = require('yargs').argv; + + +gulp.task('default', function () { + return gulp.src('app/tmp', {read: false}) + .pipe(clean()); +}); + + + +gulp.task('build', ['buildCombine']); + + +gulp.task('test', function() { + // TODO: broken test with window.clearTimeout + var qunit = require('node-qunit-phantomjs'); + qunit('./test/index.html'); +}); + + + +gulp.task('jshint', function() { + + var jshint = require('gulp-jshint'); + + return gulp.src(['./seriously.js', './effects/**.js']) + .pipe(jshint()) + .pipe(jshint.reporter('default')) + +}); + + +gulp.task('clean', function() { + gulp.src(['./build/**.js','./build/**.js.gz'], { read: false }) + .pipe(rimraf()); +}); + + +gulp.task('buildCombine', function() { + + var effects = getListOfEffects(); + var files = (effects.include.length ? effects.include : ['./effects/*.js']) + .concat(effects.exclude); + + var isCustom = effects.include.length || effects.exclude.length; + + gulp.src(['./seriously.js'].concat(files)) + + // concat all files and minify + .pipe(concat('seriously.min' + (isCustom ? '.custom' : '') + '.js')) + .pipe(uglify()) + .pipe(gulp.dest('./build/')) + + // gzip + .pipe(gzip()) + .pipe(gulp.dest('./build/')); + + }); + + + + +function getListOfEffects() { + + var fs = require('fs'); + + var onFileChecked = function(err, stat) { + + if(err == null) { + gutil.log(gutil.colors.green(this)); + } + else { + gutil.log('Missing:', gutil.colors.red(this)); + } + } + + var effects, + include = [], + exclude = []; + + if(argv.inc) { + include = argv.inc.split(' ').map(function(itm) { + var filepath = './effects/seriously.' + itm + '.js'; + fs.stat(filepath, onFileChecked.bind(filepath)); + return filepath; + }); + } + + if(argv.exc) { + exclude = argv.exc.split(' ').map(function(itm) { + var filepath = './effects/seriously.' + itm + '.js'; + return filepath; + }); + } + + + return { + include : include, + exclude : exclude + }; + +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..25e8ce2 --- /dev/null +++ b/package.json @@ -0,0 +1,45 @@ +{ + "name": "Seriously.js", + "version": "0.1.0", + "main" : "serously.js", + "author": "Brian Chirls ", + "description": "Seriously.js is a real-time, node-based video compositor for the web. Inspired by professional software such as After Effects and Nuke, Seriously.js renders high-quality video effects, but allows them to be dynamic and interactive.", + "engines" :{ + "node" : "^0.12.2", + "npm" : "^2.6.0" + }, + + "devDependencies": { + "gulp" : "3.9.0", + "gulp-util" : "^3.0.6", + "gulp-rimraf" : "^0.1.1", + "gulp-requirejs" : "0.1.3", + "gulp-concat" : "^2.6.0", + "gulp-uglify" : "^1.4.0", + "gulp-gzip" : "^1.2.0", + "event-stream" : "^3.3.1", + "gulp-if" : "1.2.5", + "yargs" : "^3.4.0", + "gulp-jshint" : "^1.11.2", + "node-qunit-phantomjs" : "x" + }, + + "dependencies": { + + }, + + "repository": { + "type": "git", + "url": "https://github.com/brianchirls/Seriously.js" + }, + + "bugs": { + "url": "https://github.com/brianchirls/Seriously.js/issues" + }, + + "scripts": { + + } +} + +