diff --git a/bin/pixi.js b/bin/pixi.js index ab4ffc9..45c2dd9 100644 --- a/bin/pixi.js +++ b/bin/pixi.js @@ -4155,18 +4155,19 @@ } } + Buffer.prototype.upload = function(data, offset, dontBind) { // todo - needed? if(!dontBind)this.bind(); var gl = this.gl; - + data = data || this.data; offset = offset || 0; if(this.data.byteLength >= data.byteLength) - { + { gl.bufferSubData(this.type, offset, data); } else @@ -4199,10 +4200,15 @@ } //TODO Destroy.. +Buffer.prototype.destroy = function(){ + this.gl.deleteBuffer(this.buffer); + + this.gl.canvas.width = 1; + this.gl.canvas.height = 1; +} module.exports = Buffer; - },{}],16:[function(require,module,exports){ var Texture = require('./GLTexture'); @@ -9147,7 +9153,7 @@ this.children = null; }; -},{"../math":59,"../textures/RenderTexture":94,"../utils":101,"./DisplayObject":41}],41:[function(require,module,exports){ +},{"../math":59,"../textures/RenderTexture":93,"../utils":100,"./DisplayObject":41}],41:[function(require,module,exports){ var math = require('../math'), RenderTexture = require('../textures/RenderTexture'), EventEmitter = require('eventemitter3'), @@ -9634,7 +9640,7 @@ this.filterArea = null; }; -},{"../const":39,"../math":59,"../textures/RenderTexture":94,"./Transform":42,"eventemitter3":12}],42:[function(require,module,exports){ +},{"../const":39,"../math":59,"../textures/RenderTexture":93,"./Transform":42,"eventemitter3":12}],42:[function(require,module,exports){ var math = require('../math'); @@ -10802,7 +10808,7 @@ this._localBounds = null; }; -},{"../const":39,"../display/Container":40,"../math":59,"../renderers/canvas/utils/CanvasBuffer":67,"../renderers/canvas/utils/CanvasGraphics":68,"../sprites/Sprite":88,"../textures/RenderTexture":94,"../textures/Texture":95,"./GraphicsData":44,"./utils/bezierCurveTo":45}],44:[function(require,module,exports){ +},{"../const":39,"../display/Container":40,"../math":59,"../renderers/canvas/utils/CanvasBuffer":67,"../renderers/canvas/utils/CanvasGraphics":68,"../sprites/Sprite":87,"../textures/RenderTexture":93,"../textures/Texture":94,"./GraphicsData":44,"./utils/bezierCurveTo":45}],44:[function(require,module,exports){ /** * A GraphicsData object. * @@ -11167,7 +11173,7 @@ }; -},{"../../const":39,"../../math":59,"../../renderers/webgl/WebGLRenderer":73,"../../renderers/webgl/utils/ObjectRenderer":83,"../../utils":101,"./WebGLGraphicsData":47,"./shaders/PrimitiveShader":48,"./utils/buildCircle":49,"./utils/buildComplexPoly":50,"./utils/buildLine":51,"./utils/buildPoly":52,"./utils/buildRectangle":53,"./utils/buildRoundedRectangle":54}],47:[function(require,module,exports){ +},{"../../const":39,"../../math":59,"../../renderers/webgl/WebGLRenderer":72,"../../renderers/webgl/utils/ObjectRenderer":82,"../../utils":100,"./WebGLGraphicsData":47,"./shaders/PrimitiveShader":48,"./utils/buildCircle":49,"./utils/buildComplexPoly":50,"./utils/buildLine":51,"./utils/buildPoly":52,"./utils/buildRectangle":53,"./utils/buildRoundedRectangle":54}],47:[function(require,module,exports){ var glCore = require('pixi-gl-core'); @@ -11425,7 +11431,7 @@ module.exports = buildCircle; -},{"../../../utils":101,"./buildLine":51}],50:[function(require,module,exports){ +},{"../../../utils":100,"./buildLine":51}],50:[function(require,module,exports){ var buildLine = require('./buildLine'), utils = require('../../../utils'); @@ -11496,7 +11502,7 @@ module.exports = buildComplexPoly; -},{"../../../utils":101,"./buildLine":51}],51:[function(require,module,exports){ +},{"../../../utils":100,"./buildLine":51}],51:[function(require,module,exports){ var math = require('../../../math'), utils = require('../../../utils'); @@ -11716,7 +11722,7 @@ }; module.exports = buildLine; -},{"../../../math":59,"../../../utils":101}],52:[function(require,module,exports){ +},{"../../../math":59,"../../../utils":100}],52:[function(require,module,exports){ var buildLine = require('./buildLine'), utils = require('../../../utils'), earcut = require('earcut'); @@ -11796,7 +11802,7 @@ module.exports = buildPoly; -},{"../../../utils":101,"./buildLine":51,"earcut":11}],53:[function(require,module,exports){ +},{"../../../utils":100,"./buildLine":51,"earcut":11}],53:[function(require,module,exports){ var buildLine = require('./buildLine'), utils = require('../../../utils'); @@ -11867,7 +11873,7 @@ }; module.exports = buildRectangle; -},{"../../../utils":101,"./buildLine":51}],54:[function(require,module,exports){ +},{"../../../utils":100,"./buildLine":51}],54:[function(require,module,exports){ var buildLine = require('./buildLine'), utils = require('../../../utils'); @@ -11995,7 +12001,7 @@ module.exports = buildRoundedRectangle; -},{"../../../utils":101,"./buildLine":51}],55:[function(require,module,exports){ +},{"../../../utils":100,"./buildLine":51}],55:[function(require,module,exports){ /** * @file Main export of the PIXI core library * @author Mat Groves @@ -12088,7 +12094,7 @@ } }); -},{"./const":39,"./display/Container":40,"./display/DisplayObject":41,"./graphics/Graphics":43,"./graphics/GraphicsData":44,"./graphics/webgl/GraphicsRenderer":46,"./math":59,"./renderers/canvas/CanvasRenderer":66,"./renderers/canvas/utils/CanvasBuffer":67,"./renderers/canvas/utils/CanvasGraphics":68,"./renderers/webgl/WebGLRenderer":73,"./renderers/webgl/filters/Filter":75,"./renderers/webgl/filters/spriteMask/SpriteMaskFilter":78,"./renderers/webgl/managers/WebGLManager":82,"./renderers/webgl/utils/ObjectRenderer":83,"./renderers/webgl/utils/RenderTarget":85,"./sprites/Sprite":88,"./sprites/webgl/SpriteRenderer":89,"./text/Text":91,"./textures/BaseRenderTexture":92,"./textures/BaseTexture":93,"./textures/RenderTexture":94,"./textures/Texture":95,"./textures/TextureUvs":96,"./textures/VideoBaseTexture":97,"./ticker":99,"./utils":101,"pixi-gl-core":14}],56:[function(require,module,exports){ +},{"./const":39,"./display/Container":40,"./display/DisplayObject":41,"./graphics/Graphics":43,"./graphics/GraphicsData":44,"./graphics/webgl/GraphicsRenderer":46,"./math":59,"./renderers/canvas/CanvasRenderer":66,"./renderers/canvas/utils/CanvasBuffer":67,"./renderers/canvas/utils/CanvasGraphics":68,"./renderers/webgl/WebGLRenderer":72,"./renderers/webgl/filters/Filter":74,"./renderers/webgl/filters/spriteMask/SpriteMaskFilter":77,"./renderers/webgl/managers/WebGLManager":81,"./renderers/webgl/utils/ObjectRenderer":82,"./renderers/webgl/utils/RenderTarget":84,"./sprites/Sprite":87,"./sprites/webgl/SpriteRenderer":88,"./text/Text":90,"./textures/BaseRenderTexture":91,"./textures/BaseTexture":92,"./textures/RenderTexture":93,"./textures/Texture":94,"./textures/TextureUvs":95,"./textures/VideoBaseTexture":96,"./ticker":98,"./utils":100,"pixi-gl-core":14}],56:[function(require,module,exports){ // Your friendly neighbour https://en.wikipedia.org/wiki/Dihedral_group of order 16 var ux = [1, 1, 0, -1, -1, -1, 0, 1, 1, 1, 0, -1, -1, -1, 0, 1]; @@ -13568,7 +13574,7 @@ this._backgroundColorString = null; }; -},{"../const":39,"../display/Container":40,"../math":59,"../utils":101,"eventemitter3":12}],66:[function(require,module,exports){ +},{"../const":39,"../display/Container":40,"../math":59,"../utils":100,"eventemitter3":12}],66:[function(require,module,exports){ var SystemRenderer = require('../SystemRenderer'), CanvasMaskManager = require('./utils/CanvasMaskManager'), utils = require('../../utils'), @@ -13836,7 +13842,7 @@ } }; -},{"../../const":39,"../../math":59,"../../utils":101,"../SystemRenderer":65,"./utils/CanvasMaskManager":69}],67:[function(require,module,exports){ +},{"../../const":39,"../../math":59,"../../utils":100,"../SystemRenderer":65,"./utils/CanvasMaskManager":69}],67:[function(require,module,exports){ /** * Creates a Canvas element of the given size. * @@ -14592,124 +14598,10 @@ */ CanvasTinter.tintMethod = CanvasTinter.canUseMultiply ? CanvasTinter.tintWithMultiply : CanvasTinter.tintWithPerPixel; -},{"../../../utils":101}],71:[function(require,module,exports){ -var GLTexture = require('pixi-gl-core').GLTexture, - utils = require('../../utils'), - RenderTarget = require('./utils/RenderTarget'); - -/** - * Helper class to create a webGL Texture - * - * @class - * @memberof PIXI - * @param gl {WebGLRenderingContext} - */ - -var RenderTextureManager = function(renderer) -{ - this.renderer = renderer - this.gl = renderer.gl; - - // track textures in the renderer so we can no longer listen to them on destruction. - this._managedTextures = []; -} - -/** - * Updates and/or Creates a WebGL texture for the renderer's context. - * - * @param texture {PIXI.BaseTexture|PIXI.Texture} the texture to update - */ -RenderTextureManager.prototype.updateTexture = function(texture) -{ - texture = texture.baseTexture || texture; - - var renderTarget = texture._glRenderTargets[this.renderer.CONTEXT_UID]; - - if (!renderTarget) - { - - renderTarget = new RenderTarget(this.gl, texture.width, texture.height, texture.scaleMode, texture.resolution); - - texture._glTextures[this.renderer.CONTEXT_UID] = renderTarget.texture; - texture._glRenderTargets[this.renderer.CONTEXT_UID] = renderTarget; - - texture.on('update', this.updateTexture, this); - texture.on('dispose', this.destroyTexture, this); - - this._managedTextures.push(texture); - - - } - renderTarget.resize(texture.width, texture.height); - - return renderTarget; -} - -/** - * Deletes the texture from WebGL - * - * @param texture {PIXI.BaseTexture|PIXI.Texture} the texture to destroy - */ -RenderTextureManager.prototype.destroyTexture = function(texture, _skipRemove) -{ - texture = texture.baseTexture || texture; - - var gl = this.gl; - if (texture._glRenderTargets[this.renderer.CONTEXT_UID]) - { - texture._glTextures[this.renderer.CONTEXT_UID] = null; - texture._glRenderTargets[this.renderer.CONTEXT_UID].destroy(); - - //.destroy(); - texture.off('update', this.updateTexture, this); - texture.off('dispose', this.destroyTexture, this); - - - delete texture._glTextures[this.renderer.CONTEXT_UID]; - - if (!_skipRemove) - { - var i = this._managedTextures.indexOf(texture); - if (i !== -1) { - utils.removeItems(this._managedTextures, i, 1); - } - } - } -} - -RenderTextureManager.prototype.removeAll = function() -{ - // empty all the old gl textures as they are useless now - for (var i = 0; i < this._managedTextures.length; ++i) - { - var texture = this._managedTextures[i]; - if (texture._glTextures[this.renderer.CONTEXT_UID]) - { - delete texture._glTextures[this.renderer.CONTEXT_UID]; - } - } -} - -RenderTextureManager.prototype.destroy = function() -{ - // destroy managed textures - for (var i = 0; i < this._managedTextures.length; ++i) - { - var texture = this._managedTextures[i]; - this.destroyTexture(texture, true); - texture.off('update', this.updateTexture, this); - texture.off('dispose', this.destroyTexture, this); - } - - this._managedTextures = null; -} - -module.exports = RenderTextureManager; - - -},{"../../utils":101,"./utils/RenderTarget":85,"pixi-gl-core":14}],72:[function(require,module,exports){ +},{"../../../utils":100}],71:[function(require,module,exports){ var GLTexture = require('pixi-gl-core').GLTexture, CONST = require('../../const'), + RenderTarget = require('./utils/RenderTarget'), utils = require('../../utils'); /** @@ -14722,12 +14614,11 @@ var TextureManager = function(renderer) { - this.renderer = renderer; + this.renderer = renderer; this.gl = renderer.gl; // track textures in the renderer so we can no longer listen to them on destruction. this._managedTextures = []; - } TextureManager.prototype.bindTexture = function(texture) @@ -14750,23 +14641,35 @@ { texture = texture.baseTexture || texture; + var isRenderTexture = !!texture._glRenderTargets; + if (!texture.hasLoaded) { return; } - var glTexture = texture._glTextures[this.renderer.CONTEXT_UID]; if (!glTexture) { - glTexture = new GLTexture(this.gl); - glTexture.premultiplyAlpha = true; + if(isRenderTexture) + { + renderTarget = new RenderTarget(this.gl, texture.width, texture.height, texture.scaleMode, texture.resolution); + texture._glRenderTargets[this.renderer.CONTEXT_UID] = renderTarget; + glTexture = renderTarget.texture; + } + else + { + glTexture = new GLTexture(this.gl); + glTexture.premultiplyAlpha = true; + glTexture.upload(texture.source); + } + texture._glTextures[this.renderer.CONTEXT_UID] = glTexture; texture.on('update', this.updateTexture, this); texture.on('dispose', this.destroyTexture, this); - + this._managedTextures.push(texture); //TODO check is power of two.. @@ -14782,9 +14685,10 @@ } } - glTexture.upload(texture.source); - - + if(isRenderTexture) + { + renderTarget.resize(texture.width, texture.height); + } return glTexture; } @@ -14835,6 +14739,12 @@ } } + +TextureManager.prototype.destroyAll = function(){ + this.destroy(); + // this.removeAll(); +} + TextureManager.prototype.destroy = function() { // destroy managed textures @@ -14851,8 +14761,7 @@ module.exports = TextureManager; - -},{"../../const":39,"../../utils":101,"pixi-gl-core":14}],73:[function(require,module,exports){ +},{"../../const":39,"../../utils":100,"./utils/RenderTarget":84,"pixi-gl-core":14}],72:[function(require,module,exports){ var SystemRenderer = require('../SystemRenderer'), MaskManager = require('./managers/MaskManager'), StencilManager = require('./managers/StencilManager'), @@ -14860,7 +14769,6 @@ RenderTarget = require('./utils/RenderTarget'), ObjectRenderer = require('./utils/ObjectRenderer'), TextureManager = require('./TextureManager'), - RenderTextureManager = require('./RenderTextureManager'), WebGLState = require('./WebGLState'), createContext = require('pixi-gl-core').createContext, mapWebGLDrawModesToPixi = require('./utils/mapWebGLDrawModesToPixi'), @@ -14954,7 +14862,7 @@ // initialize the context so it is ready for the managers. this.gl = createContext(this.view, this._contextOptions); - + this.gl.id = this.CONTEXT_UID = CONTEXT_UID++; this.state = new WebGLState(this.gl); @@ -14965,15 +14873,15 @@ * * @member {PIXI.FilterManager} */ - - + + this._initContext(); - + this.filterManager = new FilterManager(this); // map some webGL blend and drawmodes.. this.drawModes = mapWebGLDrawModesToPixi(gl) - + //alert(this.state ) this._activeShader = null; @@ -15006,19 +14914,18 @@ // create a texture manager... this.textureManager = new TextureManager(this); - this.renderTextureManager = new RenderTextureManager(this); - + this.state.resetToDefault(); this.rootRenderTarget = new RenderTarget(gl, this.width, this.height, null, this.resolution, true); this.rootRenderTarget.clearColor = this._backgroundColorRgba; - + this.bindRenderTarget(this.rootRenderTarget); this.emit('context', gl); // setup the width/height properties and gl viewport - this.resize(this.width, this.height); + this.resize(this.width, this.height); }; /** @@ -15034,7 +14941,7 @@ this.emit('prerender'); // no point rendering if our context has been blown up! - if (this.gl.isContextLost()) + if (!this.gl || this.gl.isContextLost()) { return; } @@ -15042,7 +14949,7 @@ this._lastObjectRendered = displayObject; if(!skipUpdateTransform) - { + { // update the scene graph var cacheParent = displayObject.parent; displayObject.parent = this._tempDisplayObjectParent; @@ -15061,7 +14968,7 @@ displayObject.renderWebGL(this); // apply transform.. - + this.currentRenderer.flush(); this.emit('postrender'); @@ -15131,11 +15038,10 @@ if(!baseTexture._glRenderTargets[this.CONTEXT_UID]) { - this.renderTextureManager.updateTexture(baseTexture); + this.textureManager.updateTexture(baseTexture); } renderTarget = baseTexture._glRenderTargets[this.CONTEXT_UID]; - renderTarget.setFrame(renderTexture.frame); } else @@ -15193,7 +15099,7 @@ WebGLRenderer.prototype.bindTexture = function (texture, location) { texture = texture.baseTexture || texture; - + var gl = this.gl; //TODO test perf of cache? @@ -15206,15 +15112,15 @@ } //TODO - can we cache this texture too? - this._activeTexture = texture; - + this._activeTexture = texture; + if (!texture._glTextures[this.CONTEXT_UID]) { // this will also bind the texture.. this.textureManager.updateTexture(texture); } else - { + { // bind the current texture texture._glTextures[this.CONTEXT_UID].bind(); } @@ -15263,7 +15169,7 @@ /** * Removes everything from the renderer (event listeners, spritebatch, etc...) * - * @param [removeView=false] {boolean} Removes the Canvas element from the DOM. + * @param [removeView=false] {boolean} Removes the Canvas element from the DOM. https://github.com/pixijs/pixi.js/issues/2233 */ WebGLRenderer.prototype.destroy = function (removeView) { @@ -15272,7 +15178,7 @@ // remove listeners this.view.removeEventListener('webglcontextlost', this.handleContextLost); this.view.removeEventListener('webglcontextrestored', this.handleContextRestored); - + this.textureManager.destroyAll(); // call base destroy @@ -15287,19 +15193,19 @@ this.maskManager = null; this.filterManager = null; + this.textureManager = null; this.currentRenderer = null; this.handleContextLost = null; this.handleContextRestored = null; this._contextOptions = null; - this.gl.useProgram(null); + this.gl.getExtension('WEBGL_lose_context').loseContext(); this.gl = null; }; - -},{"../../const":39,"../../utils":101,"../SystemRenderer":65,"./RenderTextureManager":71,"./TextureManager":72,"./WebGLState":74,"./managers/FilterManager":79,"./managers/MaskManager":80,"./managers/StencilManager":81,"./utils/ObjectRenderer":83,"./utils/RenderTarget":85,"./utils/mapWebGLDrawModesToPixi":87,"pixi-gl-core":14}],74:[function(require,module,exports){ +},{"../../const":39,"../../utils":100,"../SystemRenderer":65,"./TextureManager":71,"./WebGLState":73,"./managers/FilterManager":78,"./managers/MaskManager":79,"./managers/StencilManager":80,"./utils/ObjectRenderer":82,"./utils/RenderTarget":84,"./utils/mapWebGLDrawModesToPixi":86,"pixi-gl-core":14}],73:[function(require,module,exports){ var mapWebGLBlendModesToPixi = require('./utils/mapWebGLBlendModesToPixi'); @@ -15491,7 +15397,7 @@ module.exports = WebGLState; -},{"./utils/mapWebGLBlendModesToPixi":86}],75:[function(require,module,exports){ +},{"./utils/mapWebGLBlendModesToPixi":85}],74:[function(require,module,exports){ var Shader = require('pixi-gl-core').GLShader; var extractUniformsFromSrc = require('./extractUniformsFromSrc') var math = require('../../../math'); @@ -15623,7 +15529,7 @@ '}' ].join('\n'); -},{"../../../math":59,"./extractUniformsFromSrc":76,"pixi-gl-core":14}],76:[function(require,module,exports){ +},{"../../../math":59,"./extractUniformsFromSrc":75,"pixi-gl-core":14}],75:[function(require,module,exports){ var defaultValue = require('pixi-gl-core/lib/shader/defaultValue'); var mapSize = require('pixi-gl-core/lib/shader/mapSize'); @@ -15685,7 +15591,7 @@ } module.exports = extractUniformsFromSrc; -},{"pixi-gl-core/lib/shader/defaultValue":23,"pixi-gl-core/lib/shader/mapSize":27}],77:[function(require,module,exports){ +},{"pixi-gl-core/lib/shader/defaultValue":23,"pixi-gl-core/lib/shader/mapSize":27}],76:[function(require,module,exports){ var math = require('../../../math'); /* @@ -15793,7 +15699,7 @@ calculateNormalisedScreenSpaceMatrix:calculateNormalisedScreenSpaceMatrix, calculateSpriteMatrix:calculateSpriteMatrix }; -},{"../../../math":59}],78:[function(require,module,exports){ +},{"../../../math":59}],77:[function(require,module,exports){ (function (__dirname){ var Filter = require('../Filter'), math = require('../../../../math'); @@ -15847,7 +15753,7 @@ }; }).call(this,"/src/core/renderers/webgl/filters/spriteMask") -},{"../../../../math":59,"../Filter":75,"fs":3}],79:[function(require,module,exports){ +},{"../../../../math":59,"../Filter":74,"fs":3}],78:[function(require,module,exports){ var WebGLManager = require('./WebGLManager'), RenderTarget = require('../utils/RenderTarget'), @@ -16198,7 +16104,7 @@ FilterManager.pool = {} -},{"../../../const":39,"../../../math":59,"../../../utils":101,"../filters/filterTransforms":77,"../utils/Quad":84,"../utils/RenderTarget":85,"./WebGLManager":82,"bit-twiddle":2,"pixi-gl-core":14}],80:[function(require,module,exports){ +},{"../../../const":39,"../../../math":59,"../../../utils":100,"../filters/filterTransforms":76,"../utils/Quad":83,"../utils/RenderTarget":84,"./WebGLManager":81,"bit-twiddle":2,"pixi-gl-core":14}],79:[function(require,module,exports){ var WebGLManager = require('./WebGLManager'), AlphaMaskFilter = require('../filters/spriteMask/SpriteMaskFilter'); @@ -16375,7 +16281,7 @@ }; -},{"../filters/spriteMask/SpriteMaskFilter":78,"./WebGLManager":82}],81:[function(require,module,exports){ +},{"../filters/spriteMask/SpriteMaskFilter":77,"./WebGLManager":81}],80:[function(require,module,exports){ var WebGLManager = require('./WebGLManager'), utils = require('../../../utils'); @@ -16424,7 +16330,7 @@ StencilMaskManager.prototype.pushStencil = function (graphics) { this.renderer.setObjectRenderer(this.renderer.plugins.graphics); - + this.renderer._activeRenderTarget.attachStencilBuffer(); var gl = this.renderer.gl, @@ -16474,7 +16380,7 @@ gl.stencilOp(gl.KEEP,gl.KEEP,gl.DECR); this.renderer.plugins.graphics.render(graphics) - + gl.colorMask(true, true, true, true); gl.stencilFunc(gl.NOTEQUAL, 0, sms.length); gl.stencilOp(gl.KEEP,gl.KEEP,gl.KEEP); @@ -16492,8 +16398,7 @@ this.stencilMaskStack.stencilStack = null; }; - -},{"../../../utils":101,"./WebGLManager":82}],82:[function(require,module,exports){ +},{"../../../utils":100,"./WebGLManager":81}],81:[function(require,module,exports){ /** * @class * @memberof PIXI @@ -16534,7 +16439,7 @@ this.renderer = null; }; -},{}],83:[function(require,module,exports){ +},{}],82:[function(require,module,exports){ var WebGLManager = require('../managers/WebGLManager'); /** @@ -16592,7 +16497,7 @@ // render the object }; -},{"../managers/WebGLManager":82}],84:[function(require,module,exports){ +},{"../managers/WebGLManager":81}],83:[function(require,module,exports){ var glCore = require('pixi-gl-core'), createIndicesForQuads = require('../../../utils/createIndicesForQuads'); @@ -16756,7 +16661,7 @@ -},{"../../../utils/createIndicesForQuads":100,"pixi-gl-core":14}],85:[function(require,module,exports){ +},{"../../../utils/createIndicesForQuads":99,"pixi-gl-core":14}],84:[function(require,module,exports){ var math = require('../../../math'), utils = require('../../../utils'), CONST = require('../../../const'), @@ -17077,7 +16982,7 @@ this.texture = null; }; -},{"../../../const":39,"../../../math":59,"../../../utils":101,"pixi-gl-core":14}],86:[function(require,module,exports){ +},{"../../../const":39,"../../../math":59,"../../../utils":100,"pixi-gl-core":14}],85:[function(require,module,exports){ CONST = require('../../../const'); /** @@ -17114,7 +17019,7 @@ module.exports = mapWebGLBlendModesToPixi; -},{"../../../const":39}],87:[function(require,module,exports){ +},{"../../../const":39}],86:[function(require,module,exports){ CONST = require('../../../const'); /** @@ -17138,7 +17043,7 @@ module.exports = mapWebGLDrawModesToPixi; -},{"../../../const":39}],88:[function(require,module,exports){ +},{"../../../const":39}],87:[function(require,module,exports){ var math = require('../math'), Texture = require('../textures/Texture'), Container = require('../display/Container'), @@ -17166,7 +17071,6 @@ function Sprite(texture) { Container.call(this); - /** * The anchor sets the origin point of the texture. * The default is 0,0 this means the texture's origin is the top left @@ -17343,7 +17247,7 @@ } }; -Sprite.prototype.caclulateVertices = function () + Sprite.prototype.caclulateVertices = function () { var texture = this._texture, wt = this.transform.worldTransform, @@ -17403,7 +17307,7 @@ { this.textureDirty = false; // set the vertex data - this.caclulateVertices(); + this.caclulateVertices(); } renderer.setObjectRenderer(renderer.plugins.sprite); @@ -17426,7 +17330,7 @@ this.vertexDirty = false; // set the vertex data - this.caclulateVertices(); + this.caclulateVertices(); } @@ -17679,7 +17583,6 @@ Sprite.prototype.destroy = function (destroyTexture, destroyBaseTexture) { Container.prototype.destroy.call(this); - this.anchor = null; if (destroyTexture) @@ -17728,7 +17631,7 @@ return new Sprite(Texture.fromImage(imageId, crossorigin, scaleMode)); }; -},{"../const":39,"../display/Container":40,"../math":59,"../renderers/canvas/utils/CanvasTinter":70,"../textures/Texture":95,"../utils":101}],89:[function(require,module,exports){ +},{"../const":39,"../display/Container":40,"../math":59,"../renderers/canvas/utils/CanvasTinter":70,"../textures/Texture":94,"../utils":100}],88:[function(require,module,exports){ var ObjectRenderer = require('../../renderers/webgl/utils/ObjectRenderer'), WebGLRenderer = require('../../renderers/webgl/WebGLRenderer'), createIndicesForQuads = require('../../utils/createIndicesForQuads'), @@ -17813,13 +17716,13 @@ this.currentIndex = 0; this.tick =0; this.groups = []; - + //TODO - 300 is a bit magic, figure out a nicer amount! - for (var i = 0; i < this.size; i++) + for (var i = 0; i < this.size; i++) { - this.groups[i] = {textures:[], textureCount:0, ids:[], size:0, start:0, blend:0}; + this.groups[i] = {textures:[], textureCount:0, ids:[], size:0, start:0, blend:0}; }; - + this.sprites = []; } @@ -17844,7 +17747,7 @@ this.MAX_TEXTURES = Math.min(gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS), CONST.SPRITE_MAX_TEXTURES); this.shader = generateMultiTextureShader(gl, this.MAX_TEXTURES); // create a couple of buffers - this.vertexBuffer = glCore.GLBuffer.createVertexBuffer(gl, null, gl.DYNAMIC_DRAW); + this.vertexBuffer = glCore.GLBuffer.createVertexBuffer(gl, null, gl.STREAM_DRAW); this.indexBuffer = glCore.GLBuffer.createIndexBuffer(gl, this.indices, gl.STATIC_DRAW); // build the vao object that will render.. @@ -17872,9 +17775,9 @@ this.flush(); } - + // get the uvs for the texture - + // if the uvs have not updated then no point rendering just yet! if (!sprite.texture._uvs) @@ -17903,7 +17806,7 @@ var sprites = this.sprites; var groups = this.groups; - + var colors = buffer.colors; var positions = buffer.positions; var uvsBuffer = buffer.uvs; @@ -17924,7 +17827,7 @@ this.tick++; - for (var i = 0; i < this.currentIndex; i++) + for (var i = 0; i < this.currentIndex; i++) { // upload the sprite elemetns... // they have all ready been calculated so we just need to push them into the buffer. @@ -17935,7 +17838,7 @@ if(blendMode !== sprite.blendMode) { blendMode = sprite.blendMode; - + // force the batch to break! currentTexture = null; textureCount = this.MAX_TEXTURES; @@ -17945,9 +17848,9 @@ if(currentTexture !== nextTexture) { currentTexture = nextTexture; - + if(nextTexture._enabled !== this.tick) - { + { if(textureCount === this.MAX_TEXTURES) { this.tick++; @@ -17955,7 +17858,7 @@ textureCount = 0; currentGroup.size = i - currentGroup.start; - + currentGroup = groups[groupCount++]; currentGroup.textureCount = 0; currentGroup.blend = blendMode; @@ -17970,7 +17873,7 @@ } } - + var vertexData = sprite.vertexData; //TODO this sum does not need to be set each frame.. @@ -17983,8 +17886,8 @@ positions[index++] = vertexData[1]; uvsBuffer[index++] = uvs[0]; colors[index++] = tint; - positions[index++] = textureId; - + positions[index++] = textureId; + // xy positions[index++] = vertexData[2]; positions[index++] = vertexData[3]; @@ -18009,13 +17912,13 @@ }; currentGroup.size = i - currentGroup.start; - + this.vertexBuffer.upload(buffer.vertices, 0, true); - + /// render the groups.. for (i = 0; i < groupCount; i++) { - + var group = groups[i]; for (var j = 0; j < group.textureCount; j++) { @@ -18067,8 +17970,17 @@ this.vertexBuffer = null; this.indexBuffer = null; - this.sprites = null; + for (var i = 0; i < this.sprites.length; i++) { + this.sprites[i].destroy(); + } + + // this.sprites = null; this.shader = null; + + for (var i = 0; i < this.buffers.length; i++) { + this.buffers[i].destroy(); + } + }; var Buffer = function(size) @@ -18082,7 +17994,7 @@ * @member {Float32Array} */ this.positions = new Float32Array(this.vertices); - + /** * View on the vertices as a Uint32Array for uvs * @@ -18096,16 +18008,22 @@ * @member {Uint32Array} */ this.colors = new Uint32Array(this.vertices); - - } -},{"../../const":39,"../../renderers/webgl/WebGLRenderer":73,"../../renderers/webgl/utils/ObjectRenderer":83,"../../utils/createIndicesForQuads":100,"./generateMultiTextureShader":90,"bit-twiddle":2,"pixi-gl-core":14}],90:[function(require,module,exports){ + +Buffer.prototype.destroy = function(){ + this.vertices = null; + this.positions = null; + this.uvs = null; + this.colors = null; +} + +},{"../../const":39,"../../renderers/webgl/WebGLRenderer":72,"../../renderers/webgl/utils/ObjectRenderer":82,"../../utils/createIndicesForQuads":99,"./generateMultiTextureShader":89,"bit-twiddle":2,"pixi-gl-core":14}],89:[function(require,module,exports){ var Shader = require('pixi-gl-core').GLShader; function generateMultiTextureShader(gl, maxTextures) { - var vertexSrc = "#define GLSLIFY 1\nprecision lowp float;\nattribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\nattribute vec4 aColor;\nattribute float aTextureId;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\nvarying vec4 vColor;\nvarying float vTextureId;\n\nvoid main(void){\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n vTextureId = aTextureId;\n vColor = vec4(aColor.rgb * aColor.a, aColor.a);\n}"; + var vertexSrc = "precision lowp float;\n#define GLSLIFY 1\nattribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\nattribute vec4 aColor;\nattribute float aTextureId;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\nvarying vec4 vColor;\nvarying float vTextureId;\n\nvoid main(void){\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n vTextureId = aTextureId;\n vColor = vec4(aColor.rgb * aColor.a, aColor.a);\n}"; var fragmentSrc = fragTemplate fragmentSrc = fragmentSrc.replace(/\%count\%/gi, maxTextures); @@ -18164,7 +18082,7 @@ module.exports = generateMultiTextureShader; -},{"pixi-gl-core":14}],91:[function(require,module,exports){ +},{"pixi-gl-core":14}],90:[function(require,module,exports){ var Sprite = require('../sprites/Sprite'), Texture = require('../textures/Texture'), math = require('../math'), @@ -18785,7 +18703,7 @@ this._texture.destroy(destroyBaseTexture === undefined ? true : destroyBaseTexture); }; -},{"../const":39,"../math":59,"../sprites/Sprite":88,"../textures/Texture":95,"../utils":101}],92:[function(require,module,exports){ +},{"../const":39,"../math":59,"../sprites/Sprite":87,"../textures/Texture":94,"../utils":100}],91:[function(require,module,exports){ var BaseTexture = require('./BaseTexture'), Texture = require('./Texture'), RenderTarget = require('../renderers/webgl/utils/RenderTarget'), @@ -19072,7 +18990,7 @@ return this.getPixels(tempRect); }; -},{"../const":39,"../math":59,"../renderers/canvas/utils/CanvasBuffer":67,"../renderers/webgl/managers/FilterManager":79,"../renderers/webgl/utils/RenderTarget":85,"./BaseTexture":93,"./Texture":95}],93:[function(require,module,exports){ +},{"../const":39,"../math":59,"../renderers/canvas/utils/CanvasBuffer":67,"../renderers/webgl/managers/FilterManager":78,"../renderers/webgl/utils/RenderTarget":84,"./BaseTexture":92,"./Texture":94}],92:[function(require,module,exports){ var utils = require('../utils'), CONST = require('../const'), EventEmitter = require('eventemitter3'); @@ -19510,7 +19428,7 @@ return baseTexture; }; -},{"../const":39,"../utils":101,"eventemitter3":12}],94:[function(require,module,exports){ +},{"../const":39,"../utils":100,"eventemitter3":12}],93:[function(require,module,exports){ var BaseRenderTexture = require('./BaseRenderTexture'), Texture = require('./Texture'), math = require('../math'), @@ -19619,7 +19537,7 @@ } -},{"../const":39,"../math":59,"./BaseRenderTexture":92,"./Texture":95}],95:[function(require,module,exports){ +},{"../const":39,"../math":59,"./BaseRenderTexture":91,"./Texture":94}],94:[function(require,module,exports){ var BaseTexture = require('./BaseTexture'), VideoBaseTexture = require('./VideoBaseTexture'), TextureUvs = require('./TextureUvs'), @@ -19650,7 +19568,6 @@ function Texture(baseTexture, frame, crop, trim, rotate) { EventEmitter.call(this); - /** * Does this Texture have any frame data assigned to it? * @@ -19789,7 +19706,6 @@ set: function (frame) { this._frame = frame; - this.noFrame = false; if (frame.x + frame.width > this.baseTexture.width || frame.y + frame.height > this.baseTexture.height) @@ -20061,7 +19977,7 @@ */ Texture.EMPTY = new Texture(new BaseTexture()); -},{"../math":59,"../utils":101,"./BaseTexture":93,"./TextureUvs":96,"./VideoBaseTexture":97,"eventemitter3":12}],96:[function(require,module,exports){ +},{"../math":59,"../utils":100,"./BaseTexture":92,"./TextureUvs":95,"./VideoBaseTexture":96,"eventemitter3":12}],95:[function(require,module,exports){ /** * A standard object to store the Uvs of a texture @@ -20154,7 +20070,7 @@ this.uvs_uint32[3] = (((this.y3 * 65535) & 0xFFFF) << 16) | ((this.x3 * 65535) & 0xFFFF); }; -},{"../math/GroupD8":56}],97:[function(require,module,exports){ +},{"../math/GroupD8":56}],96:[function(require,module,exports){ var BaseTexture = require('./BaseTexture'), utils = require('../utils'); @@ -20391,7 +20307,7 @@ return source; } -},{"../utils":101,"./BaseTexture":93}],98:[function(require,module,exports){ +},{"../utils":100,"./BaseTexture":92}],97:[function(require,module,exports){ var CONST = require('../const'), EventEmitter = require('eventemitter3'), // Internal event used by composed emitter @@ -20746,7 +20662,7 @@ module.exports = Ticker; -},{"../const":39,"eventemitter3":12}],99:[function(require,module,exports){ +},{"../const":39,"eventemitter3":12}],98:[function(require,module,exports){ var Ticker = require('./Ticker'); /** @@ -20802,7 +20718,7 @@ Ticker: Ticker }; -},{"./Ticker":98}],100:[function(require,module,exports){ +},{"./Ticker":97}],99:[function(require,module,exports){ /** * Generic Mask Stack data structure * @class @@ -20835,7 +20751,7 @@ }; module.exports = createIndicesForQuads; -},{}],101:[function(require,module,exports){ +},{}],100:[function(require,module,exports){ var CONST = require('../const'); /** @@ -21112,7 +21028,7 @@ BaseTextureCache: {} }; -},{"../const":39,"./pluginTarget":102,"async":1,"eventemitter3":12}],102:[function(require,module,exports){ +},{"../const":39,"./pluginTarget":101,"async":1,"eventemitter3":12}],101:[function(require,module,exports){ /** * Mixins functionality to make an object have "plugins". * @@ -21182,7 +21098,7 @@ } }; -},{}],103:[function(require,module,exports){ +},{}],102:[function(require,module,exports){ /*global console */ var core = require('./core'), //mesh = require('./mesh'), @@ -21533,7 +21449,7 @@ return core.utils.uid(); }; -},{"./core":55,"./extras":110,"./filters":120}],104:[function(require,module,exports){ +},{"./core":55,"./extras":109,"./filters":119}],103:[function(require,module,exports){ var core = require('../core'); /** @@ -21921,7 +21837,7 @@ BitmapText.fonts = {}; -},{"../core":55}],105:[function(require,module,exports){ +},{"../core":55}],104:[function(require,module,exports){ var core = require('../core'); /** @@ -22241,7 +22157,7 @@ return new MovieClip(textures); }; -},{"../core":55}],106:[function(require,module,exports){ +},{"../core":55}],105:[function(require,module,exports){ var core = require('../core'), // a sprite use dfor rendering textures.. tempPoint = new core.Point(), @@ -22693,7 +22609,7 @@ return new TilingSprite(core.Texture.fromImage(imageId, crossorigin, scaleMode),width,height); }; -},{"../core":55,"../core/renderers/canvas/utils/CanvasTinter":70}],107:[function(require,module,exports){ +},{"../core":55,"../core/renderers/canvas/utils/CanvasTinter":70}],106:[function(require,module,exports){ var core = require('../core'), DisplayObject = core.DisplayObject, _tempMatrix = new core.Matrix(); @@ -22966,7 +22882,7 @@ this._originalDestroy(); }; -},{"../core":55}],108:[function(require,module,exports){ +},{"../core":55}],107:[function(require,module,exports){ var core = require('../core'); /** @@ -22996,7 +22912,7 @@ return null; }; -},{"../core":55}],109:[function(require,module,exports){ +},{"../core":55}],108:[function(require,module,exports){ var core = require('../core'); /** @@ -23026,7 +22942,7 @@ return point; }; -},{"../core":55}],110:[function(require,module,exports){ +},{"../core":55}],109:[function(require,module,exports){ /** * @file Main export of the PIXI extras library * @author Mat Groves @@ -23047,7 +22963,7 @@ BitmapText: require('./BitmapText') }; -},{"./BitmapText":104,"./MovieClip":105,"./TilingSprite":106,"./cacheAsBitmap":107,"./getChildByName":108,"./getGlobalPosition":109}],111:[function(require,module,exports){ +},{"./BitmapText":103,"./MovieClip":104,"./TilingSprite":105,"./cacheAsBitmap":106,"./getChildByName":107,"./getGlobalPosition":108}],110:[function(require,module,exports){ var core = require('../../core'), BlurXFilter = require('./BlurXFilter'), BlurYFilter = require('./BlurYFilter'); @@ -23163,7 +23079,7 @@ } }); -},{"../../core":55,"./BlurXFilter":112,"./BlurYFilter":113}],112:[function(require,module,exports){ +},{"../../core":55,"./BlurXFilter":111,"./BlurYFilter":112}],111:[function(require,module,exports){ var core = require('../../core'); var generateBlurVertSource = require('./generateBlurVertSource'); var generateBlurFragSource = require('./generateBlurFragSource'); @@ -23271,7 +23187,7 @@ } }); -},{"../../core":55,"./generateBlurFragSource":114,"./generateBlurVertSource":115,"./getMaxBlurKernelSize":116}],113:[function(require,module,exports){ +},{"../../core":55,"./generateBlurFragSource":113,"./generateBlurVertSource":114,"./getMaxBlurKernelSize":115}],112:[function(require,module,exports){ var core = require('../../core'); var generateBlurVertSource = require('./generateBlurVertSource'); var generateBlurFragSource = require('./generateBlurFragSource'); @@ -23369,7 +23285,7 @@ } }); -},{"../../core":55,"./generateBlurFragSource":114,"./generateBlurVertSource":115,"./getMaxBlurKernelSize":116}],114:[function(require,module,exports){ +},{"../../core":55,"./generateBlurFragSource":113,"./generateBlurVertSource":114,"./getMaxBlurKernelSize":115}],113:[function(require,module,exports){ var core = require('../../core') var GAUSSIAN_VALUES = { @@ -23433,7 +23349,7 @@ ].join('\n'); module.exports = generateFragBlurSource; -},{"../../core":55}],115:[function(require,module,exports){ +},{"../../core":55}],114:[function(require,module,exports){ var generateVertBlurSource = function(kernelSize, x) { @@ -23496,7 +23412,7 @@ ].join('\n'); module.exports = generateVertBlurSource; -},{}],116:[function(require,module,exports){ +},{}],115:[function(require,module,exports){ var getMaxKernelSize = function(gl) @@ -23513,7 +23429,7 @@ } module.exports = getMaxKernelSize; -},{}],117:[function(require,module,exports){ +},{}],116:[function(require,module,exports){ var core = require('../../core'); // @see https://github.com/substack/brfs/issues/25 @@ -23537,9 +23453,9 @@ { core.Filter.call(this, // vertex shader - "#define GLSLIFY 1\nprecision mediump float;\n\nattribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\nvarying vec2 vTextureCoord;\n\nvoid main(void){\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n}", + "precision mediump float;\n#define GLSLIFY 1\n\nattribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\nvarying vec2 vTextureCoord;\n\nvoid main(void){\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n}", // fragment shader - "#define GLSLIFY 1\nprecision mediump float;\n\nvarying vec2 vTextureCoord;\nuniform sampler2D uSampler;\nuniform float m[20];\n\nvoid main(void)\n{\n\n vec4 c = texture2D(uSampler, vTextureCoord);\n\n gl_FragColor.r = (m[0] * c.r);\n gl_FragColor.r += (m[1] * c.g);\n gl_FragColor.r += (m[2] * c.b);\n gl_FragColor.r += (m[3] * c.a);\n gl_FragColor.r += m[4];\n\n gl_FragColor.g = (m[5] * c.r);\n gl_FragColor.g += (m[6] * c.g);\n gl_FragColor.g += (m[7] * c.b);\n gl_FragColor.g += (m[8] * c.a);\n gl_FragColor.g += m[9];\n\n gl_FragColor.b = (m[10] * c.r);\n gl_FragColor.b += (m[11] * c.g);\n gl_FragColor.b += (m[12] * c.b);\n gl_FragColor.b += (m[13] * c.a);\n gl_FragColor.b += m[14];\n\n gl_FragColor.a = (m[15] * c.r);\n gl_FragColor.a += (m[16] * c.g);\n gl_FragColor.a += (m[17] * c.b);\n gl_FragColor.a += (m[18] * c.a);\n gl_FragColor.a += m[19];\n\n// gl_FragColor = vec4(m[0]);\n}\n" + "precision mediump float;\n#define GLSLIFY 1\n\nvarying vec2 vTextureCoord;\nuniform sampler2D uSampler;\nuniform float m[20];\n\nvoid main(void)\n{\n\n vec4 c = texture2D(uSampler, vTextureCoord);\n\n gl_FragColor.r = (m[0] * c.r);\n gl_FragColor.r += (m[1] * c.g);\n gl_FragColor.r += (m[2] * c.b);\n gl_FragColor.r += (m[3] * c.a);\n gl_FragColor.r += m[4];\n\n gl_FragColor.g = (m[5] * c.r);\n gl_FragColor.g += (m[6] * c.g);\n gl_FragColor.g += (m[7] * c.b);\n gl_FragColor.g += (m[8] * c.a);\n gl_FragColor.g += m[9];\n\n gl_FragColor.b = (m[10] * c.r);\n gl_FragColor.b += (m[11] * c.g);\n gl_FragColor.b += (m[12] * c.b);\n gl_FragColor.b += (m[13] * c.a);\n gl_FragColor.b += m[14];\n\n gl_FragColor.a = (m[15] * c.r);\n gl_FragColor.a += (m[16] * c.g);\n gl_FragColor.a += (m[17] * c.b);\n gl_FragColor.a += (m[18] * c.a);\n gl_FragColor.a += m[19];\n\n// gl_FragColor = vec4(m[0]);\n}\n" ); this.uniforms.m = [ @@ -24047,7 +23963,7 @@ } }); -},{"../../core":55}],118:[function(require,module,exports){ +},{"../../core":55}],117:[function(require,module,exports){ var core = require('../../core'); @@ -24070,7 +23986,7 @@ // vertex shader "#define GLSLIFY 1\nattribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\nattribute vec4 aColor;\n\nuniform mat3 projectionMatrix;\nuniform mat3 otherMatrix;\n\nvarying vec2 vMapCoord;\nvarying vec2 vTextureCoord;\nvarying vec4 vColor;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n vMapCoord = ( otherMatrix * vec3( aTextureCoord, 1.0) ).xy;\n vColor = vec4(aColor.rgb * aColor.a, aColor.a);\n}\n", // fragment shader - "#define GLSLIFY 1\nprecision mediump float;\n\nvarying vec2 vMapCoord;\nvarying vec2 vTextureCoord;\nvarying vec4 vColor;\n\nuniform vec2 scale;\n\nuniform sampler2D uSampler;\nuniform sampler2D mapSampler;\n\nvoid main(void)\n{\n vec4 map = texture2D(mapSampler, vMapCoord);\n\n map -= 0.5;\n map.xy *= scale;\n\n gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x + map.x, vTextureCoord.y + map.y));\n}\n" + "precision mediump float;\n#define GLSLIFY 1\n\nvarying vec2 vMapCoord;\nvarying vec2 vTextureCoord;\nvarying vec4 vColor;\n\nuniform vec2 scale;\n\nuniform sampler2D uSampler;\nuniform sampler2D mapSampler;\n\nvoid main(void)\n{\n vec4 map = texture2D(mapSampler, vMapCoord);\n\n map -= 0.5;\n map.xy *= scale;\n\n gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x + map.x, vTextureCoord.y + map.y));\n}\n" ); @@ -24126,7 +24042,7 @@ } }); -},{"../../core":55}],119:[function(require,module,exports){ +},{"../../core":55}],118:[function(require,module,exports){ var core = require('../../core'); // @see https://github.com/substack/brfs/issues/25 @@ -24142,9 +24058,9 @@ { core.Filter.call(this, // vertex shader - "#define GLSLIFY 1\nprecision lowp float;\n\nattribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\nvarying vec2 vTextureCoord;\n\nvoid main(void){\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n}", + "precision lowp float;\n#define GLSLIFY 1\n\nattribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\nvarying vec2 vTextureCoord;\n\nvoid main(void){\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n}", // fragment shader - "#define GLSLIFY 1\nprecision mediump float;\n\nvarying vec2 vTextureCoord;\n\nuniform sampler2D uSampler;\nuniform float gray;\n\nvoid main(void)\n{\n gl_FragColor = texture2D(uSampler, vTextureCoord);\n gl_FragColor.rgb = mix(gl_FragColor.rgb, vec3(0.2126*gl_FragColor.r + 0.7152*gl_FragColor.g + 0.0722*gl_FragColor.b), gray);\n}\n" + "precision mediump float;\n#define GLSLIFY 1\n\nvarying vec2 vTextureCoord;\n\nuniform sampler2D uSampler;\nuniform float gray;\n\nvoid main(void)\n{\n gl_FragColor = texture2D(uSampler, vTextureCoord);\n gl_FragColor.rgb = mix(gl_FragColor.rgb, vec3(0.2126*gl_FragColor.r + 0.7152*gl_FragColor.g + 0.0722*gl_FragColor.b), gray);\n}\n" ); this.uniforms.gray = 1; @@ -24175,7 +24091,7 @@ } }); -},{"../../core":55}],120:[function(require,module,exports){ +},{"../../core":55}],119:[function(require,module,exports){ /** * @file Main export of the PIXI filters library * @author Mat Groves @@ -24215,7 +24131,7 @@ GrayFilter: require('./gray/GrayFilter') }; -},{"./blur/BlurFilter":111,"./blur/BlurXFilter":112,"./blur/BlurYFilter":113,"./colormatrix/ColorMatrixFilter":117,"./displacement/DisplacementFilter":118,"./gray/GrayFilter":119,"./twist/TwistFilter":121}],121:[function(require,module,exports){ +},{"./blur/BlurFilter":110,"./blur/BlurXFilter":111,"./blur/BlurYFilter":112,"./colormatrix/ColorMatrixFilter":116,"./displacement/DisplacementFilter":117,"./gray/GrayFilter":118,"./twist/TwistFilter":120}],120:[function(require,module,exports){ var core = require('../../core'); @@ -24233,7 +24149,7 @@ "#define GLSLIFY 1\nattribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n}\n\n", // fragment shader - "#define GLSLIFY 1\nprecision mediump float;\n\nvarying vec2 vTextureCoord;\n\nuniform sampler2D uSampler;\nuniform float radius;\nuniform float angle;\nuniform vec2 offset;\nuniform vec4 filterArea;\n\nvec2 mapCoord( vec2 coord )\n{\n coord *= filterArea.xy;\n coord += filterArea.zw;\n\n return coord;\n}\n\nvec2 unmapCoord( vec2 coord )\n{\n coord -= filterArea.zw;\n coord /= filterArea.xy;\n\n return coord;\n}\n\nvec2 twist(vec2 coord)\n{\n coord -= offset;\n\n float dist = length(coord);\n\n if (dist < radius)\n {\n float ratioDist = (radius - dist) / radius;\n float angleMod = ratioDist * ratioDist * angle;\n float s = sin(angleMod);\n float c = cos(angleMod);\n coord = vec2(coord.x * c - coord.y * s, coord.x * s + coord.y * c);\n }\n\n coord += offset;\n\n return coord;\n}\n\nvoid main(void)\n{\n\n vec2 coord = mapCoord(vTextureCoord);\n\n coord = twist(coord);\n\n coord = unmapCoord(coord);\n\n gl_FragColor = texture2D(uSampler, coord );\n\n}\n" + "precision mediump float;\n#define GLSLIFY 1\n\nvarying vec2 vTextureCoord;\n\nuniform sampler2D uSampler;\nuniform float radius;\nuniform float angle;\nuniform vec2 offset;\nuniform vec4 filterArea;\n\nvec2 mapCoord( vec2 coord )\n{\n coord *= filterArea.xy;\n coord += filterArea.zw;\n\n return coord;\n}\n\nvec2 unmapCoord( vec2 coord )\n{\n coord -= filterArea.zw;\n coord /= filterArea.xy;\n\n return coord;\n}\n\nvec2 twist(vec2 coord)\n{\n coord -= offset;\n\n float dist = length(coord);\n\n if (dist < radius)\n {\n float ratioDist = (radius - dist) / radius;\n float angleMod = ratioDist * ratioDist * angle;\n float s = sin(angleMod);\n float c = cos(angleMod);\n coord = vec2(coord.x * c - coord.y * s, coord.x * s + coord.y * c);\n }\n\n coord += offset;\n\n return coord;\n}\n\nvoid main(void)\n{\n\n vec2 coord = mapCoord(vTextureCoord);\n\n coord = twist(coord);\n\n coord = unmapCoord(coord);\n\n gl_FragColor = texture2D(uSampler, coord );\n\n}\n" ); this.uniforms.radius = 400; @@ -24316,7 +24232,7 @@ } }); -},{"../../core":55}],122:[function(require,module,exports){ +},{"../../core":55}],121:[function(require,module,exports){ (function (global){ // run the polyfills require('./polyfill'); @@ -24348,7 +24264,7 @@ global.PIXI = core; }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./accessibility":38,"./core":55,"./deprecation":103,"./extras":110,"./filters":120,"./interaction":125,"./loaders":128,"./polyfill":134}],123:[function(require,module,exports){ +},{"./accessibility":38,"./core":55,"./deprecation":102,"./extras":109,"./filters":119,"./interaction":124,"./loaders":127,"./polyfill":133}],122:[function(require,module,exports){ var core = require('../core'); /** @@ -24397,7 +24313,7 @@ return displayObject.worldTransform.applyInverse(globalPos || this.global, point); }; -},{"../core":55}],124:[function(require,module,exports){ +},{"../core":55}],123:[function(require,module,exports){ var core = require('../core'), InteractionData = require('./InteractionData'); @@ -24490,7 +24406,7 @@ * @member {HTMLElement} * @private */ - this.moveWhenInside = false; + this.moveWhenInside = true; /** * Have events been attached to the dom element? @@ -25300,7 +25216,7 @@ core.WebGLRenderer.registerPlugin('interaction', InteractionManager); core.CanvasRenderer.registerPlugin('interaction', InteractionManager); -},{"../core":55,"./InteractionData":123,"./interactiveTarget":126}],125:[function(require,module,exports){ +},{"../core":55,"./InteractionData":122,"./interactiveTarget":125}],124:[function(require,module,exports){ /** * @file Main export of the PIXI interactions library * @author Mat Groves @@ -25317,7 +25233,7 @@ interactiveTarget: require('./interactiveTarget') }; -},{"./InteractionData":123,"./InteractionManager":124,"./interactiveTarget":126}],126:[function(require,module,exports){ +},{"./InteractionData":122,"./InteractionManager":123,"./interactiveTarget":125}],125:[function(require,module,exports){ /** * Default property values of interactive objects * used by {@link PIXI.interaction.InteractionManager}. @@ -25366,7 +25282,7 @@ module.exports = interactiveTarget; -},{}],127:[function(require,module,exports){ +},{}],126:[function(require,module,exports){ var Resource = require('resource-loader').Resource, core = require('../core'), extras = require('../extras'), @@ -25490,7 +25406,7 @@ }; }; -},{"../core":55,"../extras":110,"path":4,"resource-loader":33}],128:[function(require,module,exports){ +},{"../core":55,"../extras":109,"path":4,"resource-loader":33}],127:[function(require,module,exports){ /** * @file Main export of the PIXI loaders library * @author Mat Groves @@ -25511,7 +25427,7 @@ Resource: require('resource-loader').Resource }; -},{"./bitmapFontParser":127,"./loader":129,"./spritesheetParser":130,"./textureParser":131,"resource-loader":33}],129:[function(require,module,exports){ +},{"./bitmapFontParser":126,"./loader":128,"./spritesheetParser":129,"./textureParser":130,"resource-loader":33}],128:[function(require,module,exports){ var ResourceLoader = require('resource-loader'), textureParser = require('./textureParser'), spritesheetParser = require('./spritesheetParser'), @@ -25573,7 +25489,7 @@ Resource.setExtensionXhrType('fnt', Resource.XHR_RESPONSE_TYPE.DOCUMENT); -},{"./bitmapFontParser":127,"./spritesheetParser":130,"./textureParser":131,"resource-loader":33}],130:[function(require,module,exports){ +},{"./bitmapFontParser":126,"./spritesheetParser":129,"./textureParser":130,"resource-loader":33}],129:[function(require,module,exports){ var Resource = require('resource-loader').Resource, path = require('path'), core = require('../core'); @@ -25645,7 +25561,7 @@ }; }; -},{"../core":55,"path":4,"resource-loader":33}],131:[function(require,module,exports){ +},{"../core":55,"path":4,"resource-loader":33}],130:[function(require,module,exports){ var core = require('../core'); module.exports = function () @@ -25667,7 +25583,7 @@ }; }; -},{"../core":55}],132:[function(require,module,exports){ +},{"../core":55}],131:[function(require,module,exports){ // References: // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sign @@ -25683,7 +25599,7 @@ }; } -},{}],133:[function(require,module,exports){ +},{}],132:[function(require,module,exports){ // References: // https://github.com/sindresorhus/object-assign // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign @@ -25693,12 +25609,12 @@ Object.assign = require('object-assign'); } -},{"object-assign":13}],134:[function(require,module,exports){ +},{"object-assign":13}],133:[function(require,module,exports){ require('./Object.assign'); require('./requestAnimationFrame'); require('./Math.sign'); -},{"./Math.sign":132,"./Object.assign":133,"./requestAnimationFrame":135}],135:[function(require,module,exports){ +},{"./Math.sign":131,"./Object.assign":132,"./requestAnimationFrame":134}],134:[function(require,module,exports){ (function (global){ // References: // http://paulirish.com/2011/requestanimationframe-for-smart-animating/ @@ -25768,6 +25684,6 @@ } }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{}]},{},[122])(122) +},{}]},{},[121])(121) }); //# sourceMappingURL=pixi.js.map diff --git a/bin/pixi.js b/bin/pixi.js index ab4ffc9..45c2dd9 100644 --- a/bin/pixi.js +++ b/bin/pixi.js @@ -4155,18 +4155,19 @@ } } + Buffer.prototype.upload = function(data, offset, dontBind) { // todo - needed? if(!dontBind)this.bind(); var gl = this.gl; - + data = data || this.data; offset = offset || 0; if(this.data.byteLength >= data.byteLength) - { + { gl.bufferSubData(this.type, offset, data); } else @@ -4199,10 +4200,15 @@ } //TODO Destroy.. +Buffer.prototype.destroy = function(){ + this.gl.deleteBuffer(this.buffer); + + this.gl.canvas.width = 1; + this.gl.canvas.height = 1; +} module.exports = Buffer; - },{}],16:[function(require,module,exports){ var Texture = require('./GLTexture'); @@ -9147,7 +9153,7 @@ this.children = null; }; -},{"../math":59,"../textures/RenderTexture":94,"../utils":101,"./DisplayObject":41}],41:[function(require,module,exports){ +},{"../math":59,"../textures/RenderTexture":93,"../utils":100,"./DisplayObject":41}],41:[function(require,module,exports){ var math = require('../math'), RenderTexture = require('../textures/RenderTexture'), EventEmitter = require('eventemitter3'), @@ -9634,7 +9640,7 @@ this.filterArea = null; }; -},{"../const":39,"../math":59,"../textures/RenderTexture":94,"./Transform":42,"eventemitter3":12}],42:[function(require,module,exports){ +},{"../const":39,"../math":59,"../textures/RenderTexture":93,"./Transform":42,"eventemitter3":12}],42:[function(require,module,exports){ var math = require('../math'); @@ -10802,7 +10808,7 @@ this._localBounds = null; }; -},{"../const":39,"../display/Container":40,"../math":59,"../renderers/canvas/utils/CanvasBuffer":67,"../renderers/canvas/utils/CanvasGraphics":68,"../sprites/Sprite":88,"../textures/RenderTexture":94,"../textures/Texture":95,"./GraphicsData":44,"./utils/bezierCurveTo":45}],44:[function(require,module,exports){ +},{"../const":39,"../display/Container":40,"../math":59,"../renderers/canvas/utils/CanvasBuffer":67,"../renderers/canvas/utils/CanvasGraphics":68,"../sprites/Sprite":87,"../textures/RenderTexture":93,"../textures/Texture":94,"./GraphicsData":44,"./utils/bezierCurveTo":45}],44:[function(require,module,exports){ /** * A GraphicsData object. * @@ -11167,7 +11173,7 @@ }; -},{"../../const":39,"../../math":59,"../../renderers/webgl/WebGLRenderer":73,"../../renderers/webgl/utils/ObjectRenderer":83,"../../utils":101,"./WebGLGraphicsData":47,"./shaders/PrimitiveShader":48,"./utils/buildCircle":49,"./utils/buildComplexPoly":50,"./utils/buildLine":51,"./utils/buildPoly":52,"./utils/buildRectangle":53,"./utils/buildRoundedRectangle":54}],47:[function(require,module,exports){ +},{"../../const":39,"../../math":59,"../../renderers/webgl/WebGLRenderer":72,"../../renderers/webgl/utils/ObjectRenderer":82,"../../utils":100,"./WebGLGraphicsData":47,"./shaders/PrimitiveShader":48,"./utils/buildCircle":49,"./utils/buildComplexPoly":50,"./utils/buildLine":51,"./utils/buildPoly":52,"./utils/buildRectangle":53,"./utils/buildRoundedRectangle":54}],47:[function(require,module,exports){ var glCore = require('pixi-gl-core'); @@ -11425,7 +11431,7 @@ module.exports = buildCircle; -},{"../../../utils":101,"./buildLine":51}],50:[function(require,module,exports){ +},{"../../../utils":100,"./buildLine":51}],50:[function(require,module,exports){ var buildLine = require('./buildLine'), utils = require('../../../utils'); @@ -11496,7 +11502,7 @@ module.exports = buildComplexPoly; -},{"../../../utils":101,"./buildLine":51}],51:[function(require,module,exports){ +},{"../../../utils":100,"./buildLine":51}],51:[function(require,module,exports){ var math = require('../../../math'), utils = require('../../../utils'); @@ -11716,7 +11722,7 @@ }; module.exports = buildLine; -},{"../../../math":59,"../../../utils":101}],52:[function(require,module,exports){ +},{"../../../math":59,"../../../utils":100}],52:[function(require,module,exports){ var buildLine = require('./buildLine'), utils = require('../../../utils'), earcut = require('earcut'); @@ -11796,7 +11802,7 @@ module.exports = buildPoly; -},{"../../../utils":101,"./buildLine":51,"earcut":11}],53:[function(require,module,exports){ +},{"../../../utils":100,"./buildLine":51,"earcut":11}],53:[function(require,module,exports){ var buildLine = require('./buildLine'), utils = require('../../../utils'); @@ -11867,7 +11873,7 @@ }; module.exports = buildRectangle; -},{"../../../utils":101,"./buildLine":51}],54:[function(require,module,exports){ +},{"../../../utils":100,"./buildLine":51}],54:[function(require,module,exports){ var buildLine = require('./buildLine'), utils = require('../../../utils'); @@ -11995,7 +12001,7 @@ module.exports = buildRoundedRectangle; -},{"../../../utils":101,"./buildLine":51}],55:[function(require,module,exports){ +},{"../../../utils":100,"./buildLine":51}],55:[function(require,module,exports){ /** * @file Main export of the PIXI core library * @author Mat Groves @@ -12088,7 +12094,7 @@ } }); -},{"./const":39,"./display/Container":40,"./display/DisplayObject":41,"./graphics/Graphics":43,"./graphics/GraphicsData":44,"./graphics/webgl/GraphicsRenderer":46,"./math":59,"./renderers/canvas/CanvasRenderer":66,"./renderers/canvas/utils/CanvasBuffer":67,"./renderers/canvas/utils/CanvasGraphics":68,"./renderers/webgl/WebGLRenderer":73,"./renderers/webgl/filters/Filter":75,"./renderers/webgl/filters/spriteMask/SpriteMaskFilter":78,"./renderers/webgl/managers/WebGLManager":82,"./renderers/webgl/utils/ObjectRenderer":83,"./renderers/webgl/utils/RenderTarget":85,"./sprites/Sprite":88,"./sprites/webgl/SpriteRenderer":89,"./text/Text":91,"./textures/BaseRenderTexture":92,"./textures/BaseTexture":93,"./textures/RenderTexture":94,"./textures/Texture":95,"./textures/TextureUvs":96,"./textures/VideoBaseTexture":97,"./ticker":99,"./utils":101,"pixi-gl-core":14}],56:[function(require,module,exports){ +},{"./const":39,"./display/Container":40,"./display/DisplayObject":41,"./graphics/Graphics":43,"./graphics/GraphicsData":44,"./graphics/webgl/GraphicsRenderer":46,"./math":59,"./renderers/canvas/CanvasRenderer":66,"./renderers/canvas/utils/CanvasBuffer":67,"./renderers/canvas/utils/CanvasGraphics":68,"./renderers/webgl/WebGLRenderer":72,"./renderers/webgl/filters/Filter":74,"./renderers/webgl/filters/spriteMask/SpriteMaskFilter":77,"./renderers/webgl/managers/WebGLManager":81,"./renderers/webgl/utils/ObjectRenderer":82,"./renderers/webgl/utils/RenderTarget":84,"./sprites/Sprite":87,"./sprites/webgl/SpriteRenderer":88,"./text/Text":90,"./textures/BaseRenderTexture":91,"./textures/BaseTexture":92,"./textures/RenderTexture":93,"./textures/Texture":94,"./textures/TextureUvs":95,"./textures/VideoBaseTexture":96,"./ticker":98,"./utils":100,"pixi-gl-core":14}],56:[function(require,module,exports){ // Your friendly neighbour https://en.wikipedia.org/wiki/Dihedral_group of order 16 var ux = [1, 1, 0, -1, -1, -1, 0, 1, 1, 1, 0, -1, -1, -1, 0, 1]; @@ -13568,7 +13574,7 @@ this._backgroundColorString = null; }; -},{"../const":39,"../display/Container":40,"../math":59,"../utils":101,"eventemitter3":12}],66:[function(require,module,exports){ +},{"../const":39,"../display/Container":40,"../math":59,"../utils":100,"eventemitter3":12}],66:[function(require,module,exports){ var SystemRenderer = require('../SystemRenderer'), CanvasMaskManager = require('./utils/CanvasMaskManager'), utils = require('../../utils'), @@ -13836,7 +13842,7 @@ } }; -},{"../../const":39,"../../math":59,"../../utils":101,"../SystemRenderer":65,"./utils/CanvasMaskManager":69}],67:[function(require,module,exports){ +},{"../../const":39,"../../math":59,"../../utils":100,"../SystemRenderer":65,"./utils/CanvasMaskManager":69}],67:[function(require,module,exports){ /** * Creates a Canvas element of the given size. * @@ -14592,124 +14598,10 @@ */ CanvasTinter.tintMethod = CanvasTinter.canUseMultiply ? CanvasTinter.tintWithMultiply : CanvasTinter.tintWithPerPixel; -},{"../../../utils":101}],71:[function(require,module,exports){ -var GLTexture = require('pixi-gl-core').GLTexture, - utils = require('../../utils'), - RenderTarget = require('./utils/RenderTarget'); - -/** - * Helper class to create a webGL Texture - * - * @class - * @memberof PIXI - * @param gl {WebGLRenderingContext} - */ - -var RenderTextureManager = function(renderer) -{ - this.renderer = renderer - this.gl = renderer.gl; - - // track textures in the renderer so we can no longer listen to them on destruction. - this._managedTextures = []; -} - -/** - * Updates and/or Creates a WebGL texture for the renderer's context. - * - * @param texture {PIXI.BaseTexture|PIXI.Texture} the texture to update - */ -RenderTextureManager.prototype.updateTexture = function(texture) -{ - texture = texture.baseTexture || texture; - - var renderTarget = texture._glRenderTargets[this.renderer.CONTEXT_UID]; - - if (!renderTarget) - { - - renderTarget = new RenderTarget(this.gl, texture.width, texture.height, texture.scaleMode, texture.resolution); - - texture._glTextures[this.renderer.CONTEXT_UID] = renderTarget.texture; - texture._glRenderTargets[this.renderer.CONTEXT_UID] = renderTarget; - - texture.on('update', this.updateTexture, this); - texture.on('dispose', this.destroyTexture, this); - - this._managedTextures.push(texture); - - - } - renderTarget.resize(texture.width, texture.height); - - return renderTarget; -} - -/** - * Deletes the texture from WebGL - * - * @param texture {PIXI.BaseTexture|PIXI.Texture} the texture to destroy - */ -RenderTextureManager.prototype.destroyTexture = function(texture, _skipRemove) -{ - texture = texture.baseTexture || texture; - - var gl = this.gl; - if (texture._glRenderTargets[this.renderer.CONTEXT_UID]) - { - texture._glTextures[this.renderer.CONTEXT_UID] = null; - texture._glRenderTargets[this.renderer.CONTEXT_UID].destroy(); - - //.destroy(); - texture.off('update', this.updateTexture, this); - texture.off('dispose', this.destroyTexture, this); - - - delete texture._glTextures[this.renderer.CONTEXT_UID]; - - if (!_skipRemove) - { - var i = this._managedTextures.indexOf(texture); - if (i !== -1) { - utils.removeItems(this._managedTextures, i, 1); - } - } - } -} - -RenderTextureManager.prototype.removeAll = function() -{ - // empty all the old gl textures as they are useless now - for (var i = 0; i < this._managedTextures.length; ++i) - { - var texture = this._managedTextures[i]; - if (texture._glTextures[this.renderer.CONTEXT_UID]) - { - delete texture._glTextures[this.renderer.CONTEXT_UID]; - } - } -} - -RenderTextureManager.prototype.destroy = function() -{ - // destroy managed textures - for (var i = 0; i < this._managedTextures.length; ++i) - { - var texture = this._managedTextures[i]; - this.destroyTexture(texture, true); - texture.off('update', this.updateTexture, this); - texture.off('dispose', this.destroyTexture, this); - } - - this._managedTextures = null; -} - -module.exports = RenderTextureManager; - - -},{"../../utils":101,"./utils/RenderTarget":85,"pixi-gl-core":14}],72:[function(require,module,exports){ +},{"../../../utils":100}],71:[function(require,module,exports){ var GLTexture = require('pixi-gl-core').GLTexture, CONST = require('../../const'), + RenderTarget = require('./utils/RenderTarget'), utils = require('../../utils'); /** @@ -14722,12 +14614,11 @@ var TextureManager = function(renderer) { - this.renderer = renderer; + this.renderer = renderer; this.gl = renderer.gl; // track textures in the renderer so we can no longer listen to them on destruction. this._managedTextures = []; - } TextureManager.prototype.bindTexture = function(texture) @@ -14750,23 +14641,35 @@ { texture = texture.baseTexture || texture; + var isRenderTexture = !!texture._glRenderTargets; + if (!texture.hasLoaded) { return; } - var glTexture = texture._glTextures[this.renderer.CONTEXT_UID]; if (!glTexture) { - glTexture = new GLTexture(this.gl); - glTexture.premultiplyAlpha = true; + if(isRenderTexture) + { + renderTarget = new RenderTarget(this.gl, texture.width, texture.height, texture.scaleMode, texture.resolution); + texture._glRenderTargets[this.renderer.CONTEXT_UID] = renderTarget; + glTexture = renderTarget.texture; + } + else + { + glTexture = new GLTexture(this.gl); + glTexture.premultiplyAlpha = true; + glTexture.upload(texture.source); + } + texture._glTextures[this.renderer.CONTEXT_UID] = glTexture; texture.on('update', this.updateTexture, this); texture.on('dispose', this.destroyTexture, this); - + this._managedTextures.push(texture); //TODO check is power of two.. @@ -14782,9 +14685,10 @@ } } - glTexture.upload(texture.source); - - + if(isRenderTexture) + { + renderTarget.resize(texture.width, texture.height); + } return glTexture; } @@ -14835,6 +14739,12 @@ } } + +TextureManager.prototype.destroyAll = function(){ + this.destroy(); + // this.removeAll(); +} + TextureManager.prototype.destroy = function() { // destroy managed textures @@ -14851,8 +14761,7 @@ module.exports = TextureManager; - -},{"../../const":39,"../../utils":101,"pixi-gl-core":14}],73:[function(require,module,exports){ +},{"../../const":39,"../../utils":100,"./utils/RenderTarget":84,"pixi-gl-core":14}],72:[function(require,module,exports){ var SystemRenderer = require('../SystemRenderer'), MaskManager = require('./managers/MaskManager'), StencilManager = require('./managers/StencilManager'), @@ -14860,7 +14769,6 @@ RenderTarget = require('./utils/RenderTarget'), ObjectRenderer = require('./utils/ObjectRenderer'), TextureManager = require('./TextureManager'), - RenderTextureManager = require('./RenderTextureManager'), WebGLState = require('./WebGLState'), createContext = require('pixi-gl-core').createContext, mapWebGLDrawModesToPixi = require('./utils/mapWebGLDrawModesToPixi'), @@ -14954,7 +14862,7 @@ // initialize the context so it is ready for the managers. this.gl = createContext(this.view, this._contextOptions); - + this.gl.id = this.CONTEXT_UID = CONTEXT_UID++; this.state = new WebGLState(this.gl); @@ -14965,15 +14873,15 @@ * * @member {PIXI.FilterManager} */ - - + + this._initContext(); - + this.filterManager = new FilterManager(this); // map some webGL blend and drawmodes.. this.drawModes = mapWebGLDrawModesToPixi(gl) - + //alert(this.state ) this._activeShader = null; @@ -15006,19 +14914,18 @@ // create a texture manager... this.textureManager = new TextureManager(this); - this.renderTextureManager = new RenderTextureManager(this); - + this.state.resetToDefault(); this.rootRenderTarget = new RenderTarget(gl, this.width, this.height, null, this.resolution, true); this.rootRenderTarget.clearColor = this._backgroundColorRgba; - + this.bindRenderTarget(this.rootRenderTarget); this.emit('context', gl); // setup the width/height properties and gl viewport - this.resize(this.width, this.height); + this.resize(this.width, this.height); }; /** @@ -15034,7 +14941,7 @@ this.emit('prerender'); // no point rendering if our context has been blown up! - if (this.gl.isContextLost()) + if (!this.gl || this.gl.isContextLost()) { return; } @@ -15042,7 +14949,7 @@ this._lastObjectRendered = displayObject; if(!skipUpdateTransform) - { + { // update the scene graph var cacheParent = displayObject.parent; displayObject.parent = this._tempDisplayObjectParent; @@ -15061,7 +14968,7 @@ displayObject.renderWebGL(this); // apply transform.. - + this.currentRenderer.flush(); this.emit('postrender'); @@ -15131,11 +15038,10 @@ if(!baseTexture._glRenderTargets[this.CONTEXT_UID]) { - this.renderTextureManager.updateTexture(baseTexture); + this.textureManager.updateTexture(baseTexture); } renderTarget = baseTexture._glRenderTargets[this.CONTEXT_UID]; - renderTarget.setFrame(renderTexture.frame); } else @@ -15193,7 +15099,7 @@ WebGLRenderer.prototype.bindTexture = function (texture, location) { texture = texture.baseTexture || texture; - + var gl = this.gl; //TODO test perf of cache? @@ -15206,15 +15112,15 @@ } //TODO - can we cache this texture too? - this._activeTexture = texture; - + this._activeTexture = texture; + if (!texture._glTextures[this.CONTEXT_UID]) { // this will also bind the texture.. this.textureManager.updateTexture(texture); } else - { + { // bind the current texture texture._glTextures[this.CONTEXT_UID].bind(); } @@ -15263,7 +15169,7 @@ /** * Removes everything from the renderer (event listeners, spritebatch, etc...) * - * @param [removeView=false] {boolean} Removes the Canvas element from the DOM. + * @param [removeView=false] {boolean} Removes the Canvas element from the DOM. https://github.com/pixijs/pixi.js/issues/2233 */ WebGLRenderer.prototype.destroy = function (removeView) { @@ -15272,7 +15178,7 @@ // remove listeners this.view.removeEventListener('webglcontextlost', this.handleContextLost); this.view.removeEventListener('webglcontextrestored', this.handleContextRestored); - + this.textureManager.destroyAll(); // call base destroy @@ -15287,19 +15193,19 @@ this.maskManager = null; this.filterManager = null; + this.textureManager = null; this.currentRenderer = null; this.handleContextLost = null; this.handleContextRestored = null; this._contextOptions = null; - this.gl.useProgram(null); + this.gl.getExtension('WEBGL_lose_context').loseContext(); this.gl = null; }; - -},{"../../const":39,"../../utils":101,"../SystemRenderer":65,"./RenderTextureManager":71,"./TextureManager":72,"./WebGLState":74,"./managers/FilterManager":79,"./managers/MaskManager":80,"./managers/StencilManager":81,"./utils/ObjectRenderer":83,"./utils/RenderTarget":85,"./utils/mapWebGLDrawModesToPixi":87,"pixi-gl-core":14}],74:[function(require,module,exports){ +},{"../../const":39,"../../utils":100,"../SystemRenderer":65,"./TextureManager":71,"./WebGLState":73,"./managers/FilterManager":78,"./managers/MaskManager":79,"./managers/StencilManager":80,"./utils/ObjectRenderer":82,"./utils/RenderTarget":84,"./utils/mapWebGLDrawModesToPixi":86,"pixi-gl-core":14}],73:[function(require,module,exports){ var mapWebGLBlendModesToPixi = require('./utils/mapWebGLBlendModesToPixi'); @@ -15491,7 +15397,7 @@ module.exports = WebGLState; -},{"./utils/mapWebGLBlendModesToPixi":86}],75:[function(require,module,exports){ +},{"./utils/mapWebGLBlendModesToPixi":85}],74:[function(require,module,exports){ var Shader = require('pixi-gl-core').GLShader; var extractUniformsFromSrc = require('./extractUniformsFromSrc') var math = require('../../../math'); @@ -15623,7 +15529,7 @@ '}' ].join('\n'); -},{"../../../math":59,"./extractUniformsFromSrc":76,"pixi-gl-core":14}],76:[function(require,module,exports){ +},{"../../../math":59,"./extractUniformsFromSrc":75,"pixi-gl-core":14}],75:[function(require,module,exports){ var defaultValue = require('pixi-gl-core/lib/shader/defaultValue'); var mapSize = require('pixi-gl-core/lib/shader/mapSize'); @@ -15685,7 +15591,7 @@ } module.exports = extractUniformsFromSrc; -},{"pixi-gl-core/lib/shader/defaultValue":23,"pixi-gl-core/lib/shader/mapSize":27}],77:[function(require,module,exports){ +},{"pixi-gl-core/lib/shader/defaultValue":23,"pixi-gl-core/lib/shader/mapSize":27}],76:[function(require,module,exports){ var math = require('../../../math'); /* @@ -15793,7 +15699,7 @@ calculateNormalisedScreenSpaceMatrix:calculateNormalisedScreenSpaceMatrix, calculateSpriteMatrix:calculateSpriteMatrix }; -},{"../../../math":59}],78:[function(require,module,exports){ +},{"../../../math":59}],77:[function(require,module,exports){ (function (__dirname){ var Filter = require('../Filter'), math = require('../../../../math'); @@ -15847,7 +15753,7 @@ }; }).call(this,"/src/core/renderers/webgl/filters/spriteMask") -},{"../../../../math":59,"../Filter":75,"fs":3}],79:[function(require,module,exports){ +},{"../../../../math":59,"../Filter":74,"fs":3}],78:[function(require,module,exports){ var WebGLManager = require('./WebGLManager'), RenderTarget = require('../utils/RenderTarget'), @@ -16198,7 +16104,7 @@ FilterManager.pool = {} -},{"../../../const":39,"../../../math":59,"../../../utils":101,"../filters/filterTransforms":77,"../utils/Quad":84,"../utils/RenderTarget":85,"./WebGLManager":82,"bit-twiddle":2,"pixi-gl-core":14}],80:[function(require,module,exports){ +},{"../../../const":39,"../../../math":59,"../../../utils":100,"../filters/filterTransforms":76,"../utils/Quad":83,"../utils/RenderTarget":84,"./WebGLManager":81,"bit-twiddle":2,"pixi-gl-core":14}],79:[function(require,module,exports){ var WebGLManager = require('./WebGLManager'), AlphaMaskFilter = require('../filters/spriteMask/SpriteMaskFilter'); @@ -16375,7 +16281,7 @@ }; -},{"../filters/spriteMask/SpriteMaskFilter":78,"./WebGLManager":82}],81:[function(require,module,exports){ +},{"../filters/spriteMask/SpriteMaskFilter":77,"./WebGLManager":81}],80:[function(require,module,exports){ var WebGLManager = require('./WebGLManager'), utils = require('../../../utils'); @@ -16424,7 +16330,7 @@ StencilMaskManager.prototype.pushStencil = function (graphics) { this.renderer.setObjectRenderer(this.renderer.plugins.graphics); - + this.renderer._activeRenderTarget.attachStencilBuffer(); var gl = this.renderer.gl, @@ -16474,7 +16380,7 @@ gl.stencilOp(gl.KEEP,gl.KEEP,gl.DECR); this.renderer.plugins.graphics.render(graphics) - + gl.colorMask(true, true, true, true); gl.stencilFunc(gl.NOTEQUAL, 0, sms.length); gl.stencilOp(gl.KEEP,gl.KEEP,gl.KEEP); @@ -16492,8 +16398,7 @@ this.stencilMaskStack.stencilStack = null; }; - -},{"../../../utils":101,"./WebGLManager":82}],82:[function(require,module,exports){ +},{"../../../utils":100,"./WebGLManager":81}],81:[function(require,module,exports){ /** * @class * @memberof PIXI @@ -16534,7 +16439,7 @@ this.renderer = null; }; -},{}],83:[function(require,module,exports){ +},{}],82:[function(require,module,exports){ var WebGLManager = require('../managers/WebGLManager'); /** @@ -16592,7 +16497,7 @@ // render the object }; -},{"../managers/WebGLManager":82}],84:[function(require,module,exports){ +},{"../managers/WebGLManager":81}],83:[function(require,module,exports){ var glCore = require('pixi-gl-core'), createIndicesForQuads = require('../../../utils/createIndicesForQuads'); @@ -16756,7 +16661,7 @@ -},{"../../../utils/createIndicesForQuads":100,"pixi-gl-core":14}],85:[function(require,module,exports){ +},{"../../../utils/createIndicesForQuads":99,"pixi-gl-core":14}],84:[function(require,module,exports){ var math = require('../../../math'), utils = require('../../../utils'), CONST = require('../../../const'), @@ -17077,7 +16982,7 @@ this.texture = null; }; -},{"../../../const":39,"../../../math":59,"../../../utils":101,"pixi-gl-core":14}],86:[function(require,module,exports){ +},{"../../../const":39,"../../../math":59,"../../../utils":100,"pixi-gl-core":14}],85:[function(require,module,exports){ CONST = require('../../../const'); /** @@ -17114,7 +17019,7 @@ module.exports = mapWebGLBlendModesToPixi; -},{"../../../const":39}],87:[function(require,module,exports){ +},{"../../../const":39}],86:[function(require,module,exports){ CONST = require('../../../const'); /** @@ -17138,7 +17043,7 @@ module.exports = mapWebGLDrawModesToPixi; -},{"../../../const":39}],88:[function(require,module,exports){ +},{"../../../const":39}],87:[function(require,module,exports){ var math = require('../math'), Texture = require('../textures/Texture'), Container = require('../display/Container'), @@ -17166,7 +17071,6 @@ function Sprite(texture) { Container.call(this); - /** * The anchor sets the origin point of the texture. * The default is 0,0 this means the texture's origin is the top left @@ -17343,7 +17247,7 @@ } }; -Sprite.prototype.caclulateVertices = function () + Sprite.prototype.caclulateVertices = function () { var texture = this._texture, wt = this.transform.worldTransform, @@ -17403,7 +17307,7 @@ { this.textureDirty = false; // set the vertex data - this.caclulateVertices(); + this.caclulateVertices(); } renderer.setObjectRenderer(renderer.plugins.sprite); @@ -17426,7 +17330,7 @@ this.vertexDirty = false; // set the vertex data - this.caclulateVertices(); + this.caclulateVertices(); } @@ -17679,7 +17583,6 @@ Sprite.prototype.destroy = function (destroyTexture, destroyBaseTexture) { Container.prototype.destroy.call(this); - this.anchor = null; if (destroyTexture) @@ -17728,7 +17631,7 @@ return new Sprite(Texture.fromImage(imageId, crossorigin, scaleMode)); }; -},{"../const":39,"../display/Container":40,"../math":59,"../renderers/canvas/utils/CanvasTinter":70,"../textures/Texture":95,"../utils":101}],89:[function(require,module,exports){ +},{"../const":39,"../display/Container":40,"../math":59,"../renderers/canvas/utils/CanvasTinter":70,"../textures/Texture":94,"../utils":100}],88:[function(require,module,exports){ var ObjectRenderer = require('../../renderers/webgl/utils/ObjectRenderer'), WebGLRenderer = require('../../renderers/webgl/WebGLRenderer'), createIndicesForQuads = require('../../utils/createIndicesForQuads'), @@ -17813,13 +17716,13 @@ this.currentIndex = 0; this.tick =0; this.groups = []; - + //TODO - 300 is a bit magic, figure out a nicer amount! - for (var i = 0; i < this.size; i++) + for (var i = 0; i < this.size; i++) { - this.groups[i] = {textures:[], textureCount:0, ids:[], size:0, start:0, blend:0}; + this.groups[i] = {textures:[], textureCount:0, ids:[], size:0, start:0, blend:0}; }; - + this.sprites = []; } @@ -17844,7 +17747,7 @@ this.MAX_TEXTURES = Math.min(gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS), CONST.SPRITE_MAX_TEXTURES); this.shader = generateMultiTextureShader(gl, this.MAX_TEXTURES); // create a couple of buffers - this.vertexBuffer = glCore.GLBuffer.createVertexBuffer(gl, null, gl.DYNAMIC_DRAW); + this.vertexBuffer = glCore.GLBuffer.createVertexBuffer(gl, null, gl.STREAM_DRAW); this.indexBuffer = glCore.GLBuffer.createIndexBuffer(gl, this.indices, gl.STATIC_DRAW); // build the vao object that will render.. @@ -17872,9 +17775,9 @@ this.flush(); } - + // get the uvs for the texture - + // if the uvs have not updated then no point rendering just yet! if (!sprite.texture._uvs) @@ -17903,7 +17806,7 @@ var sprites = this.sprites; var groups = this.groups; - + var colors = buffer.colors; var positions = buffer.positions; var uvsBuffer = buffer.uvs; @@ -17924,7 +17827,7 @@ this.tick++; - for (var i = 0; i < this.currentIndex; i++) + for (var i = 0; i < this.currentIndex; i++) { // upload the sprite elemetns... // they have all ready been calculated so we just need to push them into the buffer. @@ -17935,7 +17838,7 @@ if(blendMode !== sprite.blendMode) { blendMode = sprite.blendMode; - + // force the batch to break! currentTexture = null; textureCount = this.MAX_TEXTURES; @@ -17945,9 +17848,9 @@ if(currentTexture !== nextTexture) { currentTexture = nextTexture; - + if(nextTexture._enabled !== this.tick) - { + { if(textureCount === this.MAX_TEXTURES) { this.tick++; @@ -17955,7 +17858,7 @@ textureCount = 0; currentGroup.size = i - currentGroup.start; - + currentGroup = groups[groupCount++]; currentGroup.textureCount = 0; currentGroup.blend = blendMode; @@ -17970,7 +17873,7 @@ } } - + var vertexData = sprite.vertexData; //TODO this sum does not need to be set each frame.. @@ -17983,8 +17886,8 @@ positions[index++] = vertexData[1]; uvsBuffer[index++] = uvs[0]; colors[index++] = tint; - positions[index++] = textureId; - + positions[index++] = textureId; + // xy positions[index++] = vertexData[2]; positions[index++] = vertexData[3]; @@ -18009,13 +17912,13 @@ }; currentGroup.size = i - currentGroup.start; - + this.vertexBuffer.upload(buffer.vertices, 0, true); - + /// render the groups.. for (i = 0; i < groupCount; i++) { - + var group = groups[i]; for (var j = 0; j < group.textureCount; j++) { @@ -18067,8 +17970,17 @@ this.vertexBuffer = null; this.indexBuffer = null; - this.sprites = null; + for (var i = 0; i < this.sprites.length; i++) { + this.sprites[i].destroy(); + } + + // this.sprites = null; this.shader = null; + + for (var i = 0; i < this.buffers.length; i++) { + this.buffers[i].destroy(); + } + }; var Buffer = function(size) @@ -18082,7 +17994,7 @@ * @member {Float32Array} */ this.positions = new Float32Array(this.vertices); - + /** * View on the vertices as a Uint32Array for uvs * @@ -18096,16 +18008,22 @@ * @member {Uint32Array} */ this.colors = new Uint32Array(this.vertices); - - } -},{"../../const":39,"../../renderers/webgl/WebGLRenderer":73,"../../renderers/webgl/utils/ObjectRenderer":83,"../../utils/createIndicesForQuads":100,"./generateMultiTextureShader":90,"bit-twiddle":2,"pixi-gl-core":14}],90:[function(require,module,exports){ + +Buffer.prototype.destroy = function(){ + this.vertices = null; + this.positions = null; + this.uvs = null; + this.colors = null; +} + +},{"../../const":39,"../../renderers/webgl/WebGLRenderer":72,"../../renderers/webgl/utils/ObjectRenderer":82,"../../utils/createIndicesForQuads":99,"./generateMultiTextureShader":89,"bit-twiddle":2,"pixi-gl-core":14}],89:[function(require,module,exports){ var Shader = require('pixi-gl-core').GLShader; function generateMultiTextureShader(gl, maxTextures) { - var vertexSrc = "#define GLSLIFY 1\nprecision lowp float;\nattribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\nattribute vec4 aColor;\nattribute float aTextureId;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\nvarying vec4 vColor;\nvarying float vTextureId;\n\nvoid main(void){\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n vTextureId = aTextureId;\n vColor = vec4(aColor.rgb * aColor.a, aColor.a);\n}"; + var vertexSrc = "precision lowp float;\n#define GLSLIFY 1\nattribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\nattribute vec4 aColor;\nattribute float aTextureId;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\nvarying vec4 vColor;\nvarying float vTextureId;\n\nvoid main(void){\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n vTextureId = aTextureId;\n vColor = vec4(aColor.rgb * aColor.a, aColor.a);\n}"; var fragmentSrc = fragTemplate fragmentSrc = fragmentSrc.replace(/\%count\%/gi, maxTextures); @@ -18164,7 +18082,7 @@ module.exports = generateMultiTextureShader; -},{"pixi-gl-core":14}],91:[function(require,module,exports){ +},{"pixi-gl-core":14}],90:[function(require,module,exports){ var Sprite = require('../sprites/Sprite'), Texture = require('../textures/Texture'), math = require('../math'), @@ -18785,7 +18703,7 @@ this._texture.destroy(destroyBaseTexture === undefined ? true : destroyBaseTexture); }; -},{"../const":39,"../math":59,"../sprites/Sprite":88,"../textures/Texture":95,"../utils":101}],92:[function(require,module,exports){ +},{"../const":39,"../math":59,"../sprites/Sprite":87,"../textures/Texture":94,"../utils":100}],91:[function(require,module,exports){ var BaseTexture = require('./BaseTexture'), Texture = require('./Texture'), RenderTarget = require('../renderers/webgl/utils/RenderTarget'), @@ -19072,7 +18990,7 @@ return this.getPixels(tempRect); }; -},{"../const":39,"../math":59,"../renderers/canvas/utils/CanvasBuffer":67,"../renderers/webgl/managers/FilterManager":79,"../renderers/webgl/utils/RenderTarget":85,"./BaseTexture":93,"./Texture":95}],93:[function(require,module,exports){ +},{"../const":39,"../math":59,"../renderers/canvas/utils/CanvasBuffer":67,"../renderers/webgl/managers/FilterManager":78,"../renderers/webgl/utils/RenderTarget":84,"./BaseTexture":92,"./Texture":94}],92:[function(require,module,exports){ var utils = require('../utils'), CONST = require('../const'), EventEmitter = require('eventemitter3'); @@ -19510,7 +19428,7 @@ return baseTexture; }; -},{"../const":39,"../utils":101,"eventemitter3":12}],94:[function(require,module,exports){ +},{"../const":39,"../utils":100,"eventemitter3":12}],93:[function(require,module,exports){ var BaseRenderTexture = require('./BaseRenderTexture'), Texture = require('./Texture'), math = require('../math'), @@ -19619,7 +19537,7 @@ } -},{"../const":39,"../math":59,"./BaseRenderTexture":92,"./Texture":95}],95:[function(require,module,exports){ +},{"../const":39,"../math":59,"./BaseRenderTexture":91,"./Texture":94}],94:[function(require,module,exports){ var BaseTexture = require('./BaseTexture'), VideoBaseTexture = require('./VideoBaseTexture'), TextureUvs = require('./TextureUvs'), @@ -19650,7 +19568,6 @@ function Texture(baseTexture, frame, crop, trim, rotate) { EventEmitter.call(this); - /** * Does this Texture have any frame data assigned to it? * @@ -19789,7 +19706,6 @@ set: function (frame) { this._frame = frame; - this.noFrame = false; if (frame.x + frame.width > this.baseTexture.width || frame.y + frame.height > this.baseTexture.height) @@ -20061,7 +19977,7 @@ */ Texture.EMPTY = new Texture(new BaseTexture()); -},{"../math":59,"../utils":101,"./BaseTexture":93,"./TextureUvs":96,"./VideoBaseTexture":97,"eventemitter3":12}],96:[function(require,module,exports){ +},{"../math":59,"../utils":100,"./BaseTexture":92,"./TextureUvs":95,"./VideoBaseTexture":96,"eventemitter3":12}],95:[function(require,module,exports){ /** * A standard object to store the Uvs of a texture @@ -20154,7 +20070,7 @@ this.uvs_uint32[3] = (((this.y3 * 65535) & 0xFFFF) << 16) | ((this.x3 * 65535) & 0xFFFF); }; -},{"../math/GroupD8":56}],97:[function(require,module,exports){ +},{"../math/GroupD8":56}],96:[function(require,module,exports){ var BaseTexture = require('./BaseTexture'), utils = require('../utils'); @@ -20391,7 +20307,7 @@ return source; } -},{"../utils":101,"./BaseTexture":93}],98:[function(require,module,exports){ +},{"../utils":100,"./BaseTexture":92}],97:[function(require,module,exports){ var CONST = require('../const'), EventEmitter = require('eventemitter3'), // Internal event used by composed emitter @@ -20746,7 +20662,7 @@ module.exports = Ticker; -},{"../const":39,"eventemitter3":12}],99:[function(require,module,exports){ +},{"../const":39,"eventemitter3":12}],98:[function(require,module,exports){ var Ticker = require('./Ticker'); /** @@ -20802,7 +20718,7 @@ Ticker: Ticker }; -},{"./Ticker":98}],100:[function(require,module,exports){ +},{"./Ticker":97}],99:[function(require,module,exports){ /** * Generic Mask Stack data structure * @class @@ -20835,7 +20751,7 @@ }; module.exports = createIndicesForQuads; -},{}],101:[function(require,module,exports){ +},{}],100:[function(require,module,exports){ var CONST = require('../const'); /** @@ -21112,7 +21028,7 @@ BaseTextureCache: {} }; -},{"../const":39,"./pluginTarget":102,"async":1,"eventemitter3":12}],102:[function(require,module,exports){ +},{"../const":39,"./pluginTarget":101,"async":1,"eventemitter3":12}],101:[function(require,module,exports){ /** * Mixins functionality to make an object have "plugins". * @@ -21182,7 +21098,7 @@ } }; -},{}],103:[function(require,module,exports){ +},{}],102:[function(require,module,exports){ /*global console */ var core = require('./core'), //mesh = require('./mesh'), @@ -21533,7 +21449,7 @@ return core.utils.uid(); }; -},{"./core":55,"./extras":110,"./filters":120}],104:[function(require,module,exports){ +},{"./core":55,"./extras":109,"./filters":119}],103:[function(require,module,exports){ var core = require('../core'); /** @@ -21921,7 +21837,7 @@ BitmapText.fonts = {}; -},{"../core":55}],105:[function(require,module,exports){ +},{"../core":55}],104:[function(require,module,exports){ var core = require('../core'); /** @@ -22241,7 +22157,7 @@ return new MovieClip(textures); }; -},{"../core":55}],106:[function(require,module,exports){ +},{"../core":55}],105:[function(require,module,exports){ var core = require('../core'), // a sprite use dfor rendering textures.. tempPoint = new core.Point(), @@ -22693,7 +22609,7 @@ return new TilingSprite(core.Texture.fromImage(imageId, crossorigin, scaleMode),width,height); }; -},{"../core":55,"../core/renderers/canvas/utils/CanvasTinter":70}],107:[function(require,module,exports){ +},{"../core":55,"../core/renderers/canvas/utils/CanvasTinter":70}],106:[function(require,module,exports){ var core = require('../core'), DisplayObject = core.DisplayObject, _tempMatrix = new core.Matrix(); @@ -22966,7 +22882,7 @@ this._originalDestroy(); }; -},{"../core":55}],108:[function(require,module,exports){ +},{"../core":55}],107:[function(require,module,exports){ var core = require('../core'); /** @@ -22996,7 +22912,7 @@ return null; }; -},{"../core":55}],109:[function(require,module,exports){ +},{"../core":55}],108:[function(require,module,exports){ var core = require('../core'); /** @@ -23026,7 +22942,7 @@ return point; }; -},{"../core":55}],110:[function(require,module,exports){ +},{"../core":55}],109:[function(require,module,exports){ /** * @file Main export of the PIXI extras library * @author Mat Groves @@ -23047,7 +22963,7 @@ BitmapText: require('./BitmapText') }; -},{"./BitmapText":104,"./MovieClip":105,"./TilingSprite":106,"./cacheAsBitmap":107,"./getChildByName":108,"./getGlobalPosition":109}],111:[function(require,module,exports){ +},{"./BitmapText":103,"./MovieClip":104,"./TilingSprite":105,"./cacheAsBitmap":106,"./getChildByName":107,"./getGlobalPosition":108}],110:[function(require,module,exports){ var core = require('../../core'), BlurXFilter = require('./BlurXFilter'), BlurYFilter = require('./BlurYFilter'); @@ -23163,7 +23079,7 @@ } }); -},{"../../core":55,"./BlurXFilter":112,"./BlurYFilter":113}],112:[function(require,module,exports){ +},{"../../core":55,"./BlurXFilter":111,"./BlurYFilter":112}],111:[function(require,module,exports){ var core = require('../../core'); var generateBlurVertSource = require('./generateBlurVertSource'); var generateBlurFragSource = require('./generateBlurFragSource'); @@ -23271,7 +23187,7 @@ } }); -},{"../../core":55,"./generateBlurFragSource":114,"./generateBlurVertSource":115,"./getMaxBlurKernelSize":116}],113:[function(require,module,exports){ +},{"../../core":55,"./generateBlurFragSource":113,"./generateBlurVertSource":114,"./getMaxBlurKernelSize":115}],112:[function(require,module,exports){ var core = require('../../core'); var generateBlurVertSource = require('./generateBlurVertSource'); var generateBlurFragSource = require('./generateBlurFragSource'); @@ -23369,7 +23285,7 @@ } }); -},{"../../core":55,"./generateBlurFragSource":114,"./generateBlurVertSource":115,"./getMaxBlurKernelSize":116}],114:[function(require,module,exports){ +},{"../../core":55,"./generateBlurFragSource":113,"./generateBlurVertSource":114,"./getMaxBlurKernelSize":115}],113:[function(require,module,exports){ var core = require('../../core') var GAUSSIAN_VALUES = { @@ -23433,7 +23349,7 @@ ].join('\n'); module.exports = generateFragBlurSource; -},{"../../core":55}],115:[function(require,module,exports){ +},{"../../core":55}],114:[function(require,module,exports){ var generateVertBlurSource = function(kernelSize, x) { @@ -23496,7 +23412,7 @@ ].join('\n'); module.exports = generateVertBlurSource; -},{}],116:[function(require,module,exports){ +},{}],115:[function(require,module,exports){ var getMaxKernelSize = function(gl) @@ -23513,7 +23429,7 @@ } module.exports = getMaxKernelSize; -},{}],117:[function(require,module,exports){ +},{}],116:[function(require,module,exports){ var core = require('../../core'); // @see https://github.com/substack/brfs/issues/25 @@ -23537,9 +23453,9 @@ { core.Filter.call(this, // vertex shader - "#define GLSLIFY 1\nprecision mediump float;\n\nattribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\nvarying vec2 vTextureCoord;\n\nvoid main(void){\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n}", + "precision mediump float;\n#define GLSLIFY 1\n\nattribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\nvarying vec2 vTextureCoord;\n\nvoid main(void){\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n}", // fragment shader - "#define GLSLIFY 1\nprecision mediump float;\n\nvarying vec2 vTextureCoord;\nuniform sampler2D uSampler;\nuniform float m[20];\n\nvoid main(void)\n{\n\n vec4 c = texture2D(uSampler, vTextureCoord);\n\n gl_FragColor.r = (m[0] * c.r);\n gl_FragColor.r += (m[1] * c.g);\n gl_FragColor.r += (m[2] * c.b);\n gl_FragColor.r += (m[3] * c.a);\n gl_FragColor.r += m[4];\n\n gl_FragColor.g = (m[5] * c.r);\n gl_FragColor.g += (m[6] * c.g);\n gl_FragColor.g += (m[7] * c.b);\n gl_FragColor.g += (m[8] * c.a);\n gl_FragColor.g += m[9];\n\n gl_FragColor.b = (m[10] * c.r);\n gl_FragColor.b += (m[11] * c.g);\n gl_FragColor.b += (m[12] * c.b);\n gl_FragColor.b += (m[13] * c.a);\n gl_FragColor.b += m[14];\n\n gl_FragColor.a = (m[15] * c.r);\n gl_FragColor.a += (m[16] * c.g);\n gl_FragColor.a += (m[17] * c.b);\n gl_FragColor.a += (m[18] * c.a);\n gl_FragColor.a += m[19];\n\n// gl_FragColor = vec4(m[0]);\n}\n" + "precision mediump float;\n#define GLSLIFY 1\n\nvarying vec2 vTextureCoord;\nuniform sampler2D uSampler;\nuniform float m[20];\n\nvoid main(void)\n{\n\n vec4 c = texture2D(uSampler, vTextureCoord);\n\n gl_FragColor.r = (m[0] * c.r);\n gl_FragColor.r += (m[1] * c.g);\n gl_FragColor.r += (m[2] * c.b);\n gl_FragColor.r += (m[3] * c.a);\n gl_FragColor.r += m[4];\n\n gl_FragColor.g = (m[5] * c.r);\n gl_FragColor.g += (m[6] * c.g);\n gl_FragColor.g += (m[7] * c.b);\n gl_FragColor.g += (m[8] * c.a);\n gl_FragColor.g += m[9];\n\n gl_FragColor.b = (m[10] * c.r);\n gl_FragColor.b += (m[11] * c.g);\n gl_FragColor.b += (m[12] * c.b);\n gl_FragColor.b += (m[13] * c.a);\n gl_FragColor.b += m[14];\n\n gl_FragColor.a = (m[15] * c.r);\n gl_FragColor.a += (m[16] * c.g);\n gl_FragColor.a += (m[17] * c.b);\n gl_FragColor.a += (m[18] * c.a);\n gl_FragColor.a += m[19];\n\n// gl_FragColor = vec4(m[0]);\n}\n" ); this.uniforms.m = [ @@ -24047,7 +23963,7 @@ } }); -},{"../../core":55}],118:[function(require,module,exports){ +},{"../../core":55}],117:[function(require,module,exports){ var core = require('../../core'); @@ -24070,7 +23986,7 @@ // vertex shader "#define GLSLIFY 1\nattribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\nattribute vec4 aColor;\n\nuniform mat3 projectionMatrix;\nuniform mat3 otherMatrix;\n\nvarying vec2 vMapCoord;\nvarying vec2 vTextureCoord;\nvarying vec4 vColor;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n vMapCoord = ( otherMatrix * vec3( aTextureCoord, 1.0) ).xy;\n vColor = vec4(aColor.rgb * aColor.a, aColor.a);\n}\n", // fragment shader - "#define GLSLIFY 1\nprecision mediump float;\n\nvarying vec2 vMapCoord;\nvarying vec2 vTextureCoord;\nvarying vec4 vColor;\n\nuniform vec2 scale;\n\nuniform sampler2D uSampler;\nuniform sampler2D mapSampler;\n\nvoid main(void)\n{\n vec4 map = texture2D(mapSampler, vMapCoord);\n\n map -= 0.5;\n map.xy *= scale;\n\n gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x + map.x, vTextureCoord.y + map.y));\n}\n" + "precision mediump float;\n#define GLSLIFY 1\n\nvarying vec2 vMapCoord;\nvarying vec2 vTextureCoord;\nvarying vec4 vColor;\n\nuniform vec2 scale;\n\nuniform sampler2D uSampler;\nuniform sampler2D mapSampler;\n\nvoid main(void)\n{\n vec4 map = texture2D(mapSampler, vMapCoord);\n\n map -= 0.5;\n map.xy *= scale;\n\n gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x + map.x, vTextureCoord.y + map.y));\n}\n" ); @@ -24126,7 +24042,7 @@ } }); -},{"../../core":55}],119:[function(require,module,exports){ +},{"../../core":55}],118:[function(require,module,exports){ var core = require('../../core'); // @see https://github.com/substack/brfs/issues/25 @@ -24142,9 +24058,9 @@ { core.Filter.call(this, // vertex shader - "#define GLSLIFY 1\nprecision lowp float;\n\nattribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\nvarying vec2 vTextureCoord;\n\nvoid main(void){\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n}", + "precision lowp float;\n#define GLSLIFY 1\n\nattribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\nvarying vec2 vTextureCoord;\n\nvoid main(void){\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n}", // fragment shader - "#define GLSLIFY 1\nprecision mediump float;\n\nvarying vec2 vTextureCoord;\n\nuniform sampler2D uSampler;\nuniform float gray;\n\nvoid main(void)\n{\n gl_FragColor = texture2D(uSampler, vTextureCoord);\n gl_FragColor.rgb = mix(gl_FragColor.rgb, vec3(0.2126*gl_FragColor.r + 0.7152*gl_FragColor.g + 0.0722*gl_FragColor.b), gray);\n}\n" + "precision mediump float;\n#define GLSLIFY 1\n\nvarying vec2 vTextureCoord;\n\nuniform sampler2D uSampler;\nuniform float gray;\n\nvoid main(void)\n{\n gl_FragColor = texture2D(uSampler, vTextureCoord);\n gl_FragColor.rgb = mix(gl_FragColor.rgb, vec3(0.2126*gl_FragColor.r + 0.7152*gl_FragColor.g + 0.0722*gl_FragColor.b), gray);\n}\n" ); this.uniforms.gray = 1; @@ -24175,7 +24091,7 @@ } }); -},{"../../core":55}],120:[function(require,module,exports){ +},{"../../core":55}],119:[function(require,module,exports){ /** * @file Main export of the PIXI filters library * @author Mat Groves @@ -24215,7 +24131,7 @@ GrayFilter: require('./gray/GrayFilter') }; -},{"./blur/BlurFilter":111,"./blur/BlurXFilter":112,"./blur/BlurYFilter":113,"./colormatrix/ColorMatrixFilter":117,"./displacement/DisplacementFilter":118,"./gray/GrayFilter":119,"./twist/TwistFilter":121}],121:[function(require,module,exports){ +},{"./blur/BlurFilter":110,"./blur/BlurXFilter":111,"./blur/BlurYFilter":112,"./colormatrix/ColorMatrixFilter":116,"./displacement/DisplacementFilter":117,"./gray/GrayFilter":118,"./twist/TwistFilter":120}],120:[function(require,module,exports){ var core = require('../../core'); @@ -24233,7 +24149,7 @@ "#define GLSLIFY 1\nattribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n}\n\n", // fragment shader - "#define GLSLIFY 1\nprecision mediump float;\n\nvarying vec2 vTextureCoord;\n\nuniform sampler2D uSampler;\nuniform float radius;\nuniform float angle;\nuniform vec2 offset;\nuniform vec4 filterArea;\n\nvec2 mapCoord( vec2 coord )\n{\n coord *= filterArea.xy;\n coord += filterArea.zw;\n\n return coord;\n}\n\nvec2 unmapCoord( vec2 coord )\n{\n coord -= filterArea.zw;\n coord /= filterArea.xy;\n\n return coord;\n}\n\nvec2 twist(vec2 coord)\n{\n coord -= offset;\n\n float dist = length(coord);\n\n if (dist < radius)\n {\n float ratioDist = (radius - dist) / radius;\n float angleMod = ratioDist * ratioDist * angle;\n float s = sin(angleMod);\n float c = cos(angleMod);\n coord = vec2(coord.x * c - coord.y * s, coord.x * s + coord.y * c);\n }\n\n coord += offset;\n\n return coord;\n}\n\nvoid main(void)\n{\n\n vec2 coord = mapCoord(vTextureCoord);\n\n coord = twist(coord);\n\n coord = unmapCoord(coord);\n\n gl_FragColor = texture2D(uSampler, coord );\n\n}\n" + "precision mediump float;\n#define GLSLIFY 1\n\nvarying vec2 vTextureCoord;\n\nuniform sampler2D uSampler;\nuniform float radius;\nuniform float angle;\nuniform vec2 offset;\nuniform vec4 filterArea;\n\nvec2 mapCoord( vec2 coord )\n{\n coord *= filterArea.xy;\n coord += filterArea.zw;\n\n return coord;\n}\n\nvec2 unmapCoord( vec2 coord )\n{\n coord -= filterArea.zw;\n coord /= filterArea.xy;\n\n return coord;\n}\n\nvec2 twist(vec2 coord)\n{\n coord -= offset;\n\n float dist = length(coord);\n\n if (dist < radius)\n {\n float ratioDist = (radius - dist) / radius;\n float angleMod = ratioDist * ratioDist * angle;\n float s = sin(angleMod);\n float c = cos(angleMod);\n coord = vec2(coord.x * c - coord.y * s, coord.x * s + coord.y * c);\n }\n\n coord += offset;\n\n return coord;\n}\n\nvoid main(void)\n{\n\n vec2 coord = mapCoord(vTextureCoord);\n\n coord = twist(coord);\n\n coord = unmapCoord(coord);\n\n gl_FragColor = texture2D(uSampler, coord );\n\n}\n" ); this.uniforms.radius = 400; @@ -24316,7 +24232,7 @@ } }); -},{"../../core":55}],122:[function(require,module,exports){ +},{"../../core":55}],121:[function(require,module,exports){ (function (global){ // run the polyfills require('./polyfill'); @@ -24348,7 +24264,7 @@ global.PIXI = core; }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./accessibility":38,"./core":55,"./deprecation":103,"./extras":110,"./filters":120,"./interaction":125,"./loaders":128,"./polyfill":134}],123:[function(require,module,exports){ +},{"./accessibility":38,"./core":55,"./deprecation":102,"./extras":109,"./filters":119,"./interaction":124,"./loaders":127,"./polyfill":133}],122:[function(require,module,exports){ var core = require('../core'); /** @@ -24397,7 +24313,7 @@ return displayObject.worldTransform.applyInverse(globalPos || this.global, point); }; -},{"../core":55}],124:[function(require,module,exports){ +},{"../core":55}],123:[function(require,module,exports){ var core = require('../core'), InteractionData = require('./InteractionData'); @@ -24490,7 +24406,7 @@ * @member {HTMLElement} * @private */ - this.moveWhenInside = false; + this.moveWhenInside = true; /** * Have events been attached to the dom element? @@ -25300,7 +25216,7 @@ core.WebGLRenderer.registerPlugin('interaction', InteractionManager); core.CanvasRenderer.registerPlugin('interaction', InteractionManager); -},{"../core":55,"./InteractionData":123,"./interactiveTarget":126}],125:[function(require,module,exports){ +},{"../core":55,"./InteractionData":122,"./interactiveTarget":125}],124:[function(require,module,exports){ /** * @file Main export of the PIXI interactions library * @author Mat Groves @@ -25317,7 +25233,7 @@ interactiveTarget: require('./interactiveTarget') }; -},{"./InteractionData":123,"./InteractionManager":124,"./interactiveTarget":126}],126:[function(require,module,exports){ +},{"./InteractionData":122,"./InteractionManager":123,"./interactiveTarget":125}],125:[function(require,module,exports){ /** * Default property values of interactive objects * used by {@link PIXI.interaction.InteractionManager}. @@ -25366,7 +25282,7 @@ module.exports = interactiveTarget; -},{}],127:[function(require,module,exports){ +},{}],126:[function(require,module,exports){ var Resource = require('resource-loader').Resource, core = require('../core'), extras = require('../extras'), @@ -25490,7 +25406,7 @@ }; }; -},{"../core":55,"../extras":110,"path":4,"resource-loader":33}],128:[function(require,module,exports){ +},{"../core":55,"../extras":109,"path":4,"resource-loader":33}],127:[function(require,module,exports){ /** * @file Main export of the PIXI loaders library * @author Mat Groves @@ -25511,7 +25427,7 @@ Resource: require('resource-loader').Resource }; -},{"./bitmapFontParser":127,"./loader":129,"./spritesheetParser":130,"./textureParser":131,"resource-loader":33}],129:[function(require,module,exports){ +},{"./bitmapFontParser":126,"./loader":128,"./spritesheetParser":129,"./textureParser":130,"resource-loader":33}],128:[function(require,module,exports){ var ResourceLoader = require('resource-loader'), textureParser = require('./textureParser'), spritesheetParser = require('./spritesheetParser'), @@ -25573,7 +25489,7 @@ Resource.setExtensionXhrType('fnt', Resource.XHR_RESPONSE_TYPE.DOCUMENT); -},{"./bitmapFontParser":127,"./spritesheetParser":130,"./textureParser":131,"resource-loader":33}],130:[function(require,module,exports){ +},{"./bitmapFontParser":126,"./spritesheetParser":129,"./textureParser":130,"resource-loader":33}],129:[function(require,module,exports){ var Resource = require('resource-loader').Resource, path = require('path'), core = require('../core'); @@ -25645,7 +25561,7 @@ }; }; -},{"../core":55,"path":4,"resource-loader":33}],131:[function(require,module,exports){ +},{"../core":55,"path":4,"resource-loader":33}],130:[function(require,module,exports){ var core = require('../core'); module.exports = function () @@ -25667,7 +25583,7 @@ }; }; -},{"../core":55}],132:[function(require,module,exports){ +},{"../core":55}],131:[function(require,module,exports){ // References: // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sign @@ -25683,7 +25599,7 @@ }; } -},{}],133:[function(require,module,exports){ +},{}],132:[function(require,module,exports){ // References: // https://github.com/sindresorhus/object-assign // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign @@ -25693,12 +25609,12 @@ Object.assign = require('object-assign'); } -},{"object-assign":13}],134:[function(require,module,exports){ +},{"object-assign":13}],133:[function(require,module,exports){ require('./Object.assign'); require('./requestAnimationFrame'); require('./Math.sign'); -},{"./Math.sign":132,"./Object.assign":133,"./requestAnimationFrame":135}],135:[function(require,module,exports){ +},{"./Math.sign":131,"./Object.assign":132,"./requestAnimationFrame":134}],134:[function(require,module,exports){ (function (global){ // References: // http://paulirish.com/2011/requestanimationframe-for-smart-animating/ @@ -25768,6 +25684,6 @@ } }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{}]},{},[122])(122) +},{}]},{},[121])(121) }); //# sourceMappingURL=pixi.js.map diff --git a/bin/pixi.js.map b/bin/pixi.js.map index a24aafe..fed2adc 100644 --- a/bin/pixi.js.map +++ b/bin/pixi.js.map @@ -1 +1 @@ -{"version":3,"names":[],"mappings":"","sources":["pixi.js"],"sourcesContent":["(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.PIXI = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o= 0 &&\n arr.length % 1 === 0\n );\n }\n\n function _arrayEach(arr, iterator) {\n var index = -1,\n length = arr.length;\n\n while (++index < length) {\n iterator(arr[index], index, arr);\n }\n }\n\n function _map(arr, iterator) {\n var index = -1,\n length = arr.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iterator(arr[index], index, arr);\n }\n return result;\n }\n\n function _range(count) {\n return _map(Array(count), function (v, i) { return i; });\n }\n\n function _reduce(arr, iterator, memo) {\n _arrayEach(arr, function (x, i, a) {\n memo = iterator(memo, x, i, a);\n });\n return memo;\n }\n\n function _forEachOf(object, iterator) {\n _arrayEach(_keys(object), function (key) {\n iterator(object[key], key);\n });\n }\n\n function _indexOf(arr, item) {\n for (var i = 0; i < arr.length; i++) {\n if (arr[i] === item) return i;\n }\n return -1;\n }\n\n var _keys = Object.keys || function (obj) {\n var keys = [];\n for (var k in obj) {\n if (obj.hasOwnProperty(k)) {\n keys.push(k);\n }\n }\n return keys;\n };\n\n function _keyIterator(coll) {\n var i = -1;\n var len;\n var keys;\n if (_isArrayLike(coll)) {\n len = coll.length;\n return function next() {\n i++;\n return i < len ? i : null;\n };\n } else {\n keys = _keys(coll);\n len = keys.length;\n return function next() {\n i++;\n return i < len ? keys[i] : null;\n };\n }\n }\n\n // Similar to ES6's rest param (http://ariya.ofilabs.com/2013/03/es6-and-rest-parameter.html)\n // This accumulates the arguments passed into an array, after a given index.\n // From underscore.js (https://github.com/jashkenas/underscore/pull/2140).\n function _restParam(func, startIndex) {\n startIndex = startIndex == null ? func.length - 1 : +startIndex;\n return function() {\n var length = Math.max(arguments.length - startIndex, 0);\n var rest = Array(length);\n for (var index = 0; index < length; index++) {\n rest[index] = arguments[index + startIndex];\n }\n switch (startIndex) {\n case 0: return func.call(this, rest);\n case 1: return func.call(this, arguments[0], rest);\n }\n // Currently unused but handle cases outside of the switch statement:\n // var args = Array(startIndex + 1);\n // for (index = 0; index < startIndex; index++) {\n // args[index] = arguments[index];\n // }\n // args[startIndex] = rest;\n // return func.apply(this, args);\n };\n }\n\n function _withoutIndex(iterator) {\n return function (value, index, callback) {\n return iterator(value, callback);\n };\n }\n\n //// exported async module functions ////\n\n //// nextTick implementation with browser-compatible fallback ////\n\n // capture the global reference to guard against fakeTimer mocks\n var _setImmediate = typeof setImmediate === 'function' && setImmediate;\n\n var _delay = _setImmediate ? function(fn) {\n // not a direct alias for IE10 compatibility\n _setImmediate(fn);\n } : function(fn) {\n setTimeout(fn, 0);\n };\n\n if (typeof process === 'object' && typeof process.nextTick === 'function') {\n async.nextTick = process.nextTick;\n } else {\n async.nextTick = _delay;\n }\n async.setImmediate = _setImmediate ? _delay : async.nextTick;\n\n\n async.forEach =\n async.each = function (arr, iterator, callback) {\n return async.eachOf(arr, _withoutIndex(iterator), callback);\n };\n\n async.forEachSeries =\n async.eachSeries = function (arr, iterator, callback) {\n return async.eachOfSeries(arr, _withoutIndex(iterator), callback);\n };\n\n\n async.forEachLimit =\n async.eachLimit = function (arr, limit, iterator, callback) {\n return _eachOfLimit(limit)(arr, _withoutIndex(iterator), callback);\n };\n\n async.forEachOf =\n async.eachOf = function (object, iterator, callback) {\n callback = _once(callback || noop);\n object = object || [];\n\n var iter = _keyIterator(object);\n var key, completed = 0;\n\n while ((key = iter()) != null) {\n completed += 1;\n iterator(object[key], key, only_once(done));\n }\n\n if (completed === 0) callback(null);\n\n function done(err) {\n completed--;\n if (err) {\n callback(err);\n }\n // Check key is null in case iterator isn't exhausted\n // and done resolved synchronously.\n else if (key === null && completed <= 0) {\n callback(null);\n }\n }\n };\n\n async.forEachOfSeries =\n async.eachOfSeries = function (obj, iterator, callback) {\n callback = _once(callback || noop);\n obj = obj || [];\n var nextKey = _keyIterator(obj);\n var key = nextKey();\n function iterate() {\n var sync = true;\n if (key === null) {\n return callback(null);\n }\n iterator(obj[key], key, only_once(function (err) {\n if (err) {\n callback(err);\n }\n else {\n key = nextKey();\n if (key === null) {\n return callback(null);\n } else {\n if (sync) {\n async.setImmediate(iterate);\n } else {\n iterate();\n }\n }\n }\n }));\n sync = false;\n }\n iterate();\n };\n\n\n\n async.forEachOfLimit =\n async.eachOfLimit = function (obj, limit, iterator, callback) {\n _eachOfLimit(limit)(obj, iterator, callback);\n };\n\n function _eachOfLimit(limit) {\n\n return function (obj, iterator, callback) {\n callback = _once(callback || noop);\n obj = obj || [];\n var nextKey = _keyIterator(obj);\n if (limit <= 0) {\n return callback(null);\n }\n var done = false;\n var running = 0;\n var errored = false;\n\n (function replenish () {\n if (done && running <= 0) {\n return callback(null);\n }\n\n while (running < limit && !errored) {\n var key = nextKey();\n if (key === null) {\n done = true;\n if (running <= 0) {\n callback(null);\n }\n return;\n }\n running += 1;\n iterator(obj[key], key, only_once(function (err) {\n running -= 1;\n if (err) {\n callback(err);\n errored = true;\n }\n else {\n replenish();\n }\n }));\n }\n })();\n };\n }\n\n\n function doParallel(fn) {\n return function (obj, iterator, callback) {\n return fn(async.eachOf, obj, iterator, callback);\n };\n }\n function doParallelLimit(fn) {\n return function (obj, limit, iterator, callback) {\n return fn(_eachOfLimit(limit), obj, iterator, callback);\n };\n }\n function doSeries(fn) {\n return function (obj, iterator, callback) {\n return fn(async.eachOfSeries, obj, iterator, callback);\n };\n }\n\n function _asyncMap(eachfn, arr, iterator, callback) {\n callback = _once(callback || noop);\n arr = arr || [];\n var results = _isArrayLike(arr) ? [] : {};\n eachfn(arr, function (value, index, callback) {\n iterator(value, function (err, v) {\n results[index] = v;\n callback(err);\n });\n }, function (err) {\n callback(err, results);\n });\n }\n\n async.map = doParallel(_asyncMap);\n async.mapSeries = doSeries(_asyncMap);\n async.mapLimit = doParallelLimit(_asyncMap);\n\n // reduce only has a series version, as doing reduce in parallel won't\n // work in many situations.\n async.inject =\n async.foldl =\n async.reduce = function (arr, memo, iterator, callback) {\n async.eachOfSeries(arr, function (x, i, callback) {\n iterator(memo, x, function (err, v) {\n memo = v;\n callback(err);\n });\n }, function (err) {\n callback(err, memo);\n });\n };\n\n async.foldr =\n async.reduceRight = function (arr, memo, iterator, callback) {\n var reversed = _map(arr, identity).reverse();\n async.reduce(reversed, memo, iterator, callback);\n };\n\n async.transform = function (arr, memo, iterator, callback) {\n if (arguments.length === 3) {\n callback = iterator;\n iterator = memo;\n memo = _isArray(arr) ? [] : {};\n }\n\n async.eachOf(arr, function(v, k, cb) {\n iterator(memo, v, k, cb);\n }, function(err) {\n callback(err, memo);\n });\n };\n\n function _filter(eachfn, arr, iterator, callback) {\n var results = [];\n eachfn(arr, function (x, index, callback) {\n iterator(x, function (v) {\n if (v) {\n results.push({index: index, value: x});\n }\n callback();\n });\n }, function () {\n callback(_map(results.sort(function (a, b) {\n return a.index - b.index;\n }), function (x) {\n return x.value;\n }));\n });\n }\n\n async.select =\n async.filter = doParallel(_filter);\n\n async.selectLimit =\n async.filterLimit = doParallelLimit(_filter);\n\n async.selectSeries =\n async.filterSeries = doSeries(_filter);\n\n function _reject(eachfn, arr, iterator, callback) {\n _filter(eachfn, arr, function(value, cb) {\n iterator(value, function(v) {\n cb(!v);\n });\n }, callback);\n }\n async.reject = doParallel(_reject);\n async.rejectLimit = doParallelLimit(_reject);\n async.rejectSeries = doSeries(_reject);\n\n function _createTester(eachfn, check, getResult) {\n return function(arr, limit, iterator, cb) {\n function done() {\n if (cb) cb(getResult(false, void 0));\n }\n function iteratee(x, _, callback) {\n if (!cb) return callback();\n iterator(x, function (v) {\n if (cb && check(v)) {\n cb(getResult(true, x));\n cb = iterator = false;\n }\n callback();\n });\n }\n if (arguments.length > 3) {\n eachfn(arr, limit, iteratee, done);\n } else {\n cb = iterator;\n iterator = limit;\n eachfn(arr, iteratee, done);\n }\n };\n }\n\n async.any =\n async.some = _createTester(async.eachOf, toBool, identity);\n\n async.someLimit = _createTester(async.eachOfLimit, toBool, identity);\n\n async.all =\n async.every = _createTester(async.eachOf, notId, notId);\n\n async.everyLimit = _createTester(async.eachOfLimit, notId, notId);\n\n function _findGetResult(v, x) {\n return x;\n }\n async.detect = _createTester(async.eachOf, identity, _findGetResult);\n async.detectSeries = _createTester(async.eachOfSeries, identity, _findGetResult);\n async.detectLimit = _createTester(async.eachOfLimit, identity, _findGetResult);\n\n async.sortBy = function (arr, iterator, callback) {\n async.map(arr, function (x, callback) {\n iterator(x, function (err, criteria) {\n if (err) {\n callback(err);\n }\n else {\n callback(null, {value: x, criteria: criteria});\n }\n });\n }, function (err, results) {\n if (err) {\n return callback(err);\n }\n else {\n callback(null, _map(results.sort(comparator), function (x) {\n return x.value;\n }));\n }\n\n });\n\n function comparator(left, right) {\n var a = left.criteria, b = right.criteria;\n return a < b ? -1 : a > b ? 1 : 0;\n }\n };\n\n async.auto = function (tasks, concurrency, callback) {\n if (typeof arguments[1] === 'function') {\n // concurrency is optional, shift the args.\n callback = concurrency;\n concurrency = null;\n }\n callback = _once(callback || noop);\n var keys = _keys(tasks);\n var remainingTasks = keys.length;\n if (!remainingTasks) {\n return callback(null);\n }\n if (!concurrency) {\n concurrency = remainingTasks;\n }\n\n var results = {};\n var runningTasks = 0;\n\n var hasError = false;\n\n var listeners = [];\n function addListener(fn) {\n listeners.unshift(fn);\n }\n function removeListener(fn) {\n var idx = _indexOf(listeners, fn);\n if (idx >= 0) listeners.splice(idx, 1);\n }\n function taskComplete() {\n remainingTasks--;\n _arrayEach(listeners.slice(0), function (fn) {\n fn();\n });\n }\n\n addListener(function () {\n if (!remainingTasks) {\n callback(null, results);\n }\n });\n\n _arrayEach(keys, function (k) {\n if (hasError) return;\n var task = _isArray(tasks[k]) ? tasks[k]: [tasks[k]];\n var taskCallback = _restParam(function(err, args) {\n runningTasks--;\n if (args.length <= 1) {\n args = args[0];\n }\n if (err) {\n var safeResults = {};\n _forEachOf(results, function(val, rkey) {\n safeResults[rkey] = val;\n });\n safeResults[k] = args;\n hasError = true;\n\n callback(err, safeResults);\n }\n else {\n results[k] = args;\n async.setImmediate(taskComplete);\n }\n });\n var requires = task.slice(0, task.length - 1);\n // prevent dead-locks\n var len = requires.length;\n var dep;\n while (len--) {\n if (!(dep = tasks[requires[len]])) {\n throw new Error('Has nonexistent dependency in ' + requires.join(', '));\n }\n if (_isArray(dep) && _indexOf(dep, k) >= 0) {\n throw new Error('Has cyclic dependencies');\n }\n }\n function ready() {\n return runningTasks < concurrency && _reduce(requires, function (a, x) {\n return (a && results.hasOwnProperty(x));\n }, true) && !results.hasOwnProperty(k);\n }\n if (ready()) {\n runningTasks++;\n task[task.length - 1](taskCallback, results);\n }\n else {\n addListener(listener);\n }\n function listener() {\n if (ready()) {\n runningTasks++;\n removeListener(listener);\n task[task.length - 1](taskCallback, results);\n }\n }\n });\n };\n\n\n\n async.retry = function(times, task, callback) {\n var DEFAULT_TIMES = 5;\n var DEFAULT_INTERVAL = 0;\n\n var attempts = [];\n\n var opts = {\n times: DEFAULT_TIMES,\n interval: DEFAULT_INTERVAL\n };\n\n function parseTimes(acc, t){\n if(typeof t === 'number'){\n acc.times = parseInt(t, 10) || DEFAULT_TIMES;\n } else if(typeof t === 'object'){\n acc.times = parseInt(t.times, 10) || DEFAULT_TIMES;\n acc.interval = parseInt(t.interval, 10) || DEFAULT_INTERVAL;\n } else {\n throw new Error('Unsupported argument type for \\'times\\': ' + typeof t);\n }\n }\n\n var length = arguments.length;\n if (length < 1 || length > 3) {\n throw new Error('Invalid arguments - must be either (task), (task, callback), (times, task) or (times, task, callback)');\n } else if (length <= 2 && typeof times === 'function') {\n callback = task;\n task = times;\n }\n if (typeof times !== 'function') {\n parseTimes(opts, times);\n }\n opts.callback = callback;\n opts.task = task;\n\n function wrappedTask(wrappedCallback, wrappedResults) {\n function retryAttempt(task, finalAttempt) {\n return function(seriesCallback) {\n task(function(err, result){\n seriesCallback(!err || finalAttempt, {err: err, result: result});\n }, wrappedResults);\n };\n }\n\n function retryInterval(interval){\n return function(seriesCallback){\n setTimeout(function(){\n seriesCallback(null);\n }, interval);\n };\n }\n\n while (opts.times) {\n\n var finalAttempt = !(opts.times-=1);\n attempts.push(retryAttempt(opts.task, finalAttempt));\n if(!finalAttempt && opts.interval > 0){\n attempts.push(retryInterval(opts.interval));\n }\n }\n\n async.series(attempts, function(done, data){\n data = data[data.length - 1];\n (wrappedCallback || opts.callback)(data.err, data.result);\n });\n }\n\n // If a callback is passed, run this as a controll flow\n return opts.callback ? wrappedTask() : wrappedTask;\n };\n\n async.waterfall = function (tasks, callback) {\n callback = _once(callback || noop);\n if (!_isArray(tasks)) {\n var err = new Error('First argument to waterfall must be an array of functions');\n return callback(err);\n }\n if (!tasks.length) {\n return callback();\n }\n function wrapIterator(iterator) {\n return _restParam(function (err, args) {\n if (err) {\n callback.apply(null, [err].concat(args));\n }\n else {\n var next = iterator.next();\n if (next) {\n args.push(wrapIterator(next));\n }\n else {\n args.push(callback);\n }\n ensureAsync(iterator).apply(null, args);\n }\n });\n }\n wrapIterator(async.iterator(tasks))();\n };\n\n function _parallel(eachfn, tasks, callback) {\n callback = callback || noop;\n var results = _isArrayLike(tasks) ? [] : {};\n\n eachfn(tasks, function (task, key, callback) {\n task(_restParam(function (err, args) {\n if (args.length <= 1) {\n args = args[0];\n }\n results[key] = args;\n callback(err);\n }));\n }, function (err) {\n callback(err, results);\n });\n }\n\n async.parallel = function (tasks, callback) {\n _parallel(async.eachOf, tasks, callback);\n };\n\n async.parallelLimit = function(tasks, limit, callback) {\n _parallel(_eachOfLimit(limit), tasks, callback);\n };\n\n async.series = function(tasks, callback) {\n _parallel(async.eachOfSeries, tasks, callback);\n };\n\n async.iterator = function (tasks) {\n function makeCallback(index) {\n function fn() {\n if (tasks.length) {\n tasks[index].apply(null, arguments);\n }\n return fn.next();\n }\n fn.next = function () {\n return (index < tasks.length - 1) ? makeCallback(index + 1): null;\n };\n return fn;\n }\n return makeCallback(0);\n };\n\n async.apply = _restParam(function (fn, args) {\n return _restParam(function (callArgs) {\n return fn.apply(\n null, args.concat(callArgs)\n );\n });\n });\n\n function _concat(eachfn, arr, fn, callback) {\n var result = [];\n eachfn(arr, function (x, index, cb) {\n fn(x, function (err, y) {\n result = result.concat(y || []);\n cb(err);\n });\n }, function (err) {\n callback(err, result);\n });\n }\n async.concat = doParallel(_concat);\n async.concatSeries = doSeries(_concat);\n\n async.whilst = function (test, iterator, callback) {\n callback = callback || noop;\n if (test()) {\n var next = _restParam(function(err, args) {\n if (err) {\n callback(err);\n } else if (test.apply(this, args)) {\n iterator(next);\n } else {\n callback.apply(null, [null].concat(args));\n }\n });\n iterator(next);\n } else {\n callback(null);\n }\n };\n\n async.doWhilst = function (iterator, test, callback) {\n var calls = 0;\n return async.whilst(function() {\n return ++calls <= 1 || test.apply(this, arguments);\n }, iterator, callback);\n };\n\n async.until = function (test, iterator, callback) {\n return async.whilst(function() {\n return !test.apply(this, arguments);\n }, iterator, callback);\n };\n\n async.doUntil = function (iterator, test, callback) {\n return async.doWhilst(iterator, function() {\n return !test.apply(this, arguments);\n }, callback);\n };\n\n async.during = function (test, iterator, callback) {\n callback = callback || noop;\n\n var next = _restParam(function(err, args) {\n if (err) {\n callback(err);\n } else {\n args.push(check);\n test.apply(this, args);\n }\n });\n\n var check = function(err, truth) {\n if (err) {\n callback(err);\n } else if (truth) {\n iterator(next);\n } else {\n callback(null);\n }\n };\n\n test(check);\n };\n\n async.doDuring = function (iterator, test, callback) {\n var calls = 0;\n async.during(function(next) {\n if (calls++ < 1) {\n next(null, true);\n } else {\n test.apply(this, arguments);\n }\n }, iterator, callback);\n };\n\n function _queue(worker, concurrency, payload) {\n if (concurrency == null) {\n concurrency = 1;\n }\n else if(concurrency === 0) {\n throw new Error('Concurrency must not be zero');\n }\n function _insert(q, data, pos, callback) {\n if (callback != null && typeof callback !== \"function\") {\n throw new Error(\"task callback must be a function\");\n }\n q.started = true;\n if (!_isArray(data)) {\n data = [data];\n }\n if(data.length === 0 && q.idle()) {\n // call drain immediately if there are no tasks\n return async.setImmediate(function() {\n q.drain();\n });\n }\n _arrayEach(data, function(task) {\n var item = {\n data: task,\n callback: callback || noop\n };\n\n if (pos) {\n q.tasks.unshift(item);\n } else {\n q.tasks.push(item);\n }\n\n if (q.tasks.length === q.concurrency) {\n q.saturated();\n }\n });\n async.setImmediate(q.process);\n }\n function _next(q, tasks) {\n return function(){\n workers -= 1;\n\n var removed = false;\n var args = arguments;\n _arrayEach(tasks, function (task) {\n _arrayEach(workersList, function (worker, index) {\n if (worker === task && !removed) {\n workersList.splice(index, 1);\n removed = true;\n }\n });\n\n task.callback.apply(task, args);\n });\n if (q.tasks.length + workers === 0) {\n q.drain();\n }\n q.process();\n };\n }\n\n var workers = 0;\n var workersList = [];\n var q = {\n tasks: [],\n concurrency: concurrency,\n payload: payload,\n saturated: noop,\n empty: noop,\n drain: noop,\n started: false,\n paused: false,\n push: function (data, callback) {\n _insert(q, data, false, callback);\n },\n kill: function () {\n q.drain = noop;\n q.tasks = [];\n },\n unshift: function (data, callback) {\n _insert(q, data, true, callback);\n },\n process: function () {\n while(!q.paused && workers < q.concurrency && q.tasks.length){\n\n var tasks = q.payload ?\n q.tasks.splice(0, q.payload) :\n q.tasks.splice(0, q.tasks.length);\n\n var data = _map(tasks, function (task) {\n return task.data;\n });\n\n if (q.tasks.length === 0) {\n q.empty();\n }\n workers += 1;\n workersList.push(tasks[0]);\n var cb = only_once(_next(q, tasks));\n worker(data, cb);\n }\n },\n length: function () {\n return q.tasks.length;\n },\n running: function () {\n return workers;\n },\n workersList: function () {\n return workersList;\n },\n idle: function() {\n return q.tasks.length + workers === 0;\n },\n pause: function () {\n q.paused = true;\n },\n resume: function () {\n if (q.paused === false) { return; }\n q.paused = false;\n var resumeCount = Math.min(q.concurrency, q.tasks.length);\n // Need to call q.process once per concurrent\n // worker to preserve full concurrency after pause\n for (var w = 1; w <= resumeCount; w++) {\n async.setImmediate(q.process);\n }\n }\n };\n return q;\n }\n\n async.queue = function (worker, concurrency) {\n var q = _queue(function (items, cb) {\n worker(items[0], cb);\n }, concurrency, 1);\n\n return q;\n };\n\n async.priorityQueue = function (worker, concurrency) {\n\n function _compareTasks(a, b){\n return a.priority - b.priority;\n }\n\n function _binarySearch(sequence, item, compare) {\n var beg = -1,\n end = sequence.length - 1;\n while (beg < end) {\n var mid = beg + ((end - beg + 1) >>> 1);\n if (compare(item, sequence[mid]) >= 0) {\n beg = mid;\n } else {\n end = mid - 1;\n }\n }\n return beg;\n }\n\n function _insert(q, data, priority, callback) {\n if (callback != null && typeof callback !== \"function\") {\n throw new Error(\"task callback must be a function\");\n }\n q.started = true;\n if (!_isArray(data)) {\n data = [data];\n }\n if(data.length === 0) {\n // call drain immediately if there are no tasks\n return async.setImmediate(function() {\n q.drain();\n });\n }\n _arrayEach(data, function(task) {\n var item = {\n data: task,\n priority: priority,\n callback: typeof callback === 'function' ? callback : noop\n };\n\n q.tasks.splice(_binarySearch(q.tasks, item, _compareTasks) + 1, 0, item);\n\n if (q.tasks.length === q.concurrency) {\n q.saturated();\n }\n async.setImmediate(q.process);\n });\n }\n\n // Start with a normal queue\n var q = async.queue(worker, concurrency);\n\n // Override push to accept second parameter representing priority\n q.push = function (data, priority, callback) {\n _insert(q, data, priority, callback);\n };\n\n // Remove unshift function\n delete q.unshift;\n\n return q;\n };\n\n async.cargo = function (worker, payload) {\n return _queue(worker, 1, payload);\n };\n\n function _console_fn(name) {\n return _restParam(function (fn, args) {\n fn.apply(null, args.concat([_restParam(function (err, args) {\n if (typeof console === 'object') {\n if (err) {\n if (console.error) {\n console.error(err);\n }\n }\n else if (console[name]) {\n _arrayEach(args, function (x) {\n console[name](x);\n });\n }\n }\n })]));\n });\n }\n async.log = _console_fn('log');\n async.dir = _console_fn('dir');\n /*async.info = _console_fn('info');\n async.warn = _console_fn('warn');\n async.error = _console_fn('error');*/\n\n async.memoize = function (fn, hasher) {\n var memo = {};\n var queues = {};\n var has = Object.prototype.hasOwnProperty;\n hasher = hasher || identity;\n var memoized = _restParam(function memoized(args) {\n var callback = args.pop();\n var key = hasher.apply(null, args);\n if (has.call(memo, key)) { \n async.setImmediate(function () {\n callback.apply(null, memo[key]);\n });\n }\n else if (has.call(queues, key)) {\n queues[key].push(callback);\n }\n else {\n queues[key] = [callback];\n fn.apply(null, args.concat([_restParam(function (args) {\n memo[key] = args;\n var q = queues[key];\n delete queues[key];\n for (var i = 0, l = q.length; i < l; i++) {\n q[i].apply(null, args);\n }\n })]));\n }\n });\n memoized.memo = memo;\n memoized.unmemoized = fn;\n return memoized;\n };\n\n async.unmemoize = function (fn) {\n return function () {\n return (fn.unmemoized || fn).apply(null, arguments);\n };\n };\n\n function _times(mapper) {\n return function (count, iterator, callback) {\n mapper(_range(count), iterator, callback);\n };\n }\n\n async.times = _times(async.map);\n async.timesSeries = _times(async.mapSeries);\n async.timesLimit = function (count, limit, iterator, callback) {\n return async.mapLimit(_range(count), limit, iterator, callback);\n };\n\n async.seq = function (/* functions... */) {\n var fns = arguments;\n return _restParam(function (args) {\n var that = this;\n\n var callback = args[args.length - 1];\n if (typeof callback == 'function') {\n args.pop();\n } else {\n callback = noop;\n }\n\n async.reduce(fns, args, function (newargs, fn, cb) {\n fn.apply(that, newargs.concat([_restParam(function (err, nextargs) {\n cb(err, nextargs);\n })]));\n },\n function (err, results) {\n callback.apply(that, [err].concat(results));\n });\n });\n };\n\n async.compose = function (/* functions... */) {\n return async.seq.apply(null, Array.prototype.reverse.call(arguments));\n };\n\n\n function _applyEach(eachfn) {\n return _restParam(function(fns, args) {\n var go = _restParam(function(args) {\n var that = this;\n var callback = args.pop();\n return eachfn(fns, function (fn, _, cb) {\n fn.apply(that, args.concat([cb]));\n },\n callback);\n });\n if (args.length) {\n return go.apply(this, args);\n }\n else {\n return go;\n }\n });\n }\n\n async.applyEach = _applyEach(async.eachOf);\n async.applyEachSeries = _applyEach(async.eachOfSeries);\n\n\n async.forever = function (fn, callback) {\n var done = only_once(callback || noop);\n var task = ensureAsync(fn);\n function next(err) {\n if (err) {\n return done(err);\n }\n task(next);\n }\n next();\n };\n\n function ensureAsync(fn) {\n return _restParam(function (args) {\n var callback = args.pop();\n args.push(function () {\n var innerArgs = arguments;\n if (sync) {\n async.setImmediate(function () {\n callback.apply(null, innerArgs);\n });\n } else {\n callback.apply(null, innerArgs);\n }\n });\n var sync = true;\n fn.apply(this, args);\n sync = false;\n });\n }\n\n async.ensureAsync = ensureAsync;\n\n async.constant = _restParam(function(values) {\n var args = [null].concat(values);\n return function (callback) {\n return callback.apply(this, args);\n };\n });\n\n async.wrapSync =\n async.asyncify = function asyncify(func) {\n return _restParam(function (args) {\n var callback = args.pop();\n var result;\n try {\n result = func.apply(this, args);\n } catch (e) {\n return callback(e);\n }\n // if result is Promise object\n if (_isObject(result) && typeof result.then === \"function\") {\n result.then(function(value) {\n callback(null, value);\n })[\"catch\"](function(err) {\n callback(err.message ? err : new Error(err));\n });\n } else {\n callback(null, result);\n }\n });\n };\n\n // Node.js\n if (typeof module === 'object' && module.exports) {\n module.exports = async;\n }\n // AMD / RequireJS\n else if (typeof define === 'function' && define.amd) {\n define([], function () {\n return async;\n });\n }\n // included directly via